@sumaris-net/ngx-components 2.6.26 → 2.7.0-rc2

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 (709) hide show
  1. package/esm2022/public_api.mjs +340 -0
  2. package/{esm2020 → esm2022}/src/app/admin/admin-routing.module.mjs +8 -8
  3. package/{esm2020 → esm2022}/src/app/admin/admin.module.mjs +12 -12
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +69 -0
  5. package/esm2022/src/app/admin/services/person.service.mjs +174 -0
  6. package/esm2022/src/app/admin/services/validator/person.validator.mjs +72 -0
  7. package/esm2022/src/app/admin/users/users.mjs +264 -0
  8. package/esm2022/src/app/admin/users/users.module.mjs +58 -0
  9. package/{esm2020 → esm2022}/src/app/core/about/about.modal.mjs +20 -7
  10. package/{esm2020 → esm2022}/src/app/core/about/about.module.mjs +9 -9
  11. package/{esm2020 → esm2022}/src/app/core/account/account.module.mjs +22 -22
  12. package/esm2022/src/app/core/account/account.page.mjs +337 -0
  13. package/esm2022/src/app/core/account/new-token.modal.mjs +130 -0
  14. package/esm2022/src/app/core/account/token.table.mjs +146 -0
  15. package/esm2022/src/app/core/auth/auth.form.mjs +140 -0
  16. package/esm2022/src/app/core/auth/auth.modal.mjs +76 -0
  17. package/{esm2020 → esm2022}/src/app/core/auth/auth.module.mjs +16 -16
  18. package/{esm2020 → esm2022}/src/app/core/core.module.mjs +87 -87
  19. package/esm2022/src/app/core/core.testing.module.mjs +93 -0
  20. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +109 -0
  21. package/{esm2020 → esm2022}/src/app/core/form/buttons/form-buttons-bar.module.mjs +10 -10
  22. package/esm2022/src/app/core/form/entity/editor.class.mjs +718 -0
  23. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +436 -0
  24. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +730 -0
  25. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +24 -0
  26. package/{esm2020 → esm2022}/src/app/core/form/entity/entity.module.mjs +11 -11
  27. package/esm2022/src/app/core/form/form.class.mjs +353 -0
  28. package/{esm2020 → esm2022}/src/app/core/form/form.module.mjs +30 -30
  29. package/{esm2020 → esm2022}/src/app/core/form/form.utils.mjs +69 -60
  30. package/esm2022/src/app/core/form/list/list.form.mjs +233 -0
  31. package/{esm2020 → esm2022}/src/app/core/form/list/list.module.mjs +10 -10
  32. package/esm2022/src/app/core/form/properties/properties.form.mjs +143 -0
  33. package/{esm2020 → esm2022}/src/app/core/form/properties/properties.module.mjs +13 -13
  34. package/esm2022/src/app/core/form/properties/properties.table.mjs +269 -0
  35. package/esm2022/src/app/core/form/properties/property.validator.mjs +24 -0
  36. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +95 -0
  37. package/{esm2020 → esm2022}/src/app/core/form/properties/testing/properties-form.testing.module.mjs +11 -11
  38. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +73 -0
  39. package/{esm2020 → esm2022}/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -10
  40. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +152 -0
  41. package/{esm2020 → esm2022}/src/app/core/form/text-popover/text-popover.module.mjs +10 -10
  42. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.module.mjs +6 -6
  43. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.service.mjs +32 -20
  44. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.utils.mjs +2 -1
  45. package/esm2022/src/app/core/home/home.mjs +282 -0
  46. package/esm2022/src/app/core/home/home.module.mjs +51 -0
  47. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  48. package/{esm2020 → esm2022}/src/app/core/icon/icon.module.mjs +7 -7
  49. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +358 -0
  50. package/{esm2020 → esm2022}/src/app/core/install/install-upgrade-card.module.mjs +10 -10
  51. package/esm2022/src/app/core/menu/menu.component.mjs +264 -0
  52. package/esm2022/src/app/core/menu/menu.model.mjs +269 -0
  53. package/esm2022/src/app/core/menu/menu.module.mjs +52 -0
  54. package/esm2022/src/app/core/menu/menu.service.mjs +671 -0
  55. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  56. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu-other.testing.mjs +5 -5
  57. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +122 -0
  58. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu.testing.module.mjs +12 -12
  59. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +29 -0
  60. package/{esm2020 → esm2022}/src/app/core/offline/update-offline-mode-card.module.mjs +10 -10
  61. package/esm2022/src/app/core/peer/select-peer.modal.mjs +193 -0
  62. package/{esm2020 → esm2022}/src/app/core/peer/select-peer.module.mjs +13 -13
  63. package/esm2022/src/app/core/register/register-confirm.page.mjs +88 -0
  64. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  65. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  66. package/{esm2020 → esm2022}/src/app/core/register/register.module.mjs +13 -13
  67. package/esm2022/src/app/core/services/account.service.mjs +1243 -0
  68. package/esm2022/src/app/core/services/auth-guard.service.mjs +76 -0
  69. package/esm2022/src/app/core/services/base-entity-service.class.mjs +482 -0
  70. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +224 -0
  71. package/esm2022/src/app/core/services/base58.mjs +79 -0
  72. package/esm2022/src/app/core/services/config.service.mjs +367 -0
  73. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  74. package/esm2022/src/app/core/services/local-settings.service.mjs +468 -0
  75. package/esm2022/src/app/core/services/model/account.model.mjs +155 -0
  76. package/esm2022/src/app/core/services/model/config.model.mjs +107 -0
  77. package/esm2022/src/app/core/services/model/department.model.mjs +34 -0
  78. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  79. package/esm2022/src/app/core/services/model/entity.model.mjs +228 -0
  80. package/esm2022/src/app/core/services/model/peer.model.mjs +83 -0
  81. package/esm2022/src/app/core/services/model/person.model.mjs +110 -0
  82. package/esm2022/src/app/core/services/model/referential.model.mjs +189 -0
  83. package/esm2022/src/app/core/services/model/token.model.mjs +57 -0
  84. package/esm2022/src/app/core/services/network.service.mjs +626 -0
  85. package/{esm2020 → esm2022}/src/app/core/services/pipes/account.pipes.mjs +9 -9
  86. package/{esm2020 → esm2022}/src/app/core/services/pipes/department-to-string.pipe.mjs +5 -5
  87. package/{esm2020 → esm2022}/src/app/core/services/pipes/person-to-string.pipe.mjs +5 -5
  88. package/{esm2020 → esm2022}/src/app/core/services/pipes/usage-mode.pipes.mjs +9 -9
  89. package/{esm2020 → esm2022}/src/app/core/services/platform.service.mjs +29 -7
  90. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +434 -0
  91. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +458 -0
  92. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +25 -0
  93. package/esm2022/src/app/core/services/testing/referential.validator.mjs +46 -0
  94. package/esm2022/src/app/core/services/validator/account.validator.mjs +45 -0
  95. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +49 -0
  96. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +67 -0
  97. package/{esm2020 → esm2022}/src/app/core/services/validator/user-settings.validator.mjs +5 -5
  98. package/{esm2020 → esm2022}/src/app/core/services/validator/user-token.validator.mjs +5 -5
  99. package/{esm2020 → esm2022}/src/app/core/settings/settings.module.mjs +9 -9
  100. package/esm2022/src/app/core/settings/settings.page.mjs +328 -0
  101. package/esm2022/src/app/core/table/actions-column.component.mjs +115 -0
  102. package/esm2022/src/app/core/table/async-table.class.mjs +1740 -0
  103. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +386 -0
  104. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +401 -0
  105. package/esm2022/src/app/core/table/memory-table.class.mjs +57 -0
  106. package/esm2022/src/app/core/table/table-select-columns.component.mjs +46 -0
  107. package/esm2022/src/app/core/table/table.class.mjs +1781 -0
  108. package/esm2022/src/app/core/table/table.model.mjs +16 -0
  109. package/{esm2020 → esm2022}/src/app/core/table/table.module.mjs +12 -12
  110. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +28 -0
  111. package/esm2022/src/app/core/table/testing/table.testing.mjs +291 -0
  112. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +50 -0
  113. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +25 -0
  114. package/esm2022/src/app/core/table/testing/table2.testing.mjs +250 -0
  115. package/esm2022/src/app/shared/audio/audio.mjs +251 -0
  116. package/esm2022/src/app/shared/audio/audio.testing.mjs +32 -0
  117. package/{esm2020 → esm2022}/src/app/shared/audio/audio.testing.module.mjs +10 -10
  118. package/esm2022/src/app/shared/capacitor/keyboard.mjs +42 -0
  119. package/esm2022/src/app/shared/capacitor/plugins.mjs +9 -0
  120. package/esm2022/src/app/shared/dates.mjs +149 -0
  121. package/esm2022/src/app/shared/debug/debug.component.mjs +40 -0
  122. package/{esm2020 → esm2022}/src/app/shared/debug/debug.module.mjs +14 -14
  123. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +98 -0
  124. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +32 -0
  125. package/{esm2020 → esm2022}/src/app/shared/directives/directives.module.mjs +13 -13
  126. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +52 -0
  127. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +33 -0
  128. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +62 -0
  129. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +45 -0
  130. package/{esm2020 → esm2022}/src/app/shared/directives/resizable/resizable.module.mjs +5 -5
  131. package/esm2022/src/app/shared/file/file.service.mjs +122 -0
  132. package/{esm2020 → esm2022}/src/app/shared/file/file.utils.mjs +2 -2
  133. package/esm2022/src/app/shared/form/field.component.mjs +353 -0
  134. package/{esm2020 → esm2022}/src/app/shared/form/field.model.mjs +1 -1
  135. package/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  136. package/{esm2020 → esm2022}/src/app/shared/functions.mjs +5 -4
  137. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +82 -0
  138. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  139. package/esm2022/src/app/shared/graph/graph-colors.mjs +219 -0
  140. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +59 -0
  141. package/esm2022/src/app/shared/help/help.modal.mjs +63 -0
  142. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  143. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +85 -0
  144. package/{esm2020 → esm2022}/src/app/shared/hotkeys/shared-hotkeys.module.mjs +13 -13
  145. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +388 -0
  146. package/{esm2020 → esm2022}/src/app/shared/image/gallery/image-gallery.module.mjs +22 -22
  147. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +26 -0
  148. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
  149. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +41 -0
  150. package/{esm2020 → esm2022}/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +16 -16
  151. package/{esm2020 → esm2022}/src/app/shared/image/image.module.mjs +11 -11
  152. package/esm2022/src/app/shared/image/image.service.mjs +104 -0
  153. package/esm2022/src/app/shared/inputs.mjs +231 -0
  154. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +28 -0
  155. package/esm2022/src/app/shared/logging/logging-service.class.mjs +128 -0
  156. package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.module.mjs +8 -8
  157. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +49 -0
  158. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +961 -0
  159. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +82 -0
  160. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +217 -0
  161. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +209 -0
  162. package/{esm2020 → esm2022}/src/app/shared/material/badge/badge.module.mjs +9 -9
  163. package/esm2022/src/app/shared/material/badge/badge.test.mjs +42 -0
  164. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +72 -0
  165. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +266 -0
  166. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +271 -0
  167. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +54 -0
  168. package/esm2022/src/app/shared/material/chips/chips.module.mjs +76 -0
  169. package/esm2022/src/app/shared/material/chips/material.chips.mjs +719 -0
  170. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +148 -0
  171. package/{esm2020 → esm2022}/src/app/shared/material/datetime/datetime.module.mjs +38 -38
  172. package/esm2022/src/app/shared/material/datetime/material.date.mjs +396 -0
  173. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +406 -0
  174. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +549 -0
  175. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +132 -0
  176. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +123 -0
  177. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +115 -0
  178. package/esm2022/src/app/shared/material/duration/duration.module.mjs +70 -0
  179. package/{esm2020 → esm2022}/src/app/shared/material/duration/duration.utils.mjs +2 -2
  180. package/esm2022/src/app/shared/material/duration/material.duration.mjs +273 -0
  181. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +79 -0
  182. package/{esm2020 → esm2022}/src/app/shared/material/latlong/latlong.utils.mjs +3 -3
  183. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +440 -0
  184. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +72 -0
  185. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +113 -0
  186. package/esm2022/src/app/shared/material/material.module.mjs +229 -0
  187. package/esm2022/src/app/shared/material/material.testing.module.mjs +221 -0
  188. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +104 -0
  189. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +83 -0
  190. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +203 -0
  191. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +19 -0
  192. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +168 -0
  193. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +36 -0
  194. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +16 -0
  195. package/{esm2020 → esm2022}/src/app/shared/material/numpad/numpad.module.mjs +21 -21
  196. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +48 -0
  197. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +48 -0
  198. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +23 -0
  199. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +368 -0
  200. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +56 -0
  201. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +67 -0
  202. package/esm2022/src/app/shared/material/testing/common.test.mjs +105 -0
  203. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +31 -0
  204. package/esm2022/src/app/shared/material/text/text-form.component.mjs +97 -0
  205. package/{esm2020 → esm2022}/src/app/shared/material/text/text-form.module.mjs +24 -24
  206. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +236 -0
  207. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  208. package/{esm2020 → esm2022}/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  209. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  210. package/{esm2020 → esm2022}/src/app/shared/pipes/arrays.pipe.mjs +25 -25
  211. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +27 -0
  212. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +51 -0
  213. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  214. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  215. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +36 -0
  216. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +60 -0
  217. package/esm2022/src/app/shared/pipes/form.pipes.mjs +194 -0
  218. package/{esm2020 → esm2022}/src/app/shared/pipes/highlight.pipe.mjs +5 -5
  219. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  220. package/{esm2020 → esm2022}/src/app/shared/pipes/maps.pipe.mjs +13 -13
  221. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +118 -0
  222. package/{esm2020 → esm2022}/src/app/shared/pipes/math.pipes.mjs +13 -13
  223. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  224. package/{esm2020 → esm2022}/src/app/shared/pipes/number-format.pipe.mjs +5 -5
  225. package/esm2022/src/app/shared/pipes/pipes.module.mjs +256 -0
  226. package/esm2022/src/app/shared/pipes/property.pipes.mjs +97 -0
  227. package/esm2022/src/app/shared/pipes/string.pipes.mjs +135 -0
  228. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  229. package/esm2022/src/app/shared/pipes/types.pipes.mjs +58 -0
  230. package/esm2022/src/app/shared/rx-state.module.mjs +23 -0
  231. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +347 -0
  232. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  233. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +121 -0
  234. package/{esm2020 → esm2022}/src/app/shared/services/startable-service.class.mjs +21 -18
  235. package/esm2022/src/app/shared/services/translate-context.service.mjs +104 -0
  236. package/{esm2020 → esm2022}/src/app/shared/shared-routing.module.mjs +12 -12
  237. package/esm2022/src/app/shared/shared.module.mjs +231 -0
  238. package/{esm2020 → esm2022}/src/app/shared/shared.testing.module.mjs +40 -40
  239. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +286 -0
  240. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +46 -0
  241. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +7 -7
  242. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing.module.mjs +6 -6
  243. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  244. package/{esm2020 → esm2022}/src/app/shared/storage/storage.utils.mjs +1 -1
  245. package/esm2022/src/app/shared/testing/observable.test.mjs +96 -0
  246. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  247. package/esm2022/src/app/shared/toast/toast.testing.mjs +52 -0
  248. package/{esm2020 → esm2022}/src/app/shared/toast/toast.testing.module.mjs +10 -10
  249. package/esm2022/src/app/shared/toast/toasts.mjs +144 -0
  250. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +60 -0
  251. package/esm2022/src/app/shared/toolbar/toolbar.mjs +263 -0
  252. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +57 -0
  253. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  254. package/{esm2020 → esm2022}/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -10
  255. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +107 -0
  256. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +211 -0
  257. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +27 -0
  258. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +106 -0
  259. package/esm2022/src/app/shared/validator/validators.mjs +580 -0
  260. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  261. package/esm2022/src/app/social/job/job.module.mjs +42 -0
  262. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  263. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +232 -0
  264. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +50 -0
  265. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +29 -0
  266. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +73 -0
  267. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +43 -0
  268. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +53 -0
  269. package/{esm2020 → esm2022}/src/app/social/job/testing/job.testing.module.mjs +9 -9
  270. package/esm2022/src/app/social/message/message.form.mjs +140 -0
  271. package/esm2022/src/app/social/message/message.modal.mjs +110 -0
  272. package/esm2022/src/app/social/message/message.model.mjs +75 -0
  273. package/{esm2020 → esm2022}/src/app/social/message/message.module.mjs +5 -5
  274. package/esm2022/src/app/social/message/message.service.mjs +110 -0
  275. package/{esm2020 → esm2022}/src/app/social/social.module.mjs +19 -19
  276. package/{esm2020 → esm2022}/src/app/social/social.testing.module.mjs +10 -10
  277. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +123 -0
  278. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +263 -0
  279. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +233 -0
  280. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +129 -0
  281. package/{esm2020 → esm2022}/src/app/social/user-event/testing/user-event.testing.module.mjs +9 -9
  282. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +116 -0
  283. package/esm2022/src/app/social/user-event/user-event.module.mjs +43 -0
  284. package/esm2022/src/app/social/user-event/user-event.service.mjs +512 -0
  285. package/esm2022/src/environments/environment.class.mjs +50 -0
  286. package/esm2022/src/environments/environment.loader.mjs +83 -0
  287. package/{esm2020 → esm2022}/src/environments/environment.mjs +3 -3
  288. package/{fesm2020 → fesm2022}/sumaris-net.ngx-components.mjs +12695 -10274
  289. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  290. package/package.json +37 -17
  291. package/public_api.d.ts +12 -4
  292. package/src/app/admin/users/users.d.ts +1 -1
  293. package/src/app/admin/users/users.module.d.ts +2 -1
  294. package/src/app/core/about/about.modal.d.ts +1 -1
  295. package/src/app/core/account/account.page.d.ts +1 -1
  296. package/src/app/core/account/new-token.modal.d.ts +1 -1
  297. package/src/app/core/account/token.table.d.ts +1 -1
  298. package/src/app/core/auth/auth.form.d.ts +1 -1
  299. package/src/app/core/auth/auth.modal.d.ts +1 -1
  300. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -1
  301. package/src/app/core/form/entity/editor.class.d.ts +3 -3
  302. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +1 -1
  303. package/src/app/core/form/entity/entity-editor.class.d.ts +1 -1
  304. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  305. package/src/app/core/form/form.class.d.ts +1 -1
  306. package/src/app/core/form/list/list.form.d.ts +1 -1
  307. package/src/app/core/form/properties/properties.form.d.ts +1 -1
  308. package/src/app/core/form/properties/properties.table.d.ts +2 -3
  309. package/src/app/core/form/properties/property.validator.d.ts +1 -1
  310. package/src/app/core/form/properties/testing/properties-form.test.d.ts +1 -1
  311. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +1 -1
  312. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -1
  313. package/src/app/core/graphql/graphql.utils.d.ts +1 -1
  314. package/src/app/core/home/home.d.ts +1 -1
  315. package/src/app/core/home/home.module.d.ts +4 -3
  316. package/src/app/core/icon/icon.component.d.ts +1 -1
  317. package/src/app/core/install/install-upgrade-card.component.d.ts +1 -1
  318. package/src/app/core/menu/menu.component.d.ts +2 -2
  319. package/src/app/core/menu/menu.model.d.ts +0 -1
  320. package/src/app/core/menu/menu.module.d.ts +3 -5
  321. package/src/app/core/menu/menu.service.d.ts +1 -1
  322. package/src/app/core/menu/sub-menu-tab.directive.d.ts +1 -1
  323. package/src/app/core/menu/testing/menu-other.testing.d.ts +1 -1
  324. package/src/app/core/menu/testing/menu.testing.d.ts +1 -1
  325. package/src/app/core/offline/update-offline-mode-card.component.d.ts +1 -1
  326. package/src/app/core/peer/select-peer.modal.d.ts +1 -1
  327. package/src/app/core/register/register-confirm.page.d.ts +1 -1
  328. package/src/app/core/register/register.form.d.ts +1 -1
  329. package/src/app/core/register/register.modal.d.ts +1 -1
  330. package/src/app/core/services/base-entity-service.class.d.ts +2 -2
  331. package/src/app/core/services/base-graphql-service.class.d.ts +1 -1
  332. package/src/app/core/services/model/person.model.d.ts +1 -1
  333. package/src/app/core/services/model/settings.model.d.ts +1 -1
  334. package/src/app/core/services/network.types.d.ts +2 -2
  335. package/src/app/core/services/storage/entity-store.class.d.ts +1 -1
  336. package/src/app/core/services/validator/base.validator.class.d.ts +1 -1
  337. package/src/app/core/settings/settings.page.d.ts +1 -1
  338. package/src/app/core/table/actions-column.component.d.ts +2 -2
  339. package/src/app/core/table/async-table.class.d.ts +1 -1
  340. package/src/app/core/table/entities-async-table-datasource.class.d.ts +1 -1
  341. package/src/app/core/table/entities-table-datasource.class.d.ts +1 -1
  342. package/src/app/core/table/memory-table.class.d.ts +3 -3
  343. package/src/app/core/table/table-select-columns.component.d.ts +1 -1
  344. package/src/app/core/table/table.class.d.ts +4 -3
  345. package/src/app/core/table/table.model.d.ts +1 -1
  346. package/src/app/core/table/testing/table.testing.d.ts +5 -4
  347. package/src/app/core/table/testing/table.testing.module.d.ts +8 -5
  348. package/src/app/core/table/testing/table2-validator.service.d.ts +15 -0
  349. package/src/app/core/table/testing/table2.testing.d.ts +45 -0
  350. package/src/app/shared/audio/audio.d.ts +1 -1
  351. package/src/app/shared/audio/audio.testing.d.ts +1 -1
  352. package/src/app/shared/debug/debug.component.d.ts +1 -1
  353. package/src/app/shared/directives/autofocus.directive.d.ts +1 -1
  354. package/src/app/shared/directives/autotitle.directive.d.ts +1 -1
  355. package/src/app/shared/directives/drag-and-drop.directive.d.ts +1 -1
  356. package/src/app/shared/directives/ng-var.directive.d.ts +1 -1
  357. package/src/app/shared/directives/resizable/resizable.component.d.ts +1 -1
  358. package/src/app/shared/directives/resizable/resizable.directive.d.ts +1 -1
  359. package/src/app/shared/events.d.ts +1 -1
  360. package/src/app/shared/form/field.component.d.ts +4 -5
  361. package/src/app/shared/form/field.model.d.ts +2 -0
  362. package/src/app/shared/form/loading-spinner.d.ts +1 -1
  363. package/src/app/shared/functions.d.ts +2 -2
  364. package/src/app/shared/help/help.modal.d.ts +2 -2
  365. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +3 -5
  366. package/src/app/shared/hotkeys/hotkeys.service.d.ts +3 -3
  367. package/src/app/shared/image/gallery/image-gallery.component.d.ts +3 -3
  368. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +2 -2
  369. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +8 -8
  370. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +10 -9
  371. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +1 -1
  372. package/src/app/shared/material/badge/badge.directive.d.ts +1 -1
  373. package/src/app/shared/material/badge/badge.test.d.ts +1 -1
  374. package/src/app/shared/material/boolean/boolean.module.d.ts +12 -11
  375. package/src/app/shared/material/boolean/material-boolean2.d.ts +66 -0
  376. package/src/app/shared/material/boolean/material.boolean.d.ts +5 -4
  377. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +21 -0
  378. package/src/app/shared/material/chips/material.chips.d.ts +8 -9
  379. package/src/app/shared/material/chips/testing/chips.test.d.ts +2 -2
  380. package/src/app/shared/material/datetime/datetime.module.d.ts +2 -2
  381. package/src/app/shared/material/datetime/material.date.d.ts +5 -4
  382. package/src/app/shared/material/datetime/material.dateshort.d.ts +8 -7
  383. package/src/app/shared/material/datetime/material.datetime.d.ts +16 -8
  384. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +7 -1
  385. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +3 -1
  386. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +3 -1
  387. package/src/app/shared/material/duration/duration.module.d.ts +6 -5
  388. package/src/app/shared/material/duration/material.duration.d.ts +6 -5
  389. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +22 -0
  390. package/src/app/shared/material/latlong/material.latlong.d.ts +16 -9
  391. package/src/app/shared/material/latlong/material.latlong.module.d.ts +9 -8
  392. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +3 -1
  393. package/src/app/shared/material/material.testing.module.d.ts +23 -19
  394. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +1 -1
  395. package/src/app/shared/material/numpad/numpad.component.d.ts +1 -1
  396. package/src/app/shared/material/numpad/numpad.container.d.ts +1 -1
  397. package/src/app/shared/material/numpad/numpad.content.d.ts +1 -1
  398. package/src/app/shared/material/numpad/numpad.directive.d.ts +1 -1
  399. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -3
  400. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +1 -1
  401. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -3
  402. package/src/app/shared/material/swipe/material.swipe.d.ts +6 -6
  403. package/src/app/shared/material/swipe/swipe.module.d.ts +2 -1
  404. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +1 -1
  405. package/src/app/shared/material/testing/common.test.d.ts +25 -0
  406. package/src/app/shared/material/text/testing/text-form.testing.d.ts +1 -1
  407. package/src/app/shared/material/text/text-form.component.d.ts +1 -1
  408. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -1
  409. package/src/app/shared/named-filter/named-filter.service.d.ts +1 -1
  410. package/src/app/shared/pipes/maskito.pipe.d.ts +16 -0
  411. package/src/app/shared/pipes/ng-init.pipe.d.ts +1 -1
  412. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  413. package/src/app/shared/pipes/string.pipes.d.ts +6 -0
  414. package/src/app/shared/pipes/types.pipes.d.ts +7 -0
  415. package/src/app/shared/rx-state.module.d.ts +10 -0
  416. package/src/app/shared/services/job.utils.d.ts +1 -1
  417. package/src/app/shared/services/memory-entity-service.class.d.ts +1 -1
  418. package/src/app/shared/services/startable-observable-service.class.d.ts +3 -0
  419. package/src/app/shared/services/startable-service.class.d.ts +3 -0
  420. package/src/app/shared/shared.module.d.ts +4 -4
  421. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -1
  422. package/src/app/shared/storage/storage-explorer.module.d.ts +3 -3
  423. package/src/app/shared/storage/storage.service.d.ts +1 -1
  424. package/src/app/shared/storage/storage.utils.d.ts +1 -1
  425. package/src/app/shared/testing/observable.test.d.ts +1 -1
  426. package/src/app/shared/testing/tests.page.d.ts +1 -1
  427. package/src/app/shared/toast/toast.testing.d.ts +1 -1
  428. package/src/app/shared/toolbar/modal-toolbar.d.ts +1 -1
  429. package/src/app/shared/toolbar/toolbar.d.ts +1 -1
  430. package/src/app/shared/toolbar/toolbar.module.d.ts +4 -3
  431. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +1 -1
  432. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +1 -1
  433. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -1
  434. package/src/app/shared/upload-file/upload-file.model.d.ts +2 -2
  435. package/src/app/social/job/progression/job-progression.component.d.ts +17 -3
  436. package/src/app/social/job/progression/job-progression.icon.d.ts +24 -10
  437. package/src/app/social/job/progression/job-progression.list.d.ts +3 -3
  438. package/src/app/social/job/progression/job-progression.model.d.ts +0 -1
  439. package/src/app/social/job/testing/job-progression.testing.d.ts +3 -6
  440. package/src/app/social/message/message.form.d.ts +1 -1
  441. package/src/app/social/message/message.modal.d.ts +1 -1
  442. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -3
  443. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +1 -1
  444. package/src/app/social/user-event/testing/user-event.testing.d.ts +1 -1
  445. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -1
  446. package/src/app/social/user-event/user-event.model.d.ts +2 -2
  447. package/src/app/social/user-event/user-event.module.d.ts +3 -2
  448. package/src/app/social/user-event/user-event.service.d.ts +1 -1
  449. package/src/assets/i18n/fr.json +2 -2
  450. package/src/assets/img/logo/logo-eis.png +0 -0
  451. package/src/assets/manifest.json +1 -1
  452. package/src/environments/environment.loader.d.ts +1 -1
  453. package/src/theme/_material.globals.scss +51 -19
  454. package/src/theme/_material.scss +35 -19
  455. package/src/theme/_mixins.scss +4 -4
  456. package/src/theme/_ngx-components.globals.scss +6 -1
  457. package/src/theme/_ngx-components.scss +264 -535
  458. package/src/theme/_ngx-components.table.scss +597 -0
  459. package/src/theme/_theme.scss +1 -0
  460. package/esm2020/public_api.mjs +0 -332
  461. package/esm2020/src/app/admin/services/filter/person.filter.mjs +0 -59
  462. package/esm2020/src/app/admin/services/person.service.mjs +0 -170
  463. package/esm2020/src/app/admin/services/validator/person.validator.mjs +0 -71
  464. package/esm2020/src/app/admin/users/users.mjs +0 -250
  465. package/esm2020/src/app/admin/users/users.module.mjs +0 -54
  466. package/esm2020/src/app/core/account/account.page.mjs +0 -319
  467. package/esm2020/src/app/core/account/new-token.modal.mjs +0 -121
  468. package/esm2020/src/app/core/account/token.table.mjs +0 -141
  469. package/esm2020/src/app/core/auth/auth.form.mjs +0 -131
  470. package/esm2020/src/app/core/auth/auth.modal.mjs +0 -72
  471. package/esm2020/src/app/core/core.testing.module.mjs +0 -86
  472. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -107
  473. package/esm2020/src/app/core/form/entity/editor.class.mjs +0 -685
  474. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -422
  475. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +0 -696
  476. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  477. package/esm2020/src/app/core/form/form.class.mjs +0 -345
  478. package/esm2020/src/app/core/form/list/list.form.mjs +0 -222
  479. package/esm2020/src/app/core/form/properties/properties.form.mjs +0 -132
  480. package/esm2020/src/app/core/form/properties/properties.table.mjs +0 -267
  481. package/esm2020/src/app/core/form/properties/property.validator.mjs +0 -23
  482. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +0 -90
  483. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -70
  484. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +0 -146
  485. package/esm2020/src/app/core/home/home.mjs +0 -257
  486. package/esm2020/src/app/core/home/home.module.mjs +0 -48
  487. package/esm2020/src/app/core/icon/icon.component.mjs +0 -41
  488. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +0 -344
  489. package/esm2020/src/app/core/menu/menu.component.mjs +0 -242
  490. package/esm2020/src/app/core/menu/menu.model.mjs +0 -247
  491. package/esm2020/src/app/core/menu/menu.module.mjs +0 -57
  492. package/esm2020/src/app/core/menu/menu.service.mjs +0 -660
  493. package/esm2020/src/app/core/menu/sub-menu-tab.directive.mjs +0 -98
  494. package/esm2020/src/app/core/menu/testing/menu.testing.mjs +0 -121
  495. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +0 -27
  496. package/esm2020/src/app/core/peer/select-peer.modal.mjs +0 -183
  497. package/esm2020/src/app/core/register/register-confirm.page.mjs +0 -81
  498. package/esm2020/src/app/core/register/register.form.mjs +0 -183
  499. package/esm2020/src/app/core/register/register.modal.mjs +0 -52
  500. package/esm2020/src/app/core/services/account.service.mjs +0 -1235
  501. package/esm2020/src/app/core/services/auth-guard.service.mjs +0 -71
  502. package/esm2020/src/app/core/services/base-entity-service.class.mjs +0 -468
  503. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +0 -221
  504. package/esm2020/src/app/core/services/base58.mjs +0 -78
  505. package/esm2020/src/app/core/services/config.service.mjs +0 -357
  506. package/esm2020/src/app/core/services/crypto.service.mjs +0 -107
  507. package/esm2020/src/app/core/services/local-settings.service.mjs +0 -460
  508. package/esm2020/src/app/core/services/model/account.model.mjs +0 -147
  509. package/esm2020/src/app/core/services/model/config.model.mjs +0 -92
  510. package/esm2020/src/app/core/services/model/department.model.mjs +0 -30
  511. package/esm2020/src/app/core/services/model/entity.decorators.mjs +0 -97
  512. package/esm2020/src/app/core/services/model/entity.model.mjs +0 -225
  513. package/esm2020/src/app/core/services/model/peer.model.mjs +0 -68
  514. package/esm2020/src/app/core/services/model/person.model.mjs +0 -97
  515. package/esm2020/src/app/core/services/model/referential.model.mjs +0 -167
  516. package/esm2020/src/app/core/services/model/token.model.mjs +0 -52
  517. package/esm2020/src/app/core/services/network.service.mjs +0 -607
  518. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +0 -428
  519. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +0 -449
  520. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +0 -23
  521. package/esm2020/src/app/core/services/testing/referential.validator.mjs +0 -45
  522. package/esm2020/src/app/core/services/validator/account.validator.mjs +0 -41
  523. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +0 -47
  524. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +0 -66
  525. package/esm2020/src/app/core/settings/settings.page.mjs +0 -312
  526. package/esm2020/src/app/core/table/actions-column.component.mjs +0 -102
  527. package/esm2020/src/app/core/table/async-table.class.mjs +0 -1698
  528. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  529. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +0 -399
  530. package/esm2020/src/app/core/table/memory-table.class.mjs +0 -53
  531. package/esm2020/src/app/core/table/table-select-columns.component.mjs +0 -43
  532. package/esm2020/src/app/core/table/table.class.mjs +0 -1733
  533. package/esm2020/src/app/core/table/table.model.mjs +0 -12
  534. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +0 -27
  535. package/esm2020/src/app/core/table/testing/table.testing.mjs +0 -281
  536. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +0 -38
  537. package/esm2020/src/app/shared/audio/audio.mjs +0 -248
  538. package/esm2020/src/app/shared/audio/audio.testing.mjs +0 -31
  539. package/esm2020/src/app/shared/capacitor/keyboard.mjs +0 -40
  540. package/esm2020/src/app/shared/capacitor/plugins.mjs +0 -9
  541. package/esm2020/src/app/shared/dates.mjs +0 -149
  542. package/esm2020/src/app/shared/debug/debug.component.mjs +0 -39
  543. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +0 -93
  544. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +0 -30
  545. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +0 -53
  546. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +0 -31
  547. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +0 -59
  548. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +0 -40
  549. package/esm2020/src/app/shared/file/file.service.mjs +0 -117
  550. package/esm2020/src/app/shared/form/field.component.mjs +0 -332
  551. package/esm2020/src/app/shared/form/loading-spinner.mjs +0 -36
  552. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +0 -80
  553. package/esm2020/src/app/shared/gesture/gesture-config.mjs +0 -49
  554. package/esm2020/src/app/shared/graph/graph-colors.mjs +0 -212
  555. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +0 -57
  556. package/esm2020/src/app/shared/help/help.modal.mjs +0 -53
  557. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  558. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +0 -84
  559. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +0 -368
  560. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -27
  561. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -90
  562. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -39
  563. package/esm2020/src/app/shared/image/image.service.mjs +0 -98
  564. package/esm2020/src/app/shared/inputs.mjs +0 -231
  565. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  566. package/esm2020/src/app/shared/logging/logging-service.class.mjs +0 -121
  567. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -47
  568. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -920
  569. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -78
  570. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -209
  571. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +0 -199
  572. package/esm2020/src/app/shared/material/badge/badge.test.mjs +0 -41
  573. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +0 -68
  574. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +0 -253
  575. package/esm2020/src/app/shared/material/chips/chips.module.mjs +0 -76
  576. package/esm2020/src/app/shared/material/chips/material.chips.mjs +0 -696
  577. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +0 -143
  578. package/esm2020/src/app/shared/material/datetime/material.date.mjs +0 -376
  579. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +0 -385
  580. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +0 -499
  581. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -109
  582. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -111
  583. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -103
  584. package/esm2020/src/app/shared/material/duration/duration.module.mjs +0 -67
  585. package/esm2020/src/app/shared/material/duration/material.duration.mjs +0 -257
  586. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +0 -382
  587. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  588. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -102
  589. package/esm2020/src/app/shared/material/material.module.mjs +0 -229
  590. package/esm2020/src/app/shared/material/material.testing.module.mjs +0 -179
  591. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -98
  592. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +0 -80
  593. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +0 -190
  594. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +0 -17
  595. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +0 -162
  596. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -37
  597. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +0 -15
  598. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -46
  599. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -46
  600. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -22
  601. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +0 -344
  602. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  603. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -64
  604. package/esm2020/src/app/shared/material/text/testing/text-form.testing.mjs +0 -29
  605. package/esm2020/src/app/shared/material/text/text-form.component.mjs +0 -89
  606. package/esm2020/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -224
  607. package/esm2020/src/app/shared/named-filter/named-filter.model.mjs +0 -45
  608. package/esm2020/src/app/shared/named-filter/named-filter.service.mjs +0 -63
  609. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +0 -25
  610. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -48
  611. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +0 -66
  612. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +0 -27
  613. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +0 -34
  614. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +0 -62
  615. package/esm2020/src/app/shared/pipes/form.pipes.mjs +0 -187
  616. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +0 -46
  617. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +0 -21
  618. package/esm2020/src/app/shared/pipes/pipes.module.mjs +0 -239
  619. package/esm2020/src/app/shared/pipes/property.pipes.mjs +0 -93
  620. package/esm2020/src/app/shared/pipes/string.pipes.mjs +0 -121
  621. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +0 -43
  622. package/esm2020/src/app/shared/pipes/types.pipes.mjs +0 -45
  623. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +0 -339
  624. package/esm2020/src/app/shared/services/progress-bar.service.mjs +0 -33
  625. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +0 -118
  626. package/esm2020/src/app/shared/services/translate-context.service.mjs +0 -103
  627. package/esm2020/src/app/shared/shared.module.mjs +0 -229
  628. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +0 -268
  629. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +0 -47
  630. package/esm2020/src/app/shared/storage/storage.service.mjs +0 -132
  631. package/esm2020/src/app/shared/testing/observable.test.mjs +0 -95
  632. package/esm2020/src/app/shared/testing/tests.page.mjs +0 -33
  633. package/esm2020/src/app/shared/toast/toast.testing.mjs +0 -51
  634. package/esm2020/src/app/shared/toast/toasts.mjs +0 -144
  635. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +0 -58
  636. package/esm2020/src/app/shared/toolbar/toolbar.mjs +0 -251
  637. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +0 -53
  638. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -58
  639. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -97
  640. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +0 -204
  641. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +0 -20
  642. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +0 -104
  643. package/esm2020/src/app/shared/validator/validators.mjs +0 -580
  644. package/esm2020/src/app/shared/version/versions.mjs +0 -81
  645. package/esm2020/src/app/social/job/job.module.mjs +0 -42
  646. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -20
  647. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +0 -216
  648. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +0 -43
  649. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +0 -23
  650. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +0 -71
  651. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +0 -52
  652. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +0 -55
  653. package/esm2020/src/app/social/message/message.form.mjs +0 -136
  654. package/esm2020/src/app/social/message/message.modal.mjs +0 -99
  655. package/esm2020/src/app/social/message/message.model.mjs +0 -67
  656. package/esm2020/src/app/social/message/message.service.mjs +0 -105
  657. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -114
  658. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -246
  659. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +0 -227
  660. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -112
  661. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -111
  662. package/esm2020/src/app/social/user-event/user-event.module.mjs +0 -39
  663. package/esm2020/src/app/social/user-event/user-event.service.mjs +0 -501
  664. package/esm2020/src/environments/environment.class.mjs +0 -5
  665. package/esm2020/src/environments/environment.loader.mjs +0 -79
  666. package/fesm2015/sumaris-net.ngx-components.mjs +0 -41105
  667. package/fesm2015/sumaris-net.ngx-components.mjs.map +0 -1
  668. package/fesm2020/sumaris-net.ngx-components.mjs.map +0 -1
  669. package/resources/README.md +0 -7
  670. /package/{esm2020 → esm2022}/src/app/core/services/config/core.config.mjs +0 -0
  671. /package/{esm2020 → esm2022}/src/app/core/services/errors.mjs +0 -0
  672. /package/{esm2020 → esm2022}/src/app/core/services/model/filter.model.mjs +0 -0
  673. /package/{esm2020 → esm2022}/src/app/core/services/model/history.model.mjs +0 -0
  674. /package/{esm2020 → esm2022}/src/app/core/services/model/model.enum.mjs +0 -0
  675. /package/{esm2020 → esm2022}/src/app/core/services/model/settings.model.mjs +0 -0
  676. /package/{esm2020 → esm2022}/src/app/core/services/model/tree-item-entity.model.mjs +0 -0
  677. /package/{esm2020 → esm2022}/src/app/core/services/network.types.mjs +0 -0
  678. /package/{esm2020 → esm2022}/src/app/core/services/network.utils.mjs +0 -0
  679. /package/{esm2020 → esm2022}/src/app/core/table/table.utils.mjs +0 -0
  680. /package/{esm2020 → esm2022}/src/app/shared/alerts.mjs +0 -0
  681. /package/{esm2020 → esm2022}/src/app/shared/constants.mjs +0 -0
  682. /package/{esm2020 → esm2022}/src/app/shared/debug/debug-service.class.mjs +0 -0
  683. /package/{esm2020 → esm2022}/src/app/shared/events.mjs +0 -0
  684. /package/{esm2020 → esm2022}/src/app/shared/file/csv.utils.mjs +0 -0
  685. /package/{esm2020 → esm2022}/src/app/shared/file/images.utils.mjs +0 -0
  686. /package/{esm2020 → esm2022}/src/app/shared/file/json.utils.mjs +0 -0
  687. /package/{esm2020 → esm2022}/src/app/shared/file/uri.utils.mjs +0 -0
  688. /package/{esm2020 → esm2022}/src/app/shared/focusable.mjs +0 -0
  689. /package/{esm2020 → esm2022}/src/app/shared/forms.mjs +0 -0
  690. /package/{esm2020 → esm2022}/src/app/shared/gesture/hammer.utils.mjs +0 -0
  691. /package/{esm2020 → esm2022}/src/app/shared/graph/colors.utils.mjs +0 -0
  692. /package/{esm2020 → esm2022}/src/app/shared/http/http.utils.mjs +0 -0
  693. /package/{esm2020 → esm2022}/src/app/shared/image/image.model.mjs +0 -0
  694. /package/{esm2020 → esm2022}/src/app/shared/logging/log-level.model.mjs +0 -0
  695. /package/{esm2020 → esm2022}/src/app/shared/logging/logger.model.mjs +0 -0
  696. /package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.config.mjs +0 -0
  697. /package/{esm2020 → esm2022}/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -0
  698. /package/{esm2020 → esm2022}/src/app/shared/material/material.animations.mjs +0 -0
  699. /package/{esm2020 → esm2022}/src/app/shared/modules.mjs +0 -0
  700. /package/{esm2020 → esm2022}/src/app/shared/observables.mjs +0 -0
  701. /package/{esm2020 → esm2022}/src/app/shared/platforms.mjs +0 -0
  702. /package/{esm2020 → esm2022}/src/app/shared/services/entity-service.class.mjs +0 -0
  703. /package/{esm2020 → esm2022}/src/app/shared/services/job.utils.mjs +0 -0
  704. /package/{esm2020 → esm2022}/src/app/shared/services/validator-service.class.mjs +0 -0
  705. /package/{esm2020 → esm2022}/src/app/shared/services.mjs +0 -0
  706. /package/{esm2020 → esm2022}/src/app/shared/types.mjs +0 -0
  707. /package/{esm2020 → esm2022}/src/app/social/social.errors.mjs +0 -0
  708. /package/{esm2020 → esm2022}/src/app/social/user-event/user-event.model.mjs +0 -0
  709. /package/{esm2020 → esm2022}/sumaris-net.ngx-components.mjs +0 -0
@@ -33,6 +33,31 @@ const loggerLink = unwrapESModule(loggerLinkImported);
33
33
  export const APP_GRAPHQL_TYPE_POLICIES = new InjectionToken('graphqlTypePolicies');
34
34
  export const APP_GRAPHQL_FRAGMENTS = new InjectionToken('graphqlFragments');
35
35
  export class GraphqlService extends StartableService {
36
+ platform;
37
+ apollo;
38
+ httpLink;
39
+ network;
40
+ storage;
41
+ environment;
42
+ typePolicies;
43
+ fragments;
44
+ _networkStatusChanged$;
45
+ httpParams;
46
+ wsParams;
47
+ connectionParams = {};
48
+ _defaultFetchPolicy;
49
+ onNetworkError = new Subject();
50
+ customErrors = {};
51
+ onResetAuth = new Subject();
52
+ get client() {
53
+ return this._data;
54
+ }
55
+ get cache() {
56
+ return this.apollo.client.cache;
57
+ }
58
+ get defaultFetchPolicy() {
59
+ return this._defaultFetchPolicy;
60
+ }
36
61
  constructor(platform, apollo, httpLink, network, storage, environment, typePolicies, fragments) {
37
62
  super(platform); // Wait platform
38
63
  this.platform = platform;
@@ -43,10 +68,6 @@ export class GraphqlService extends StartableService {
43
68
  this.environment = environment;
44
69
  this.typePolicies = typePolicies;
45
70
  this.fragments = fragments;
46
- this.connectionParams = {};
47
- this.onNetworkError = new Subject();
48
- this.customErrors = {};
49
- this.onResetAuth = new Subject();
50
71
  this._debug = !environment.production;
51
72
  this._defaultFetchPolicy = environment.apolloFetchPolicy;
52
73
  // Listen network status
@@ -57,15 +78,6 @@ export class GraphqlService extends StartableService {
57
78
  .pipe(throttleTime(300), filter(() => this.network.online), mergeMap(() => this.network.checkPeerAlive()), filter(alive => !alive))
58
79
  .subscribe(() => this.network.setForceOffline(true, { showToast: true }));
59
80
  }
60
- get client() {
61
- return this._data;
62
- }
63
- get cache() {
64
- return this.apollo.client.cache;
65
- }
66
- get defaultFetchPolicy() {
67
- return this._defaultFetchPolicy;
68
- }
69
81
  async setAuthToken(token) {
70
82
  if (token) {
71
83
  console.debug('[graphql] Apply token authentication to headers');
@@ -200,7 +212,7 @@ export class GraphqlService extends StartableService {
200
212
  let data = cache.readQuery({ query: opts.query, variables: opts.variables });
201
213
  if (!data)
202
214
  return; // Skip: nothing in cache
203
- if (!!data[opts.arrayFieldName]) {
215
+ if (data[opts.arrayFieldName]) {
204
216
  // Copy because immutable
205
217
  data = { ...data };
206
218
  // Append to result array
@@ -751,15 +763,15 @@ export class GraphqlService extends StartableService {
751
763
  }
752
764
  return undefined;
753
765
  }
766
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: GraphqlService, deps: [{ token: i1.Platform }, { token: i2.Apollo }, { token: i3.HttpLink }, { token: i4.NetworkService }, { token: i5.StorageService }, { token: ENVIRONMENT }, { token: APP_GRAPHQL_TYPE_POLICIES, optional: true }, { token: APP_GRAPHQL_FRAGMENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
767
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: GraphqlService, providedIn: 'root' });
754
768
  }
755
- GraphqlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GraphqlService, deps: [{ token: i1.Platform }, { token: i2.Apollo }, { token: i3.HttpLink }, { token: i4.NetworkService }, { token: i5.StorageService }, { token: ENVIRONMENT }, { token: APP_GRAPHQL_TYPE_POLICIES, optional: true }, { token: APP_GRAPHQL_FRAGMENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
756
- GraphqlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GraphqlService, providedIn: 'root' });
757
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GraphqlService, decorators: [{
769
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: GraphqlService, decorators: [{
758
770
  type: Injectable,
759
771
  args: [{
760
772
  providedIn: 'root'
761
773
  }]
762
- }], ctorParameters: function () { return [{ type: i1.Platform }, { type: i2.Apollo }, { type: i3.HttpLink }, { type: i4.NetworkService }, { type: i5.StorageService }, { type: i6.Environment, decorators: [{
774
+ }], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Apollo }, { type: i3.HttpLink }, { type: i4.NetworkService }, { type: i5.StorageService }, { type: i6.Environment, decorators: [{
763
775
  type: Inject,
764
776
  args: [ENVIRONMENT]
765
777
  }] }, { type: undefined, decorators: [{
@@ -772,5 +784,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
772
784
  }, {
773
785
  type: Inject,
774
786
  args: [APP_GRAPHQL_FRAGMENTS]
775
- }] }]; } });
776
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2dyYXBocWwvZ3JhcGhxbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvRCxPQUFPLEVBRUwsWUFBWSxFQUNaLFVBQVUsRUFHVixhQUFhLEVBRWIsYUFBYSxHQUlkLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc3RSxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUVqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixxQkFBcUIsR0FDdEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxpQkFBaUIsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLHVCQUF1QixNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sa0JBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBVyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztB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eUIsNkJBQ3pCLHFCQUFxQjsrR0FoQ2hDLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkErQkksTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx5QkFBeUI7OzBCQUM1QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBvbGxvLCBFeHRyYVN1YnNjcmlwdGlvbk9wdGlvbnMsIFF1ZXJ5UmVmIH0gZnJvbSAnYXBvbGxvLWFuZ3VsYXInO1xuaW1wb3J0IHtcbiAgQXBvbGxvQ2FjaGUsXG4gIEFwb2xsb0NsaWVudCxcbiAgQXBvbGxvTGluayxcbiAgQXBvbGxvUXVlcnlSZXN1bHQsXG4gIEZldGNoUG9saWN5LFxuICBJbk1lbW9yeUNhY2hlLFxuICBNdXRhdGlvblVwZGF0ZXJGbixcbiAgTmV0d29ya1N0YXR1cyxcbiAgT3BlcmF0aW9uVmFyaWFibGVzLFxuICBUeXBlUG9saWNpZXMsXG4gIFdhdGNoUXVlcnlGZXRjaFBvbGljeSxcbn0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBTZXJ2ZXJFcnJvckNvZGVzLCBTZXJ2aWNlRXJyb3IgfSBmcm9tICcuLi9zZXJ2aWNlcy9lcnJvcnMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmlyc3QsIG1hcCwgbWVyZ2VNYXAsIHRha2VVbnRpbCwgdGhyb3R0bGVUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblR5cGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9uZXR3b3JrLnR5cGVzJztcbmltcG9ydCB7XG4gIEFwcFdlYlNvY2tldCxcbiAgY3JlYXRlVHJhY2tlckxpbmssXG4gIEVtcHR5T2JqZWN0LFxuICBpc011dGF0aW9uT3BlcmF0aW9uLFxuICBpc1N1YnNjcmlwdGlvbk9wZXJhdGlvbixcbiAgcmVzdG9yZVRyYWNrZWRRdWVyaWVzLFxuICBTdG9yYWdlU2VydmljZVdyYXBwZXIsXG59IGZyb20gJy4vZ3JhcGhxbC51dGlscyc7XG5pbXBvcnQgeyBSZXRyeUxpbmsgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9saW5rL3JldHJ5JztcbmltcG9ydCBxdWV1ZUxpbmtJbXBvcnRlZCBmcm9tICdhcG9sbG8tbGluay1xdWV1ZSc7XG5pbXBvcnQgc2VyaWFsaXppbmdMaW5rSW1wb3J0ZWQgZnJvbSAnYXBvbGxvLWxpbmstc2VyaWFsaXplJztcbmltcG9ydCBsb2dnZXJMaW5rSW1wb3J0ZWQgZnJvbSAnYXBvbGxvLWxpbmstbG9nZ2VyJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgRW50aXR5VXRpbHMsIElFbnRpdHkgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgaXNOaWwsIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIHRvTnVtYmVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBSZXNvbHZlcnMgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSHR0cExpbmssIE9wdGlvbnMgfSBmcm9tICdhcG9sbG8tYW5ndWxhci9odHRwJztcbmltcG9ydCB7IHBlcnNpc3RDYWNoZSwgUGVyc2lzdGVudFN0b3JhZ2UgfSBmcm9tICdhcG9sbG8zLWNhY2hlLXBlcnNpc3QnO1xuaW1wb3J0IHsgRXJyb3JQb2xpY3ksIE11dGF0aW9uQmFzZU9wdGlvbnMgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlL3dhdGNoUXVlcnlPcHRpb25zJztcbmltcG9ydCB7IENhY2hlIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY2FjaGUvY29yZS90eXBlcy9DYWNoZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgUHJvcGVydGllc01hcCB9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBHcmFwaFFMV3NMaW5rIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvbGluay9zdWJzY3JpcHRpb25zJztcbmltcG9ydCB7IENsaWVudE9wdGlvbnMsIGNyZWF0ZUNsaWVudCB9IGZyb20gJ2dyYXBocWwtd3MnO1xuaW1wb3J0IHsgdW53cmFwRVNNb2R1bGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kdWxlcyc7XG5pbXBvcnQgeyBjcmVhdGVGcmFnbWVudFJlZ2lzdHJ5IH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY2FjaGUvaW5tZW1vcnkvZnJhZ21lbnRSZWdpc3RyeSc7XG5pbXBvcnQgeyBEb2N1bWVudE5vZGUgfSBmcm9tICdncmFwaHFsJztcblxuLy8gV29ya2Fyb3VuZCBmb3IgaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL25nLXBhY2thZ3IvbmctcGFja2Fnci9pc3N1ZXMvMjIxNVxuY29uc3QgUXVldWVMaW5rID0gdW53cmFwRVNNb2R1bGUocXVldWVMaW5rSW1wb3J0ZWQpO1xuY29uc3QgU2VyaWFsaXppbmdMaW5rID0gdW53cmFwRVNNb2R1bGUoc2VyaWFsaXppbmdMaW5rSW1wb3J0ZWQpO1xuY29uc3QgbG9nZ2VyTGluayA9IHVud3JhcEVTTW9kdWxlKGxvZ2dlckxpbmtJbXBvcnRlZCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hRdWVyeU9wdGlvbnM8Vj4ge1xuICBxdWVyeTogYW55O1xuICB2YXJpYWJsZXM/OiBWO1xuICBlcnJvcj86IFNlcnZpY2VFcnJvcjtcbiAgZmV0Y2hQb2xpY3k/OiBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3k7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXV0YXRlUXVlcnlPcHRpb25zPFQsIFYgPSBPcGVyYXRpb25WYXJpYWJsZXM+IGV4dGVuZHMgTXV0YXRpb25CYXNlT3B0aW9uczxULCBWPiB7XG4gIG11dGF0aW9uOiBhbnk7XG4gIHZhcmlhYmxlcz86IFY7XG4gIGVycm9yPzogU2VydmljZUVycm9yO1xuICBjb250ZXh0Pzoge1xuICAgIHNlcmlhbGl6YXRpb25LZXk/OiBzdHJpbmc7XG4gICAgdHJhY2tlZD86IGJvb2xlYW47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgfTtcbiAgb3B0aW1pc3RpY1Jlc3BvbnNlPzogVDtcbiAgb2ZmbGluZVJlc3BvbnNlPzogVCB8ICgoY29udGV4dDogYW55KSA9PiBQcm9taXNlPFQ+KTtcbiAgdXBkYXRlPzogTXV0YXRpb25VcGRhdGVyRm48VD47XG4gIGZvcmNlT2ZmbGluZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBBUFBfR1JBUEhRTF9UWVBFX1BPTElDSUVTID0gbmV3IEluamVjdGlvblRva2VuPFR5cGVQb2xpY2llcz4oJ2dyYXBocWxUeXBlUG9saWNpZXMnKTtcblxuZXhwb3J0IGNvbnN0IEFQUF9HUkFQSFFMX0ZSQUdNRU5UUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEb2N1bWVudE5vZGVbXT4oJ2dyYXBocWxGcmFnbWVudHMnKTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25QYXJhbXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgYXV0aFRva2VuPzogc3RyaW5nO1xuICBhdXRoQmFzaWM/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEdyYXBocWxTZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlU2VydmljZTxBcG9sbG9DbGllbnQ8YW55Pj4ge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25ldHdvcmtTdGF0dXNDaGFuZ2VkJDogT2JzZXJ2YWJsZTxDb25uZWN0aW9uVHlwZT47XG5cbiAgcHJpdmF0ZSBodHRwUGFyYW1zOiBPcHRpb25zO1xuICBwcml2YXRlIHdzUGFyYW1zOiBDbGllbnRPcHRpb25zPENvbm5lY3Rpb25QYXJhbXM+O1xuICBwcml2YXRlIGNvbm5lY3Rpb25QYXJhbXM6IENvbm5lY3Rpb25QYXJhbXMgPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEZldGNoUG9saWN5OiBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3k7XG4gIHByaXZhdGUgb25OZXR3b3JrRXJyb3IgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHByaXZhdGUgY3VzdG9tRXJyb3JzOiBQcm9wZXJ0aWVzTWFwID0ge307XG4gIHByaXZhdGUgb25SZXNldEF1dGggID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBnZXQgY2xpZW50KCk6IEFwb2xsb0NsaWVudDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIGdldCBjYWNoZSgpOiBBcG9sbG9DYWNoZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5hcG9sbG8uY2xpZW50LmNhY2hlO1xuICB9XG5cbiAgZ2V0IGRlZmF1bHRGZXRjaFBvbGljeSgpOiBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3kge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RmV0Y2hQb2xpY3k7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBwcml2YXRlIGFwb2xsbzogQXBvbGxvLFxuICAgIHByaXZhdGUgaHR0cExpbms6IEh0dHBMaW5rLFxuICAgIHByaXZhdGUgbmV0d29yazogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlU2VydmljZSxcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0dSQVBIUUxfVFlQRV9QT0xJQ0lFUykgcHJpdmF0ZSB0eXBlUG9saWNpZXM6IFR5cGVQb2xpY2llcyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9HUkFQSFFMX0ZSQUdNRU5UUykgcHJpdmF0ZSBmcmFnbWVudHM6IERvY3VtZW50Tm9kZVtdXG4gICkge1xuICAgIHN1cGVyKHBsYXRmb3JtKTsgLy8gV2FpdCBwbGF0Zm9ybVxuXG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICB0aGlzLl9kZWZhdWx0RmV0Y2hQb2xpY3kgPSBlbnZpcm9ubWVudC5hcG9sbG9GZXRjaFBvbGljeTtcblxuICAgIC8vIExpc3RlbiBuZXR3b3JrIHN0YXR1c1xuICAgIHRoaXMuX25ldHdvcmtTdGF0dXNDaGFuZ2VkJCA9IG5ldHdvcmsub25OZXR3b3JrU3RhdHVzQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihpc05vdE5pbCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICk7XG5cbiAgICAvLyBXaGVuIGdldHRpbmcgbmV0d29yayBlcnJvcjogdHJ5IHRvIHBpbmcgcGVlciwgYW5kIHRvZ2dsZSB0byBvZmZsaW5lXG4gICAgdGhpcy5vbk5ldHdvcmtFcnJvclxuICAgICAgLnBpcGUoXG4gICAgICAgIHRocm90dGxlVGltZSgzMDApLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5uZXR3b3JrLm9ubGluZSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMubmV0d29yay5jaGVja1BlZXJBbGl2ZSgpKSxcbiAgICAgICAgZmlsdGVyKGFsaXZlID0+ICFhbGl2ZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5uZXR3b3JrLnNldEZvcmNlT2ZmbGluZSh0cnVlLCB7c2hvd1RvYXN0OiB0cnVlfSkpO1xuXG4gIH1cblxuICBhc3luYyBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZykge1xuICAgIGlmICh0b2tlbikge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIEFwcGx5IHRva2VuIGF1dGhlbnRpY2F0aW9uIHRvIGhlYWRlcnMnKTtcbiAgICAgIHRoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoVG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgLy8gQ2xlYW4gYXV0aCB0b2tlblxuICAgIGVsc2UgaWYgKHRoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoVG9rZW4pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tncmFwaHFsXSBSZW1vdmUgdG9rZW4gYXV0aGVudGljYXRpb24gZnJvbSBoZWFkZXJzJyk7XG4gICAgICBkZWxldGUgdGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhUb2tlbjtcblxuICAgICAgYXdhaXQgdGhpcy5jbGVhckNhY2hlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2V0QXV0aEJhc2ljKGJhc2ljOiBzdHJpbmcpIHtcbiAgICBpZiAoYmFzaWMpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tncmFwaHFsXSBBcHBseSBiYXNpYyBhdXRoZW50aWNhdGlvbiB0byBoZWFkZXJzJyk7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aEJhc2ljID0gYmFzaWM7XG4gICAgfVxuICAgIC8vIENsZWFuIGF1dGggYmFzaWNcbiAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aEJhc2ljKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gUmVtb3ZlIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGZyb20gaGVhZGVycycpO1xuICAgICAgZGVsZXRlIHRoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoQmFzaWM7XG5cbiAgICAgIGF3YWl0IHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBhZGQgYSBmaWVsZCByZXNvbHZlclxuICAgKiAgKHNlZSBkb2M6IGh0dHBzOi8vd3d3LmFwb2xsb2dyYXBocWwuY29tL2RvY3MvcmVhY3QvZGF0YS9sb2NhbC1zdGF0ZS8jaGFuZGxpbmctY2xpZW50LWZpZWxkcy13aXRoLXJlc29sdmVycylcbiAgICpcbiAgICogQHBhcmFtIHJlc29sdmVyc1xuICAgKi9cbiAgYXN5bmMgYWRkUmVzb2x2ZXIocmVzb2x2ZXJzOiBSZXNvbHZlcnMgfCBSZXNvbHZlcnNbXSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgdGhpcy5hcG9sbG8uY2xpZW50LmFkZFJlc29sdmVycyhyZXNvbHZlcnMpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnk8VCwgViA9IEVtcHR5T2JqZWN0PihvcHRzOiB7XG4gICAgcXVlcnk6IGFueTtcbiAgICB2YXJpYWJsZXM/OiBWO1xuICAgIGVycm9yPzogU2VydmljZUVycm9yO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gIH0pOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIGxldCByZXM6IEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+O1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5xdWVyeTxULCBWPih7XG4gICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICBmZXRjaFBvbGljeTogb3B0cy5mZXRjaFBvbGljeSB8fCAodGhpcy5fZGVmYXVsdEZldGNoUG9saWN5IGFzIEZldGNoUG9saWN5KSB8fCB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVzID0gdGhpcy50b0Fwb2xsb0Vycm9yPFQ+KGVyciwgb3B0cy5lcnJvcik7XG4gICAgfVxuICAgIGlmIChyZXMuZXJyb3JzKSB7XG4gICAgICB0aHJvdyByZXMuZXJyb3JzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmRhdGE7XG4gIH1cblxuICB3YXRjaFF1ZXJ5UmVmPFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0czogV2F0Y2hRdWVyeU9wdGlvbnM8Vj4pOiBRdWVyeVJlZjxULCBWPiB7XG4gICAgcmV0dXJuIHRoaXMuYXBvbGxvLndhdGNoUXVlcnk8VCwgVj4oe1xuICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdHMuZmV0Y2hQb2xpY3kgfHwgKHRoaXMuX2RlZmF1bHRGZXRjaFBvbGljeSBhcyBGZXRjaFBvbGljeSkgfHwgdW5kZWZpbmVkLFxuICAgICAgbm90aWZ5T25OZXR3b3JrU3RhdHVzQ2hhbmdlOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBxdWVyeVJlZlZhbHVlc0NoYW5nZXM8VCwgViA9IEVtcHR5T2JqZWN0PihxdWVyeVJlZjogUXVlcnlSZWY8VCwgVj4sIG9wdHM6IFdhdGNoUXVlcnlPcHRpb25zPFY+KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHF1ZXJ5UmVmXG4gICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLm9uQXBvbGxvRXJyb3I8VD4oZXJyb3IsIG9wdHMuZXJyb3IpKSxcbiAgICAgICAgZmlsdGVyKHZhbHVlID0+IHZhbHVlLm5ldHdvcmtTdGF0dXMgPT09IE5ldHdvcmtTdGF0dXMucmVhZHkgfHwgdmFsdWUubmV0d29ya1N0YXR1cyA9PT0gTmV0d29ya1N0YXR1cy5lcnJvciksXG4gICAgICAgIG1hcCgoe2RhdGEsIGVycm9yc30pID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHdhdGNoUXVlcnk8VCwgViA9IEVtcHR5T2JqZWN0PihvcHRzOiBXYXRjaFF1ZXJ5T3B0aW9uczxWPik6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHF1ZXJ5UmVmOiBRdWVyeVJlZjxULCBWPiA9IHRoaXMud2F0Y2hRdWVyeVJlZihvcHRzKTtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVJlZlZhbHVlc0NoYW5nZXMocXVlcnlSZWYsIG9wdHMpO1xuICB9XG5cbiAgYXN5bmMgbXV0YXRlPFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0czogTXV0YXRlUXVlcnlPcHRpb25zPFQsIFY+KTogUHJvbWlzZTxUPiB7XG5cbiAgICAvLyBJZiBvZmZsaW5lLCBjb21wdXRlIGFuIG9wdGltaXN0aWMgcmVzcG9uc2UgZm9yIHRyYWNrZWQgcXVlcmllc1xuICAgIGlmICgob3B0cy5mb3JjZU9mZmxpbmUgfHwgdGhpcy5uZXR3b3JrLm9mZmxpbmUpICYmIG9wdHMub2ZmbGluZVJlc3BvbnNlKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMub2ZmbGluZVJlc3BvbnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdHMuY29udGV4dCA9IG9wdHMuY29udGV4dCB8fCB7fTtcbiAgICAgICAgY29uc3Qgb3B0aW1pc3RpY1Jlc3BvbnNlRm4gPSAob3B0cy5vZmZsaW5lUmVzcG9uc2UgYXMgKChjb250ZXh0OiBhbnkpID0+IFByb21pc2U8VD4pKTtcbiAgICAgICAgb3B0cy5vcHRpbWlzdGljUmVzcG9uc2UgPSBhd2FpdCBvcHRpbWlzdGljUmVzcG9uc2VGbihvcHRzLmNvbnRleHQpO1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1tncmFwaHFsXSBbb2ZmbGluZV0gVXNpbmcgYW4gb3B0aW1pc3RpYyByZXNwb25zZTogJywgb3B0cy5vcHRpbWlzdGljUmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG9wdHMub3B0aW1pc3RpY1Jlc3BvbnNlID0gb3B0cy5vZmZsaW5lUmVzcG9uc2UgYXMgVDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLmZvcmNlT2ZmbGluZSkge1xuICAgICAgICBjb25zdCByZXMgPSB7ZGF0YTogb3B0cy5vcHRpbWlzdGljUmVzcG9uc2V9O1xuICAgICAgICBpZiAob3B0cy51cGRhdGUpIHtcbiAgICAgICAgICBvcHRzLnVwZGF0ZSh0aGlzLmFwb2xsby5jbGllbnQuY2FjaGUsIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcy5kYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXBvbGxvLm11dGF0ZTxBcG9sbG9RdWVyeVJlc3VsdDxUPiwgVj4oe1xuICAgICAgbXV0YXRpb246IG9wdHMubXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgY29udGV4dDogb3B0cy5jb250ZXh0LFxuICAgICAgb3B0aW1pc3RpY1Jlc3BvbnNlOiBvcHRzLm9wdGltaXN0aWNSZXNwb25zZSBhcyBhbnksXG4gICAgICB1cGRhdGU6IG9wdHMudXBkYXRlIGFzIGFueVxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLm9uQXBvbGxvRXJyb3I8VD4oZXJyb3IsIG9wdHMuZXJyb3IpKSxcbiAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgLy8gVG8gZGVidWcsIGlmIG5lZWQ6XG4gICAgICAgIC8vdGFwKChyZXMpID0+ICghcmVzKSAmJiBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gVW5rbm93biBlcnJvciBkdXJpbmcgbXV0YXRpb24uIENoZWNrIGVycm9ycyBpbiBjb25zb2xlIChtYXkgYmUgYW4gaW52YWxpZCBnZW5lcmF0ZWQgY2FjaGUgaWQgPyknKSlcbiAgICAgICkpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlcy5lcnJvcnMpKSB7XG4gICAgICB0aHJvdyByZXMuZXJyb3JzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmRhdGEgYXMgVDtcbiAgfVxuXG4gIHN1YnNjcmliZTxULCBWID0gRW1wdHlPYmplY3Q+KG9wdHM6IHtcbiAgICBxdWVyeTogYW55O1xuICAgIHZhcmlhYmxlczogVjtcbiAgICBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5O1xuICAgIGVycm9yUG9saWN5PzogRXJyb3JQb2xpY3k7XG4gICAgZXJyb3I/OiBTZXJ2aWNlRXJyb3I7XG4gIH0sIGV4dHJhPzogRXh0cmFTdWJzY3JpcHRpb25PcHRpb25zKTogT2JzZXJ2YWJsZTxUPiB7XG5cbiAgICByZXR1cm4gdGhpcy5hcG9sbG8uc3Vic2NyaWJlPFQ+KHtcbiAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdHMgJiYgb3B0cy5mZXRjaFBvbGljeSB8fCAnbmV0d29yay1vbmx5JyxcbiAgICAgIGVycm9yUG9saWN5OiBvcHRzICYmIG9wdHMuZXJyb3JQb2xpY3kgfHwgdW5kZWZpbmVkLFxuICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlc1xuICAgIH0sIHtcbiAgICAgIHVzZVpvbmU6IHRydWUsXG4gICAgICAuLi5leHRyYVxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB0aGlzLm9uQXBvbGxvRXJyb3I8VD4oZXJyb3IsIG9wdHMuZXJyb3IpKSxcbiAgICAgICAgbWFwKCh7ZGF0YSwgZXJyb3JzfSkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yc1swXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgaW5zZXJ0SW50b1F1ZXJ5Q2FjaGU8VCwgViA9IEVtcHR5T2JqZWN0PihjYWNoZTogQXBvbGxvQ2FjaGU8YW55PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzOiBDYWNoZS5SZWFkUXVlcnlPcHRpb25zPFYsIGFueT4gJiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxGaWVsZE5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydEZuPzogKGQxOiBULCBkMjogVCkgPT4gbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT86IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSB7XG5cbiAgICBjYWNoZSA9IGNhY2hlIHx8IHRoaXMuYXBvbGxvLmNsaWVudC5jYWNoZTtcbiAgICBvcHRzLmFycmF5RmllbGROYW1lID0gb3B0cy5hcnJheUZpZWxkTmFtZSB8fCAnZGF0YSc7XG5cbiAgICB0cnkge1xuICAgICAgbGV0IGRhdGEgPSBjYWNoZS5yZWFkUXVlcnk8YW55LCBWPih7cXVlcnk6IG9wdHMucXVlcnksIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXN9KTtcblxuICAgICAgaWYgKCFkYXRhKSByZXR1cm47IC8vIFNraXA6IG5vdGhpbmcgaW4gY2FjaGVcblxuICAgICAgaWYgKCEhZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSkge1xuICAgICAgICAvLyBDb3B5IGJlY2F1c2UgaW1tdXRhYmxlXG4gICAgICAgIGRhdGEgPSB7IC4uLmRhdGEgfTtcblxuICAgICAgICAvLyBBcHBlbmQgdG8gcmVzdWx0IGFycmF5XG4gICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0gPSBbIC4uLmRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0sIHsuLi5vcHRzLmRhdGF9XTtcblxuICAgICAgICAvLyBSZXNvcnQsIGlmIG5lZWRcbiAgICAgICAgaWYgKG9wdHMuc29ydEZuKSB7XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zb3J0KG9wdHMuc29ydEZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4Y2x1ZGUgaWYgZXhjZWVkIG1heCBzaXplXG4gICAgICAgIGNvbnN0IHNpemUgPSB0b051bWJlcihvcHRzLnZhcmlhYmxlcyAmJiBvcHRzLnZhcmlhYmxlc1snc2l6ZSddLCAtMSk7XG4gICAgICAgIGlmIChzaXplID4gMCAmJiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLmxlbmd0aCA+IHNpemUpIHtcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNwbGljZShzaXplLCBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLmxlbmd0aCAtIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHRvdGFsXG4gICAgICAgIGlmIChpc05vdE5pbChvcHRzLnRvdGFsRmllbGROYW1lKSkge1xuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy50b3RhbEZpZWxkTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FjaGUud3JpdGVRdWVyeSh7XG4gICAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy5hcnJheUZpZWxkTmFtZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgLy8gcmVhZCBpbiBjYWNoZSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYSByZXN1bHQuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9yZWFjdC1hcG9sbG8vaXNzdWVzLzE3NzYjaXNzdWVjb21tZW50LTM3MjIzNzk0MFxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgdXBkYXRpbmcgY2FjaGU6ICcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgYWRkTWFueVRvUXVlcnlDYWNoZTxUID0gYW55LCBWID0gRW1wdHlPYmplY3Q+KGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0czogQ2FjaGUuUmVhZFF1ZXJ5T3B0aW9uczxWLCBhbnk+ICYge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogVFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHNGbj86IChkMTogVCwgZDI6IFQpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbj86IChkMTogVCwgZDI6IFQpID0+IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHtcblxuICAgIGlmICghb3B0cy5kYXRhIHx8ICFvcHRzLmRhdGEubGVuZ3RoKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gcHJvY2Vzc1xuXG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhID0gY2FjaGUucmVhZFF1ZXJ5PGFueSwgVj4oe3F1ZXJ5OiBvcHRzLnF1ZXJ5LCB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzfSk7XG4gICAgICBpZiAoIWRhdGEpIHJldHVybiAwOyAvLyBza2lwXG5cbiAgICAgIGlmIChkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdKSB7XG4gICAgICAgIC8vIENvcHkgYmVjYXVzZSBpbW11dGFibGVcbiAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgICAgIC8vIEtlZXAgb25seSBub3QgZXhpc3RpbmcgcmVzXG4gICAgICAgIGNvbnN0IGVxdWFsc0ZuID0gb3B0cy5lcXVhbHNGbiB8fCAoKGQxLCBkMikgPT4gZDFbJ2lkJ10gPT09IGQyWydpZCddICYmIGQxWydlbnRpdHlOYW1lJ10gPT09IGQyWydlbnRpdHlOYW1lJ10pO1xuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IG9wdHMuZGF0YS5maWx0ZXIoaW5wdXRWYWx1ZSA9PiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLmZpbmRJbmRleChleGlzdGluZ1ZhbHVlID0+IGVxdWFsc0ZuKGlucHV0VmFsdWUsIGV4aXN0aW5nVmFsdWUpKSA9PT0gLTEpO1xuXG4gICAgICAgIGlmICghbmV3SXRlbXMubGVuZ3RoKSByZXR1cm47IC8vIE5vIG5ldyB2YWx1ZVxuXG4gICAgICAgIC8vIEFwcGVuZCB0byBhcnJheVxuICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gWyAuLi5kYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLCAuLi5uZXdJdGVtc107XG5cbiAgICAgICAgLy8gUmVzb3J0LCBpZiBuZWVkXG4gICAgICAgIGlmIChvcHRzLnNvcnRGbikge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc29ydChvcHRzLnNvcnRGbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeGNsdWRlIGlmIGV4Y2VlZCBtYXggc2l6ZVxuICAgICAgICBjb25zdCBzaXplID0gdG9OdW1iZXIob3B0cy52YXJpYWJsZXMgJiYgb3B0cy52YXJpYWJsZXNbJ3NpemUnXSwgLTEpO1xuICAgICAgICBpZiAoc2l6ZSA+IDAgJiYgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5sZW5ndGggPiBzaXplKSB7XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zcGxpY2Uoc2l6ZSwgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5sZW5ndGggLSBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY3JlbWVudCB0aGUgdG90YWxcbiAgICAgICAgaWYgKGlzTm90TmlsKG9wdHMudG90YWxGaWVsZE5hbWUpKSB7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0pKSB7XG4gICAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdICs9IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMudG90YWxGaWVsZE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRvIGNhY2hlXG4gICAgICAgIGNhY2hlLndyaXRlUXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMuYXJyYXlGaWVsZE5hbWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gY29udGludWVcbiAgICAgIC8vIHJlYWQgaW4gY2FjaGUgaXMgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgcmVzdWx0LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvcmVhY3QtYXBvbGxvL2lzc3Vlcy8xNzc2I2lzc3VlY29tbWVudC0zNzIyMzc5NDBcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgdXBkYXRpbmcgY2FjaGU6ICcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBmcm9tIGNhY2hlLCBhbmQgcmV0dXJuIGlmIHJlbW92ZWQgb3Igbm90XG4gICAqXG4gICAqIEBwYXJhbSBjYWNoZVxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgcmVtb3ZlRnJvbUNhY2hlZFF1ZXJ5QnlJZDxWID0gRW1wdHlPYmplY3QsIElEID0gbnVtYmVyPihjYWNoZTogQXBvbGxvQ2FjaGU8YW55PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzOiBDYWNoZS5SZWFkUXVlcnlPcHRpb25zPFYsIGFueT4gJiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxGaWVsZE5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHM6IElEOyAvLyBEbyBOT1QgdXNlICdpZCcsIGFzIGFscmVhZHkgdXNlZCBieSB0aGUgQXBvbGxvIEFQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOiBib29sZWFuIHtcblxuICAgIGNhY2hlID0gY2FjaGUgfHwgdGhpcy5hcG9sbG8uY2xpZW50LmNhY2hlO1xuICAgIG9wdHMuYXJyYXlGaWVsZE5hbWUgPSBvcHRzLmFycmF5RmllbGROYW1lIHx8ICdkYXRhJztcblxuICAgIHRyeSB7XG4gICAgICBsZXQgZGF0YSA9IGNhY2hlLnJlYWRRdWVyeTxhbnksIFY+KHtxdWVyeTogb3B0cy5xdWVyeSwgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlc30pO1xuXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdKSB7XG4gICAgICAgIC8vIENvcHkgYmVjYXVzZSBpbW11dGFibGVcbiAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5maW5kSW5kZXgoaXRlbSA9PiBpdGVtWydpZCddID09PSBvcHRzLmlkcyk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTsgLy8gU2tpcCAobm90aGluZyByZW1vdmVkKVxuXG4gICAgICAgIC8vIENvcHksIHRoZW4gcmVtb3ZlIGRlbGV0ZWQgaXRlbVxuICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zbGljZSgpO1xuICAgICAgICBjb25zdCBkZWxldGVkSXRlbSA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc3BsaWNlKGluZGV4LCAxKVswXTtcbiAgICAgICAgY2FjaGUuZXZpY3Qoe2lkOiBjYWNoZS5pZGVudGlmeShkZWxldGVkSXRlbSl9KTtcblxuICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIHRvdGFsXG4gICAgICAgIGlmIChpc05vdE5pbChvcHRzLnRvdGFsRmllbGROYW1lKSkge1xuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSAtPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy50b3RhbEZpZWxkTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgdG8gY2FjaGVcbiAgICAgICAgY2FjaGUud3JpdGVRdWVyeSh7XG4gICAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMuYXJyYXlGaWVsZE5hbWUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgLy8gcmVhZCBpbiBjYWNoZSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYSByZXN1bHQuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9yZWFjdC1hcG9sbG8vaXNzdWVzLzE3NzYjaXNzdWVjb21tZW50LTM3MjIzNzk0MFxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBFcnJvciB3aGlsZSByZW1vdmluZyBmcm9tIGNhY2hlOiAnLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaWRzIGZyb20gY2FjaGUsIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyByZW1vdmVkXG4gICAqXG4gICAqIEBwYXJhbSBjYWNoZVxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgcmVtb3ZlRnJvbUNhY2hlZFF1ZXJ5QnlJZHM8ViA9IEVtcHR5T2JqZWN0LCBJRCA9IG51bWJlcj4oY2FjaGU6IEFwb2xsb0NhY2hlPGFueT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHM6IENhY2hlLlJlYWRRdWVyeU9wdGlvbnM8ViwgYW55PiAmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmllbGROYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkczogSURbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk6IG51bWJlciB7XG5cbiAgICBjYWNoZSA9IGNhY2hlIHx8IHRoaXMuYXBvbGxvLmNsaWVudC5jYWNoZTtcbiAgICBvcHRzLmFycmF5RmllbGROYW1lID0gb3B0cy5hcnJheUZpZWxkTmFtZSB8fCAnZGF0YSc7XG5cbiAgICB0cnkge1xuICAgICAgbGV0IGRhdGEgPSBjYWNoZS5yZWFkUXVlcnkob3B0cyk7XG5cbiAgICAgIGlmIChkYXRhICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0pIHtcbiAgICAgICAgLy8gQ29weSBiZWNhdXNlIGltbXV0YWJsZVxuICAgICAgICBkYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICAgICAgY29uc3QgZGVsZXRlZEluZGV4ZXMgPSBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnJlZHVjZSgocmVzLCBpdGVtLCBpbmRleCkgPT4gb3B0cy5pZHMuaW5jbHVkZXMoaXRlbVsnaWQnXSkgPyByZXMuY29uY2F0KGluZGV4KSA6IHJlcywgW10pO1xuXG4gICAgICAgIGlmIChkZWxldGVkSW5kZXhlcy5sZW5ndGggPD0gMCkgcmV0dXJuIDA7IC8vIFNraXAgKG5vdGhpbmcgcmVtb3ZlZClcblxuICAgICAgICAvLyBRdWVyeSBoYXMgTk8gdG90YWxcbiAgICAgICAgaWYgKGlzTmlsKG9wdHMudG90YWxGaWVsZE5hbWUpKSB7XG5cbiAgICAgICAgICAvLyBFdmljdCBlYWNoIG9iamVjdFxuICAgICAgICAgIGRlbGV0ZWRJbmRleGVzXG4gICAgICAgICAgICAubWFwKGluZGV4ID0+IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV1baW5kZXhdKVxuICAgICAgICAgICAgLm1hcChpdGVtID0+IGNhY2hlLmlkZW50aWZ5KGl0ZW0pKVxuICAgICAgICAgICAgLmZvckVhY2goaWQgPT4gY2FjaGUuZXZpY3Qoe2lkfSkpO1xuXG4gICAgICAgIH1cbiAgICAgICAgLy8gUXVlcnkgaGFzIGEgdG90YWxcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gQ29weSB0aGUgYXJyYXlcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zbGljZSgpO1xuXG4gICAgICAgICAgLy8gcmVtb3ZlIGZyb20gYXJyYXksIHRoZW4gZXZpY3RcbiAgICAgICAgICBkZWxldGVkSW5kZXhlc1xuICAgICAgICAgICAgLy8gUmV2ZXJzZTogdG8ga2VlcCB2YWxpZCBpbmRleFxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gdGhlIGFycmF5XG4gICAgICAgICAgICAubWFwKGluZGV4ID0+IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc3BsaWNlKGluZGV4LCAxKVswXSlcbiAgICAgICAgICAgIC8vIEV2aWN0IGZyb20gY2FjaGVcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBjYWNoZS5pZGVudGlmeShpdGVtKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGlkID0+IGNhY2hlLmV2aWN0KHtpZH0pKTtcblxuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSAtPSBkZWxldGVkSW5kZXhlcy5sZW5ndGg7IC8vIFJlbW92ZSBkZWxldGlvbiBjb3VudFxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgdGhlIHRvdGFsIGluIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMudG90YWxGaWVsZE5hbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhY2hlLndyaXRlUXVlcnkoe1xuICAgICAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICAgICAgZGF0YVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIGRlbGV0ZWRJbmRleGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy5hcnJheUZpZWxkTmFtZSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gY29udGludWVcbiAgICAgIC8vIHJlYWQgaW4gY2FjaGUgaXMgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgcmVzdWx0LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvcmVhY3QtYXBvbGxvL2lzc3Vlcy8xNzc2I2lzc3VlY29tbWVudC0zNzIyMzc5NDBcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgcmVtb3ZpbmcgZnJvbSBjYWNoZTogJywgZXJyKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRvUXVlcnlDYWNoZTxUIGV4dGVuZHMgSUVudGl0eTxhbnk+LFxuICAgIFYgPSBFbXB0eU9iamVjdD4oY2FjaGU6IEFwb2xsb0NhY2hlPGFueT4sXG4gICAgICAgICAgICAgICAgICAgICBvcHRzOiBDYWNoZS5SZWFkUXVlcnlPcHRpb25zPFYsIGFueT4gJiB7XG4gICAgICAgICAgICAgICAgICAgICAgIGFycmF5RmllbGROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmllbGROYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBUO1xuICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHNGbj86IChkMTogVCwgZDI6IFQpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICB9KSB7XG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSBjYWNoZS5yZWFkUXVlcnkob3B0cyk7XG5cbiAgICAgIGlmIChkYXRhICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0pIHtcbiAgICAgICAgLy8gQ29weSBiZWNhdXNlIGltbXV0YWJsZVxuICAgICAgICBkYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICAgICAgY29uc3QgZXF1YWxzRm4gPSBvcHRzLmVxdWFsc0ZuIHx8ICgoZDEsIGQyKSA9PiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGlmIGV4aXN0cywgb3IgaW5zZXJ0XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5maW5kSW5kZXgodiA9PiBlcXVhbHNGbihvcHRzLmRhdGEsIHYpKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0gPSBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNsaWNlKCkuc3BsaWNlKGluZGV4LCAxLCBvcHRzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0gPSBbIC4uLmRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0sIG9wdHMuZGF0YV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNyZW1lbnQgdG90YWwgKGlmIGNoYW5nZWQpXG4gICAgICAgIGlmIChpc05vdE5pbChvcHRzLnRvdGFsRmllbGROYW1lKSAmJiBpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBpZiAoaXNOb3ROaWwoZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSkpIHtcbiAgICAgICAgICAgIGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0gKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMudG90YWxGaWVsZE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhY2hlLndyaXRlUXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuOyAvLyBPSzogc3RvcCBoZXJlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgLy8gcmVhZCBpbiBjYWNoZSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYSByZXN1bHQuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9yZWFjdC1hcG9sbG8vaXNzdWVzLzE3NzYjaXNzdWVjb21tZW50LTM3MjIzNzk0MFxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBFcnJvciB3aGlsZSB1cGRhdGluZyBjYWNoZTogJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhckNhY2hlKGNsaWVudD86IEFwb2xsb0NsaWVudDxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY2xpZW50ID0gKGNsaWVudCB8fCB0aGlzLmNsaWVudCkgYXMgQXBvbGxvQ2xpZW50PGFueT47XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gQ2xlYW5pbmcgY2FjaGUuLi4gJyk7XG4gICAgICBjb25zdCBub3cgPSB0aGlzLl9kZWJ1ZyAmJiBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDbGVhcmluZyB0aGUgY2FjaGVcbiAgICAgIGF3YWl0IGNsaWVudC5jYWNoZS5yZXNldCgpO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtncmFwaHFsXSBDbGVhbmluZyBjYWNoZSBbT0tdIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyQ3VzdG9tRXJyb3IoZXJyb3I6IFByb3BlcnRpZXNNYXApIHtcbiAgICB0aGlzLmN1c3RvbUVycm9ycyA9IHsuLi50aGlzLmN1c3RvbUVycm9ycywgLi4uZXJyb3J9O1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8QXBvbGxvQ2xpZW50PGFueT4+IHtcblxuICAgIC8vIFdhaXQgbmV0d29yayBhbmQgc3RvcmFnZVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuc3RvcmFnZS5yZWFkeSgpLFxuICAgICAgdGhpcy5uZXR3b3JrLnJlYWR5KClcbiAgICBdKTtcblxuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIFN0YXJ0aW5nIGdyYXBocWwuLi4nKTtcbiAgICBjb25zdCBtb2JpbGUgPSBpc01vYmlsZSh3aW5kb3cpO1xuICAgIGNvbnN0IGVuYWJsZVRyYWNrTXV0YXRpb25RdWVyaWVzID0gIW1vYmlsZTtcblxuICAgIGNvbnN0IHBlZXIgPSB0aGlzLm5ldHdvcmsucGVlcjtcbiAgICBpZiAoIXBlZXIpIHRocm93IEVycm9yKCdbZ3JhcGhxbF0gTWlzc2luZyBwZWVyLiBVbmFibGUgdG8gc3RhcnQgZ3JhcGhxbCBzZXJ2aWNlJyk7XG5cbiAgICBjb25zdCB1cmkgPSBwZWVyLnVybCArICcvZ3JhcGhxbCc7XG4gICAgY29uc3Qgd3NVcmwgPSB1cmkucmVwbGFjZSgvXmh0dHAocyk/Oi8sICd3cyQxOicpICsgJy93ZWJzb2NrZXQnO1xuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIEJhc2UgdXJpOiAnICsgdXJpKTtcbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBTdWJzY3JpcHRpb24gdXJpOiAnICsgd3NVcmwpO1xuXG4gICAgdGhpcy5odHRwUGFyYW1zID0gdGhpcy5odHRwUGFyYW1zIHx8IHt9O1xuICAgIHRoaXMuaHR0cFBhcmFtcy51cmkgPSB1cmk7XG5cbiAgICB0aGlzLndzUGFyYW1zID0ge1xuICAgICAgLi4udGhpcy53c1BhcmFtcyxcbiAgICAgIGxhenk6IHRydWUsXG4gICAgICBjb25uZWN0aW9uUGFyYW1zOiB0aGlzLmNvbm5lY3Rpb25QYXJhbXMsXG4gICAgICB3ZWJTb2NrZXRJbXBsOiBBcHBXZWJTb2NrZXQsXG4gICAgICB1cmw6IHdzVXJsLFxuICAgICAgc2hvdWxkUmV0cnk6IChlcnJPckNsb3NlRXZlbnQpID0+IHtcbiAgICAgICAgLy8gSWYgV1MgVVJMIGNoYW5nZWQsIHRoZW4gZG8gbm90IHJldHJ5XG4gICAgICAgIGlmICh3c1VybCAhPT0gdGhpcy53c1BhcmFtcy51cmwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbC1zZXJ2aWNlXSBbV1NdIFRyeWluZyB0byByZWNvbm5lY3QuLi4nLCBlcnJPckNsb3NlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICByZXRyeUF0dGVtcHRzOiAxMFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSBzdG9yYWdlIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBzdG9yYWdlOiBQZXJzaXN0ZW50U3RvcmFnZTxzdHJpbmc+ID0gbmV3IFN0b3JhZ2VTZXJ2aWNlV3JhcHBlcih0aGlzLnN0b3JhZ2UpO1xuXG4gICAgbGV0IGNsaWVudCA9IHRoaXMuYXBvbGxvLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIENyZWF0aW5nIEFwb2xsbyBHcmFwaFFMIGNsaWVudC4uLicpO1xuXG4gICAgICAvLyBXZWJzb2NrZXQgbGlua1xuICAgICAgY29uc3Qgd3NMaW5rID0gbmV3IEdyYXBoUUxXc0xpbmsoY3JlYXRlQ2xpZW50KHRoaXMud3NQYXJhbXMpKTtcbiAgICAgIHRoaXMub25SZXNldEF1dGhcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuc3RvcFN1YmplY3QpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBDbG9zaW5nIHdlYnNvY2tldCBjbGllbnQsIHRvIGZvcmNlIHVuYXV0aCcpO1xuICAgICAgICAgIHdzTGluay5jbGllbnQuZGlzcG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gUmV0cnkgd2hlbiBmYWlsZWQgbGlua1xuICAgICAgY29uc3QgcmV0cnlMaW5rID0gbmV3IFJldHJ5TGluaygpO1xuICAgICAgY29uc3QgYXV0aExpbmsgPSBuZXcgQXBvbGxvTGluaygob3BlcmF0aW9uLCBmb3J3YXJkKSA9PiB7XG5cbiAgICAgICAgY29uc3QgYXV0aG9yaXphdGlvbiA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhUb2tlbikge1xuICAgICAgICAgIGF1dGhvcml6YXRpb24ucHVzaChgdG9rZW4gJHt0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aFRva2VufWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aEJhc2ljKSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbi5wdXNoKGBCYXNpYyAke3RoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoQmFzaWN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpXG4gICAgICAgICAgLmFwcGVuZCgnQXV0aG9yaXphdGlvbicsIGF1dGhvcml6YXRpb24pO1xuXG4gICAgICAgIC8vIFVzZSB0aGUgc2V0Q29udGV4dCBtZXRob2QgdG8gc2V0IHRoZSBIVFRQIGhlYWRlcnMuXG4gICAgICAgIG9wZXJhdGlvbi5zZXRDb250ZXh0KHtcbiAgICAgICAgICAuLi5vcGVyYXRpb24uZ2V0Q29udGV4dCgpLFxuICAgICAgICAgIC4uLntoZWFkZXJzfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDYWxsIHRoZSBuZXh0IGxpbmsgaW4gdGhlIG1pZGRsZXdhcmUgY2hhaW4uXG4gICAgICAgIHJldHVybiBmb3J3YXJkKG9wZXJhdGlvbik7XG4gICAgICB9KTtcblxuICAgICAgLy8gSHR0cCBsaW5rXG4gICAgICBjb25zdCBodHRwTGluayA9IHRoaXMuaHR0cExpbmsuY3JlYXRlKHRoaXMuaHR0cFBhcmFtcyk7XG5cbiAgICAgIC8vIENhY2hlXG4gICAgICBjb25zdCBjYWNoZSA9IG5ldyBJbk1lbW9yeUNhY2hlKHtcbiAgICAgICAgdHlwZVBvbGljaWVzOiB0aGlzLnR5cGVQb2xpY2llcyxcbiAgICAgICAgZnJhZ21lbnRzOiBpc05vdEVtcHR5QXJyYXkodGhpcy5mcmFnbWVudHMpID8gY3JlYXRlRnJhZ21lbnRSZWdpc3RyeSguLi50aGlzLmZyYWdtZW50cykgOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY2FjaGUgcGVyc2lzdGVuY2VcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnBlcnNpc3RDYWNoZSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gU3RhcnRpbmcgcGVyc2lzdGVuY2UgY2FjaGUuLi4nKTtcbiAgICAgICAgYXdhaXQgcGVyc2lzdENhY2hlKHtcbiAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIHRyaWdnZXI6IHRoaXMucGxhdGZvcm0uaXMoJ2FuZHJvaWQnKSA/ICdiYWNrZ3JvdW5kJyA6ICd3cml0ZScsXG4gICAgICAgICAgZGVib3VuY2U6IDEwMDAsXG4gICAgICAgICAgZGVidWc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBtdXRhdGlvbkxpbmtzOiBBcnJheTxBcG9sbG9MaW5rPjtcblxuICAgICAgLy8gQWRkIHF1ZXVlIHRvIHN0b3JlIHRyYWNrZWQgcXVlcmllcywgd2hlbiBvZmZsaW5lXG4gICAgICBpZiAoZW5hYmxlVHJhY2tNdXRhdGlvblF1ZXJpZXMpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXppbmdMaW5rID0gbmV3IFNlcmlhbGl6aW5nTGluaygpO1xuICAgICAgICBjb25zdCB0cmFja2VyTGluayA9IGNyZWF0ZVRyYWNrZXJMaW5rKHtcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIG9uTmV0d29ya1N0YXR1c0NoYW5nZTogdGhpcy5fbmV0d29ya1N0YXR1c0NoYW5nZWQkLFxuICAgICAgICAgIGRlYm91bmNlOiAxMDAwLFxuICAgICAgICAgIGRlYnVnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDcmVhdGluZyBhIG11dGF0aW9uIHF1ZXVlXG4gICAgICAgIGNvbnN0IHF1ZXVlTGluayA9IG5ldyBRdWV1ZUxpbmsoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLl9uZXR3b3JrU3RhdHVzQ2hhbmdlZCRcbiAgICAgICAgICAuc3Vic2NyaWJlKHR5cGUgPT4ge1xuICAgICAgICAgICAgLy8gTmV0d29yayBpcyBvZmZsaW5lOiBzdGFydCBidWZmZXJpbmcgaW50byBxdWV1ZVxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdub25lJykge1xuICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBvZmZsaW5lIG1vZGU6IGVuYWJsZSBtdXRhdGlvbnMgYnVmZmVyJyk7XG4gICAgICAgICAgICAgIHF1ZXVlTGluay5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTmV0d29yayBpcyBvbmxpbmVcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBvbmxpbmUgbW9kZTogZGlzYWJsZSBtdXRhdGlvbnMgYnVmZmVyJyk7XG4gICAgICAgICAgICAgIHF1ZXVlTGluay5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuICAgICAgICBtdXRhdGlvbkxpbmtzID0gW1xuICAgICAgICAgIGxvZ2dlckxpbmssXG4gICAgICAgICAgcXVldWVMaW5rLFxuICAgICAgICAgIHRyYWNrZXJMaW5rLFxuICAgICAgICAgIHF1ZXVlTGluayxcbiAgICAgICAgICBzZXJpYWxpemluZ0xpbmssXG4gICAgICAgICAgcmV0cnlMaW5rLFxuICAgICAgICAgIGF1dGhMaW5rLFxuICAgICAgICAgIGh0dHBMaW5rXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbXV0YXRpb25MaW5rcyA9IFtcbiAgICAgICAgICByZXRyeUxpbmssXG4gICAgICAgICAgYXV0aExpbmssXG4gICAgICAgICAgaHR0cExpbmtcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgLy8gY3JlYXRlIEFwb2xsb1xuICAgICAgY2xpZW50ID0gbmV3IEFwb2xsb0NsaWVudCh7XG4gICAgICAgIGNhY2hlLFxuICAgICAgICBsaW5rOlxuICAgICAgICAgIEFwb2xsb0xpbmsuc3BsaXQoXG4gICAgICAgICAgICAvLyBIYW5kbGUgbXV0YXRpb25zXG4gICAgICAgICAgICBpc011dGF0aW9uT3BlcmF0aW9uLFxuICAgICAgICAgICAgQXBvbGxvTGluay5mcm9tKG11dGF0aW9uTGlua3MpLFxuXG4gICAgICAgICAgICBBcG9sbG9MaW5rLnNwbGl0KFxuICAgICAgICAgICAgICAvLyBIYW5kbGUgc3Vic2NyaXB0aW9uc1xuICAgICAgICAgICAgICBpc1N1YnNjcmlwdGlvbk9wZXJhdGlvbixcbiAgICAgICAgICAgICAgd3NMaW5rLFxuXG4gICAgICAgICAgICAgIC8vIEhhbmRsZSBxdWVyaWVzXG4gICAgICAgICAgICAgIEFwb2xsb0xpbmsuZnJvbShbXG4gICAgICAgICAgICAgICAgcmV0cnlMaW5rLFxuICAgICAgICAgICAgICAgIGF1dGhMaW5rLFxuICAgICAgICAgICAgICAgIGh0dHBMaW5rXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgY29ubmVjdFRvRGV2VG9vbHM6ICF0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb25cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFwb2xsby5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHRyYWNrZWQgcXVlcmllcyBwZXJzaXN0ZW5jZVxuICAgIGlmIChlbmFibGVUcmFja011dGF0aW9uUXVlcmllcyAmJiB0aGlzLmVudmlyb25tZW50LnBlcnNpc3RDYWNoZSkge1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZXN0b3JlVHJhY2tlZFF1ZXJpZXMoe1xuICAgICAgICAgIGFwb2xsb0NsaWVudDogY2xpZW50LFxuICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgZGVidWc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW2dyYXBocWxdIEZhaWxlZCB0byByZXN0b3JlIHRyYWNrZWQgcXVlcmllcyBmcm9tIHN0b3JhZ2U6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciksIGVycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIGZvciBuZXR3b3JrIHJlc3RhcnRcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5uZXR3b3JrLm9uKCdzdGFydCcsICgpID0+IHRoaXMucmVzdGFydCgpKVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGNsZWFyIGNhY2hlIHJlcXVlc3QsIGZyb20gbmV0d29ya1xuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLm5ldHdvcmsub24oJ3Jlc2V0Q2FjaGUnLCAoKSA9PiB0aGlzLmNsZWFyQ2FjaGUoKSlcbiAgICApO1xuXG4gICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gU3RhcnRpbmcgZ3JhcGhxbCBbT0tdJyk7XG4gICAgcmV0dXJuIGNsaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RvcCgpIHtcbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBTdG9wcGluZyBncmFwaHFsIHNlcnZpY2UuLi4nKTtcbiAgICBhd2FpdCB0aGlzLnJlc2V0Q2xpZW50KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVzZXRDbGllbnQoY2xpZW50PzogQXBvbGxvQ2xpZW50PGFueT4pIHtcbiAgICBjbGllbnQgPSAoY2xpZW50IHx8IHRoaXMuYXBvbGxvLmNsaWVudCkgYXMgQXBvbGxvQ2xpZW50PGFueT47XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcblxuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIFJlc2V0dGluZyBBcG9sbG8gY2xpZW50Li4uJyk7XG4gICAgY2xpZW50LnN0b3AoKTtcblxuICAgIHRoaXMub25SZXNldEF1dGgubmV4dCgpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgY2xpZW50LmNsZWFyU3RvcmUoKSxcbiAgICAgIHRoaXMuY2xlYXJDYWNoZShjbGllbnQpXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIG9uQXBvbGxvRXJyb3I8VD4oZXJyOiBhbnksIGRlZmF1bHRFcnJvcj86IGFueSk6IE9ic2VydmFibGU8QXBvbGxvUXVlcnlSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gb2YodGhpcy50b0Fwb2xsb0Vycm9yPFQ+KGVyciwgZGVmYXVsdEVycm9yKSk7XG4gIH1cblxuICBwcml2YXRlIHRvQXBvbGxvRXJyb3I8VD4oZXJyOiBhbnksIGRlZmF1bHRFcnJvcj86IGFueSk6IEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+IHtcbiAgICBsZXQgZXJyb3IgPVxuICAgICAgLy8gSWYgbmV0d29yayBlcnJvcjogdHJ5IHRvIGNvbnZlcnQgdG8gQXBwIChyZWFkIGFzIEpTT04pLCBvciBjcmVhdGUgYW4gVU5LTk9XTl9ORVRXT1JLX0VSUk9SXG4gICAgICAoZXJyLm5ldHdvcmtFcnJvciAmJiAoXG4gICAgICAgICAgKGVyci5uZXR3b3JrRXJyb3IuZXJyb3IgJiYgdGhpcy50b0FwcEVycm9yKGVyci5uZXR3b3JrRXJyb3IuZXJyb3IpKVxuICAgICAgICAgIHx8IHRoaXMudG9BcHBFcnJvcihlcnIubmV0d29ya0Vycm9yKVxuICAgICAgICAgIHx8IChlcnIubmV0d29ya0Vycm9yLmVycm9yICYmIHRoaXMuY3JlYXRlQXBwRXJyb3JCeUNvZGUoZXJyLm5ldHdvcmtFcnJvci5lcnJvci5zdGF0dXMpKVxuICAgICAgICAgIHx8IHRoaXMuY3JlYXRlQXBwRXJyb3JCeUNvZGUoRXJyb3JDb2Rlcy5VTktOT1dOX05FVFdPUktfRVJST1IpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC8vIElmIGdyYXBoUUw6IHRyeSB0byBjb252ZXJ0IHRoZSBmaXJzdCBlcnJvciBmb3VuZFxuICAgICAgfHwgKGVyci5ncmFwaFFMRXJyb3JzICYmIGVyci5ncmFwaFFMRXJyb3JzLmxlbmd0aCAmJiB0aGlzLnRvQXBwRXJyb3IoZXJyLmdyYXBoUUxFcnJvcnNbMF0pKVxuICAgICAgfHwgdGhpcy50b0FwcEVycm9yKGVycilcbiAgICAgIHx8IHRoaXMudG9BcHBFcnJvcihlcnIub3JpZ2luYWxFcnJvcilcbiAgICAgIHx8IChlcnIuZ3JhcGhRTEVycm9ycyAmJiBlcnIuZ3JhcGhRTEVycm9yc1swXSlcbiAgICAgIHx8IGVycjtcbiAgICBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gJyArIChlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yKSwgZXJyb3Iuc3RhY2sgfHwgJycpO1xuICAgIGlmIChlcnJvcj8uY29kZSA9PT0gRXJyb3JDb2Rlcy5VTktOT1dOX05FVFdPUktfRVJST1IgJiYgZXJyLm5ldHdvcmtFcnJvcj8ubWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcignW2dyYXBocWxdIG9yaWdpbmFsIGVycm9yOiAnICsgZXJyLm5ldHdvcmtFcnJvci5tZXNzYWdlKTtcbiAgICAgIHRoaXMub25OZXR3b3JrRXJyb3IubmV4dChlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBlcnJvciwgYW5kIHN0b3JlIG9yaWdpbmFsIGVycm9yIGludG8gZXJyb3IncyBkZXRhaWxzXG4gICAgaWYgKCghZXJyb3IgfHwgIWVycm9yLmNvZGUgfHwgZXJyb3IuY29kZSA9PT0gRXJyb3JDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpICYmIGRlZmF1bHRFcnJvcikge1xuICAgICAgZXJyb3IgPSB7Li4uZGVmYXVsdEVycm9yLCBkZXRhaWxzOiBlcnJvciwgc3RhY2s6IGVyci5zdGFja307XG4gICAgICBpZiAoZGVmYXVsdEVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9IGRlZmF1bHRFcnJvci5tZXNzYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgZXJyb3JzOiBbZXJyb3JdLFxuICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICBuZXR3b3JrU3RhdHVzOiBOZXR3b3JrU3RhdHVzLmVycm9yXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXBwRXJyb3JCeUNvZGUoZXJyb3JDb2RlOiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldEkxOG5FcnJvck1lc3NhZ2VCeUNvZGUoZXJyb3JDb2RlKTtcbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogZXJyb3JDb2RlLFxuICAgICAgICBtZXNzYWdlXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJMThuRXJyb3JNZXNzYWdlQnlDb2RlKGVycm9yQ29kZTogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblxuICAgIC8vIGxvb2sgaW4gcmVnaXN0ZXJlZCBlcnJvciBjb2Rlc1xuICAgIGNvbnN0IGN1c3RvbUVycm9yTWVzc2FnZSA9IHRoaXMuY3VzdG9tRXJyb3JzW2Vycm9yQ29kZV07XG4gICAgaWYgKGN1c3RvbUVycm9yTWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGN1c3RvbUVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0LCBzd2l0Y2ggb24gZXJyb3IgY29kZVxuICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuVU5BVVRIT1JJWkVEOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLlVOQVVUSE9SSVpFRCc7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuRk9SQklEREVOOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLkZPUkJJRERFTic7XG4gICAgICBjYXNlIEVycm9yQ29kZXMuVU5LTk9XTl9ORVRXT1JLX0VSUk9SOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLlVOS05PV05fTkVUV09SS19FUlJPUic7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuQkFEX1VQREFURV9EQVRFOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLkJBRF9VUERBVEVfREFURSc7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuREFUQV9MT0NLRUQ6XG4gICAgICAgIHJldHVybiAnRVJST1IuREFUQV9MT0NLRUQnO1xuICAgICAgY2FzZSBTZXJ2ZXJFcnJvckNvZGVzLkJBRF9BUFBfVkVSU0lPTjpcbiAgICAgICAgcmV0dXJuICdFUlJPUi5CQURfQVBQX1ZFUlNJT04nO1xuICAgICAgY2FzZSBTZXJ2ZXJFcnJvckNvZGVzLkRBVEFfTk9UX1VOSVFVRTpcbiAgICAgICAgcmV0dXJuICdFUlJPUi5EQVRBX05PVF9VTklRVUUnO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHRvQXBwRXJyb3IoZXJyOiBhbnkpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGxldCBlcnJvciA9IGVycjtcbiAgICBsZXQgbWVzc2FnZSA9IGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnI7XG4gICAgLy8gcGFyc2UgbWVzc2FnZSBpZiBKU09OXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLnRyaW0oKS5pbmRleE9mKCd7XCJjb2RlXCI6JykgPT09IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVycm9yID0gSlNPTi5wYXJzZShtZXNzYWdlXG4gICAgICAgICAgLy8gUmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBiZWZvcmUgcGFyc2luZyAoZS5nLiBTUUwgZXJyb3JzIGZyb20gYW4gT3JhY2xlIGRhdGFiYXNlKVxuICAgICAgICAgIC5yZXBsYWNlKCdcXG4nLCAnICcpXG4gICAgICAgICAgLnJlcGxhY2UoJ1xccicsICcnKSk7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IG1lc3NhZ2U7XG4gICAgICB9XG4gICAgICBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgZXJyb3IgYXMgSlNPTjogJywgcGFyc2VFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvciAmJiBlcnJvci5jb2RlKSB7XG4gICAgICBjb25zdCBhcHBFcnJvciA9IHtcbiAgICAgICAgY29kZTogZXJyb3IuY29kZSxcbiAgICAgICAgbWVzc2FnZTogKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykgPyBtZXNzYWdlIDogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgLi4udGhpcy5jcmVhdGVBcHBFcnJvckJ5Q29kZShlcnJvci5jb2RlKVxuICAgICAgfTtcbiAgICAgIGlmIChhcHBFcnJvci5jb2RlICE9PSBlcnJvci5jb2RlIHx8IGFwcEVycm9yLm1lc3NhZ2UgIT09IGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgZXJyb3IgaW4gZGV0YWlsc1xuICAgICAgICBhcHBFcnJvci5kZXRhaWxzID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBhcHBFcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEtlZXAgZXJyb3IgKHdpdGggZGV0YWlscywgaWYgYW55KVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbn1cbiJdfQ==
787
+ }] }] });
788
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2dyYXBocWwvZ3JhcGhxbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvRCxPQUFPLEVBRUwsWUFBWSxFQUNaLFVBQVUsRUFHVixhQUFhLEVBRWIsYUFBYSxHQUlkLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc3RSxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUVqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixxQkFBcUIsR0FDdEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxpQkFBaUIsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLHVCQUF1QixNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sa0JBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBVyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztB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Q0FBb0M7WUFDcEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7dUdBaDRCVSxjQUFjLG9KQThCZixXQUFXLGFBQ0MseUJBQXlCLDZCQUN6QixxQkFBcUI7MkdBaENoQyxjQUFjLGNBRmIsTUFBTTs7MkZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQStCSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQzVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBcG9sbG8sIEV4dHJhU3Vic2NyaXB0aW9uT3B0aW9ucywgUXVlcnlSZWYgfSBmcm9tICdhcG9sbG8tYW5ndWxhcic7XG5pbXBvcnQge1xuICBBcG9sbG9DYWNoZSxcbiAgQXBvbGxvQ2xpZW50LFxuICBBcG9sbG9MaW5rLFxuICBBcG9sbG9RdWVyeVJlc3VsdCxcbiAgRmV0Y2hQb2xpY3ksXG4gIEluTWVtb3J5Q2FjaGUsXG4gIE11dGF0aW9uVXBkYXRlckZuLFxuICBOZXR3b3JrU3RhdHVzLFxuICBPcGVyYXRpb25WYXJpYWJsZXMsXG4gIFR5cGVQb2xpY2llcyxcbiAgV2F0Y2hRdWVyeUZldGNoUG9saWN5LFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFNlcnZlckVycm9yQ29kZXMsIFNlcnZpY2VFcnJvciB9IGZyb20gJy4uL3NlcnZpY2VzL2Vycm9ycyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwLCBtZXJnZU1hcCwgdGFrZVVudGlsLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uVHlwZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHtcbiAgQXBwV2ViU29ja2V0LFxuICBjcmVhdGVUcmFja2VyTGluayxcbiAgRW1wdHlPYmplY3QsXG4gIGlzTXV0YXRpb25PcGVyYXRpb24sXG4gIGlzU3Vic2NyaXB0aW9uT3BlcmF0aW9uLFxuICByZXN0b3JlVHJhY2tlZFF1ZXJpZXMsXG4gIFN0b3JhZ2VTZXJ2aWNlV3JhcHBlcixcbn0gZnJvbSAnLi9ncmFwaHFsLnV0aWxzJztcbmltcG9ydCB7IFJldHJ5TGluayB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2xpbmsvcmV0cnknO1xuaW1wb3J0IHF1ZXVlTGlua0ltcG9ydGVkIGZyb20gJ2Fwb2xsby1saW5rLXF1ZXVlJztcbmltcG9ydCBzZXJpYWxpemluZ0xpbmtJbXBvcnRlZCBmcm9tICdhcG9sbG8tbGluay1zZXJpYWxpemUnO1xuaW1wb3J0IGxvZ2dlckxpbmtJbXBvcnRlZCBmcm9tICdhcG9sbG8tbGluay1sb2dnZXInO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBFbnRpdHlVdGlscywgSUVudGl0eSB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBpc05pbCwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgdG9OdW1iZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IFJlc29sdmVycyB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBIdHRwTGluaywgT3B0aW9ucyB9IGZyb20gJ2Fwb2xsby1hbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgcGVyc2lzdENhY2hlLCBQZXJzaXN0ZW50U3RvcmFnZSB9IGZyb20gJ2Fwb2xsbzMtY2FjaGUtcGVyc2lzdCc7XG5pbXBvcnQgeyBFcnJvclBvbGljeSwgTXV0YXRpb25CYXNlT3B0aW9ucyB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUvd2F0Y2hRdWVyeU9wdGlvbnMnO1xuaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jYWNoZS9jb3JlL3R5cGVzL0NhY2hlJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBQcm9wZXJ0aWVzTWFwIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7IFN0YXJ0YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvcGxhdGZvcm1zJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3N0b3JhZ2Uvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEdyYXBoUUxXc0xpbmsgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9saW5rL3N1YnNjcmlwdGlvbnMnO1xuaW1wb3J0IHsgQ2xpZW50T3B0aW9ucywgY3JlYXRlQ2xpZW50IH0gZnJvbSAnZ3JhcGhxbC13cyc7XG5pbXBvcnQgeyB1bndyYXBFU01vZHVsZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2R1bGVzJztcbmltcG9ydCB7IGNyZWF0ZUZyYWdtZW50UmVnaXN0cnkgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jYWNoZS9pbm1lbW9yeS9mcmFnbWVudFJlZ2lzdHJ5JztcbmltcG9ydCB7IERvY3VtZW50Tm9kZSB9IGZyb20gJ2dyYXBocWwnO1xuXG4vLyBXb3JrYXJvdW5kIGZvciBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vbmctcGFja2Fnci9uZy1wYWNrYWdyL2lzc3Vlcy8yMjE1XG5jb25zdCBRdWV1ZUxpbmsgPSB1bndyYXBFU01vZHVsZShxdWV1ZUxpbmtJbXBvcnRlZCk7XG5jb25zdCBTZXJpYWxpemluZ0xpbmsgPSB1bndyYXBFU01vZHVsZShzZXJpYWxpemluZ0xpbmtJbXBvcnRlZCk7XG5jb25zdCBsb2dnZXJMaW5rID0gdW53cmFwRVNNb2R1bGUobG9nZ2VyTGlua0ltcG9ydGVkKTtcblxuZXhwb3J0IGludGVyZmFjZSBXYXRjaFF1ZXJ5T3B0aW9uczxWPiB7XG4gIHF1ZXJ5OiBhbnk7XG4gIHZhcmlhYmxlcz86IFY7XG4gIGVycm9yPzogU2VydmljZUVycm9yO1xuICBmZXRjaFBvbGljeT86IFdhdGNoUXVlcnlGZXRjaFBvbGljeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdXRhdGVRdWVyeU9wdGlvbnM8VCwgViA9IE9wZXJhdGlvblZhcmlhYmxlcz4gZXh0ZW5kcyBNdXRhdGlvbkJhc2VPcHRpb25zPFQsIFY+IHtcbiAgbXV0YXRpb246IGFueTtcbiAgdmFyaWFibGVzPzogVjtcbiAgZXJyb3I/OiBTZXJ2aWNlRXJyb3I7XG4gIGNvbnRleHQ/OiB7XG4gICAgc2VyaWFsaXphdGlvbktleT86IHN0cmluZztcbiAgICB0cmFja2VkPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICB9O1xuICBvcHRpbWlzdGljUmVzcG9uc2U/OiBUO1xuICBvZmZsaW5lUmVzcG9uc2U/OiBUIHwgKChjb250ZXh0OiBhbnkpID0+IFByb21pc2U8VD4pO1xuICB1cGRhdGU/OiBNdXRhdGlvblVwZGF0ZXJGbjxUPjtcbiAgZm9yY2VPZmZsaW5lPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEFQUF9HUkFQSFFMX1RZUEVfUE9MSUNJRVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48VHlwZVBvbGljaWVzPignZ3JhcGhxbFR5cGVQb2xpY2llcycpO1xuXG5leHBvcnQgY29uc3QgQVBQX0dSQVBIUUxfRlJBR01FTlRTID0gbmV3IEluamVjdGlvblRva2VuPERvY3VtZW50Tm9kZVtdPignZ3JhcGhxbEZyYWdtZW50cycpO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvblBhcmFtcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBhdXRoVG9rZW4/OiBzdHJpbmc7XG4gIGF1dGhCYXNpYz86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR3JhcGhxbFNlcnZpY2UgZXh0ZW5kcyBTdGFydGFibGVTZXJ2aWNlPEFwb2xsb0NsaWVudDxhbnk+PiB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmV0d29ya1N0YXR1c0NoYW5nZWQkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25UeXBlPjtcblxuICBwcml2YXRlIGh0dHBQYXJhbXM6IE9wdGlvbnM7XG4gIHByaXZhdGUgd3NQYXJhbXM6IENsaWVudE9wdGlvbnM8Q29ubmVjdGlvblBhcmFtcz47XG4gIHByaXZhdGUgY29ubmVjdGlvblBhcmFtczogQ29ubmVjdGlvblBhcmFtcyA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0RmV0Y2hQb2xpY3k6IFdhdGNoUXVlcnlGZXRjaFBvbGljeTtcbiAgcHJpdmF0ZSBvbk5ldHdvcmtFcnJvciA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJpdmF0ZSBjdXN0b21FcnJvcnM6IFByb3BlcnRpZXNNYXAgPSB7fTtcbiAgcHJpdmF0ZSBvblJlc2V0QXV0aCAgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGdldCBjbGllbnQoKTogQXBvbGxvQ2xpZW50PGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgZ2V0IGNhY2hlKCk6IEFwb2xsb0NhY2hlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gIH1cblxuICBnZXQgZGVmYXVsdEZldGNoUG9saWN5KCk6IFdhdGNoUXVlcnlGZXRjaFBvbGljeSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRGZXRjaFBvbGljeTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgYXBvbGxvOiBBcG9sbG8sXG4gICAgcHJpdmF0ZSBodHRwTGluazogSHR0cExpbmssXG4gICAgcHJpdmF0ZSBuZXR3b3JrOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfR1JBUEhRTF9UWVBFX1BPTElDSUVTKSBwcml2YXRlIHR5cGVQb2xpY2llczogVHlwZVBvbGljaWVzLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0dSQVBIUUxfRlJBR01FTlRTKSBwcml2YXRlIGZyYWdtZW50czogRG9jdW1lbnROb2RlW11cbiAgKSB7XG4gICAgc3VwZXIocGxhdGZvcm0pOyAvLyBXYWl0IHBsYXRmb3JtXG5cbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIHRoaXMuX2RlZmF1bHRGZXRjaFBvbGljeSA9IGVudmlyb25tZW50LmFwb2xsb0ZldGNoUG9saWN5O1xuXG4gICAgLy8gTGlzdGVuIG5ldHdvcmsgc3RhdHVzXG4gICAgdGhpcy5fbmV0d29ya1N0YXR1c0NoYW5nZWQkID0gbmV0d29yay5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGlzTm90TmlsKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKTtcblxuICAgIC8vIFdoZW4gZ2V0dGluZyBuZXR3b3JrIGVycm9yOiB0cnkgdG8gcGluZyBwZWVyLCBhbmQgdG9nZ2xlIHRvIG9mZmxpbmVcbiAgICB0aGlzLm9uTmV0d29ya0Vycm9yXG4gICAgICAucGlwZShcbiAgICAgICAgdGhyb3R0bGVUaW1lKDMwMCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLm5ldHdvcmsub25saW5lKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5uZXR3b3JrLmNoZWNrUGVlckFsaXZlKCkpLFxuICAgICAgICBmaWx0ZXIoYWxpdmUgPT4gIWFsaXZlKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm5ldHdvcmsuc2V0Rm9yY2VPZmZsaW5lKHRydWUsIHtzaG93VG9hc3Q6IHRydWV9KSk7XG5cbiAgfVxuXG4gIGFzeW5jIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKSB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gQXBwbHkgdG9rZW4gYXV0aGVudGljYXRpb24gdG8gaGVhZGVycycpO1xuICAgICAgdGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhUb2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICAvLyBDbGVhbiBhdXRoIHRva2VuXG4gICAgZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhUb2tlbikge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIFJlbW92ZSB0b2tlbiBhdXRoZW50aWNhdGlvbiBmcm9tIGhlYWRlcnMnKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aFRva2VuO1xuXG4gICAgICBhd2FpdCB0aGlzLmNsZWFyQ2FjaGUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXRBdXRoQmFzaWMoYmFzaWM6IHN0cmluZykge1xuICAgIGlmIChiYXNpYykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIEFwcGx5IGJhc2ljIGF1dGhlbnRpY2F0aW9uIHRvIGhlYWRlcnMnKTtcbiAgICAgIHRoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoQmFzaWMgPSBiYXNpYztcbiAgICB9XG4gICAgLy8gQ2xlYW4gYXV0aCBiYXNpY1xuICAgIGVsc2UgaWYgKHRoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoQmFzaWMpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tncmFwaHFsXSBSZW1vdmUgYmFzaWMgYXV0aGVudGljYXRpb24gZnJvbSBoZWFkZXJzJyk7XG4gICAgICBkZWxldGUgdGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhCYXNpYztcblxuICAgICAgYXdhaXQgdGhpcy5jbGVhckNhY2hlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIGFkZCBhIGZpZWxkIHJlc29sdmVyXG4gICAqICAoc2VlIGRvYzogaHR0cHM6Ly93d3cuYXBvbGxvZ3JhcGhxbC5jb20vZG9jcy9yZWFjdC9kYXRhL2xvY2FsLXN0YXRlLyNoYW5kbGluZy1jbGllbnQtZmllbGRzLXdpdGgtcmVzb2x2ZXJzKVxuICAgKlxuICAgKiBAcGFyYW0gcmVzb2x2ZXJzXG4gICAqL1xuICBhc3luYyBhZGRSZXNvbHZlcihyZXNvbHZlcnM6IFJlc29sdmVycyB8IFJlc29sdmVyc1tdKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICB0aGlzLmFwb2xsby5jbGllbnQuYWRkUmVzb2x2ZXJzKHJlc29sdmVycyk7XG4gIH1cblxuICBhc3luYyBxdWVyeTxULCBWID0gRW1wdHlPYmplY3Q+KG9wdHM6IHtcbiAgICBxdWVyeTogYW55O1xuICAgIHZhcmlhYmxlcz86IFY7XG4gICAgZXJyb3I/OiBTZXJ2aWNlRXJyb3I7XG4gICAgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTtcbiAgfSk6IFByb21pc2U8VD4ge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgbGV0IHJlczogQXBvbGxvUXVlcnlSZXN1bHQ8VD47XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnF1ZXJ5PFQsIFY+KHtcbiAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICAgIGZldGNoUG9saWN5OiBvcHRzLmZldGNoUG9saWN5IHx8ICh0aGlzLl9kZWZhdWx0RmV0Y2hQb2xpY3kgYXMgRmV0Y2hQb2xpY3kpIHx8IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXMgPSB0aGlzLnRvQXBvbGxvRXJyb3I8VD4oZXJyLCBvcHRzLmVycm9yKTtcbiAgICB9XG4gICAgaWYgKHJlcy5lcnJvcnMpIHtcbiAgICAgIHRocm93IHJlcy5lcnJvcnNbMF07XG4gICAgfVxuICAgIHJldHVybiByZXMuZGF0YTtcbiAgfVxuXG4gIHdhdGNoUXVlcnlSZWY8VCwgViA9IEVtcHR5T2JqZWN0PihvcHRzOiBXYXRjaFF1ZXJ5T3B0aW9uczxWPik6IFF1ZXJ5UmVmPFQsIFY+IHtcbiAgICByZXR1cm4gdGhpcy5hcG9sbG8ud2F0Y2hRdWVyeTxULCBWPih7XG4gICAgICBxdWVyeTogb3B0cy5xdWVyeSxcbiAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICBmZXRjaFBvbGljeTogb3B0cy5mZXRjaFBvbGljeSB8fCAodGhpcy5fZGVmYXVsdEZldGNoUG9saWN5IGFzIEZldGNoUG9saWN5KSB8fCB1bmRlZmluZWQsXG4gICAgICBub3RpZnlPbk5ldHdvcmtTdGF0dXNDaGFuZ2U6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHF1ZXJ5UmVmVmFsdWVzQ2hhbmdlczxULCBWID0gRW1wdHlPYmplY3Q+KHF1ZXJ5UmVmOiBRdWVyeVJlZjxULCBWPiwgb3B0czogV2F0Y2hRdWVyeU9wdGlvbnM8Vj4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gcXVlcnlSZWZcbiAgICAgIC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMub25BcG9sbG9FcnJvcjxUPihlcnJvciwgb3B0cy5lcnJvcikpLFxuICAgICAgICBmaWx0ZXIodmFsdWUgPT4gdmFsdWUubmV0d29ya1N0YXR1cyA9PT0gTmV0d29ya1N0YXR1cy5yZWFkeSB8fCB2YWx1ZS5uZXR3b3JrU3RhdHVzID09PSBOZXR3b3JrU3RhdHVzLmVycm9yKSxcbiAgICAgICAgbWFwKCh7ZGF0YSwgZXJyb3JzfSkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yc1swXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgd2F0Y2hRdWVyeTxULCBWID0gRW1wdHlPYmplY3Q+KG9wdHM6IFdhdGNoUXVlcnlPcHRpb25zPFY+KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgcXVlcnlSZWY6IFF1ZXJ5UmVmPFQsIFY+ID0gdGhpcy53YXRjaFF1ZXJ5UmVmKG9wdHMpO1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5UmVmVmFsdWVzQ2hhbmdlcyhxdWVyeVJlZiwgb3B0cyk7XG4gIH1cblxuICBhc3luYyBtdXRhdGU8VCwgViA9IEVtcHR5T2JqZWN0PihvcHRzOiBNdXRhdGVRdWVyeU9wdGlvbnM8VCwgVj4pOiBQcm9taXNlPFQ+IHtcblxuICAgIC8vIElmIG9mZmxpbmUsIGNvbXB1dGUgYW4gb3B0aW1pc3RpYyByZXNwb25zZSBmb3IgdHJhY2tlZCBxdWVyaWVzXG4gICAgaWYgKChvcHRzLmZvcmNlT2ZmbGluZSB8fCB0aGlzLm5ldHdvcmsub2ZmbGluZSkgJiYgb3B0cy5vZmZsaW5lUmVzcG9uc2UpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vZmZsaW5lUmVzcG9uc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0cy5jb250ZXh0ID0gb3B0cy5jb250ZXh0IHx8IHt9O1xuICAgICAgICBjb25zdCBvcHRpbWlzdGljUmVzcG9uc2VGbiA9IChvcHRzLm9mZmxpbmVSZXNwb25zZSBhcyAoKGNvbnRleHQ6IGFueSkgPT4gUHJvbWlzZTxUPikpO1xuICAgICAgICBvcHRzLm9wdGltaXN0aWNSZXNwb25zZSA9IGF3YWl0IG9wdGltaXN0aWNSZXNwb25zZUZuKG9wdHMuY29udGV4dCk7XG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIFtvZmZsaW5lXSBVc2luZyBhbiBvcHRpbWlzdGljIHJlc3BvbnNlOiAnLCBvcHRzLm9wdGltaXN0aWNSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgb3B0cy5vcHRpbWlzdGljUmVzcG9uc2UgPSBvcHRzLm9mZmxpbmVSZXNwb25zZSBhcyBUO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMuZm9yY2VPZmZsaW5lKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHtkYXRhOiBvcHRzLm9wdGltaXN0aWNSZXNwb25zZX07XG4gICAgICAgIGlmIChvcHRzLnVwZGF0ZSkge1xuICAgICAgICAgIG9wdHMudXBkYXRlKHRoaXMuYXBvbGxvLmNsaWVudC5jYWNoZSwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzLmRhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hcG9sbG8ubXV0YXRlPEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+LCBWPih7XG4gICAgICBtdXRhdGlvbjogb3B0cy5tdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICBjb250ZXh0OiBvcHRzLmNvbnRleHQsXG4gICAgICBvcHRpbWlzdGljUmVzcG9uc2U6IG9wdHMub3B0aW1pc3RpY1Jlc3BvbnNlIGFzIGFueSxcbiAgICAgIHVwZGF0ZTogb3B0cy51cGRhdGUgYXMgYW55XG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMub25BcG9sbG9FcnJvcjxUPihlcnJvciwgb3B0cy5lcnJvcikpLFxuICAgICAgICBmaXJzdCgpLFxuICAgICAgICAvLyBUbyBkZWJ1ZywgaWYgbmVlZDpcbiAgICAgICAgLy90YXAoKHJlcykgPT4gKCFyZXMpICYmIGNvbnNvbGUuZXJyb3IoJ1tncmFwaHFsXSBVbmtub3duIGVycm9yIGR1cmluZyBtdXRhdGlvbi4gQ2hlY2sgZXJyb3JzIGluIGNvbnNvbGUgKG1heSBiZSBhbiBpbnZhbGlkIGdlbmVyYXRlZCBjYWNoZSBpZCA/KScpKVxuICAgICAgKSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLmVycm9ycykpIHtcbiAgICAgIHRocm93IHJlcy5lcnJvcnNbMF07XG4gICAgfVxuICAgIHJldHVybiByZXMuZGF0YSBhcyBUO1xuICB9XG5cbiAgc3Vic2NyaWJlPFQsIFYgPSBFbXB0eU9iamVjdD4ob3B0czoge1xuICAgIHF1ZXJ5OiBhbnk7XG4gICAgdmFyaWFibGVzOiBWO1xuICAgIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gICAgZXJyb3JQb2xpY3k/OiBFcnJvclBvbGljeTtcbiAgICBlcnJvcj86IFNlcnZpY2VFcnJvcjtcbiAgfSwgZXh0cmE/OiBFeHRyYVN1YnNjcmlwdGlvbk9wdGlvbnMpOiBPYnNlcnZhYmxlPFQ+IHtcblxuICAgIHJldHVybiB0aGlzLmFwb2xsby5zdWJzY3JpYmU8VD4oe1xuICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICBmZXRjaFBvbGljeTogb3B0cyAmJiBvcHRzLmZldGNoUG9saWN5IHx8ICduZXR3b3JrLW9ubHknLFxuICAgICAgZXJyb3JQb2xpY3k6IG9wdHMgJiYgb3B0cy5lcnJvclBvbGljeSB8fCB1bmRlZmluZWQsXG4gICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzXG4gICAgfSwge1xuICAgICAgdXNlWm9uZTogdHJ1ZSxcbiAgICAgIC4uLmV4dHJhXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHRoaXMub25BcG9sbG9FcnJvcjxUPihlcnJvciwgb3B0cy5lcnJvcikpLFxuICAgICAgICBtYXAoKHtkYXRhLCBlcnJvcnN9KSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBpbnNlcnRJbnRvUXVlcnlDYWNoZTxULCBWID0gRW1wdHlPYmplY3Q+KGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHM6IENhY2hlLlJlYWRRdWVyeU9wdGlvbnM8ViwgYW55PiAmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5RmllbGROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IFQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0Rm4/OiAoZDE6IFQsIGQyOiBUKSA9PiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPzogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHtcblxuICAgIGNhY2hlID0gY2FjaGUgfHwgdGhpcy5hcG9sbG8uY2xpZW50LmNhY2hlO1xuICAgIG9wdHMuYXJyYXlGaWVsZE5hbWUgPSBvcHRzLmFycmF5RmllbGROYW1lIHx8ICdkYXRhJztcblxuICAgIHRyeSB7XG4gICAgICBsZXQgZGF0YSA9IGNhY2hlLnJlYWRRdWVyeTxhbnksIFY+KHtxdWVyeTogb3B0cy5xdWVyeSwgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlc30pO1xuXG4gICAgICBpZiAoIWRhdGEpIHJldHVybjsgLy8gU2tpcDogbm90aGluZyBpbiBjYWNoZVxuXG4gICAgICBpZiAoZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXSkge1xuICAgICAgICAvLyBDb3B5IGJlY2F1c2UgaW1tdXRhYmxlXG4gICAgICAgIGRhdGEgPSB7IC4uLmRhdGEgfTtcblxuICAgICAgICAvLyBBcHBlbmQgdG8gcmVzdWx0IGFycmF5XG4gICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0gPSBbIC4uLmRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0sIHsuLi5vcHRzLmRhdGF9XTtcblxuICAgICAgICAvLyBSZXNvcnQsIGlmIG5lZWRcbiAgICAgICAgaWYgKG9wdHMuc29ydEZuKSB7XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zb3J0KG9wdHMuc29ydEZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4Y2x1ZGUgaWYgZXhjZWVkIG1heCBzaXplXG4gICAgICAgIGNvbnN0IHNpemUgPSB0b051bWJlcihvcHRzLnZhcmlhYmxlcyAmJiBvcHRzLnZhcmlhYmxlc1snc2l6ZSddLCAtMSk7XG4gICAgICAgIGlmIChzaXplID4gMCAmJiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLmxlbmd0aCA+IHNpemUpIHtcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNwbGljZShzaXplLCBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLmxlbmd0aCAtIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHRvdGFsXG4gICAgICAgIGlmIChpc05vdE5pbChvcHRzLnRvdGFsRmllbGROYW1lKSkge1xuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy50b3RhbEZpZWxkTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FjaGUud3JpdGVRdWVyeSh7XG4gICAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy5hcnJheUZpZWxkTmFtZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgLy8gcmVhZCBpbiBjYWNoZSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYSByZXN1bHQuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9yZWFjdC1hcG9sbG8vaXNzdWVzLzE3NzYjaXNzdWVjb21tZW50LTM3MjIzNzk0MFxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgdXBkYXRpbmcgY2FjaGU6ICcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgYWRkTWFueVRvUXVlcnlDYWNoZTxUID0gYW55LCBWID0gRW1wdHlPYmplY3Q+KGNhY2hlOiBBcG9sbG9DYWNoZTxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0czogQ2FjaGUuUmVhZFF1ZXJ5T3B0aW9uczxWLCBhbnk+ICYge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEZpZWxkTmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogVFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHNGbj86IChkMTogVCwgZDI6IFQpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGbj86IChkMTogVCwgZDI6IFQpID0+IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHtcblxuICAgIGlmICghb3B0cy5kYXRhIHx8ICFvcHRzLmRhdGEubGVuZ3RoKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gcHJvY2Vzc1xuXG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhID0gY2FjaGUucmVhZFF1ZXJ5PGFueSwgVj4oe3F1ZXJ5OiBvcHRzLnF1ZXJ5LCB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzfSk7XG4gICAgICBpZiAoIWRhdGEpIHJldHVybiAwOyAvLyBza2lwXG5cbiAgICAgIGlmIChkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdKSB7XG4gICAgICAgIC8vIENvcHkgYmVjYXVzZSBpbW11dGFibGVcbiAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgICAgIC8vIEtlZXAgb25seSBub3QgZXhpc3RpbmcgcmVzXG4gICAgICAgIGNvbnN0IGVxdWFsc0ZuID0gb3B0cy5lcXVhbHNGbiB8fCAoKGQxLCBkMikgPT4gZDFbJ2lkJ10gPT09IGQyWydpZCddICYmIGQxWydlbnRpdHlOYW1lJ10gPT09IGQyWydlbnRpdHlOYW1lJ10pO1xuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IG9wdHMuZGF0YS5maWx0ZXIoaW5wdXRWYWx1ZSA9PiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLmZpbmRJbmRleChleGlzdGluZ1ZhbHVlID0+IGVxdWFsc0ZuKGlucHV0VmFsdWUsIGV4aXN0aW5nVmFsdWUpKSA9PT0gLTEpO1xuXG4gICAgICAgIGlmICghbmV3SXRlbXMubGVuZ3RoKSByZXR1cm47IC8vIE5vIG5ldyB2YWx1ZVxuXG4gICAgICAgIC8vIEFwcGVuZCB0byBhcnJheVxuICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gWyAuLi5kYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLCAuLi5uZXdJdGVtc107XG5cbiAgICAgICAgLy8gUmVzb3J0LCBpZiBuZWVkXG4gICAgICAgIGlmIChvcHRzLnNvcnRGbikge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc29ydChvcHRzLnNvcnRGbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeGNsdWRlIGlmIGV4Y2VlZCBtYXggc2l6ZVxuICAgICAgICBjb25zdCBzaXplID0gdG9OdW1iZXIob3B0cy52YXJpYWJsZXMgJiYgb3B0cy52YXJpYWJsZXNbJ3NpemUnXSwgLTEpO1xuICAgICAgICBpZiAoc2l6ZSA+IDAgJiYgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5sZW5ndGggPiBzaXplKSB7XG4gICAgICAgICAgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zcGxpY2Uoc2l6ZSwgZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5sZW5ndGggLSBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY3JlbWVudCB0aGUgdG90YWxcbiAgICAgICAgaWYgKGlzTm90TmlsKG9wdHMudG90YWxGaWVsZE5hbWUpKSB7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0pKSB7XG4gICAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdICs9IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMudG90YWxGaWVsZE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRvIGNhY2hlXG4gICAgICAgIGNhY2hlLndyaXRlUXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMuYXJyYXlGaWVsZE5hbWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gY29udGludWVcbiAgICAgIC8vIHJlYWQgaW4gY2FjaGUgaXMgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgcmVzdWx0LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvcmVhY3QtYXBvbGxvL2lzc3Vlcy8xNzc2I2lzc3VlY29tbWVudC0zNzIyMzc5NDBcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgdXBkYXRpbmcgY2FjaGU6ICcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBmcm9tIGNhY2hlLCBhbmQgcmV0dXJuIGlmIHJlbW92ZWQgb3Igbm90XG4gICAqXG4gICAqIEBwYXJhbSBjYWNoZVxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgcmVtb3ZlRnJvbUNhY2hlZFF1ZXJ5QnlJZDxWID0gRW1wdHlPYmplY3QsIElEID0gbnVtYmVyPihjYWNoZTogQXBvbGxvQ2FjaGU8YW55PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzOiBDYWNoZS5SZWFkUXVlcnlPcHRpb25zPFYsIGFueT4gJiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxGaWVsZE5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHM6IElEOyAvLyBEbyBOT1QgdXNlICdpZCcsIGFzIGFscmVhZHkgdXNlZCBieSB0aGUgQXBvbGxvIEFQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOiBib29sZWFuIHtcblxuICAgIGNhY2hlID0gY2FjaGUgfHwgdGhpcy5hcG9sbG8uY2xpZW50LmNhY2hlO1xuICAgIG9wdHMuYXJyYXlGaWVsZE5hbWUgPSBvcHRzLmFycmF5RmllbGROYW1lIHx8ICdkYXRhJztcblxuICAgIHRyeSB7XG4gICAgICBsZXQgZGF0YSA9IGNhY2hlLnJlYWRRdWVyeTxhbnksIFY+KHtxdWVyeTogb3B0cy5xdWVyeSwgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlc30pO1xuXG4gICAgICBpZiAoZGF0YSAmJiBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdKSB7XG4gICAgICAgIC8vIENvcHkgYmVjYXVzZSBpbW11dGFibGVcbiAgICAgICAgZGF0YSA9IHsgLi4uZGF0YSB9O1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5maW5kSW5kZXgoaXRlbSA9PiBpdGVtWydpZCddID09PSBvcHRzLmlkcyk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTsgLy8gU2tpcCAobm90aGluZyByZW1vdmVkKVxuXG4gICAgICAgIC8vIENvcHksIHRoZW4gcmVtb3ZlIGRlbGV0ZWQgaXRlbVxuICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zbGljZSgpO1xuICAgICAgICBjb25zdCBkZWxldGVkSXRlbSA9IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc3BsaWNlKGluZGV4LCAxKVswXTtcbiAgICAgICAgY2FjaGUuZXZpY3Qoe2lkOiBjYWNoZS5pZGVudGlmeShkZWxldGVkSXRlbSl9KTtcblxuICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIHRvdGFsXG4gICAgICAgIGlmIChpc05vdE5pbChvcHRzLnRvdGFsRmllbGROYW1lKSkge1xuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSAtPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy50b3RhbEZpZWxkTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgdG8gY2FjaGVcbiAgICAgICAgY2FjaGUud3JpdGVRdWVyeSh7XG4gICAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgICAgdmFyaWFibGVzOiBvcHRzLnZhcmlhYmxlcyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMuYXJyYXlGaWVsZE5hbWUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgLy8gcmVhZCBpbiBjYWNoZSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYSByZXN1bHQuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9yZWFjdC1hcG9sbG8vaXNzdWVzLzE3NzYjaXNzdWVjb21tZW50LTM3MjIzNzk0MFxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBFcnJvciB3aGlsZSByZW1vdmluZyBmcm9tIGNhY2hlOiAnLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaWRzIGZyb20gY2FjaGUsIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyByZW1vdmVkXG4gICAqXG4gICAqIEBwYXJhbSBjYWNoZVxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgcmVtb3ZlRnJvbUNhY2hlZFF1ZXJ5QnlJZHM8ViA9IEVtcHR5T2JqZWN0LCBJRCA9IG51bWJlcj4oY2FjaGU6IEFwb2xsb0NhY2hlPGFueT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHM6IENhY2hlLlJlYWRRdWVyeU9wdGlvbnM8ViwgYW55PiAmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmllbGROYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkczogSURbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk6IG51bWJlciB7XG5cbiAgICBjYWNoZSA9IGNhY2hlIHx8IHRoaXMuYXBvbGxvLmNsaWVudC5jYWNoZTtcbiAgICBvcHRzLmFycmF5RmllbGROYW1lID0gb3B0cy5hcnJheUZpZWxkTmFtZSB8fCAnZGF0YSc7XG5cbiAgICB0cnkge1xuICAgICAgbGV0IGRhdGEgPSBjYWNoZS5yZWFkUXVlcnkob3B0cyk7XG5cbiAgICAgIGlmIChkYXRhICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0pIHtcbiAgICAgICAgLy8gQ29weSBiZWNhdXNlIGltbXV0YWJsZVxuICAgICAgICBkYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICAgICAgY29uc3QgZGVsZXRlZEluZGV4ZXMgPSBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnJlZHVjZSgocmVzLCBpdGVtLCBpbmRleCkgPT4gb3B0cy5pZHMuaW5jbHVkZXMoaXRlbVsnaWQnXSkgPyByZXMuY29uY2F0KGluZGV4KSA6IHJlcywgW10pO1xuXG4gICAgICAgIGlmIChkZWxldGVkSW5kZXhlcy5sZW5ndGggPD0gMCkgcmV0dXJuIDA7IC8vIFNraXAgKG5vdGhpbmcgcmVtb3ZlZClcblxuICAgICAgICAvLyBRdWVyeSBoYXMgTk8gdG90YWxcbiAgICAgICAgaWYgKGlzTmlsKG9wdHMudG90YWxGaWVsZE5hbWUpKSB7XG5cbiAgICAgICAgICAvLyBFdmljdCBlYWNoIG9iamVjdFxuICAgICAgICAgIGRlbGV0ZWRJbmRleGVzXG4gICAgICAgICAgICAubWFwKGluZGV4ID0+IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV1baW5kZXhdKVxuICAgICAgICAgICAgLm1hcChpdGVtID0+IGNhY2hlLmlkZW50aWZ5KGl0ZW0pKVxuICAgICAgICAgICAgLmZvckVhY2goaWQgPT4gY2FjaGUuZXZpY3Qoe2lkfSkpO1xuXG4gICAgICAgIH1cbiAgICAgICAgLy8gUXVlcnkgaGFzIGEgdG90YWxcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gQ29weSB0aGUgYXJyYXlcbiAgICAgICAgICBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5zbGljZSgpO1xuXG4gICAgICAgICAgLy8gcmVtb3ZlIGZyb20gYXJyYXksIHRoZW4gZXZpY3RcbiAgICAgICAgICBkZWxldGVkSW5kZXhlc1xuICAgICAgICAgICAgLy8gUmV2ZXJzZTogdG8ga2VlcCB2YWxpZCBpbmRleFxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gdGhlIGFycmF5XG4gICAgICAgICAgICAubWFwKGluZGV4ID0+IGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0uc3BsaWNlKGluZGV4LCAxKVswXSlcbiAgICAgICAgICAgIC8vIEV2aWN0IGZyb20gY2FjaGVcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBjYWNoZS5pZGVudGlmeShpdGVtKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGlkID0+IGNhY2hlLmV2aWN0KHtpZH0pKTtcblxuICAgICAgICAgIGlmIChpc05vdE5pbChkYXRhW29wdHMudG90YWxGaWVsZE5hbWVdKSkge1xuICAgICAgICAgICAgZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSAtPSBkZWxldGVkSW5kZXhlcy5sZW5ndGg7IC8vIFJlbW92ZSBkZWxldGlvbiBjb3VudFxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgdGhlIHRvdGFsIGluIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMudG90YWxGaWVsZE5hbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhY2hlLndyaXRlUXVlcnkoe1xuICAgICAgICAgICAgcXVlcnk6IG9wdHMucXVlcnksXG4gICAgICAgICAgICB2YXJpYWJsZXM6IG9wdHMudmFyaWFibGVzLFxuICAgICAgICAgICAgZGF0YVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIGRlbGV0ZWRJbmRleGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2dyYXBocWxdIFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIHF1ZXJ5LiBVbmtub3duIHJlc3VsdCBwYXJ0OiAnICsgb3B0cy5hcnJheUZpZWxkTmFtZSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gY29udGludWVcbiAgICAgIC8vIHJlYWQgaW4gY2FjaGUgaXMgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgcmVzdWx0LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvcmVhY3QtYXBvbGxvL2lzc3Vlcy8xNzc2I2lzc3VlY29tbWVudC0zNzIyMzc5NDBcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKCdbZ3JhcGhxbF0gRXJyb3Igd2hpbGUgcmVtb3ZpbmcgZnJvbSBjYWNoZTogJywgZXJyKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRvUXVlcnlDYWNoZTxUIGV4dGVuZHMgSUVudGl0eTxhbnk+LFxuICAgIFYgPSBFbXB0eU9iamVjdD4oY2FjaGU6IEFwb2xsb0NhY2hlPGFueT4sXG4gICAgICAgICAgICAgICAgICAgICBvcHRzOiBDYWNoZS5SZWFkUXVlcnlPcHRpb25zPFYsIGFueT4gJiB7XG4gICAgICAgICAgICAgICAgICAgICAgIGFycmF5RmllbGROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmllbGROYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBUO1xuICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHNGbj86IChkMTogVCwgZDI6IFQpID0+IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICB9KSB7XG4gICAgY2FjaGUgPSBjYWNoZSB8fCB0aGlzLmFwb2xsby5jbGllbnQuY2FjaGU7XG4gICAgb3B0cy5hcnJheUZpZWxkTmFtZSA9IG9wdHMuYXJyYXlGaWVsZE5hbWUgfHwgJ2RhdGEnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSBjYWNoZS5yZWFkUXVlcnkob3B0cyk7XG5cbiAgICAgIGlmIChkYXRhICYmIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0pIHtcbiAgICAgICAgLy8gQ29weSBiZWNhdXNlIGltbXV0YWJsZVxuICAgICAgICBkYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICAgICAgY29uc3QgZXF1YWxzRm4gPSBvcHRzLmVxdWFsc0ZuIHx8ICgoZDEsIGQyKSA9PiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGlmIGV4aXN0cywgb3IgaW5zZXJ0XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvcHRzLmFycmF5RmllbGROYW1lXS5maW5kSW5kZXgodiA9PiBlcXVhbHNGbihvcHRzLmRhdGEsIHYpKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0gPSBkYXRhW29wdHMuYXJyYXlGaWVsZE5hbWVdLnNsaWNlKCkuc3BsaWNlKGluZGV4LCAxLCBvcHRzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0gPSBbIC4uLmRhdGFbb3B0cy5hcnJheUZpZWxkTmFtZV0sIG9wdHMuZGF0YV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNyZW1lbnQgdG90YWwgKGlmIGNoYW5nZWQpXG4gICAgICAgIGlmIChpc05vdE5pbChvcHRzLnRvdGFsRmllbGROYW1lKSAmJiBpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBpZiAoaXNOb3ROaWwoZGF0YVtvcHRzLnRvdGFsRmllbGROYW1lXSkpIHtcbiAgICAgICAgICAgIGRhdGFbb3B0cy50b3RhbEZpZWxkTmFtZV0gKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBxdWVyeS4gVW5rbm93biByZXN1bHQgcGFydDogJyArIG9wdHMudG90YWxGaWVsZE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhY2hlLndyaXRlUXVlcnkoe1xuICAgICAgICAgIHF1ZXJ5OiBvcHRzLnF1ZXJ5LFxuICAgICAgICAgIHZhcmlhYmxlczogb3B0cy52YXJpYWJsZXMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuOyAvLyBPSzogc3RvcCBoZXJlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgLy8gcmVhZCBpbiBjYWNoZSBpcyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYSByZXN1bHQuIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9yZWFjdC1hcG9sbG8vaXNzdWVzLzE3NzYjaXNzdWVjb21tZW50LTM3MjIzNzk0MFxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLndhcm4oJ1tncmFwaHFsXSBFcnJvciB3aGlsZSB1cGRhdGluZyBjYWNoZTogJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhckNhY2hlKGNsaWVudD86IEFwb2xsb0NsaWVudDxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY2xpZW50ID0gKGNsaWVudCB8fCB0aGlzLmNsaWVudCkgYXMgQXBvbGxvQ2xpZW50PGFueT47XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gQ2xlYW5pbmcgY2FjaGUuLi4gJyk7XG4gICAgICBjb25zdCBub3cgPSB0aGlzLl9kZWJ1ZyAmJiBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDbGVhcmluZyB0aGUgY2FjaGVcbiAgICAgIGF3YWl0IGNsaWVudC5jYWNoZS5yZXNldCgpO1xuXG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtncmFwaHFsXSBDbGVhbmluZyBjYWNoZSBbT0tdIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyQ3VzdG9tRXJyb3IoZXJyb3I6IFByb3BlcnRpZXNNYXApIHtcbiAgICB0aGlzLmN1c3RvbUVycm9ycyA9IHsuLi50aGlzLmN1c3RvbUVycm9ycywgLi4uZXJyb3J9O1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8QXBvbGxvQ2xpZW50PGFueT4+IHtcblxuICAgIC8vIFdhaXQgbmV0d29yayBhbmQgc3RvcmFnZVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuc3RvcmFnZS5yZWFkeSgpLFxuICAgICAgdGhpcy5uZXR3b3JrLnJlYWR5KClcbiAgICBdKTtcblxuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIFN0YXJ0aW5nIGdyYXBocWwuLi4nKTtcbiAgICBjb25zdCBtb2JpbGUgPSBpc01vYmlsZSh3aW5kb3cpO1xuICAgIGNvbnN0IGVuYWJsZVRyYWNrTXV0YXRpb25RdWVyaWVzID0gIW1vYmlsZTtcblxuICAgIGNvbnN0IHBlZXIgPSB0aGlzLm5ldHdvcmsucGVlcjtcbiAgICBpZiAoIXBlZXIpIHRocm93IEVycm9yKCdbZ3JhcGhxbF0gTWlzc2luZyBwZWVyLiBVbmFibGUgdG8gc3RhcnQgZ3JhcGhxbCBzZXJ2aWNlJyk7XG5cbiAgICBjb25zdCB1cmkgPSBwZWVyLnVybCArICcvZ3JhcGhxbCc7XG4gICAgY29uc3Qgd3NVcmwgPSB1cmkucmVwbGFjZSgvXmh0dHAocyk/Oi8sICd3cyQxOicpICsgJy93ZWJzb2NrZXQnO1xuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIEJhc2UgdXJpOiAnICsgdXJpKTtcbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBTdWJzY3JpcHRpb24gdXJpOiAnICsgd3NVcmwpO1xuXG4gICAgdGhpcy5odHRwUGFyYW1zID0gdGhpcy5odHRwUGFyYW1zIHx8IHt9O1xuICAgIHRoaXMuaHR0cFBhcmFtcy51cmkgPSB1cmk7XG5cbiAgICB0aGlzLndzUGFyYW1zID0ge1xuICAgICAgLi4udGhpcy53c1BhcmFtcyxcbiAgICAgIGxhenk6IHRydWUsXG4gICAgICBjb25uZWN0aW9uUGFyYW1zOiB0aGlzLmNvbm5lY3Rpb25QYXJhbXMsXG4gICAgICB3ZWJTb2NrZXRJbXBsOiBBcHBXZWJTb2NrZXQsXG4gICAgICB1cmw6IHdzVXJsLFxuICAgICAgc2hvdWxkUmV0cnk6IChlcnJPckNsb3NlRXZlbnQpID0+IHtcbiAgICAgICAgLy8gSWYgV1MgVVJMIGNoYW5nZWQsIHRoZW4gZG8gbm90IHJldHJ5XG4gICAgICAgIGlmICh3c1VybCAhPT0gdGhpcy53c1BhcmFtcy51cmwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKCdbZ3JhcGhxbC1zZXJ2aWNlXSBbV1NdIFRyeWluZyB0byByZWNvbm5lY3QuLi4nLCBlcnJPckNsb3NlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICByZXRyeUF0dGVtcHRzOiAxMFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSBzdG9yYWdlIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBzdG9yYWdlOiBQZXJzaXN0ZW50U3RvcmFnZTxzdHJpbmc+ID0gbmV3IFN0b3JhZ2VTZXJ2aWNlV3JhcHBlcih0aGlzLnN0b3JhZ2UpO1xuXG4gICAgbGV0IGNsaWVudCA9IHRoaXMuYXBvbGxvLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2dyYXBocWxdIENyZWF0aW5nIEFwb2xsbyBHcmFwaFFMIGNsaWVudC4uLicpO1xuXG4gICAgICAvLyBXZWJzb2NrZXQgbGlua1xuICAgICAgY29uc3Qgd3NMaW5rID0gbmV3IEdyYXBoUUxXc0xpbmsoY3JlYXRlQ2xpZW50KHRoaXMud3NQYXJhbXMpKTtcbiAgICAgIHRoaXMub25SZXNldEF1dGhcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuc3RvcFN1YmplY3QpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBDbG9zaW5nIHdlYnNvY2tldCBjbGllbnQsIHRvIGZvcmNlIHVuYXV0aCcpO1xuICAgICAgICAgIHdzTGluay5jbGllbnQuZGlzcG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gUmV0cnkgd2hlbiBmYWlsZWQgbGlua1xuICAgICAgY29uc3QgcmV0cnlMaW5rID0gbmV3IFJldHJ5TGluaygpO1xuICAgICAgY29uc3QgYXV0aExpbmsgPSBuZXcgQXBvbGxvTGluaygob3BlcmF0aW9uLCBmb3J3YXJkKSA9PiB7XG5cbiAgICAgICAgY29uc3QgYXV0aG9yaXphdGlvbiA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUGFyYW1zLmF1dGhUb2tlbikge1xuICAgICAgICAgIGF1dGhvcml6YXRpb24ucHVzaChgdG9rZW4gJHt0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aFRva2VufWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25QYXJhbXMuYXV0aEJhc2ljKSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbi5wdXNoKGBCYXNpYyAke3RoaXMuY29ubmVjdGlvblBhcmFtcy5hdXRoQmFzaWN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpXG4gICAgICAgICAgLmFwcGVuZCgnQXV0aG9yaXphdGlvbicsIGF1dGhvcml6YXRpb24pO1xuXG4gICAgICAgIC8vIFVzZSB0aGUgc2V0Q29udGV4dCBtZXRob2QgdG8gc2V0IHRoZSBIVFRQIGhlYWRlcnMuXG4gICAgICAgIG9wZXJhdGlvbi5zZXRDb250ZXh0KHtcbiAgICAgICAgICAuLi5vcGVyYXRpb24uZ2V0Q29udGV4dCgpLFxuICAgICAgICAgIC4uLntoZWFkZXJzfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDYWxsIHRoZSBuZXh0IGxpbmsgaW4gdGhlIG1pZGRsZXdhcmUgY2hhaW4uXG4gICAgICAgIHJldHVybiBmb3J3YXJkKG9wZXJhdGlvbik7XG4gICAgICB9KTtcblxuICAgICAgLy8gSHR0cCBsaW5rXG4gICAgICBjb25zdCBodHRwTGluayA9IHRoaXMuaHR0cExpbmsuY3JlYXRlKHRoaXMuaHR0cFBhcmFtcyk7XG5cbiAgICAgIC8vIENhY2hlXG4gICAgICBjb25zdCBjYWNoZSA9IG5ldyBJbk1lbW9yeUNhY2hlKHtcbiAgICAgICAgdHlwZVBvbGljaWVzOiB0aGlzLnR5cGVQb2xpY2llcyxcbiAgICAgICAgZnJhZ21lbnRzOiBpc05vdEVtcHR5QXJyYXkodGhpcy5mcmFnbWVudHMpID8gY3JlYXRlRnJhZ21lbnRSZWdpc3RyeSguLi50aGlzLmZyYWdtZW50cykgOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY2FjaGUgcGVyc2lzdGVuY2VcbiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50LnBlcnNpc3RDYWNoZSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbZ3JhcGhxbF0gU3RhcnRpbmcgcGVyc2lzdGVuY2UgY2FjaGUuLi4nKTtcbiAgICAgICAgYXdhaXQgcGVyc2lzdENhY2hlKHtcbiAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIHRyaWdnZXI6IHRoaXMucGxhdGZvcm0uaXMoJ2FuZHJvaWQnKSA/ICdiYWNrZ3JvdW5kJyA6ICd3cml0ZScsXG4gICAgICAgICAgZGVib3VuY2U6IDEwMDAsXG4gICAgICAgICAgZGVidWc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBtdXRhdGlvbkxpbmtzOiBBcnJheTxBcG9sbG9MaW5rPjtcblxuICAgICAgLy8gQWRkIHF1ZXVlIHRvIHN0b3JlIHRyYWNrZWQgcXVlcmllcywgd2hlbiBvZmZsaW5lXG4gICAgICBpZiAoZW5hYmxlVHJhY2tNdXRhdGlvblF1ZXJpZXMpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXppbmdMaW5rID0gbmV3IFNlcmlhbGl6aW5nTGluaygpO1xuICAgICAgICBjb25zdCB0cmFja2VyTGluayA9IGNyZWF0ZVRyYWNrZXJMaW5rKHtcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIG9uTmV0d29ya1N0YXR1c0NoYW5nZTogdGhpcy5fbmV0d29ya1N0YXR1c0NoYW5nZWQkLFxuICAgICAgICAgIGRlYm91bmNlOiAxMDAwLFxuICAgICAgICAgIGRlYnVnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDcmVhdGluZyBhIG11dGF0aW9uIHF1ZXVlXG4gICAgICAgIGNvbnN0IHF1ZXVlTGluayA9IG5ldyBRdWV1ZUxpbmsoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLl9uZXR3b3JrU3RhdHVzQ2hhbmdlZCRcbiAgICAgICAgICAuc3Vic2NyaWJlKHR5cGUgPT4ge1xuICAgICAgICAgICAgLy8gTmV0d29yayBpcyBvZmZsaW5lOiBzdGFydCBidWZmZXJpbmcgaW50byBxdWV1ZVxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdub25lJykge1xuICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBvZmZsaW5lIG1vZGU6IGVuYWJsZSBtdXRhdGlvbnMgYnVmZmVyJyk7XG4gICAgICAgICAgICAgIHF1ZXVlTGluay5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTmV0d29yayBpcyBvbmxpbmVcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBvbmxpbmUgbW9kZTogZGlzYWJsZSBtdXRhdGlvbnMgYnVmZmVyJyk7XG4gICAgICAgICAgICAgIHF1ZXVlTGluay5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuICAgICAgICBtdXRhdGlvbkxpbmtzID0gW1xuICAgICAgICAgIGxvZ2dlckxpbmssXG4gICAgICAgICAgcXVldWVMaW5rLFxuICAgICAgICAgIHRyYWNrZXJMaW5rLFxuICAgICAgICAgIHF1ZXVlTGluayxcbiAgICAgICAgICBzZXJpYWxpemluZ0xpbmssXG4gICAgICAgICAgcmV0cnlMaW5rLFxuICAgICAgICAgIGF1dGhMaW5rLFxuICAgICAgICAgIGh0dHBMaW5rXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbXV0YXRpb25MaW5rcyA9IFtcbiAgICAgICAgICByZXRyeUxpbmssXG4gICAgICAgICAgYXV0aExpbmssXG4gICAgICAgICAgaHR0cExpbmtcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgLy8gY3JlYXRlIEFwb2xsb1xuICAgICAgY2xpZW50ID0gbmV3IEFwb2xsb0NsaWVudCh7XG4gICAgICAgIGNhY2hlLFxuICAgICAgICBsaW5rOlxuICAgICAgICAgIEFwb2xsb0xpbmsuc3BsaXQoXG4gICAgICAgICAgICAvLyBIYW5kbGUgbXV0YXRpb25zXG4gICAgICAgICAgICBpc011dGF0aW9uT3BlcmF0aW9uLFxuICAgICAgICAgICAgQXBvbGxvTGluay5mcm9tKG11dGF0aW9uTGlua3MpLFxuXG4gICAgICAgICAgICBBcG9sbG9MaW5rLnNwbGl0KFxuICAgICAgICAgICAgICAvLyBIYW5kbGUgc3Vic2NyaXB0aW9uc1xuICAgICAgICAgICAgICBpc1N1YnNjcmlwdGlvbk9wZXJhdGlvbixcbiAgICAgICAgICAgICAgd3NMaW5rLFxuXG4gICAgICAgICAgICAgIC8vIEhhbmRsZSBxdWVyaWVzXG4gICAgICAgICAgICAgIEFwb2xsb0xpbmsuZnJvbShbXG4gICAgICAgICAgICAgICAgcmV0cnlMaW5rLFxuICAgICAgICAgICAgICAgIGF1dGhMaW5rLFxuICAgICAgICAgICAgICAgIGh0dHBMaW5rXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgY29ubmVjdFRvRGV2VG9vbHM6ICF0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb25cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFwb2xsby5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHRyYWNrZWQgcXVlcmllcyBwZXJzaXN0ZW5jZVxuICAgIGlmIChlbmFibGVUcmFja011dGF0aW9uUXVlcmllcyAmJiB0aGlzLmVudmlyb25tZW50LnBlcnNpc3RDYWNoZSkge1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZXN0b3JlVHJhY2tlZFF1ZXJpZXMoe1xuICAgICAgICAgIGFwb2xsb0NsaWVudDogY2xpZW50LFxuICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgZGVidWc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW2dyYXBocWxdIEZhaWxlZCB0byByZXN0b3JlIHRyYWNrZWQgcXVlcmllcyBmcm9tIHN0b3JhZ2U6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciksIGVycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIGZvciBuZXR3b3JrIHJlc3RhcnRcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5uZXR3b3JrLm9uKCdzdGFydCcsICgpID0+IHRoaXMucmVzdGFydCgpKVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGNsZWFyIGNhY2hlIHJlcXVlc3QsIGZyb20gbmV0d29ya1xuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLm5ldHdvcmsub24oJ3Jlc2V0Q2FjaGUnLCAoKSA9PiB0aGlzLmNsZWFyQ2FjaGUoKSlcbiAgICApO1xuXG4gICAgY29uc29sZS5pbmZvKCdbZ3JhcGhxbF0gU3RhcnRpbmcgZ3JhcGhxbCBbT0tdJyk7XG4gICAgcmV0dXJuIGNsaWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RvcCgpIHtcbiAgICBjb25zb2xlLmluZm8oJ1tncmFwaHFsXSBTdG9wcGluZyBncmFwaHFsIHNlcnZpY2UuLi4nKTtcbiAgICBhd2FpdCB0aGlzLnJlc2V0Q2xpZW50KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVzZXRDbGllbnQoY2xpZW50PzogQXBvbGxvQ2xpZW50PGFueT4pIHtcbiAgICBjbGllbnQgPSAoY2xpZW50IHx8IHRoaXMuYXBvbGxvLmNsaWVudCkgYXMgQXBvbGxvQ2xpZW50PGFueT47XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcblxuICAgIGNvbnNvbGUuaW5mbygnW2dyYXBocWxdIFJlc2V0dGluZyBBcG9sbG8gY2xpZW50Li4uJyk7XG4gICAgY2xpZW50LnN0b3AoKTtcblxuICAgIHRoaXMub25SZXNldEF1dGgubmV4dCgpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgY2xpZW50LmNsZWFyU3RvcmUoKSxcbiAgICAgIHRoaXMuY2xlYXJDYWNoZShjbGllbnQpXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIG9uQXBvbGxvRXJyb3I8VD4oZXJyOiBhbnksIGRlZmF1bHRFcnJvcj86IGFueSk6IE9ic2VydmFibGU8QXBvbGxvUXVlcnlSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gb2YodGhpcy50b0Fwb2xsb0Vycm9yPFQ+KGVyciwgZGVmYXVsdEVycm9yKSk7XG4gIH1cblxuICBwcml2YXRlIHRvQXBvbGxvRXJyb3I8VD4oZXJyOiBhbnksIGRlZmF1bHRFcnJvcj86IGFueSk6IEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+IHtcbiAgICBsZXQgZXJyb3IgPVxuICAgICAgLy8gSWYgbmV0d29yayBlcnJvcjogdHJ5IHRvIGNvbnZlcnQgdG8gQXBwIChyZWFkIGFzIEpTT04pLCBvciBjcmVhdGUgYW4gVU5LTk9XTl9ORVRXT1JLX0VSUk9SXG4gICAgICAoZXJyLm5ldHdvcmtFcnJvciAmJiAoXG4gICAgICAgICAgKGVyci5uZXR3b3JrRXJyb3IuZXJyb3IgJiYgdGhpcy50b0FwcEVycm9yKGVyci5uZXR3b3JrRXJyb3IuZXJyb3IpKVxuICAgICAgICAgIHx8IHRoaXMudG9BcHBFcnJvcihlcnIubmV0d29ya0Vycm9yKVxuICAgICAgICAgIHx8IChlcnIubmV0d29ya0Vycm9yLmVycm9yICYmIHRoaXMuY3JlYXRlQXBwRXJyb3JCeUNvZGUoZXJyLm5ldHdvcmtFcnJvci5lcnJvci5zdGF0dXMpKVxuICAgICAgICAgIHx8IHRoaXMuY3JlYXRlQXBwRXJyb3JCeUNvZGUoRXJyb3JDb2Rlcy5VTktOT1dOX05FVFdPUktfRVJST1IpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC8vIElmIGdyYXBoUUw6IHRyeSB0byBjb252ZXJ0IHRoZSBmaXJzdCBlcnJvciBmb3VuZFxuICAgICAgfHwgKGVyci5ncmFwaFFMRXJyb3JzICYmIGVyci5ncmFwaFFMRXJyb3JzLmxlbmd0aCAmJiB0aGlzLnRvQXBwRXJyb3IoZXJyLmdyYXBoUUxFcnJvcnNbMF0pKVxuICAgICAgfHwgdGhpcy50b0FwcEVycm9yKGVycilcbiAgICAgIHx8IHRoaXMudG9BcHBFcnJvcihlcnIub3JpZ2luYWxFcnJvcilcbiAgICAgIHx8IChlcnIuZ3JhcGhRTEVycm9ycyAmJiBlcnIuZ3JhcGhRTEVycm9yc1swXSlcbiAgICAgIHx8IGVycjtcbiAgICBjb25zb2xlLmVycm9yKCdbZ3JhcGhxbF0gJyArIChlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yKSwgZXJyb3Iuc3RhY2sgfHwgJycpO1xuICAgIGlmIChlcnJvcj8uY29kZSA9PT0gRXJyb3JDb2Rlcy5VTktOT1dOX05FVFdPUktfRVJST1IgJiYgZXJyLm5ldHdvcmtFcnJvcj8ubWVzc2FnZSkge1xuICAgICAgY29uc29sZS5lcnJvcignW2dyYXBocWxdIG9yaWdpbmFsIGVycm9yOiAnICsgZXJyLm5ldHdvcmtFcnJvci5tZXNzYWdlKTtcbiAgICAgIHRoaXMub25OZXR3b3JrRXJyb3IubmV4dChlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBlcnJvciwgYW5kIHN0b3JlIG9yaWdpbmFsIGVycm9yIGludG8gZXJyb3IncyBkZXRhaWxzXG4gICAgaWYgKCghZXJyb3IgfHwgIWVycm9yLmNvZGUgfHwgZXJyb3IuY29kZSA9PT0gRXJyb3JDb2Rlcy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpICYmIGRlZmF1bHRFcnJvcikge1xuICAgICAgZXJyb3IgPSB7Li4uZGVmYXVsdEVycm9yLCBkZXRhaWxzOiBlcnJvciwgc3RhY2s6IGVyci5zdGFja307XG4gICAgICBpZiAoZGVmYXVsdEVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9IGRlZmF1bHRFcnJvci5tZXNzYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgZXJyb3JzOiBbZXJyb3JdLFxuICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICBuZXR3b3JrU3RhdHVzOiBOZXR3b3JrU3RhdHVzLmVycm9yXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXBwRXJyb3JCeUNvZGUoZXJyb3JDb2RlOiBudW1iZXIpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldEkxOG5FcnJvck1lc3NhZ2VCeUNvZGUoZXJyb3JDb2RlKTtcbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogZXJyb3JDb2RlLFxuICAgICAgICBtZXNzYWdlXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJMThuRXJyb3JNZXNzYWdlQnlDb2RlKGVycm9yQ29kZTogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblxuICAgIC8vIGxvb2sgaW4gcmVnaXN0ZXJlZCBlcnJvciBjb2Rlc1xuICAgIGNvbnN0IGN1c3RvbUVycm9yTWVzc2FnZSA9IHRoaXMuY3VzdG9tRXJyb3JzW2Vycm9yQ29kZV07XG4gICAgaWYgKGN1c3RvbUVycm9yTWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGN1c3RvbUVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0LCBzd2l0Y2ggb24gZXJyb3IgY29kZVxuICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuVU5BVVRIT1JJWkVEOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLlVOQVVUSE9SSVpFRCc7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuRk9SQklEREVOOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLkZPUkJJRERFTic7XG4gICAgICBjYXNlIEVycm9yQ29kZXMuVU5LTk9XTl9ORVRXT1JLX0VSUk9SOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLlVOS05PV05fTkVUV09SS19FUlJPUic7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuQkFEX1VQREFURV9EQVRFOlxuICAgICAgICByZXR1cm4gJ0VSUk9SLkJBRF9VUERBVEVfREFURSc7XG4gICAgICBjYXNlIFNlcnZlckVycm9yQ29kZXMuREFUQV9MT0NLRUQ6XG4gICAgICAgIHJldHVybiAnRVJST1IuREFUQV9MT0NLRUQnO1xuICAgICAgY2FzZSBTZXJ2ZXJFcnJvckNvZGVzLkJBRF9BUFBfVkVSU0lPTjpcbiAgICAgICAgcmV0dXJuICdFUlJPUi5CQURfQVBQX1ZFUlNJT04nO1xuICAgICAgY2FzZSBTZXJ2ZXJFcnJvckNvZGVzLkRBVEFfTk9UX1VOSVFVRTpcbiAgICAgICAgcmV0dXJuICdFUlJPUi5EQVRBX05PVF9VTklRVUUnO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHRvQXBwRXJyb3IoZXJyOiBhbnkpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGxldCBlcnJvciA9IGVycjtcbiAgICBsZXQgbWVzc2FnZSA9IGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnI7XG4gICAgLy8gcGFyc2UgbWVzc2FnZSBpZiBKU09OXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLnRyaW0oKS5pbmRleE9mKCd7XCJjb2RlXCI6JykgPT09IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVycm9yID0gSlNPTi5wYXJzZShtZXNzYWdlXG4gICAgICAgICAgLy8gUmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyBiZWZvcmUgcGFyc2luZyAoZS5nLiBTUUwgZXJyb3JzIGZyb20gYW4gT3JhY2xlIGRhdGFiYXNlKVxuICAgICAgICAgIC5yZXBsYWNlKCdcXG4nLCAnICcpXG4gICAgICAgICAgLnJlcGxhY2UoJ1xccicsICcnKSk7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IG1lc3NhZ2U7XG4gICAgICB9XG4gICAgICBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgZXJyb3IgYXMgSlNPTjogJywgcGFyc2VFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvciAmJiBlcnJvci5jb2RlKSB7XG4gICAgICBjb25zdCBhcHBFcnJvciA9IHtcbiAgICAgICAgY29kZTogZXJyb3IuY29kZSxcbiAgICAgICAgbWVzc2FnZTogKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykgPyBtZXNzYWdlIDogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgLi4udGhpcy5jcmVhdGVBcHBFcnJvckJ5Q29kZShlcnJvci5jb2RlKVxuICAgICAgfTtcbiAgICAgIGlmIChhcHBFcnJvci5jb2RlICE9PSBlcnJvci5jb2RlIHx8IGFwcEVycm9yLm1lc3NhZ2UgIT09IGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgZXJyb3IgaW4gZGV0YWlsc1xuICAgICAgICBhcHBFcnJvci5kZXRhaWxzID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBhcHBFcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEtlZXAgZXJyb3IgKHdpdGggZGV0YWlscywgaWYgYW55KVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbn1cbiJdfQ==
@@ -101,6 +101,7 @@ export async function restoreTrackedQueries(opts) {
101
101
  return Promise.all(promises);
102
102
  }
103
103
  export class StorageServiceWrapper {
104
+ storage;
104
105
  constructor(storage) {
105
106
  this.storage = storage;
106
107
  }
@@ -114,4 +115,4 @@ export class StorageServiceWrapper {
114
115
  return this.storage.set(key, value);
115
116
  }
116
117
  }
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9ncmFwaHFsL2dyYXBocWwudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFVBQVUsRUFBc0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxlQUFlLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHM0QsT0FBTyxFQUFDLEVBQUUsSUFBSSxNQUFNLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFJbEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZHLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFNekU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFVBQVMsR0FBVyxFQUFFLFNBQTZCO0lBQzdFLE9BQU8sSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFBLGdCQUFnQixDQUFDLENBQUM7QUFDbEQsQ0FBUSxDQUFDO0FBQ1QsWUFBWSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO0FBQzdDLFlBQVksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztBQUMvQyxZQUFZLENBQUMsVUFBVSxH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SUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELFVBQVUsQ0FBQyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBvbGxvQ2xpZW50LCBBcG9sbG9MaW5rLCBOZXh0TGluaywgT3BlcmF0aW9ufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHN3aXRjaE1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtnZXRNYWluRGVmaW5pdGlvbn0gZnJvbSAnQGFwb2xsby9jbGllbnQvdXRpbGl0aWVzJztcbmltcG9ydCB7UGVyc2lzdGVudFN0b3JhZ2V9IGZyb20gJ2Fwb2xsbzMtY2FjaGUtcGVyc2lzdCc7XG5pbXBvcnQge0Nvbm5lY3Rpb25UeXBlfSBmcm9tICcuLi9zZXJ2aWNlcy9uZXR3b3JrLnR5cGVzJztcbmltcG9ydCB7djQgYXMgdXVpZHY0fSBmcm9tICd1dWlkJztcbmltcG9ydCB7U3RvcmFnZVNlcnZpY2V9IGZyb20gJy4uLy4uL3NoYXJlZC9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XG5cbmRlY2xhcmUgbGV0IHdpbmRvdzogYW55O1xuY29uc3QgX2dsb2JhbCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge30pO1xuZXhwb3J0IGNvbnN0IE5hdGl2ZVdlYlNvY2tldCA9IF9nbG9iYWwuV2ViU29ja2V0IHx8IF9nbG9iYWwuTW96V2ViU29ja2V0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtcHR5T2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIEFwcFdlYlNvY2tldCBjbGFzcy5cbiAqIFdpdGggYSBoYWNrIG9uIGRlZmF1bHQgV2Vic29ja2V0LCB0byBhdm9pZCB0aGUgdXNlIG9mIHByb3RvY29sXG4gKi9cbmV4cG9ydCBjb25zdCBBcHBXZWJTb2NrZXQgPSBmdW5jdGlvbih1cmw6IHN0cmluZywgcHJvdG9jb2xzPzogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgcmV0dXJuIG5ldyBOYXRpdmVXZWJTb2NrZXQodXJsLypubyBwcm90b2NvbHMqLyk7XG59IGFzIGFueTtcbkFwcFdlYlNvY2tldC5DTE9TRUQgPSBOYXRpdmVXZWJTb2NrZXQuQ0xPU0VEO1xuQXBwV2ViU29ja2V0LkNMT1NJTkcgPSBOYXRpdmVXZWJTb2NrZXQuQ0xPU0lORztcbkFwcFdlYlNvY2tldC5DT05ORUNUSU5HID0gTmF0aXZlV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG5BcHBXZWJTb2NrZXQuT1BFTiA9IE5hdGl2ZVdlYlNvY2tldC5PUEVOO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNdXRhdGlvbk9wZXJhdGlvbihvcGVyYXRpb246IE9wZXJhdGlvbikge1xuICBjb25zdCBkZWYgPSBnZXRNYWluRGVmaW5pdGlvbihvcGVyYXRpb24ucXVlcnkpO1xuICByZXR1cm4gZGVmLmtpbmQgPT09ICdPcGVyYXRpb25EZWZpbml0aW9uJyAmJiBkZWYub3BlcmF0aW9uID09PSAnbXV0YXRpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdWJzY3JpcHRpb25PcGVyYXRpb24ob3BlcmF0aW9uOiBPcGVyYXRpb24pIHtcbiAgY29uc3QgZGVmID0gZ2V0TWFpbkRlZmluaXRpb24ob3BlcmF0aW9uLnF1ZXJ5KTtcbiAgcmV0dXJuIGRlZi5raW5kID09PSAnT3BlcmF0aW9uRGVmaW5pdGlvbicgJiYgZGVmLm9wZXJhdGlvbiA9PT0gJ3N1YnNjcmlwdGlvbic7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja2VkUXVlcnkge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHF1ZXJ5SlNPTjogc3RyaW5nO1xuICB2YXJpYWJsZXNKU09OOiBzdHJpbmc7XG4gIGNvbnRleHRKU09OOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBUUkFDS0VEX1FVRVJJRVNfU1RPUkFHRV9LRVkgPSAnYXBvbGxvLXRyYWNrZXItcGVyc2lzdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFja2VyTGluayhvcHRzOiB7XG4gIHN0b3JhZ2U/OiBQZXJzaXN0ZW50U3RvcmFnZTxzdHJpbmc+O1xuICBvbk5ldHdvcmtTdGF0dXNDaGFuZ2U6IE9ic2VydmFibGU8Q29ubmVjdGlvblR5cGU+O1xuICBkZWJvdW5jZT86IG51bWJlcjtcbiAgZGVidWc/OiBib29sZWFuO1xuICB9KTogQXBvbGxvTGluayB7XG5cbiAgY29uc3QgdHJhY2tlZFF1ZXJpZXNVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBjb25zdCB0cmFja2VkUXVlcmllc0J5SWQ6IHtbaWQ6IHN0cmluZ106IFRyYWNrZWRRdWVyeX0gPSB7fTtcblxuICBjb25zdCBuZXR3b3JrU3RhdHVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignbm9uZScpO1xuICBvcHRzLm9uTmV0d29ya1N0YXR1c0NoYW5nZS5zdWJzY3JpYmUodHlwZSA9PiBuZXR3b3JrU3RhdHVzU3ViamVjdC5uZXh0KHR5cGUpKTtcblxuICAvLyBTYXZlIHBlbmRpbmcgYW5kIHRyYWNrZWQgcXVlcmllcyBpbiBzdG9yYWdlXG4gIHRyYWNrZWRRdWVyaWVzVXBkYXRlZC5waXBlKFxuICAgIGRlYm91bmNlVGltZShvcHRzLmRlYm91bmNlIHx8IDEwMDApLFxuICAgIHN3aXRjaE1hcCgoKSA9PiBuZXR3b3JrU3RhdHVzU3ViamVjdCksXG4gICAgLy8gQ29udGludWUgaWYgb2ZmbGluZVxuICAgIGZpbHRlcigodHlwZSkgPT4gdHlwZSA9PT0gJ25vbmUnICYmICEhb3B0cy5zdG9yYWdlKVxuICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCB0cmFja2VkUXVlcmllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRyYWNrZWRRdWVyaWVzQnlJZClcbiAgICAgICAgLm1hcChrZXkgPT4gdHJhY2tlZFF1ZXJpZXNCeUlkW2tleV0pXG4gICAgICAgIC5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCk7XG4gICAgICBpZiAob3B0cy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2Fwb2xsby10cmFja2VyLWxpbmtdIFNhdmluZyB0cmFja2VkIHF1ZXJpZXMgdG8gc3RvcmFnZScsIHRyYWNrZWRRdWVyaWVzKTtcbiAgICAgIHJldHVybiBvcHRzLnN0b3JhZ2Uuc2V0SXRlbShUUkFDS0VEX1FVRVJJRVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRyYWNrZWRRdWVyaWVzKSk7XG4gICAgfSk7XG5cbiAgcmV0dXJuIG5ldyBBcG9sbG9MaW5rKChvcGVyYXRpb246IE9wZXJhdGlvbiwgZm9yd2FyZDogTmV4dExpbmspID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gb3BlcmF0aW9uLmdldENvbnRleHQoKTtcblxuICAgIC8vIFNraXAgaWYgbm90IHRyYWNrZWRcbiAgICBpZiAoIWNvbnRleHQgfHwgIWNvbnRleHQudHJhY2tlZCkgcmV0dXJuIGZvcndhcmQob3BlcmF0aW9uKTtcblxuICAgIGNvbnN0IGlkID0gY29udGV4dC5zZXJpYWxpemF0aW9uS2V5IHx8IHV1aWR2NCgpO1xuICAgIGNvbnNvbGUuZGVidWcoYFthcG9sbG8tdHJhY2tlci1saW5rXSBXYXRjaGluZyB0cmFja2VkIHF1ZXJ5IHske29wZXJhdGlvbi5vcGVyYXRpb25OYW1lfSMke2lkfX1gKTtcblxuICAgIC8vIENsZWFuIGNvbnRleHQsIGJlZm9yZSBjYWxsaW5nIEpTT04uc3RyaW5naWZ5IChyZW1vdmUgdW51c2VkIGF0dHJpYnV0ZXMpXG4gICAgY29uc3QgY2xlYW5Db250ZXh0ID0geyAuLi5jb250ZXh0LCAuLi57b3B0aW1pc3RpY1Jlc3BvbnNlOiBudWxsLCBjYWNoZTogbnVsbH0gfTtcblxuICAgIGNvbnN0IHRyYWNrZWRRdWVyeTogVHJhY2tlZFF1ZXJ5ID0ge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgIHF1ZXJ5SlNPTjogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uLnF1ZXJ5KSxcbiAgICAgIHZhcmlhYmxlc0pTT046IEpTT04uc3RyaW5naWZ5KG9wZXJhdGlvbi52YXJpYWJsZXMpLFxuICAgICAgY29udGV4dEpTT046IEpTT04uc3RyaW5naWZ5KGNsZWFuQ29udGV4dClcbiAgICB9O1xuXG4gICAgLy8gQWRkIHRvIG1hcFxuICAgIHRyYWNrZWRRdWVyaWVzQnlJZFtpZF0gPSB0cmFja2VkUXVlcnk7XG4gICAgdHJhY2tlZFF1ZXJpZXNVcGRhdGVkLmVtaXQoKTtcblxuICAgIGNvbnN0IG5leHRPcGVyYXRpb24gPSBmb3J3YXJkKG9wZXJhdGlvbilcbiAgICAgIC5tYXAoZGF0YSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoYFthcG9sbG8tdHJhY2tlci1saW5rXSBRdWVyeSB7JHtvcGVyYXRpb24ub3BlcmF0aW9uTmFtZX0jJHtpZH19IHN1Y2NlZWQhYCwgZGF0YSk7XG4gICAgICAgIGRlbGV0ZSB0cmFja2VkUXVlcmllc0J5SWRbaWRdO1xuICAgICAgICB0cmFja2VkUXVlcmllc1VwZGF0ZWQuZW1pdCh0cmFja2VkUXVlcmllc0J5SWQpOyAvLyB1cGRhdGVcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0pO1xuXG4gICAgLy8gSWYgb2ZmbGluZSwgcmV0dXJuIHRoZSBvcHRpbWlzdGljIHJlc3BvbnNlXG4gICAgaWYgKG5ldHdvcmtTdGF0dXNTdWJqZWN0LmdldFZhbHVlKCkgPT09ICdub25lJykge1xuICAgICAgaWYgKGNvbnRleHQub3B0aW1pc3RpY1Jlc3BvbnNlKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoYFthcG9sbG8tdHJhY2tlci1saW5rXSBRdWVyeSB7JHtvcGVyYXRpb24ub3BlcmF0aW9uTmFtZX0jJHtpZH19IGhhcyBvcHRpbWlzdGljIHJlc3BvbnNlOiBgLCBjb250ZXh0Lm9wdGltaXN0aWNSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbYXBvbGxvLXRyYWNrZXItbGlua10gUXVlcnkgeyR7b3BlcmF0aW9uLm9wZXJhdGlvbk5hbWV9IyR7aWR9fSBtaXNzaW5nICdjb250ZXh0Lm9wdGltaXN0aWNSZXNwb25zZSc6IHdhaXRpbmcgbmV0d29yayBVUCBiZWZvcmUgdG8gY29udGludWUuLi5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dE9wZXJhdGlvbjtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN0b3JlVHJhY2tlZFF1ZXJpZXMob3B0czoge1xuICBhcG9sbG9DbGllbnQ6IEFwb2xsb0NsaWVudDxhbnk+O1xuICBzdG9yYWdlOiBQZXJzaXN0ZW50U3RvcmFnZTxhbnk+O1xuICBkZWJ1Zz86IGJvb2xlYW47XG59KSB7XG5cbiAgY29uc3QgbGlzdCA9IEpTT04ucGFyc2UoYXdhaXQgb3B0cy5zdG9yYWdlLmdldEl0ZW0oVFJBQ0tFRF9RVUVSSUVTX1NUT1JBR0VfS0VZKSkgYXMgVHJhY2tlZFF1ZXJ5W107XG5cbiAgaWYgKCFsaXN0KSByZXR1cm47XG4gIGlmIChvcHRzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbYXBvbGxvLXRyYWNrZXItbGlua10gUmVzdG9yaW5nIHRyYWNrZWQgcXVlcmllcycsIGxpc3QpO1xuXG4gIGNvbnN0IHByb21pc2VzID0gKGxpc3QgfHwgW10pLm1hcCh0cmFja2VkUXVlcnkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBKU09OLnBhcnNlKHRyYWNrZWRRdWVyeS5jb250ZXh0SlNPTik7XG4gICAgY29uc3QgcXVlcnkgPSBKU09OLnBhcnNlKHRyYWNrZWRRdWVyeS5xdWVyeUpTT04pO1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IEpTT04ucGFyc2UodHJhY2tlZFF1ZXJ5LnZhcmlhYmxlc0pTT04pO1xuICAgIHJldHVybiBvcHRzLmFwb2xsb0NsaWVudC5tdXRhdGUoe1xuICAgICAgY29udGV4dCxcbiAgICAgIG11dGF0aW9uOiBxdWVyeSxcbiAgICAgIG9wdGltaXN0aWNSZXNwb25zZTogY29udGV4dC5vcHRpbWlzdGljUmVzcG9uc2UsXG4gICAgICAvL3VwZGF0ZTogdXBkYXRlSGFuZGxlckJ5TmFtZVt0cmFja2VkUXVlcnkubmFtZV0sXG4gICAgICB2YXJpYWJsZXMsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59XG5cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTZXJ2aWNlV3JhcHBlciBpbXBsZW1lbnRzIFBlcnNpc3RlbnRTdG9yYWdlPHN0cmluZz4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2VTZXJ2aWNlKSB7XG4gIH1cblxuICBnZXRJdGVtKGtleSkge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0KGtleSk7XG4gIH1cbiAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnJlbW92ZShrZXkpO1xuICB9XG4gIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2Uuc2V0KGtleSwgdmFsdWUpO1xuICB9XG59XG4iXX0=
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9ncmFwaHFsL2dyYXBocWwudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFVBQVUsRUFBc0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxlQUFlLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHM0QsT0FBTyxFQUFDLEVBQUUsSUFBSSxNQUFNLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFJbEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZHLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFNekU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFVBQVMsR0FBVyxFQUFFLFNBQTZCO0lBQzdFLE9BQU8sSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFBLGdCQUFnQixDQUFDLENBQUM7QUFDbEQsQ0FBUSxDQUFDO0FBQ1QsWUFBWSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO0FBQzdDLFlBQVksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztBQUMvQyxZQUFZLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUM7QUFDckQsWUFBWSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO0FBRXpDLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxTQUFvQjtJQUN0RCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLHFCQUFxQixJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDO0FBQzVFLENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsU0FBb0I7SUFDMUQsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxxQkFBcUIsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLGNBQWMsQ0FBQztBQUNoRixDQUFDO0FBV0QsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsd0JBQXdCLENBQUM7QUFFcEUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBSy9CO0lBRUQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ2pELE1BQU0sa0JBQWtCLEdBQWlDLEVBQUUsQ0FBQztJQUU1RCxNQUFNLG9CQUFvQixHQUFHLElBQUksZUFBZSxDQUFTLE1BQU0sQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUU5RSw4Q0FBOEM7SUFDOUMscUJBQXFCLENBQUMsSUFBSSxDQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsRUFDbkMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO0lBQ3JDLHNCQUFzQjtJQUN0QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEQsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDO2FBQ2xFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyx5REFBeUQsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN6RyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUMzRixDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxTQUFvQixFQUFFLE9BQWlCLEVBQUUsRUFBRTtRQUNoRSxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFdkMsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTztZQUFFLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVELE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLGlEQUFpRCxTQUFTLENBQUMsYUFBYSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFakcsMEVBQTBFO1FBQzFFLE1BQU0sWUFBWSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxFQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLEVBQUUsQ0FBQztRQUVoRixNQUFNLFlBQVksR0FBaUI7WUFDakMsRUFBRTtZQUNGLElBQUksRUFBRSxTQUFTLENBQUMsYUFBYTtZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQzFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDbEQsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1NBQzFDLENBQUM7UUFFRixhQUFhO1FBQ2Isa0JBQWtCLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQ3RDLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDO1FBRTdCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7YUFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsU0FBUyxDQUFDLGFBQWEsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvRixPQUFPLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLHFCQUFxQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUV6RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUwsNkNBQTZDO1FBQzdDLElBQUksb0JBQW9CLENBQUMsUUFBUSxFQUFFLEtBQUssTUFBTSxFQUFFO1lBQzlDLElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFO2dCQUM5QixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxTQUFTLENBQUMsYUFBYSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDdkk7aUJBQ0k7Z0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsU0FBUyxDQUFDLGFBQWEsSUFBSSxFQUFFLGtGQUFrRixDQUFDLENBQUM7YUFDL0o7U0FDRjtRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQUMsSUFJM0M7SUFFQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBbUIsQ0FBQztJQUVuRyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU87SUFDbEIsSUFBSSxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsaURBQWlELEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFdkYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO1FBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDOUIsT0FBTztZQUNQLFFBQVEsRUFBRSxLQUFLO1lBQ2Ysa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxpREFBaUQ7WUFDakQsU0FBUztTQUNWLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFHRCxNQUFNLE9BQU8scUJBQXFCO0lBQ1o7SUFBcEIsWUFBb0IsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7SUFDM0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsVUFBVSxDQUFDLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUs7UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcG9sbG9DbGllbnQsIEFwb2xsb0xpbmssIE5leHRMaW5rLCBPcGVyYXRpb259IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgc3dpdGNoTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2dldE1haW5EZWZpbml0aW9ufSBmcm9tICdAYXBvbGxvL2NsaWVudC91dGlsaXRpZXMnO1xuaW1wb3J0IHtQZXJzaXN0ZW50U3RvcmFnZX0gZnJvbSAnYXBvbGxvMy1jYWNoZS1wZXJzaXN0JztcbmltcG9ydCB7Q29ubmVjdGlvblR5cGV9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHt2NCBhcyB1dWlkdjR9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHtTdG9yYWdlU2VydmljZX0gZnJvbSAnLi4vLi4vc2hhcmVkL3N0b3JhZ2Uvc3RvcmFnZS5zZXJ2aWNlJztcblxuZGVjbGFyZSBsZXQgd2luZG93OiBhbnk7XG5jb25zdCBfZ2xvYmFsID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fSk7XG5leHBvcnQgY29uc3QgTmF0aXZlV2ViU29ja2V0ID0gX2dsb2JhbC5XZWJTb2NrZXQgfHwgX2dsb2JhbC5Nb3pXZWJTb2NrZXQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1wdHlPYmplY3Qge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQXBwV2ViU29ja2V0IGNsYXNzLlxuICogV2l0aCBhIGhhY2sgb24gZGVmYXVsdCBXZWJzb2NrZXQsIHRvIGF2b2lkIHRoZSB1c2Ugb2YgcHJvdG9jb2xcbiAqL1xuZXhwb3J0IGNvbnN0IEFwcFdlYlNvY2tldCA9IGZ1bmN0aW9uKHVybDogc3RyaW5nLCBwcm90b2NvbHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICByZXR1cm4gbmV3IE5hdGl2ZVdlYlNvY2tldCh1cmwvKm5vIHByb3RvY29scyovKTtcbn0gYXMgYW55O1xuQXBwV2ViU29ja2V0LkNMT1NFRCA9IE5hdGl2ZVdlYlNvY2tldC5DTE9TRUQ7XG5BcHBXZWJTb2NrZXQuQ0xPU0lORyA9IE5hdGl2ZVdlYlNvY2tldC5DTE9TSU5HO1xuQXBwV2ViU29ja2V0LkNPTk5FQ1RJTkcgPSBOYXRpdmVXZWJTb2NrZXQuQ09OTkVDVElORztcbkFwcFdlYlNvY2tldC5PUEVOID0gTmF0aXZlV2ViU29ja2V0Lk9QRU47XG5cbmV4cG9ydCBmdW5jdGlvbiBpc011dGF0aW9uT3BlcmF0aW9uKG9wZXJhdGlvbjogT3BlcmF0aW9uKSB7XG4gIGNvbnN0IGRlZiA9IGdldE1haW5EZWZpbml0aW9uKG9wZXJhdGlvbi5xdWVyeSk7XG4gIHJldHVybiBkZWYua2luZCA9PT0gJ09wZXJhdGlvbkRlZmluaXRpb24nICYmIGRlZi5vcGVyYXRpb24gPT09ICdtdXRhdGlvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N1YnNjcmlwdGlvbk9wZXJhdGlvbihvcGVyYXRpb246IE9wZXJhdGlvbikge1xuICBjb25zdCBkZWYgPSBnZXRNYWluRGVmaW5pdGlvbihvcGVyYXRpb24ucXVlcnkpO1xuICByZXR1cm4gZGVmLmtpbmQgPT09ICdPcGVyYXRpb25EZWZpbml0aW9uJyAmJiBkZWYub3BlcmF0aW9uID09PSAnc3Vic2NyaXB0aW9uJztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrZWRRdWVyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcXVlcnlKU09OOiBzdHJpbmc7XG4gIHZhcmlhYmxlc0pTT046IHN0cmluZztcbiAgY29udGV4dEpTT046IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFRSQUNLRURfUVVFUklFU19TVE9SQUdFX0tFWSA9ICdhcG9sbG8tdHJhY2tlci1wZXJzaXN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyYWNrZXJMaW5rKG9wdHM6IHtcbiAgc3RvcmFnZT86IFBlcnNpc3RlbnRTdG9yYWdlPHN0cmluZz47XG4gIG9uTmV0d29ya1N0YXR1c0NoYW5nZTogT2JzZXJ2YWJsZTxDb25uZWN0aW9uVHlwZT47XG4gIGRlYm91bmNlPzogbnVtYmVyO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pOiBBcG9sbG9MaW5rIHtcblxuICBjb25zdCB0cmFja2VkUXVlcmllc1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGNvbnN0IHRyYWNrZWRRdWVyaWVzQnlJZDoge1tpZDogc3RyaW5nXTogVHJhY2tlZFF1ZXJ5fSA9IHt9O1xuXG4gIGNvbnN0IG5ldHdvcmtTdGF0dXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCdub25lJyk7XG4gIG9wdHMub25OZXR3b3JrU3RhdHVzQ2hhbmdlLnN1YnNjcmliZSh0eXBlID0+IG5ldHdvcmtTdGF0dXNTdWJqZWN0Lm5leHQodHlwZSkpO1xuXG4gIC8vIFNhdmUgcGVuZGluZyBhbmQgdHJhY2tlZCBxdWVyaWVzIGluIHN0b3JhZ2VcbiAgdHJhY2tlZFF1ZXJpZXNVcGRhdGVkLnBpcGUoXG4gICAgZGVib3VuY2VUaW1lKG9wdHMuZGVib3VuY2UgfHwgMTAwMCksXG4gICAgc3dpdGNoTWFwKCgpID0+IG5ldHdvcmtTdGF0dXNTdWJqZWN0KSxcbiAgICAvLyBDb250aW51ZSBpZiBvZmZsaW5lXG4gICAgZmlsdGVyKCh0eXBlKSA9PiB0eXBlID09PSAnbm9uZScgJiYgISFvcHRzLnN0b3JhZ2UpXG4gICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IHRyYWNrZWRRdWVyaWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModHJhY2tlZFF1ZXJpZXNCeUlkKVxuICAgICAgICAubWFwKGtleSA9PiB0cmFja2VkUXVlcmllc0J5SWRba2V5XSlcbiAgICAgICAgLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGlmIChvcHRzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbYXBvbGxvLXRyYWNrZXItbGlua10gU2F2aW5nIHRyYWNrZWQgcXVlcmllcyB0byBzdG9yYWdlJywgdHJhY2tlZFF1ZXJpZXMpO1xuICAgICAgcmV0dXJuIG9wdHMuc3RvcmFnZS5zZXRJdGVtKFRSQUNLRURfUVVFUklFU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodHJhY2tlZFF1ZXJpZXMpKTtcbiAgICB9KTtcblxuICByZXR1cm4gbmV3IEFwb2xsb0xpbmsoKG9wZXJhdGlvbjogT3BlcmF0aW9uLCBmb3J3YXJkOiBOZXh0TGluaykgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBvcGVyYXRpb24uZ2V0Q29udGV4dCgpO1xuXG4gICAgLy8gU2tpcCBpZiBub3QgdHJhY2tlZFxuICAgIGlmICghY29udGV4dCB8fCAhY29udGV4dC50cmFja2VkKSByZXR1cm4gZm9yd2FyZChvcGVyYXRpb24pO1xuXG4gICAgY29uc3QgaWQgPSBjb250ZXh0LnNlcmlhbGl6YXRpb25LZXkgfHwgdXVpZHY0KCk7XG4gICAgY29uc29sZS5kZWJ1ZyhgW2Fwb2xsby10cmFja2VyLWxpbmtdIFdhdGNoaW5nIHRyYWNrZWQgcXVlcnkgeyR7b3BlcmF0aW9uLm9wZXJhdGlvbk5hbWV9IyR7aWR9fWApO1xuXG4gICAgLy8gQ2xlYW4gY29udGV4dCwgYmVmb3JlIGNhbGxpbmcgSlNPTi5zdHJpbmdpZnkgKHJlbW92ZSB1bnVzZWQgYXR0cmlidXRlcylcbiAgICBjb25zdCBjbGVhbkNvbnRleHQgPSB7IC4uLmNvbnRleHQsIC4uLntvcHRpbWlzdGljUmVzcG9uc2U6IG51bGwsIGNhY2hlOiBudWxsfSB9O1xuXG4gICAgY29uc3QgdHJhY2tlZFF1ZXJ5OiBUcmFja2VkUXVlcnkgPSB7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IG9wZXJhdGlvbi5vcGVyYXRpb25OYW1lLFxuICAgICAgcXVlcnlKU09OOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb24ucXVlcnkpLFxuICAgICAgdmFyaWFibGVzSlNPTjogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uLnZhcmlhYmxlcyksXG4gICAgICBjb250ZXh0SlNPTjogSlNPTi5zdHJpbmdpZnkoY2xlYW5Db250ZXh0KVxuICAgIH07XG5cbiAgICAvLyBBZGQgdG8gbWFwXG4gICAgdHJhY2tlZFF1ZXJpZXNCeUlkW2lkXSA9IHRyYWNrZWRRdWVyeTtcbiAgICB0cmFja2VkUXVlcmllc1VwZGF0ZWQuZW1pdCgpO1xuXG4gICAgY29uc3QgbmV4dE9wZXJhdGlvbiA9IGZvcndhcmQob3BlcmF0aW9uKVxuICAgICAgLm1hcChkYXRhID0+IHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgW2Fwb2xsby10cmFja2VyLWxpbmtdIFF1ZXJ5IHske29wZXJhdGlvbi5vcGVyYXRpb25OYW1lfSMke2lkfX0gc3VjY2VlZCFgLCBkYXRhKTtcbiAgICAgICAgZGVsZXRlIHRyYWNrZWRRdWVyaWVzQnlJZFtpZF07XG4gICAgICAgIHRyYWNrZWRRdWVyaWVzVXBkYXRlZC5lbWl0KHRyYWNrZWRRdWVyaWVzQnlJZCk7IC8vIHVwZGF0ZVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSk7XG5cbiAgICAvLyBJZiBvZmZsaW5lLCByZXR1cm4gdGhlIG9wdGltaXN0aWMgcmVzcG9uc2VcbiAgICBpZiAobmV0d29ya1N0YXR1c1N1YmplY3QuZ2V0VmFsdWUoKSA9PT0gJ25vbmUnKSB7XG4gICAgICBpZiAoY29udGV4dC5vcHRpbWlzdGljUmVzcG9uc2UpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgW2Fwb2xsby10cmFja2VyLWxpbmtdIFF1ZXJ5IHske29wZXJhdGlvbi5vcGVyYXRpb25OYW1lfSMke2lkfX0gaGFzIG9wdGltaXN0aWMgcmVzcG9uc2U6IGAsIGNvbnRleHQub3B0aW1pc3RpY1Jlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFthcG9sbG8tdHJhY2tlci1saW5rXSBRdWVyeSB7JHtvcGVyYXRpb24ub3BlcmF0aW9uTmFtZX0jJHtpZH19IG1pc3NpbmcgJ2NvbnRleHQub3B0aW1pc3RpY1Jlc3BvbnNlJzogd2FpdGluZyBuZXR3b3JrIFVQIGJlZm9yZSB0byBjb250aW51ZS4uLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0T3BlcmF0aW9uO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVUcmFja2VkUXVlcmllcyhvcHRzOiB7XG4gIGFwb2xsb0NsaWVudDogQXBvbGxvQ2xpZW50PGFueT47XG4gIHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlPGFueT47XG4gIGRlYnVnPzogYm9vbGVhbjtcbn0pIHtcblxuICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBvcHRzLnN0b3JhZ2UuZ2V0SXRlbShUUkFDS0VEX1FVRVJJRVNfU1RPUkFHRV9LRVkpKSBhcyBUcmFja2VkUXVlcnlbXTtcblxuICBpZiAoIWxpc3QpIHJldHVybjtcbiAgaWYgKG9wdHMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thcG9sbG8tdHJhY2tlci1saW5rXSBSZXN0b3JpbmcgdHJhY2tlZCBxdWVyaWVzJywgbGlzdCk7XG5cbiAgY29uc3QgcHJvbWlzZXMgPSAobGlzdCB8fCBbXSkubWFwKHRyYWNrZWRRdWVyeSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IEpTT04ucGFyc2UodHJhY2tlZFF1ZXJ5LmNvbnRleHRKU09OKTtcbiAgICBjb25zdCBxdWVyeSA9IEpTT04ucGFyc2UodHJhY2tlZFF1ZXJ5LnF1ZXJ5SlNPTik7XG4gICAgY29uc3QgdmFyaWFibGVzID0gSlNPTi5wYXJzZSh0cmFja2VkUXVlcnkudmFyaWFibGVzSlNPTik7XG4gICAgcmV0dXJuIG9wdHMuYXBvbGxvQ2xpZW50Lm11dGF0ZSh7XG4gICAgICBjb250ZXh0LFxuICAgICAgbXV0YXRpb246IHF1ZXJ5LFxuICAgICAgb3B0aW1pc3RpY1Jlc3BvbnNlOiBjb250ZXh0Lm9wdGltaXN0aWNSZXNwb25zZSxcbiAgICAgIC8vdXBkYXRlOiB1cGRhdGVIYW5kbGVyQnlOYW1lW3RyYWNrZWRRdWVyeS5uYW1lXSxcbiAgICAgIHZhcmlhYmxlcyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cblxuXG5leHBvcnQgY2xhc3MgU3RvcmFnZVNlcnZpY2VXcmFwcGVyIGltcGxlbWVudHMgUGVyc2lzdGVudFN0b3JhZ2U8c3RyaW5nPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZVNlcnZpY2UpIHtcbiAgfVxuXG4gIGdldEl0ZW0oa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXQoa2V5KTtcbiAgfVxuICByZW1vdmVJdGVtKGtleSkge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucmVtb3ZlKGtleSk7XG4gIH1cbiAgc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbn1cbiJdfQ==