@wallfree-dev/angular-core 0.0.59-beta.1

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 (623) hide show
  1. package/README.md +60 -0
  2. package/esm2022/lib/airgap-angular-core.module.mjs +63 -0
  3. package/esm2022/lib/base/base.component.mjs +38 -0
  4. package/esm2022/lib/base/base.facade.mjs +37 -0
  5. package/esm2022/lib/capacitor-plugins/definitions.mjs +15 -0
  6. package/esm2022/lib/capacitor-plugins/injection-tokens.mjs +11 -0
  7. package/esm2022/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin-wrapper.mjs +67 -0
  8. package/esm2022/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin.mjs +247 -0
  9. package/esm2022/lib/components/account-item/account-item.component.mjs +30 -0
  10. package/esm2022/lib/components/account-selection/account-selection.component.mjs +61 -0
  11. package/esm2022/lib/components/components.module.mjs +97 -0
  12. package/esm2022/lib/components/currency-symbol/currency-symbol.component.mjs +45 -0
  13. package/esm2022/lib/components/currency-symbol/currency-symbol.facade.mjs +8 -0
  14. package/esm2022/lib/components/currency-symbol/currency-symbol.types.mjs +2 -0
  15. package/esm2022/lib/components/from-to/from-to.component.mjs +100 -0
  16. package/esm2022/lib/components/iac-qr/iac-qr.component.mjs +192 -0
  17. package/esm2022/lib/components/identicon/identicon.component.mjs +51 -0
  18. package/esm2022/lib/components/isolated-modules-badges/isolated-modules-badges.component.mjs +16 -0
  19. package/esm2022/lib/components/isolated-modules-details/isolated-modules-details.component.mjs +43 -0
  20. package/esm2022/lib/components/isolated-modules-details/isolated-modules-details.facade.mjs +7 -0
  21. package/esm2022/lib/components/isolated-modules-list/isolated-modules-list.component.mjs +50 -0
  22. package/esm2022/lib/components/isolated-modules-list/isolated-modules-list.facade.mjs +7 -0
  23. package/esm2022/lib/components/isolated-modules-onboarding/isolated-modules-onboarding.component.mjs +12 -0
  24. package/esm2022/lib/components/network-badge/network-badge.component.mjs +19 -0
  25. package/esm2022/lib/components/qr/qr.component.mjs +36 -0
  26. package/esm2022/lib/components/qr-settings/qr-settings.component.mjs +30 -0
  27. package/esm2022/lib/components/titled-address/titled-address.component.mjs +31 -0
  28. package/esm2022/lib/components/titled-text/titled-text.component.mjs +28 -0
  29. package/esm2022/lib/config/app-config.mjs +3 -0
  30. package/esm2022/lib/pages/isolated-modules-list/isolated-modules-list.facade.mjs +7 -0
  31. package/esm2022/lib/pipes/amount-converter/amount-converter.pipe.mjs +82 -0
  32. package/esm2022/lib/pipes/fee-converter/fee-converter.pipe.mjs +36 -0
  33. package/esm2022/lib/pipes/pipes.module.mjs +19 -0
  34. package/esm2022/lib/pipes/wallet-filter/wallet-filter.pipe.mjs +36 -0
  35. package/esm2022/lib/protocol/adapter/protocol-v0-adapter.mjs +880 -0
  36. package/esm2022/lib/protocol/isolated/base-isolated.mjs +27 -0
  37. package/esm2022/lib/protocol/isolated/block-explorer-isolated.mjs +32 -0
  38. package/esm2022/lib/protocol/isolated/protocol-offline-isolated.mjs +37 -0
  39. package/esm2022/lib/protocol/isolated/protocol-online-isolated.mjs +52 -0
  40. package/esm2022/lib/protocol/isolated/v3-serializer-companion-isolated.mjs +35 -0
  41. package/esm2022/lib/services/address/address.service.mjs +78 -0
  42. package/esm2022/lib/services/clipboard/clipboard.service.mjs +48 -0
  43. package/esm2022/lib/services/deeplink/deeplink.service.mjs +73 -0
  44. package/esm2022/lib/services/environment/base-environment.service.mjs +6 -0
  45. package/esm2022/lib/services/filesystem/filesystem.service.mjs +291 -0
  46. package/esm2022/lib/services/iac/base.iac.service.mjs +155 -0
  47. package/esm2022/lib/services/iac/message-handler-single.mjs +48 -0
  48. package/esm2022/lib/services/iac/message-handler.mjs +22 -0
  49. package/esm2022/lib/services/iac/qr-generator.mjs +17 -0
  50. package/esm2022/lib/services/image/fetcher/image-direct.fetcher.mjs +16 -0
  51. package/esm2022/lib/services/image/fetcher/image-proxy.fetcher.mjs +45 -0
  52. package/esm2022/lib/services/image/image.service.mjs +39 -0
  53. package/esm2022/lib/services/key-pair/key-pair.service.mjs +57 -0
  54. package/esm2022/lib/services/language/language.service.mjs +47 -0
  55. package/esm2022/lib/services/modules/base-modules.service.mjs +157 -0
  56. package/esm2022/lib/services/modules/controller/base-modules.controller.mjs +2 -0
  57. package/esm2022/lib/services/modules/controller/integral/integral-modules.controller.mjs +91 -0
  58. package/esm2022/lib/services/modules/controller/isolated/isolated-modules.controller.mjs +190 -0
  59. package/esm2022/lib/services/modules/controller/modules.controller.mjs +85 -0
  60. package/esm2022/lib/services/permissions/permissions.service.mjs +140 -0
  61. package/esm2022/lib/services/protocol/defaults.mjs +55 -0
  62. package/esm2022/lib/services/protocol/protocol.service.mjs +230 -0
  63. package/esm2022/lib/services/protocol/store/base-protocol-store.service.mjs +63 -0
  64. package/esm2022/lib/services/protocol/store/main/main-protocol-store.service.mjs +91 -0
  65. package/esm2022/lib/services/protocol/store/sub/sub-protocol-store.service.mjs +174 -0
  66. package/esm2022/lib/services/qr/qr-generators/bc-ur-generator.mjs +127 -0
  67. package/esm2022/lib/services/qr/qr-generators/metamask-generator.mjs +117 -0
  68. package/esm2022/lib/services/qr/qr-generators/output-descriptor-generator.mjs +49 -0
  69. package/esm2022/lib/services/qr/qr-generators/serializer-v2-generator.mjs +30 -0
  70. package/esm2022/lib/services/qr/qr-generators/serializer-v3-generator.mjs +45 -0
  71. package/esm2022/lib/services/qr/qr-generators/xpub-generator.mjs +38 -0
  72. package/esm2022/lib/services/qr/qr-handler/serializer-v2-handler.mjs +114 -0
  73. package/esm2022/lib/services/qr/qr-handler/serializer-v3-handler.mjs +274 -0
  74. package/esm2022/lib/services/qr-scanner/qr-scanner.service.mjs +61 -0
  75. package/esm2022/lib/services/serializer/serializer.service.mjs +181 -0
  76. package/esm2022/lib/services/storage/base.storage.mjs +30 -0
  77. package/esm2022/lib/services/storage/storage.service.mjs +33 -0
  78. package/esm2022/lib/services/token/token.service.mjs +52 -0
  79. package/esm2022/lib/services/transaction/transaction.service.mjs +67 -0
  80. package/esm2022/lib/services/ui-event/ui-event.service.mjs +198 -0
  81. package/esm2022/lib/services/ui-event-elements/ui-event-elements.service.mjs +122 -0
  82. package/esm2022/lib/services/uri/uri.service.mjs +51 -0
  83. package/esm2022/lib/translation/AirGapTranslateLoader.mjs +26 -0
  84. package/esm2022/lib/types/Either.mjs +2 -0
  85. package/esm2022/lib/types/ExternalAliasResolver.mjs +2 -0
  86. package/esm2022/lib/types/RuntimeMode.mjs +6 -0
  87. package/esm2022/lib/types/SupportedLanguage.mjs +2 -0
  88. package/esm2022/lib/types/Token.mjs +2 -0
  89. package/esm2022/lib/types/isolated-modules/IsolatedModule.mjs +2 -0
  90. package/esm2022/lib/types/isolated-modules/IsolatedModuleManifest.mjs +2 -0
  91. package/esm2022/lib/types/isolated-modules/IsolatedModuleMetadata.mjs +2 -0
  92. package/esm2022/lib/types/ui/UIAction.mjs +6 -0
  93. package/esm2022/lib/types/ui/UIResource.mjs +8 -0
  94. package/esm2022/lib/utils/ExposedPromise.mjs +103 -0
  95. package/esm2022/lib/utils/airgap-transaction.mjs +23 -0
  96. package/esm2022/lib/utils/array.mjs +32 -0
  97. package/esm2022/lib/utils/modules/isolated/isolated-modules-metadata.mjs +10 -0
  98. package/esm2022/lib/utils/modules/load-protocol.mjs +19 -0
  99. package/esm2022/lib/utils/not-initialized.mjs +7 -0
  100. package/esm2022/lib/utils/protocol/delegation.mjs +33 -0
  101. package/esm2022/lib/utils/protocol/protocol-identifier.mjs +4 -0
  102. package/esm2022/lib/utils/protocol/protocol-network-identifier.mjs +18 -0
  103. package/esm2022/lib/utils/protocol/protocol-options.mjs +114 -0
  104. package/esm2022/lib/utils/protocol/protocol-v0-adapter.mjs +390 -0
  105. package/esm2022/lib/utils/utils.mjs +80 -0
  106. package/esm2022/lib/utils/worker.mjs +28 -0
  107. package/esm2022/public-api.mjs +102 -0
  108. package/esm2022/wallfree-dev-angular-core.mjs +5 -0
  109. package/fesm2022/wallfree-dev-angular-core.mjs +6933 -0
  110. package/fesm2022/wallfree-dev-angular-core.mjs.map +1 -0
  111. package/index.d.ts +6 -0
  112. package/lib/airgap-angular-core.module.d.ts +25 -0
  113. package/lib/airgap-angular-core.module.d.ts.map +1 -0
  114. package/lib/base/base.component.d.ts +18 -0
  115. package/lib/base/base.component.d.ts.map +1 -0
  116. package/lib/base/base.facade.d.ts +16 -0
  117. package/lib/base/base.facade.d.ts.map +1 -0
  118. package/lib/capacitor-plugins/definitions.d.ts +122 -0
  119. package/lib/capacitor-plugins/definitions.d.ts.map +1 -0
  120. package/lib/capacitor-plugins/injection-tokens.d.ts +18 -0
  121. package/lib/capacitor-plugins/injection-tokens.d.ts.map +1 -0
  122. package/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin-wrapper.d.ts +20 -0
  123. package/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin-wrapper.d.ts.map +1 -0
  124. package/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin.d.ts +38 -0
  125. package/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin.d.ts.map +1 -0
  126. package/lib/components/account-item/account-item.component.d.ts +15 -0
  127. package/lib/components/account-item/account-item.component.d.ts.map +1 -0
  128. package/lib/components/account-selection/account-selection.component.d.ts +23 -0
  129. package/lib/components/account-selection/account-selection.component.d.ts.map +1 -0
  130. package/lib/components/components.module.d.ts +28 -0
  131. package/lib/components/components.module.d.ts.map +1 -0
  132. package/lib/components/currency-symbol/currency-symbol.component.d.ts +20 -0
  133. package/lib/components/currency-symbol/currency-symbol.component.d.ts.map +1 -0
  134. package/lib/components/currency-symbol/currency-symbol.facade.d.ts +16 -0
  135. package/lib/components/currency-symbol/currency-symbol.facade.d.ts.map +1 -0
  136. package/lib/components/currency-symbol/currency-symbol.types.d.ts +35 -0
  137. package/lib/components/currency-symbol/currency-symbol.types.d.ts.map +1 -0
  138. package/lib/components/from-to/from-to.component.d.ts +33 -0
  139. package/lib/components/from-to/from-to.component.d.ts.map +1 -0
  140. package/lib/components/iac-qr/iac-qr.component.d.ts +45 -0
  141. package/lib/components/iac-qr/iac-qr.component.d.ts.map +1 -0
  142. package/lib/components/identicon/identicon.component.d.ts +14 -0
  143. package/lib/components/identicon/identicon.component.d.ts.map +1 -0
  144. package/lib/components/isolated-modules-badges/isolated-modules-badges.component.d.ts +8 -0
  145. package/lib/components/isolated-modules-badges/isolated-modules-badges.component.d.ts.map +1 -0
  146. package/lib/components/isolated-modules-details/isolated-modules-details.component.d.ts +17 -0
  147. package/lib/components/isolated-modules-details/isolated-modules-details.component.d.ts.map +1 -0
  148. package/lib/components/isolated-modules-details/isolated-modules-details.facade.d.ts +17 -0
  149. package/lib/components/isolated-modules-details/isolated-modules-details.facade.d.ts.map +1 -0
  150. package/lib/components/isolated-modules-list/isolated-modules-list.component.d.ts +20 -0
  151. package/lib/components/isolated-modules-list/isolated-modules-list.component.d.ts.map +1 -0
  152. package/lib/components/isolated-modules-list/isolated-modules-list.facade.d.ts +15 -0
  153. package/lib/components/isolated-modules-list/isolated-modules-list.facade.d.ts.map +1 -0
  154. package/lib/components/isolated-modules-onboarding/isolated-modules-onboarding.component.d.ts +6 -0
  155. package/lib/components/isolated-modules-onboarding/isolated-modules-onboarding.component.d.ts.map +1 -0
  156. package/lib/components/network-badge/network-badge.component.d.ts +9 -0
  157. package/lib/components/network-badge/network-badge.component.d.ts.map +1 -0
  158. package/lib/components/qr/qr.component.d.ts +16 -0
  159. package/lib/components/qr/qr.component.d.ts.map +1 -0
  160. package/lib/components/qr-settings/qr-settings.component.d.ts +12 -0
  161. package/lib/components/qr-settings/qr-settings.component.d.ts.map +1 -0
  162. package/lib/components/titled-address/titled-address.component.d.ts +13 -0
  163. package/lib/components/titled-address/titled-address.component.d.ts.map +1 -0
  164. package/lib/components/titled-text/titled-text.component.d.ts +11 -0
  165. package/lib/components/titled-text/titled-text.component.d.ts.map +1 -0
  166. package/lib/config/app-config.d.ts +15 -0
  167. package/lib/config/app-config.d.ts.map +1 -0
  168. package/lib/pages/isolated-modules-list/isolated-modules-list.facade.d.ts +16 -0
  169. package/lib/pages/isolated-modules-list/isolated-modules-list.facade.d.ts.map +1 -0
  170. package/lib/pipes/amount-converter/amount-converter.pipe.d.ts +29 -0
  171. package/lib/pipes/amount-converter/amount-converter.pipe.d.ts.map +1 -0
  172. package/lib/pipes/fee-converter/fee-converter.pipe.d.ts +20 -0
  173. package/lib/pipes/fee-converter/fee-converter.pipe.d.ts.map +1 -0
  174. package/lib/pipes/pipes.module.d.ts +10 -0
  175. package/lib/pipes/pipes.module.d.ts.map +1 -0
  176. package/lib/pipes/wallet-filter/wallet-filter.pipe.d.ts +15 -0
  177. package/lib/pipes/wallet-filter/wallet-filter.pipe.d.ts.map +1 -0
  178. package/lib/protocol/adapter/protocol-v0-adapter.d.ts +231 -0
  179. package/lib/protocol/adapter/protocol-v0-adapter.d.ts.map +1 -0
  180. package/lib/protocol/isolated/base-isolated.d.ts +11 -0
  181. package/lib/protocol/isolated/base-isolated.d.ts.map +1 -0
  182. package/lib/protocol/isolated/block-explorer-isolated.d.ts +14 -0
  183. package/lib/protocol/isolated/block-explorer-isolated.d.ts.map +1 -0
  184. package/lib/protocol/isolated/protocol-offline-isolated.d.ts +17 -0
  185. package/lib/protocol/isolated/protocol-offline-isolated.d.ts.map +1 -0
  186. package/lib/protocol/isolated/protocol-online-isolated.d.ts +21 -0
  187. package/lib/protocol/isolated/protocol-online-isolated.d.ts.map +1 -0
  188. package/lib/protocol/isolated/v3-serializer-companion-isolated.d.ts +17 -0
  189. package/lib/protocol/isolated/v3-serializer-companion-isolated.d.ts.map +1 -0
  190. package/lib/services/address/address.service.d.ts +26 -0
  191. package/lib/services/address/address.service.d.ts.map +1 -0
  192. package/lib/services/clipboard/clipboard.service.d.ts +14 -0
  193. package/lib/services/clipboard/clipboard.service.d.ts.map +1 -0
  194. package/lib/services/deeplink/deeplink.service.d.ts +18 -0
  195. package/lib/services/deeplink/deeplink.service.d.ts.map +1 -0
  196. package/lib/services/environment/base-environment.service.d.ts +6 -0
  197. package/lib/services/environment/base-environment.service.d.ts.map +1 -0
  198. package/lib/services/filesystem/filesystem.service.d.ts +42 -0
  199. package/lib/services/filesystem/filesystem.service.d.ts.map +1 -0
  200. package/lib/services/iac/base.iac.service.d.ts +41 -0
  201. package/lib/services/iac/base.iac.service.d.ts.map +1 -0
  202. package/lib/services/iac/message-handler-single.d.ts +20 -0
  203. package/lib/services/iac/message-handler-single.d.ts.map +1 -0
  204. package/lib/services/iac/message-handler.d.ts +34 -0
  205. package/lib/services/iac/message-handler.d.ts.map +1 -0
  206. package/lib/services/iac/qr-generator.d.ts +13 -0
  207. package/lib/services/iac/qr-generator.d.ts.map +1 -0
  208. package/lib/services/image/fetcher/image-direct.fetcher.d.ts +9 -0
  209. package/lib/services/image/fetcher/image-direct.fetcher.d.ts.map +1 -0
  210. package/lib/services/image/fetcher/image-proxy.fetcher.d.ts +9 -0
  211. package/lib/services/image/fetcher/image-proxy.fetcher.d.ts.map +1 -0
  212. package/lib/services/image/image.service.d.ts +20 -0
  213. package/lib/services/image/image.service.d.ts.map +1 -0
  214. package/lib/services/key-pair/key-pair.service.d.ts +14 -0
  215. package/lib/services/key-pair/key-pair.service.d.ts.map +1 -0
  216. package/lib/services/language/language.service.d.ts +21 -0
  217. package/lib/services/language/language.service.d.ts.map +1 -0
  218. package/lib/services/modules/base-modules.service.d.ts +34 -0
  219. package/lib/services/modules/base-modules.service.d.ts.map +1 -0
  220. package/lib/services/modules/controller/base-modules.controller.d.ts +19 -0
  221. package/lib/services/modules/controller/base-modules.controller.d.ts.map +1 -0
  222. package/lib/services/modules/controller/integral/integral-modules.controller.d.ts +22 -0
  223. package/lib/services/modules/controller/integral/integral-modules.controller.d.ts.map +1 -0
  224. package/lib/services/modules/controller/isolated/isolated-modules.controller.d.ts +32 -0
  225. package/lib/services/modules/controller/isolated/isolated-modules.controller.d.ts.map +1 -0
  226. package/lib/services/modules/controller/modules.controller.d.ts +27 -0
  227. package/lib/services/modules/controller/modules.controller.d.ts.map +1 -0
  228. package/lib/services/permissions/permissions.service.d.ts +39 -0
  229. package/lib/services/permissions/permissions.service.d.ts.map +1 -0
  230. package/lib/services/protocol/defaults.d.ts +6 -0
  231. package/lib/services/protocol/defaults.d.ts.map +1 -0
  232. package/lib/services/protocol/protocol.service.d.ts +47 -0
  233. package/lib/services/protocol/protocol.service.d.ts.map +1 -0
  234. package/lib/services/protocol/store/base-protocol-store.service.d.ts +36 -0
  235. package/lib/services/protocol/store/base-protocol-store.service.d.ts.map +1 -0
  236. package/lib/services/protocol/store/main/main-protocol-store.service.d.ts +21 -0
  237. package/lib/services/protocol/store/main/main-protocol-store.service.d.ts.map +1 -0
  238. package/lib/services/protocol/store/sub/sub-protocol-store.service.d.ts +31 -0
  239. package/lib/services/protocol/store/sub/sub-protocol-store.service.d.ts.map +1 -0
  240. package/lib/services/qr/qr-generators/bc-ur-generator.d.ts +16 -0
  241. package/lib/services/qr/qr-generators/bc-ur-generator.d.ts.map +1 -0
  242. package/lib/services/qr/qr-generators/metamask-generator.d.ts +16 -0
  243. package/lib/services/qr/qr-generators/metamask-generator.d.ts.map +1 -0
  244. package/lib/services/qr/qr-generators/output-descriptor-generator.d.ts +13 -0
  245. package/lib/services/qr/qr-generators/output-descriptor-generator.d.ts.map +1 -0
  246. package/lib/services/qr/qr-generators/serializer-v2-generator.d.ts +13 -0
  247. package/lib/services/qr/qr-generators/serializer-v2-generator.d.ts.map +1 -0
  248. package/lib/services/qr/qr-generators/serializer-v3-generator.d.ts +12 -0
  249. package/lib/services/qr/qr-generators/serializer-v3-generator.d.ts.map +1 -0
  250. package/lib/services/qr/qr-generators/xpub-generator.d.ts +12 -0
  251. package/lib/services/qr/qr-generators/xpub-generator.d.ts.map +1 -0
  252. package/lib/services/qr/qr-handler/serializer-v2-handler.d.ts +20 -0
  253. package/lib/services/qr/qr-handler/serializer-v2-handler.d.ts.map +1 -0
  254. package/lib/services/qr/qr-handler/serializer-v3-handler.d.ts +23 -0
  255. package/lib/services/qr/qr-handler/serializer-v3-handler.d.ts.map +1 -0
  256. package/lib/services/qr-scanner/qr-scanner.service.d.ts +23 -0
  257. package/lib/services/qr-scanner/qr-scanner.service.d.ts.map +1 -0
  258. package/lib/services/serializer/serializer.service.d.ts +34 -0
  259. package/lib/services/serializer/serializer.service.d.ts.map +1 -0
  260. package/lib/services/storage/base.storage.d.ts +15 -0
  261. package/lib/services/storage/base.storage.d.ts.map +1 -0
  262. package/lib/services/storage/storage.service.d.ts +28 -0
  263. package/lib/services/storage/storage.service.d.ts.map +1 -0
  264. package/lib/services/token/token.service.d.ts +11 -0
  265. package/lib/services/token/token.service.d.ts.map +1 -0
  266. package/lib/services/transaction/transaction.service.d.ts +21 -0
  267. package/lib/services/transaction/transaction.service.d.ts.map +1 -0
  268. package/lib/services/ui-event/ui-event.service.d.ts +58 -0
  269. package/lib/services/ui-event/ui-event.service.d.ts.map +1 -0
  270. package/lib/services/ui-event-elements/ui-event-elements.service.d.ts +16 -0
  271. package/lib/services/ui-event-elements/ui-event-elements.service.d.ts.map +1 -0
  272. package/lib/services/uri/uri.service.d.ts +15 -0
  273. package/lib/services/uri/uri.service.d.ts.map +1 -0
  274. package/lib/translation/AirGapTranslateLoader.d.ts +15 -0
  275. package/lib/translation/AirGapTranslateLoader.d.ts.map +1 -0
  276. package/lib/types/Either.d.ts +2 -0
  277. package/lib/types/Either.d.ts.map +1 -0
  278. package/lib/types/ExternalAliasResolver.d.ts +6 -0
  279. package/lib/types/ExternalAliasResolver.d.ts.map +1 -0
  280. package/lib/types/RuntimeMode.d.ts +5 -0
  281. package/lib/types/RuntimeMode.d.ts.map +1 -0
  282. package/lib/types/SupportedLanguage.d.ts +2 -0
  283. package/lib/types/SupportedLanguage.d.ts.map +1 -0
  284. package/lib/types/Token.d.ts +9 -0
  285. package/lib/types/Token.d.ts.map +1 -0
  286. package/lib/types/isolated-modules/IsolatedModule.d.ts +28 -0
  287. package/lib/types/isolated-modules/IsolatedModule.d.ts.map +1 -0
  288. package/lib/types/isolated-modules/IsolatedModuleManifest.d.ts +24 -0
  289. package/lib/types/isolated-modules/IsolatedModuleManifest.d.ts.map +1 -0
  290. package/lib/types/isolated-modules/IsolatedModuleMetadata.d.ts +21 -0
  291. package/lib/types/isolated-modules/IsolatedModuleMetadata.d.ts.map +1 -0
  292. package/lib/types/ui/UIAction.d.ts +10 -0
  293. package/lib/types/ui/UIAction.d.ts.map +1 -0
  294. package/lib/types/ui/UIResource.d.ts +11 -0
  295. package/lib/types/ui/UIResource.d.ts.map +1 -0
  296. package/lib/utils/ExposedPromise.d.ts +40 -0
  297. package/lib/utils/ExposedPromise.d.ts.map +1 -0
  298. package/lib/utils/airgap-transaction.d.ts +4 -0
  299. package/lib/utils/airgap-transaction.d.ts.map +1 -0
  300. package/lib/utils/array.d.ts +6 -0
  301. package/lib/utils/array.d.ts.map +1 -0
  302. package/lib/utils/modules/isolated/isolated-modules-metadata.d.ts +3 -0
  303. package/lib/utils/modules/isolated/isolated-modules-metadata.d.ts.map +1 -0
  304. package/lib/utils/modules/load-protocol.d.ts +4 -0
  305. package/lib/utils/modules/load-protocol.d.ts.map +1 -0
  306. package/lib/utils/not-initialized.d.ts +2 -0
  307. package/lib/utils/not-initialized.d.ts.map +1 -0
  308. package/lib/utils/protocol/delegation.d.ts +6 -0
  309. package/lib/utils/protocol/delegation.d.ts.map +1 -0
  310. package/lib/utils/protocol/protocol-identifier.d.ts +3 -0
  311. package/lib/utils/protocol/protocol-identifier.d.ts.map +1 -0
  312. package/lib/utils/protocol/protocol-network-identifier.d.ts +8 -0
  313. package/lib/utils/protocol/protocol-network-identifier.d.ts.map +1 -0
  314. package/lib/utils/protocol/protocol-options.d.ts +6 -0
  315. package/lib/utils/protocol/protocol-options.d.ts.map +1 -0
  316. package/lib/utils/protocol/protocol-v0-adapter.d.ts +75 -0
  317. package/lib/utils/protocol/protocol-v0-adapter.d.ts.map +1 -0
  318. package/lib/utils/utils.d.ts +9 -0
  319. package/lib/utils/utils.d.ts.map +1 -0
  320. package/lib/utils/worker.d.ts +11 -0
  321. package/lib/utils/worker.d.ts.map +1 -0
  322. package/package.json +88 -0
  323. package/public-api.d.ts +87 -0
  324. package/public-api.d.ts.map +1 -0
  325. package/src/assets/i18n-common/de.json +112 -0
  326. package/src/assets/i18n-common/en.json +112 -0
  327. package/src/assets/i18n-common/es.json +112 -0
  328. package/src/assets/i18n-common/fr.json +112 -0
  329. package/src/assets/i18n-common/pt_BR.json +112 -0
  330. package/src/assets/i18n-common/ru.json +112 -0
  331. package/src/assets/i18n-common/zh_CN.json +112 -0
  332. package/src/assets/img/identicon_placeholder.png +0 -0
  333. package/src/assets/native/isolated_modules/isolated-modules.js-engine-android.js +34 -0
  334. package/src/assets/native/isolated_modules/isolated-modules.script.js +304 -0
  335. package/src/assets/symbols/abt.svg +1 -0
  336. package/src/assets/symbols/adx.svg +1 -0
  337. package/src/assets/symbols/ae.svg +17 -0
  338. package/src/assets/symbols/agi.svg +1 -0
  339. package/src/assets/symbols/aion.svg +1 -0
  340. package/src/assets/symbols/amb.svg +1 -0
  341. package/src/assets/symbols/ampl.svg +7 -0
  342. package/src/assets/symbols/ant.svg +1 -0
  343. package/src/assets/symbols/aoa.svg +7 -0
  344. package/src/assets/symbols/appc.svg +1 -0
  345. package/src/assets/symbols/aqua.svg +5 -0
  346. package/src/assets/symbols/arn.svg +1 -0
  347. package/src/assets/symbols/ary.svg +1 -0
  348. package/src/assets/symbols/ast.svg +1 -0
  349. package/src/assets/symbols/astr.png +0 -0
  350. package/src/assets/symbols/atm.svg +1 -0
  351. package/src/assets/symbols/atom.svg +1 -0
  352. package/src/assets/symbols/auto.svg +1 -0
  353. package/src/assets/symbols/bal.svg +7 -0
  354. package/src/assets/symbols/band.svg +7 -0
  355. package/src/assets/symbols/bat.svg +1 -0
  356. package/src/assets/symbols/bcbc.svg +1 -0
  357. package/src/assets/symbols/bcpt.svg +1 -0
  358. package/src/assets/symbols/bix.svg +1 -0
  359. package/src/assets/symbols/blz.svg +1 -0
  360. package/src/assets/symbols/bnb.svg +1 -0
  361. package/src/assets/symbols/bnt.svg +1 -0
  362. package/src/assets/symbols/bnty.svg +1 -0
  363. package/src/assets/symbols/bpt.svg +1 -0
  364. package/src/assets/symbols/brc.svg +7 -0
  365. package/src/assets/symbols/brd.svg +1 -0
  366. package/src/assets/symbols/btc.svg +1 -0
  367. package/src/assets/symbols/btctz.png +0 -0
  368. package/src/assets/symbols/btm.svg +1 -0
  369. package/src/assets/symbols/busd.svg +7 -0
  370. package/src/assets/symbols/bytom.svg +7 -0
  371. package/src/assets/symbols/cacu.svg +1 -0
  372. package/src/assets/symbols/cdt.svg +1 -0
  373. package/src/assets/symbols/cel.svg +7 -0
  374. package/src/assets/symbols/cennz.svg +7 -0
  375. package/src/assets/symbols/cfx.svg +1 -0
  376. package/src/assets/symbols/chsb.svg +7 -0
  377. package/src/assets/symbols/chz.svg +7 -0
  378. package/src/assets/symbols/ckbtc.png +0 -0
  379. package/src/assets/symbols/cmt.svg +1 -0
  380. package/src/assets/symbols/cnd.svg +1 -0
  381. package/src/assets/symbols/cob.svg +1 -0
  382. package/src/assets/symbols/comp.svg +7 -0
  383. package/src/assets/symbols/coreum.png +0 -0
  384. package/src/assets/symbols/cred.svg +1 -0
  385. package/src/assets/symbols/cro.svg +7 -0
  386. package/src/assets/symbols/crpt.svg +1 -0
  387. package/src/assets/symbols/crv.svg +7 -0
  388. package/src/assets/symbols/cs.svg +1 -0
  389. package/src/assets/symbols/ctez.svg +1 -0
  390. package/src/assets/symbols/ctr.svg +1 -0
  391. package/src/assets/symbols/ctxc.svg +1 -0
  392. package/src/assets/symbols/cusdc.svg +7 -0
  393. package/src/assets/symbols/cvc.svg +1 -0
  394. package/src/assets/symbols/cvt.svg +7 -0
  395. package/src/assets/symbols/czrx.svg +7 -0
  396. package/src/assets/symbols/dai.svg +7 -0
  397. package/src/assets/symbols/dat.svg +1 -0
  398. package/src/assets/symbols/data.svg +1 -0
  399. package/src/assets/symbols/dcn.svg +1 -0
  400. package/src/assets/symbols/deez.svg +1 -0
  401. package/src/assets/symbols/dent.svg +1 -0
  402. package/src/assets/symbols/dew.svg +1 -0
  403. package/src/assets/symbols/dgd.svg +1 -0
  404. package/src/assets/symbols/dia.svg +7 -0
  405. package/src/assets/symbols/divx.svg +7 -0
  406. package/src/assets/symbols/dlt.svg +1 -0
  407. package/src/assets/symbols/dnt.svg +1 -0
  408. package/src/assets/symbols/dock.svg +1 -0
  409. package/src/assets/symbols/doga.png +0 -0
  410. package/src/assets/symbols/dot.svg +14 -0
  411. package/src/assets/symbols/drgn.svg +1 -0
  412. package/src/assets/symbols/drop.svg +1 -0
  413. package/src/assets/symbols/dth.svg +1 -0
  414. package/src/assets/symbols/dtr.svg +1 -0
  415. package/src/assets/symbols/dx.svg +7 -0
  416. package/src/assets/symbols/edg.svg +1 -0
  417. package/src/assets/symbols/edo.svg +1 -0
  418. package/src/assets/symbols/elf.svg +1 -0
  419. package/src/assets/symbols/elix.svg +1 -0
  420. package/src/assets/symbols/eng.svg +1 -0
  421. package/src/assets/symbols/enj.svg +1 -0
  422. package/src/assets/symbols/entrp.svg +1 -0
  423. package/src/assets/symbols/eos.svg +1 -0
  424. package/src/assets/symbols/eth.svg +1 -0
  425. package/src/assets/symbols/ethtz.png +0 -0
  426. package/src/assets/symbols/eurc.svg +8 -0
  427. package/src/assets/symbols/evx.svg +1 -0
  428. package/src/assets/symbols/fet.svg +7 -0
  429. package/src/assets/symbols/frax.svg +26 -0
  430. package/src/assets/symbols/fsn.svg +1 -0
  431. package/src/assets/symbols/ftc.svg +1 -0
  432. package/src/assets/symbols/ftm.svg +7 -0
  433. package/src/assets/symbols/fuel.svg +1 -0
  434. package/src/assets/symbols/fun.svg +1 -0
  435. package/src/assets/symbols/gbx.svg +1 -0
  436. package/src/assets/symbols/generic-coin.svg +1 -0
  437. package/src/assets/symbols/glmr.svg +1 -0
  438. package/src/assets/symbols/gno.svg +1 -0
  439. package/src/assets/symbols/gnt.svg +1 -0
  440. package/src/assets/symbols/grs.svg +1 -0
  441. package/src/assets/symbols/gsc.svg +1 -0
  442. package/src/assets/symbols/gto.svg +1 -0
  443. package/src/assets/symbols/gup.svg +1 -0
  444. package/src/assets/symbols/gusd.svg +1 -0
  445. package/src/assets/symbols/gvt.svg +1 -0
  446. package/src/assets/symbols/gzr.svg +1 -0
  447. package/src/assets/symbols/hedg.svg +7 -0
  448. package/src/assets/symbols/hodl.svg +1 -0
  449. package/src/assets/symbols/hot.svg +7 -0
  450. package/src/assets/symbols/hpb.svg +1 -0
  451. package/src/assets/symbols/ht.svg +1 -0
  452. package/src/assets/symbols/husd.svg +7 -0
  453. package/src/assets/symbols/icn.svg +1 -0
  454. package/src/assets/symbols/icp.svg +16 -0
  455. package/src/assets/symbols/icx.svg +1 -0
  456. package/src/assets/symbols/inb.svg +7 -0
  457. package/src/assets/symbols/ino.svg +7 -0
  458. package/src/assets/symbols/ins.svg +1 -0
  459. package/src/assets/symbols/iost.svg +1 -0
  460. package/src/assets/symbols/iotx.svg +1 -0
  461. package/src/assets/symbols/itc.svg +1 -0
  462. package/src/assets/symbols/jnt.svg +1 -0
  463. package/src/assets/symbols/kcs.svg +7 -0
  464. package/src/assets/symbols/kin.svg +1 -0
  465. package/src/assets/symbols/knc.svg +1 -0
  466. package/src/assets/symbols/ksm.svg +1 -0
  467. package/src/assets/symbols/kusd.svg +1 -0
  468. package/src/assets/symbols/ldo.svg +97 -0
  469. package/src/assets/symbols/lend.svg +1 -0
  470. package/src/assets/symbols/leo.svg +7 -0
  471. package/src/assets/symbols/link.svg +7 -0
  472. package/src/assets/symbols/loom.svg +1 -0
  473. package/src/assets/symbols/lpt.svg +1 -0
  474. package/src/assets/symbols/lrc.svg +1 -0
  475. package/src/assets/symbols/lun.svg +1 -0
  476. package/src/assets/symbols/mana.svg +1 -0
  477. package/src/assets/symbols/matic.svg +7 -0
  478. package/src/assets/symbols/mcap.svg +1 -0
  479. package/src/assets/symbols/mco.svg +1 -0
  480. package/src/assets/symbols/mda.svg +1 -0
  481. package/src/assets/symbols/mds.svg +1 -0
  482. package/src/assets/symbols/mkr.svg +1 -0
  483. package/src/assets/symbols/mln.svg +7 -0
  484. package/src/assets/symbols/mnw.svg +1 -0
  485. package/src/assets/symbols/mod.svg +1 -0
  486. package/src/assets/symbols/movr.svg +10 -0
  487. package/src/assets/symbols/mth.svg +1 -0
  488. package/src/assets/symbols/mtl.svg +1 -0
  489. package/src/assets/symbols/mxc.svg +7 -0
  490. package/src/assets/symbols/nas.svg +1 -0
  491. package/src/assets/symbols/ncash.svg +1 -0
  492. package/src/assets/symbols/neu.svg +1 -0
  493. package/src/assets/symbols/nexo.svg +1 -0
  494. package/src/assets/symbols/ngc.svg +1 -0
  495. package/src/assets/symbols/nio.svg +1 -0
  496. package/src/assets/symbols/nmr.svg +7 -0
  497. package/src/assets/symbols/noah.svg +7 -0
  498. package/src/assets/symbols/npxs.svg +1 -0
  499. package/src/assets/symbols/nuls.svg +1 -0
  500. package/src/assets/symbols/nxm.svg +7 -0
  501. package/src/assets/symbols/oax.svg +1 -0
  502. package/src/assets/symbols/ocean.svg +7 -0
  503. package/src/assets/symbols/okb.svg +7 -0
  504. package/src/assets/symbols/omg.svg +1 -0
  505. package/src/assets/symbols/ong.svg +1 -0
  506. package/src/assets/symbols/op.svg +21 -0
  507. package/src/assets/symbols/ost.svg +1 -0
  508. package/src/assets/symbols/pax.svg +1 -0
  509. package/src/assets/symbols/paxg.svg +7 -0
  510. package/src/assets/symbols/pay.svg +1 -0
  511. package/src/assets/symbols/plenty.svg +1 -0
  512. package/src/assets/symbols/plr.svg +1 -0
  513. package/src/assets/symbols/pnk.svg +7 -0
  514. package/src/assets/symbols/poe.svg +1 -0
  515. package/src/assets/symbols/poly.svg +1 -0
  516. package/src/assets/symbols/powr.svg +1 -0
  517. package/src/assets/symbols/ppp.svg +1 -0
  518. package/src/assets/symbols/ppt.svg +1 -0
  519. package/src/assets/symbols/prl.svg +1 -0
  520. package/src/assets/symbols/qash.svg +1 -0
  521. package/src/assets/symbols/qnt.svg +7 -0
  522. package/src/assets/symbols/qrl.svg +1 -0
  523. package/src/assets/symbols/qsp.svg +1 -0
  524. package/src/assets/symbols/qtum.svg +1 -0
  525. package/src/assets/symbols/quipu.png +0 -0
  526. package/src/assets/symbols/r.svg +1 -0
  527. package/src/assets/symbols/rcn.svg +1 -0
  528. package/src/assets/symbols/rdn.svg +1 -0
  529. package/src/assets/symbols/ren.svg +7 -0
  530. package/src/assets/symbols/rep.svg +1 -0
  531. package/src/assets/symbols/repv2.svg +7 -0
  532. package/src/assets/symbols/req.svg +1 -0
  533. package/src/assets/symbols/rev.svg +7 -0
  534. package/src/assets/symbols/rhoc.svg +1 -0
  535. package/src/assets/symbols/rlc.svg +1 -0
  536. package/src/assets/symbols/rsr.svg +7 -0
  537. package/src/assets/symbols/sai.svg +7 -0
  538. package/src/assets/symbols/salt.svg +1 -0
  539. package/src/assets/symbols/san.svg +1 -0
  540. package/src/assets/symbols/sdn.svg +1 -0
  541. package/src/assets/symbols/shx.svg +32 -0
  542. package/src/assets/symbols/sirs.svg +1 -0
  543. package/src/assets/symbols/smart.svg +1 -0
  544. package/src/assets/symbols/sngls.svg +1 -0
  545. package/src/assets/symbols/snm.svg +1 -0
  546. package/src/assets/symbols/snt.svg +1 -0
  547. package/src/assets/symbols/snx.svg +7 -0
  548. package/src/assets/symbols/soc.svg +1 -0
  549. package/src/assets/symbols/sol.svg +1 -0
  550. package/src/assets/symbols/spank.svg +1 -0
  551. package/src/assets/symbols/sphtx.svg +1 -0
  552. package/src/assets/symbols/srm.svg +7 -0
  553. package/src/assets/symbols/srn.svg +1 -0
  554. package/src/assets/symbols/stake.svg +7 -0
  555. package/src/assets/symbols/stellar.png +0 -0
  556. package/src/assets/symbols/storj.svg +1 -0
  557. package/src/assets/symbols/storm.svg +1 -0
  558. package/src/assets/symbols/stq.svg +1 -0
  559. package/src/assets/symbols/stxtz.svg +18 -0
  560. package/src/assets/symbols/sub.svg +1 -0
  561. package/src/assets/symbols/sushi.svg +7 -0
  562. package/src/assets/symbols/sxp.svg +7 -0
  563. package/src/assets/symbols/sxtz.svg +6 -0
  564. package/src/assets/symbols/taas.svg +1 -0
  565. package/src/assets/symbols/tau.svg +1 -0
  566. package/src/assets/symbols/tbx.svg +1 -0
  567. package/src/assets/symbols/tel.svg +1 -0
  568. package/src/assets/symbols/ten.svg +1 -0
  569. package/src/assets/symbols/theta.svg +1 -0
  570. package/src/assets/symbols/tix.svg +1 -0
  571. package/src/assets/symbols/tkn.svg +1 -0
  572. package/src/assets/symbols/tnt.svg +1 -0
  573. package/src/assets/symbols/tomo.svg +1 -0
  574. package/src/assets/symbols/trac.svg +7 -0
  575. package/src/assets/symbols/trb.svg +7 -0
  576. package/src/assets/symbols/trx.svg +1 -0
  577. package/src/assets/symbols/tusd.svg +1 -0
  578. package/src/assets/symbols/tzbtc.svg +1 -0
  579. package/src/assets/symbols/ubt.svg +7 -0
  580. package/src/assets/symbols/ubtc.svg +1 -0
  581. package/src/assets/symbols/udefi.svg +1 -0
  582. package/src/assets/symbols/uma.svg +7 -0
  583. package/src/assets/symbols/usdc.svg +1 -0
  584. package/src/assets/symbols/usdt.png +0 -0
  585. package/src/assets/symbols/usdt.svg +1 -0
  586. package/src/assets/symbols/usdtz.svg +17 -0
  587. package/src/assets/symbols/ust.svg +1 -0
  588. package/src/assets/symbols/utk.svg +1 -0
  589. package/src/assets/symbols/uusd.svg +1 -0
  590. package/src/assets/symbols/uxtz.svg +1 -0
  591. package/src/assets/symbols/velo.svg +5 -0
  592. package/src/assets/symbols/ven.svg +7 -0
  593. package/src/assets/symbols/veri.svg +1 -0
  594. package/src/assets/symbols/verse.svg +1 -0
  595. package/src/assets/symbols/vest.svg +7 -0
  596. package/src/assets/symbols/vib.svg +1 -0
  597. package/src/assets/symbols/vibe.svg +1 -0
  598. package/src/assets/symbols/wabi.svg +1 -0
  599. package/src/assets/symbols/wax.svg +1 -0
  600. package/src/assets/symbols/wbtc.svg +7 -0
  601. package/src/assets/symbols/weth.svg +18 -0
  602. package/src/assets/symbols/wic.svg +7 -0
  603. package/src/assets/symbols/wings.svg +1 -0
  604. package/src/assets/symbols/wnxm.svg +7 -0
  605. package/src/assets/symbols/wpr.svg +1 -0
  606. package/src/assets/symbols/wrap.png +0 -0
  607. package/src/assets/symbols/wtc.svg +1 -0
  608. package/src/assets/symbols/wusdc.png +0 -0
  609. package/src/assets/symbols/xchf.svg +1 -0
  610. package/src/assets/symbols/xdce.svg +7 -0
  611. package/src/assets/symbols/xin.svg +7 -0
  612. package/src/assets/symbols/xpa.svg +1 -0
  613. package/src/assets/symbols/xpl.svg +1 -0
  614. package/src/assets/symbols/xtz.svg +5 -0
  615. package/src/assets/symbols/yfi.svg +7 -0
  616. package/src/assets/symbols/you.svg +1 -0
  617. package/src/assets/symbols/yoyow.svg +1 -0
  618. package/src/assets/symbols/ytez.svg +1 -0
  619. package/src/assets/symbols/zb.svg +7 -0
  620. package/src/assets/symbols/zil.svg +1 -0
  621. package/src/assets/symbols/zrx.svg +1 -0
  622. package/src/assets/workers/airgap-coin-lib.js +119 -0
  623. package/wallfree-dev-angular-core.d.ts.map +1 -0
@@ -0,0 +1,880 @@
1
+ /* eslint-disable max-lines */
2
+ /* eslint-disable max-classes-per-file */
3
+ import { NetworkType as NetworkTypeV0, ProtocolBlockExplorer as ProtocolBlockExplorerV0, ProtocolNetwork as ProtocolNetworkV0, SubProtocolSymbols, SubProtocolType as SubProtocolTypeV0 } from '@wallfree-dev/coinlib-core';
4
+ import { derive, mnemonicToSeed } from '@wallfree-dev/crypto';
5
+ import { canEncryptAES, canEncryptAsymmetric, canFetchDataForAddress, canFetchDataForMultipleAddresses, canSignMessage, hasConfigurableContract, hasMultiAddressPublicKeys, implementsInterface, isAmount, isBip32Protocol, isMultiTokenSubProtocol, isOfflineProtocol, isOnlineProtocol, isTransactionStatusChecker, newAmount, newExtendedPublicKey, newExtendedSecretKey, newPublicKey, newSecretKey, newSignature } from '@wallfree-dev/module-kit';
6
+ import BigNumber from 'bignumber.js';
7
+ import { isTezosSaplingProtocol } from '@wallfree-dev/tezos';
8
+ import { isBitcoinSegwitProtocol, isBitcoinTaprootProtocol } from '@wallfree-dev/bitcoin';
9
+ import { getProtocolOptionsByIdentifierLegacy } from '../../utils/protocol/protocol-options';
10
+ import { supportsV1Delegation } from '../../utils/protocol/delegation';
11
+ import { convertFeeDefaultsV1ToV0, convertNetworkTypeV1ToV0, convertTransactionDetailsV1ToV0, convertTransactionStatusV1ToV0, getBytesFormatV1FromV0, getPublicKeyType, getSecretKeyType } from '../../utils/protocol/protocol-v0-adapter';
12
+ // ProtocolBlockExplorer
13
+ export class ProtocolBlockExplorerAdapter extends ProtocolBlockExplorerV0 {
14
+ constructor(blockExplorerV1, url) {
15
+ super(url);
16
+ this.blockExplorerV1 = blockExplorerV1;
17
+ }
18
+ async getAddressLink(address) {
19
+ return this.blockExplorerV1.createAddressUrl(address);
20
+ }
21
+ async getTransactionLink(transactionId) {
22
+ return this.blockExplorerV1.createTransactionUrl(transactionId);
23
+ }
24
+ toJSON() {
25
+ return {
26
+ blockExplorer: this.blockExplorer
27
+ };
28
+ }
29
+ }
30
+ // ProtocolNetwork
31
+ export class ProtocolNetworkAdapter extends ProtocolNetworkV0 {
32
+ constructor(name, type, rpcUrl, blockExplorer, extras = {}) {
33
+ const networkType = Object.values(NetworkTypeV0).includes(type)
34
+ ? type
35
+ : convertNetworkTypeV1ToV0(type);
36
+ super(name, networkType, rpcUrl, blockExplorer, extras);
37
+ }
38
+ }
39
+ // ProtocolOptions
40
+ export class ProtocolOptionsAdapter {
41
+ constructor(network, config = {}) {
42
+ this.network = network;
43
+ this.config = config;
44
+ }
45
+ }
46
+ // TransactionValidator
47
+ export class TransactionValidatorAdapter {
48
+ constructor(protocolIdentifier, serializerCompanion) {
49
+ this.protocolIdentifier = protocolIdentifier;
50
+ this.serializerCompanion = serializerCompanion;
51
+ }
52
+ async validateUnsignedTransaction(transaction) {
53
+ return this.serializerCompanion.validateTransactionSignRequest(this.protocolIdentifier, transaction);
54
+ }
55
+ async validateSignedTransaction(transaction) {
56
+ return this.serializerCompanion.validateTransactionSignResponse(this.protocolIdentifier, transaction);
57
+ }
58
+ }
59
+ // ICoinProtocol
60
+ export class ICoinProtocolAdapter {
61
+ constructor(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion) {
62
+ this.protocolV1 = protocolV1;
63
+ this.protocolMetadata = protocolMetadata;
64
+ this.crypto = crypto;
65
+ this.network = network;
66
+ this.v3SerializerCompanion = v3SerializerCompanion;
67
+ const units = this.protocolMetadata.units;
68
+ const mainUnit = this.protocolMetadata.mainUnit;
69
+ const symbol = units[mainUnit].symbol;
70
+ const feeUnits = protocolMetadata.fee?.units ?? protocolMetadata.units;
71
+ const mainFeeUnit = protocolMetadata.fee?.mainUnit ?? protocolMetadata.mainUnit;
72
+ const feeSymbol = feeUnits[mainFeeUnit].symbol;
73
+ const feeDefaults = protocolMetadata.fee?.defaults ?? {
74
+ low: newAmount('0', 'blockchain'),
75
+ medium: newAmount('0', 'blockchain'),
76
+ high: newAmount('0', 'blockchain')
77
+ };
78
+ const maxDecimals = Math.max(...Object.values(protocolMetadata.units).map((unit) => unit.decimals));
79
+ this.name = this.protocolMetadata.name;
80
+ this.identifier = this.protocolMetadata.identifier;
81
+ this.symbol = symbol.value;
82
+ this.marketSymbol = symbol.market ?? symbol.value;
83
+ this.assetSymbol = symbol.asset;
84
+ this.decimals = units[mainUnit].decimals;
85
+ this.feeSymbol = feeSymbol.value;
86
+ this.feeDefaults = this.convertFeeDefaultsV1ToV0(feeDefaults);
87
+ this.feeDecimals = feeUnits[mainFeeUnit].decimals;
88
+ this.units = Object.entries(protocolMetadata.units).map((entry) => {
89
+ const unitSymbol = entry[0];
90
+ const factor = new BigNumber(1).shiftedBy(-(maxDecimals - entry[1].decimals)).toFixed();
91
+ return { unitSymbol, factor };
92
+ });
93
+ this.supportsHD = isBip32Protocol(this.protocolV1);
94
+ this.standardDerivationPath = this.protocolMetadata.account?.standardDerivationPath ?? 'm/';
95
+ this.addressIsCaseSensitive = this.protocolMetadata.account.address?.isCaseSensitive ?? false;
96
+ this.addressValidationPattern = this.protocolMetadata.account?.address?.regex ?? '*+';
97
+ this.addressPlaceholder = this.protocolMetadata.account?.address?.placeholder ?? '';
98
+ let knownOptions;
99
+ try {
100
+ knownOptions = getProtocolOptionsByIdentifierLegacy(this.protocolMetadata.identifier);
101
+ // eslint-disable-next-line no-empty
102
+ }
103
+ catch { }
104
+ this.blockExplorerV0 =
105
+ blockExplorerV1 && blockExplorerMetadata ? new ProtocolBlockExplorerAdapter(blockExplorerV1, blockExplorerMetadata.url) : undefined;
106
+ this.networkV0 = this.getNetwork(knownOptions);
107
+ this.options = new ProtocolOptionsAdapter(this.networkV0, knownOptions?.config ?? {});
108
+ }
109
+ async getSymbol() {
110
+ return this.symbol;
111
+ }
112
+ async getName() {
113
+ return this.name;
114
+ }
115
+ async getMarketSymbol() {
116
+ return this.marketSymbol;
117
+ }
118
+ async getAssetSymbol() {
119
+ return this.assetSymbol;
120
+ }
121
+ async getFeeSymbol() {
122
+ return this.feeSymbol;
123
+ }
124
+ async getFeeDefaults() {
125
+ return this.feeDefaults;
126
+ }
127
+ async getDecimals() {
128
+ return this.decimals;
129
+ }
130
+ async getFeeDecimals() {
131
+ return this.feeDecimals;
132
+ }
133
+ async getIdentifier() {
134
+ return this.identifier;
135
+ }
136
+ async getUnits() {
137
+ return this.units;
138
+ }
139
+ async getSupportsHD() {
140
+ return this.supportsHD;
141
+ }
142
+ async getStandardDerivationPath() {
143
+ return this.standardDerivationPath;
144
+ }
145
+ async getAddressIsCaseSensitive() {
146
+ return this.addressIsCaseSensitive;
147
+ }
148
+ async getAddressValidationPattern() {
149
+ return this.addressValidationPattern;
150
+ }
151
+ async getAddressPlaceholder() {
152
+ return this.addressPlaceholder;
153
+ }
154
+ async getOptions() {
155
+ return this.options;
156
+ }
157
+ async getBlockExplorerLinkForAddress(address) {
158
+ if (this.blockExplorerV0 === undefined) {
159
+ throw new Error('Method not supported, BlockExplorer not found.');
160
+ }
161
+ return this.blockExplorerV0.getAddressLink(address);
162
+ }
163
+ async getBlockExplorerLinkForTxId(txId) {
164
+ if (this.blockExplorerV0 === undefined) {
165
+ throw new Error('Method not supported, BlockExplorer not found.');
166
+ }
167
+ return this.blockExplorerV0.getTransactionLink(txId);
168
+ }
169
+ async getTransactionsFromPublicKey(publicKey, limit, cursor) {
170
+ if (!isOnlineProtocol(this.protocolV1)) {
171
+ throw new Error('Method not supported, required interface: Online.');
172
+ }
173
+ const transactions = await this.protocolV1.getTransactionsForPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), limit, cursor);
174
+ return {
175
+ transactions: await this.convertTransactionDetailsV1ToV0(transactions.transactions),
176
+ cursor
177
+ };
178
+ }
179
+ async getTransactionsFromExtendedPublicKey(extendedPublicKey, limit, cursor) {
180
+ if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
181
+ throw new Error('Method not supported, required interface: Online, Bip32.');
182
+ }
183
+ const transactions = await this.protocolV1.getTransactionsForPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), limit, cursor);
184
+ return {
185
+ transactions: await this.convertTransactionDetailsV1ToV0(transactions.transactions),
186
+ cursor
187
+ };
188
+ }
189
+ async getTransactionsFromAddresses(addresses, limit, cursor) {
190
+ if (!isOnlineProtocol(this.protocolV1)) {
191
+ throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
192
+ }
193
+ let transactions;
194
+ if (addresses.length === 1 && canFetchDataForAddress(this.protocolV1)) {
195
+ transactions = await this.protocolV1.getTransactionsForAddress(addresses[0], limit, cursor);
196
+ }
197
+ else if (canFetchDataForMultipleAddresses(this.protocolV1)) {
198
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
199
+ transactions = await this.protocolV1.getTransactionsForAddresses(addresses, limit, cursor);
200
+ }
201
+ else {
202
+ throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
203
+ }
204
+ return {
205
+ transactions: await this.convertTransactionDetailsV1ToV0(transactions.transactions),
206
+ cursor: transactions.cursor ? transactions.cursor : cursor
207
+ };
208
+ }
209
+ async getBalanceOfAddresses(addresses, _data) {
210
+ if (!isOnlineProtocol(this.protocolV1)) {
211
+ throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
212
+ }
213
+ let balance;
214
+ if (addresses.length === 1 && canFetchDataForAddress(this.protocolV1)) {
215
+ balance = await this.protocolV1.getBalanceOfAddress(addresses[0]);
216
+ }
217
+ else if (canFetchDataForMultipleAddresses(this.protocolV1)) {
218
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
219
+ balance = await this.protocolV1.getBalanceOfAddresses(addresses);
220
+ }
221
+ else {
222
+ throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
223
+ }
224
+ return newAmount(balance.total).blockchain(this.protocolMetadata.units).value;
225
+ }
226
+ async getBalanceOfPublicKey(publicKey, data) {
227
+ if (!isOnlineProtocol(this.protocolV1)) {
228
+ throw new Error('Method not supported, required inferface: Online.');
229
+ }
230
+ const publicKeyV1 = newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey));
231
+ const balance = data?.assetID && isMultiTokenSubProtocol(this.protocolV1)
232
+ ? await this.protocolV1.getBalanceOfPublicKey(publicKeyV1, { tokenId: data.assetID })
233
+ : await this.protocolV1.getBalanceOfPublicKey(publicKeyV1);
234
+ return newAmount(balance.total).blockchain(this.protocolMetadata.units).value;
235
+ }
236
+ async getBalanceOfExtendedPublicKey(extendedPublicKey, _offset, data) {
237
+ if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
238
+ throw new Error('Method not supported, required inferface: Online, Bip32.');
239
+ }
240
+ const extendedPublicKeyV1 = newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey));
241
+ const balance = data?.assetID && isMultiTokenSubProtocol(this.protocolV1)
242
+ ? await this.protocolV1.getBalanceOfPublicKey(extendedPublicKeyV1, { tokenId: data.assetID })
243
+ : await this.protocolV1.getBalanceOfPublicKey(extendedPublicKeyV1);
244
+ return newAmount(balance.total).blockchain(this.protocolMetadata.units).value;
245
+ }
246
+ async getAvailableBalanceOfAddresses(addresses, _data) {
247
+ if (!isOnlineProtocol(this.protocolV1)) {
248
+ throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
249
+ }
250
+ let balance;
251
+ if (addresses.length === 1 && canFetchDataForAddress(this.protocolV1)) {
252
+ balance = await this.protocolV1.getBalanceOfAddress(addresses[0]);
253
+ }
254
+ else if (canFetchDataForMultipleAddresses(this.protocolV1)) {
255
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
256
+ balance = await this.protocolV1.getBalanceOfAddresses(addresses);
257
+ }
258
+ else {
259
+ throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
260
+ }
261
+ return newAmount(balance.transferable ?? balance.total).blockchain(this.protocolMetadata.units).value;
262
+ }
263
+ async getTransactionStatuses(transactionHash) {
264
+ if (!isOnlineProtocol(this.protocolV1) || !isTransactionStatusChecker(this.protocolV1)) {
265
+ throw new Error('Method not supported, required inferface: Online, TransactionStatusChecker.');
266
+ }
267
+ const statuses = await this.protocolV1.getTransactionStatus(transactionHash);
268
+ return transactionHash.map((hash) => {
269
+ const status = statuses[hash];
270
+ return convertTransactionStatusV1ToV0(status);
271
+ });
272
+ }
273
+ async getBalanceOfPublicKeyForSubProtocols(_publicKey, _subProtocols) {
274
+ throw new Error('Method not supported.');
275
+ }
276
+ async estimateMaxTransactionValueFromExtendedPublicKey(extendedPublicKey, recipients, fee, data) {
277
+ if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
278
+ throw new Error('Method not supported, required inferface: Online, Bip32.');
279
+ }
280
+ const maxAmount = await this.protocolV1.getTransactionMaxAmountWithPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), recipients, {
281
+ arbitraryData: this.getArbitraryData(data),
282
+ fee: fee ? newAmount(fee, 'blockchain') : undefined
283
+ });
284
+ return newAmount(maxAmount).blockchain(this.protocolMetadata.units).value;
285
+ }
286
+ async estimateMaxTransactionValueFromPublicKey(publicKey, recipients, fee, data) {
287
+ if (!isOnlineProtocol(this.protocolV1)) {
288
+ throw new Error('Method not supported, required inferface: Online.');
289
+ }
290
+ const maxAmount = await this.protocolV1.getTransactionMaxAmountWithPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), recipients, {
291
+ fee: fee ? newAmount(fee, 'blockchain') : undefined,
292
+ arbitraryData: this.getArbitraryData(data)
293
+ });
294
+ return newAmount(maxAmount).blockchain(this.protocolMetadata.units).value;
295
+ }
296
+ async estimateFeeDefaultsFromExtendedPublicKey(publicKey, recipients, values, data) {
297
+ if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
298
+ throw new Error('Method not supported, required inferface: Online, Bip32.');
299
+ }
300
+ const feeEstimation = await this.protocolV1.getTransactionFeeWithPublicKey(newExtendedPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), this.combineTransactionDetails(recipients, values), {
301
+ arbitraryData: this.getArbitraryData(data),
302
+ assetId: data?.assetID ? parseInt(data.assetID, 10) : undefined
303
+ });
304
+ if (feeEstimation === undefined) {
305
+ throw new Error('Method `estimateFeeDefaultsFromExtendedPublicKey` not supported.');
306
+ }
307
+ const feeDefaults = isAmount(feeEstimation)
308
+ ? { low: feeEstimation, medium: feeEstimation, high: feeEstimation }
309
+ : feeEstimation;
310
+ return this.convertFeeDefaultsV1ToV0(feeDefaults);
311
+ }
312
+ async estimateFeeDefaultsFromPublicKey(publicKey, recipients, values, data) {
313
+ if (!isOnlineProtocol(this.protocolV1)) {
314
+ throw new Error('Method not supported, required inferface: Online.');
315
+ }
316
+ if (recipients.length !== values.length) {
317
+ throw new Error('Recipients length must match values length.');
318
+ }
319
+ const transactionDetails = recipients.map((recipient, index) => ({
320
+ to: recipient,
321
+ amount: newAmount(values[index], 'blockchain')
322
+ }));
323
+ const feeEstimation = await this.protocolV1.getTransactionFeeWithPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), transactionDetails, {
324
+ arbitraryData: this.getArbitraryData(data),
325
+ assetId: data?.assetID ? parseInt(data.assetID, 10) : undefined
326
+ });
327
+ if (feeEstimation === undefined) {
328
+ throw new Error('Method `estimateFeeDefaultsFromPublicKey` not supported.');
329
+ }
330
+ const feeDefaults = isAmount(feeEstimation)
331
+ ? { low: feeEstimation, medium: feeEstimation, high: feeEstimation }
332
+ : feeEstimation;
333
+ return this.convertFeeDefaultsV1ToV0(feeDefaults);
334
+ }
335
+ async prepareTransactionFromExtendedPublicKey(extendedPublicKey, _offset, recipients, values, fee, extras) {
336
+ if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
337
+ throw new Error('Method not supported, required inferface: Online.');
338
+ }
339
+ const isSegwit = isBitcoinSegwitProtocol(this.protocolV1);
340
+ const isTaproot = isBitcoinTaprootProtocol(this.protocolV1);
341
+ let transaction;
342
+ if (isSegwit || isTaproot) {
343
+ transaction = await (isSegwit
344
+ ? this.protocolV1
345
+ : this.protocolV1).prepareTransactionWithPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), this.combineTransactionDetails(recipients, values), {
346
+ fee: newAmount(fee, 'blockchain'),
347
+ arbitraryData: this.getArbitraryData(extras),
348
+ masterFingerprint: {
349
+ format: 'hex',
350
+ value: extras?.masterFingerprint
351
+ },
352
+ replaceByFee: extras?.replaceByFee
353
+ });
354
+ }
355
+ else {
356
+ transaction = await this.protocolV1.prepareTransactionWithPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), this.combineTransactionDetails(recipients, values), {
357
+ fee: newAmount(fee, 'blockchain'),
358
+ assetId: extras?.assetID ? parseInt(extras.assetID, 10) : undefined,
359
+ arbitraryData: this.getArbitraryData(extras)
360
+ });
361
+ }
362
+ const transactionV0 = await this.convertUnsignedTransactionV1ToV0(transaction, extendedPublicKey);
363
+ return transactionV0.transaction;
364
+ }
365
+ async prepareTransactionFromPublicKey(publicKey, recipients, values, fee, extras) {
366
+ if (!isOnlineProtocol(this.protocolV1)) {
367
+ throw new Error('Method not supported, required inferface: Online.');
368
+ }
369
+ const transaction = await this.protocolV1.prepareTransactionWithPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), this.combineTransactionDetails(recipients, values), {
370
+ fee: newAmount(fee, 'blockchain'),
371
+ arbitraryData: this.getArbitraryData(extras),
372
+ assetId: extras?.assetID ? parseInt(extras.assetID, 10) : undefined
373
+ });
374
+ const transactionV0 = await this.convertUnsignedTransactionV1ToV0(transaction, publicKey);
375
+ return transactionV0.transaction;
376
+ }
377
+ async broadcastTransaction(rawTransaction) {
378
+ if (!isOnlineProtocol(this.protocolV1)) {
379
+ throw new Error('Method not supported, required inferface: Online.');
380
+ }
381
+ const transaction = { transaction: rawTransaction, accountIdentifier: '' };
382
+ const signed = await this.convertSignedTransactionV0ToV1(transaction);
383
+ return this.protocolV1.broadcastTransaction(signed);
384
+ }
385
+ async getAddressFromPublicKey(publicKey, _cursor) {
386
+ const address = await this.protocolV1.getAddressFromPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)));
387
+ return {
388
+ address: typeof address === 'string' ? address : address.address,
389
+ cursor: typeof address === 'object' ? address.cursor : { hasNext: false }
390
+ };
391
+ }
392
+ async getAddressesFromPublicKey(publicKey, _cursor) {
393
+ if (hasMultiAddressPublicKeys(this.protocolV1)) {
394
+ const pk = newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey));
395
+ const addresses = await this.protocolV1.getInitialAddressesFromPublicKey(pk);
396
+ return addresses;
397
+ }
398
+ else {
399
+ return [await this.getAddressFromPublicKey(publicKey)];
400
+ }
401
+ }
402
+ async getAddressFromExtendedPublicKey(extendedPublicKey, visibilityDerivationIndex, addressDerivationIndex) {
403
+ if (!isBip32Protocol(this.protocolV1)) {
404
+ throw new Error('Method not supported, required inferface: Bip32.');
405
+ }
406
+ const derivedPublicKey = await this.protocolV1.deriveFromExtendedPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), visibilityDerivationIndex, addressDerivationIndex);
407
+ return this.getAddressFromPublicKey(derivedPublicKey.value);
408
+ }
409
+ async getAddressesFromExtendedPublicKey(extendedPublicKey, visibilityDerivationIndex, addressCount, offset) {
410
+ if (!isBip32Protocol(this.protocolV1)) {
411
+ throw new Error('Method not supported, required inferface: Bip32.');
412
+ }
413
+ const generatorArray = Array.from(new Array(addressCount), (_, i) => i + offset);
414
+ return Promise.all(generatorArray.map((addressDerivationIndex) => this.getAddressFromExtendedPublicKey(extendedPublicKey, visibilityDerivationIndex, addressDerivationIndex)));
415
+ }
416
+ async getTransactionDetails(transaction, data) {
417
+ const unsigned = await this.convertUnsignedTransactionV0ToV1(transaction, data?.transactionOwner);
418
+ let transactions;
419
+ if (this.isExtendedPublicKey(transaction.publicKey)) {
420
+ if (!isBip32Protocol(this.protocolV1)) {
421
+ throw new Error('Method not supported, required inferface: Bip32.');
422
+ }
423
+ transactions = await this.protocolV1.getDetailsFromTransaction(unsigned, newExtendedPublicKey(transaction.publicKey, getBytesFormatV1FromV0(transaction.publicKey)));
424
+ }
425
+ else {
426
+ const publicKey = newPublicKey(transaction.publicKey, getBytesFormatV1FromV0(transaction.publicKey));
427
+ transactions =
428
+ data?.knownViewingKeys && isTezosSaplingProtocol(this.protocolV1)
429
+ ? await this.protocolV1.getDetailsFromTransaction(unsigned, publicKey, data.knownViewingKeys)
430
+ : await this.protocolV1.getDetailsFromTransaction(unsigned, publicKey);
431
+ }
432
+ const transactionsV0 = await this.convertTransactionDetailsV1ToV0(transactions);
433
+ return transactionsV0.map((tx) => ({
434
+ ...tx,
435
+ transactionDetails: tx.transactionDetails ?? transaction.transaction
436
+ }));
437
+ }
438
+ async getTransactionDetailsFromSigned(transaction, data) {
439
+ const signed = await this.convertSignedTransactionV0ToV1(transaction, data?.transactionOwner);
440
+ let transactions;
441
+ if (this.isExtendedPublicKey(transaction.accountIdentifier)) {
442
+ if (!isBip32Protocol(this.protocolV1)) {
443
+ throw new Error('Method not supported, required inferface: Bip32.');
444
+ }
445
+ transactions = await this.protocolV1.getDetailsFromTransaction(signed, newExtendedPublicKey(transaction.accountIdentifier, getBytesFormatV1FromV0(transaction.accountIdentifier)));
446
+ }
447
+ else {
448
+ const publicKey = newPublicKey(transaction.accountIdentifier, getBytesFormatV1FromV0(transaction.accountIdentifier));
449
+ transactions =
450
+ data?.knownViewingKeys && isTezosSaplingProtocol(this.protocolV1)
451
+ ? await this.protocolV1.getDetailsFromTransaction(signed, publicKey, data.knownViewingKeys)
452
+ : await this.protocolV1.getDetailsFromTransaction(signed, publicKey);
453
+ }
454
+ const transactionsV0 = await this.convertTransactionDetailsV1ToV0(transactions);
455
+ return transactionsV0.map((tx) => ({
456
+ ...tx,
457
+ transactionDetails: tx.transactionDetails ?? transaction.transaction
458
+ }));
459
+ }
460
+ async verifyMessage(message, signature, publicKey) {
461
+ if (!isOfflineProtocol(this.protocolV1) || !canSignMessage(this.protocolV1)) {
462
+ throw new Error('Method not supported, required inferface: Offline, SignMessage.');
463
+ }
464
+ return this.protocolV1.verifyMessageWithPublicKey(message, newSignature(signature, getBytesFormatV1FromV0(signature)), newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)));
465
+ }
466
+ async encryptAsymmetric(payload, publicKey) {
467
+ if (!isOfflineProtocol(this.protocolV1) || !canEncryptAsymmetric(this.protocolV1)) {
468
+ throw new Error('Method not supported, required inferface: Offline, AsymmetricEncryption.');
469
+ }
470
+ return this.protocolV1.encryptAsymmetricWithPublicKey(payload, newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)));
471
+ }
472
+ async getPublicKeyFromMnemonic(mnemonic, derivationPath, password) {
473
+ if (!isOfflineProtocol(this.protocolV1)) {
474
+ throw new Error('Method not supported, required inferface: Offline.');
475
+ }
476
+ const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
477
+ const seed = await mnemonicToSeed(crypto, mnemonic, password);
478
+ return this.getPublicKeyFromHexSecret(seed.toString('hex'), derivationPath);
479
+ }
480
+ async getPrivateKeyFromMnemonic(mnemonic, derivationPath, password) {
481
+ if (!isOfflineProtocol(this.protocolV1)) {
482
+ throw new Error('Method not supported, required inferface: Offline.');
483
+ }
484
+ const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
485
+ const seed = await mnemonicToSeed(crypto, mnemonic, password);
486
+ return this.getPrivateKeyFromHexSecret(seed.toString('hex'), derivationPath);
487
+ }
488
+ async getExtendedPublicKeyFromMnemonic(mnemonic, derivationPath, password) {
489
+ if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
490
+ throw new Error('Method not supported, required inferface: Offline, Bip32.');
491
+ }
492
+ const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
493
+ const seed = await mnemonicToSeed(crypto, mnemonic, password);
494
+ return this.getExtendedPublicKeyFromHexSecret(seed.toString('hex'), derivationPath);
495
+ }
496
+ async getExtendedPrivateKeyFromMnemonic(mnemonic, derivationPath, password) {
497
+ if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
498
+ throw new Error('Method not supported, required inferface: Offline, Bip32.');
499
+ }
500
+ const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
501
+ const seed = await mnemonicToSeed(crypto, mnemonic, password);
502
+ return this.getExtendedPrivateKeyFromHexSecret(seed.toString('hex'), derivationPath);
503
+ }
504
+ async getPublicKeyFromHexSecret(secret, derivationPath) {
505
+ if (!isOfflineProtocol(this.protocolV1)) {
506
+ throw new Error('Method not supported, required inferface: Offline, Bip32.');
507
+ }
508
+ const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
509
+ const derivative = await derive(crypto, Buffer.from(secret, 'hex'), derivationPath);
510
+ const keyPair = await this.protocolV1.getKeyPairFromDerivative(derivative);
511
+ return keyPair.publicKey.value;
512
+ }
513
+ async getPrivateKeyFromHexSecret(secret, derivationPath) {
514
+ if (!isOfflineProtocol(this.protocolV1)) {
515
+ throw new Error('Method not supported, required inferface: Offline.');
516
+ }
517
+ const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
518
+ const derivative = await derive(crypto, Buffer.from(secret, 'hex'), derivationPath);
519
+ const keyPair = await this.protocolV1.getKeyPairFromDerivative(derivative);
520
+ return keyPair.secretKey.value;
521
+ }
522
+ async getExtendedPublicKeyFromHexSecret(secret, derivationPath) {
523
+ if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
524
+ throw new Error('Method not supported, required inferface: Offline, Bip32.');
525
+ }
526
+ const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
527
+ const derivative = await derive(crypto, Buffer.from(secret, 'hex'), derivationPath);
528
+ const keyPair = await this.protocolV1.getExtendedKeyPairFromDerivative(derivative);
529
+ return keyPair.publicKey.value;
530
+ }
531
+ async getExtendedPrivateKeyFromHexSecret(secret, derivationPath) {
532
+ if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
533
+ throw new Error('Method not supported, required inferface: Offline, Bip32.');
534
+ }
535
+ const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
536
+ const derivative = await derive(crypto, Buffer.from(secret, 'hex'), derivationPath);
537
+ const keyPair = await this.protocolV1.getExtendedKeyPairFromDerivative(derivative);
538
+ return keyPair.secretKey.value;
539
+ }
540
+ async signWithExtendedPrivateKey(extendedPrivateKey, transaction, childDerivationPath) {
541
+ if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
542
+ throw new Error('Method not supported, required inferface: Offline, Bip32.');
543
+ }
544
+ const unsigned = await this.convertUnsignedTransactionV0ToV1({
545
+ transaction,
546
+ publicKey: ''
547
+ });
548
+ const extendedSecretKey = newExtendedSecretKey(extendedPrivateKey, getBytesFormatV1FromV0(extendedPrivateKey));
549
+ const secretKey = childDerivationPath
550
+ ? await this.deriveSecretKey(extendedSecretKey, childDerivationPath)
551
+ : extendedSecretKey;
552
+ const signed = await this.protocolV1.signTransactionWithSecretKey(unsigned, secretKey);
553
+ const signedV0 = await this.convertSignedTransactionV1ToV0(signed, '');
554
+ return signedV0.transaction;
555
+ }
556
+ async signWithPrivateKey(privateKey, transaction) {
557
+ if (!isOfflineProtocol(this.protocolV1)) {
558
+ throw new Error('Method not supported, required inferface: Offline.');
559
+ }
560
+ const unsigned = await this.convertUnsignedTransactionV0ToV1({
561
+ transaction,
562
+ publicKey: ''
563
+ });
564
+ const signed = await this.protocolV1.signTransactionWithSecretKey(unsigned, newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)));
565
+ const signedV0 = await this.convertSignedTransactionV1ToV0(signed, '');
566
+ return signedV0.transaction;
567
+ }
568
+ async signMessage(message, keypair) {
569
+ if (!isOfflineProtocol(this.protocolV1) || !canSignMessage(this.protocolV1)) {
570
+ throw new Error('Method not supported, required inferface: Offline, SignMessage.');
571
+ }
572
+ const privateKey = getSecretKeyType(keypair.privateKey) === 'xpriv'
573
+ ? await this.getPrivateKeyFromExtendedPrivateKey(keypair.privateKey)
574
+ : keypair.privateKey;
575
+ const publicKey = keypair.publicKey
576
+ ? getPublicKeyType(keypair.publicKey) === 'xpub'
577
+ ? await this.getPublicKeyFromExtendedPrivateKey(keypair.publicKey)
578
+ : keypair.publicKey
579
+ : '';
580
+ const signature = await this.protocolV1.signMessageWithKeyPair(message, {
581
+ secretKey: newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)),
582
+ publicKey: newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey))
583
+ });
584
+ return signature.value;
585
+ }
586
+ async decryptAsymmetric(encryptedPayload, keypair) {
587
+ if (!isOfflineProtocol(this.protocolV1) || !canEncryptAsymmetric(this.protocolV1)) {
588
+ throw new Error('Method not supported, required inferface: Offline, AsymmetricEncryption.');
589
+ }
590
+ const privateKey = getSecretKeyType(keypair.privateKey) === 'xpriv'
591
+ ? await this.getPrivateKeyFromExtendedPrivateKey(keypair.privateKey)
592
+ : keypair.privateKey;
593
+ const publicKey = keypair.publicKey
594
+ ? getPublicKeyType(keypair.publicKey) === 'xpub'
595
+ ? await this.getPublicKeyFromExtendedPrivateKey(keypair.publicKey)
596
+ : keypair.publicKey
597
+ : '';
598
+ return this.protocolV1.decryptAsymmetricWithKeyPair(encryptedPayload, {
599
+ secretKey: newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)),
600
+ publicKey: newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey))
601
+ });
602
+ }
603
+ async encryptAES(payload, privateKey) {
604
+ if (!isOfflineProtocol(this.protocolV1) || !canEncryptAES(this.protocolV1)) {
605
+ throw new Error('Method not supported, required inferface: Offline, AES.');
606
+ }
607
+ // eslint-disable-next-line no-param-reassign
608
+ privateKey = getSecretKeyType(privateKey) === 'xpriv' ? await this.getPrivateKeyFromExtendedPrivateKey(privateKey) : privateKey;
609
+ return this.protocolV1.encryptAESWithSecretKey(payload, newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)));
610
+ }
611
+ async decryptAES(encryptedPayload, privateKey) {
612
+ if (!isOfflineProtocol(this.protocolV1) || !canEncryptAES(this.protocolV1)) {
613
+ throw new Error('Method not supported, required inferface: Offline, AES.');
614
+ }
615
+ // eslint-disable-next-line no-param-reassign
616
+ privateKey = getSecretKeyType(privateKey) === 'xpriv' ? await this.getPrivateKeyFromExtendedPrivateKey(privateKey) : privateKey;
617
+ return this.protocolV1.decryptAESWithSecretKey(encryptedPayload, newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)));
618
+ }
619
+ async getPrivateKeyFromExtendedPrivateKey(extendedPrivateKey, childDerivationPath) {
620
+ if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
621
+ throw new Error('Method not supported, required inferface: Offline, Bip32.');
622
+ }
623
+ const secretKey = await this.deriveSecretKey(newExtendedSecretKey(extendedPrivateKey, getBytesFormatV1FromV0(extendedPrivateKey)), childDerivationPath);
624
+ return secretKey.value;
625
+ }
626
+ async getPublicKeyFromExtendedPrivateKey(extendedPublicKey, childDerivationPath) {
627
+ if (!isBip32Protocol(this.protocolV1)) {
628
+ throw new Error('Method not supported, required inferface: Bip32.');
629
+ }
630
+ const publicKey = await this.derivePublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), childDerivationPath);
631
+ return publicKey.value;
632
+ }
633
+ getNetwork(protocolOptions) {
634
+ let knownOptions;
635
+ try {
636
+ knownOptions = protocolOptions ?? getProtocolOptionsByIdentifierLegacy(this.identifier);
637
+ // eslint-disable-next-line no-empty
638
+ }
639
+ catch { }
640
+ const { name, type, rpcUrl, ...rest } = this.network ?? {};
641
+ return new ProtocolNetworkAdapter(name ?? knownOptions?.network.name ?? '', type ?? knownOptions?.network.type ?? 'mainnet', rpcUrl ?? knownOptions?.network.rpcUrl ?? '', this.blockExplorerV0, rest || (knownOptions?.network.extras ?? {}));
642
+ }
643
+ async deriveSecretKey(extendedSecretKey, childDerivationPath = '0/0') {
644
+ if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
645
+ throw new Error(`Protocol doesn't support secret key derivation, missing inferface: Offline, Bip32.`);
646
+ }
647
+ if (childDerivationPath.startsWith('m')) {
648
+ throw new Error('Received full derivation path, expected child derivation path');
649
+ }
650
+ if (childDerivationPath.toLowerCase().includes('h') || childDerivationPath.includes(`'`)) {
651
+ throw new Error('Child derivation path cannot include hardened children');
652
+ }
653
+ const [visibilityIndex, addressIndex] = childDerivationPath.split('/').map((index) => parseInt(index, 10));
654
+ return this.protocolV1.deriveFromExtendedSecretKey(extendedSecretKey, visibilityIndex, addressIndex);
655
+ }
656
+ async derivePublicKey(extendedPublicKey, childDerivationPath = '0/0') {
657
+ if (!isBip32Protocol(this.protocolV1)) {
658
+ throw new Error(`Protocol doesn't support public key derivation, missing inferface: Bip32.`);
659
+ }
660
+ if (childDerivationPath.startsWith('m')) {
661
+ throw new Error('Received full derivation path, expected child derivation path');
662
+ }
663
+ if (childDerivationPath.toLowerCase().includes('h') || childDerivationPath.includes(`'`)) {
664
+ throw new Error('Child derivation path cannot include hardened children');
665
+ }
666
+ const [visibilityIndex, addressIndex] = childDerivationPath.split('/').map((index) => parseInt(index, 10));
667
+ return this.protocolV1.deriveFromExtendedPublicKey(extendedPublicKey, visibilityIndex, addressIndex);
668
+ }
669
+ async getSerializerIdentifier(base) {
670
+ const identifier = base ?? (await this.getIdentifier());
671
+ return identifier.startsWith(SubProtocolSymbols.ETH_ERC20)
672
+ ? SubProtocolSymbols.ETH_ERC20
673
+ : identifier.startsWith(SubProtocolSymbols.OPTIMISM_ERC20)
674
+ ? SubProtocolSymbols.OPTIMISM_ERC20
675
+ : identifier;
676
+ }
677
+ async convertUnsignedTransactionV0ToV1(transaction, owner) {
678
+ const identifier = await this.getSerializerIdentifier(owner);
679
+ return this.v3SerializerCompanion.fromTransactionSignRequest(identifier, transaction);
680
+ }
681
+ async convertUnsignedTransactionV1ToV0(transaction, publicKey, callbackUrl, owner) {
682
+ const identifier = await this.getSerializerIdentifier(owner);
683
+ return this.v3SerializerCompanion.toTransactionSignRequest(identifier, transaction, publicKey, callbackUrl);
684
+ }
685
+ async convertSignedTransactionV0ToV1(transaction, owner) {
686
+ const identifier = await this.getSerializerIdentifier(owner);
687
+ return this.v3SerializerCompanion.fromTransactionSignResponse(identifier, transaction);
688
+ }
689
+ async convertSignedTransactionV1ToV0(transaction, accountIdentifier, owner) {
690
+ const identifier = await this.getSerializerIdentifier(owner);
691
+ return this.v3SerializerCompanion.toTransactionSignResponse(identifier, transaction, accountIdentifier);
692
+ }
693
+ convertFeeDefaultsV1ToV0(feeDefaults) {
694
+ return convertFeeDefaultsV1ToV0(feeDefaults, this.protocolMetadata);
695
+ }
696
+ async convertTransactionDetailsV1ToV0(txs) {
697
+ return convertTransactionDetailsV1ToV0(txs, this.protocolMetadata, this.networkV0);
698
+ }
699
+ combineTransactionDetails(recipients, values) {
700
+ if (recipients.length !== values.length) {
701
+ throw new Error('Recipients length must match values length.');
702
+ }
703
+ return recipients.map((recipient, index) => ({
704
+ to: recipient,
705
+ amount: newAmount(values[index], 'blockchain')
706
+ }));
707
+ }
708
+ isExtendedPublicKey(publicKey) {
709
+ return publicKey.startsWith('xpub') || publicKey.startsWith('ypub') || publicKey.startsWith('zpub');
710
+ }
711
+ getArbitraryData(data) {
712
+ const simpleArbitraryDataMetadataSchema = {
713
+ name: 'required',
714
+ maxLength: 'optional',
715
+ regex: 'optional'
716
+ };
717
+ return this.protocolMetadata.transaction?.arbitraryData
718
+ ? implementsInterface(this.protocolMetadata.transaction?.arbitraryData, simpleArbitraryDataMetadataSchema)
719
+ ? data[this.protocolMetadata.transaction.arbitraryData.name]
720
+ : data[this.protocolMetadata.transaction.arbitraryData.root?.name ?? this.protocolMetadata.transaction.arbitraryData.inner?.name]
721
+ : undefined;
722
+ }
723
+ }
724
+ // ICoinDelegateProtocol
725
+ export class ICoinDelegateProtocolAdapter extends ICoinProtocolAdapter {
726
+ async getDefaultDelegatee() {
727
+ return this.protocolV1.getDefaultDelegatee();
728
+ }
729
+ async getCurrentDelegateesForPublicKey(publicKey, data) {
730
+ return this.protocolV1.getCurrentDelegateesForPublicKey({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, data);
731
+ }
732
+ async getCurrentDelegateesForAddress(address, data) {
733
+ return this.protocolV1.getCurrentDelegateesForAddress(address, data);
734
+ }
735
+ async getDelegateeDetails(address, data) {
736
+ return this.protocolV1.getDelegateeDetails(address, data);
737
+ }
738
+ async isPublicKeyDelegating(publicKey, data) {
739
+ return this.protocolV1.isPublicKeyDelegating({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, data);
740
+ }
741
+ async isAddressDelegating(address, data) {
742
+ return this.protocolV1.isAddressDelegating(address, data);
743
+ }
744
+ async getDelegatorDetailsFromPublicKey(publicKey, data) {
745
+ return this.protocolV1.getDelegatorDetailsFromPublicKey({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, data);
746
+ }
747
+ async getDelegatorDetailsFromAddress(address, data) {
748
+ return this.protocolV1.getDelegatorDetailsFromAddress(address, data);
749
+ }
750
+ async getDelegationDetailsFromPublicKey(publicKey, delegatees, data) {
751
+ return this.protocolV1.getDelegationDetailsFromPublicKey({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, delegatees, data);
752
+ }
753
+ async getDelegationDetailsFromAddress(address, delegatees, data) {
754
+ return this.protocolV1.getDelegationDetailsFromAddress(address, delegatees, data);
755
+ }
756
+ async prepareDelegatorActionFromPublicKey(publicKey, type, data) {
757
+ const transactions = await this.protocolV1.prepareDelegatorActionFromPublicKey({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, type, data);
758
+ const transactionsV0 = await Promise.all(transactions.map((transaction) => this.convertUnsignedTransactionV1ToV0(transaction, publicKey)));
759
+ return transactionsV0.map((transaction) => transaction.transaction);
760
+ }
761
+ }
762
+ // ICoinSubProtocol
763
+ export class ICoinSubProtocolAdapter extends ICoinProtocolAdapter {
764
+ constructor(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress) {
765
+ super(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion);
766
+ this.isSubProtocol = true;
767
+ this.subProtocolType = type === 'account' ? SubProtocolTypeV0.ACCOUNT : SubProtocolTypeV0.TOKEN;
768
+ this.contractAddress = contractAddress;
769
+ }
770
+ async getIsSubProtocol() {
771
+ return this.isSubProtocol;
772
+ }
773
+ async getSubProtocolType() {
774
+ return this.subProtocolType;
775
+ }
776
+ async getContractAddress() {
777
+ return this.contractAddress;
778
+ }
779
+ }
780
+ export class ICoinDelegateSubProtocolAdapter extends ICoinSubProtocolAdapter {
781
+ constructor(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress) {
782
+ super(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress);
783
+ this.delegateProtocolAdapter = new ICoinDelegateProtocolAdapter(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion);
784
+ }
785
+ async getDefaultDelegatee() {
786
+ return this.delegateProtocolAdapter.getDefaultDelegatee();
787
+ }
788
+ async getCurrentDelegateesForPublicKey(publicKey, data) {
789
+ return this.delegateProtocolAdapter.getCurrentDelegateesForPublicKey(publicKey, data);
790
+ }
791
+ async getCurrentDelegateesForAddress(address, data) {
792
+ return this.delegateProtocolAdapter.getCurrentDelegateesForAddress(address, data);
793
+ }
794
+ async getDelegateeDetails(address, data) {
795
+ return this.delegateProtocolAdapter.getDelegateeDetails(address, data);
796
+ }
797
+ async isPublicKeyDelegating(publicKey, data) {
798
+ return this.delegateProtocolAdapter.isPublicKeyDelegating(publicKey, data);
799
+ }
800
+ async isAddressDelegating(address, data) {
801
+ return this.delegateProtocolAdapter.isAddressDelegating(address, data);
802
+ }
803
+ async getDelegatorDetailsFromPublicKey(publicKey, data) {
804
+ return this.delegateProtocolAdapter.getDelegatorDetailsFromPublicKey(publicKey, data);
805
+ }
806
+ async getDelegatorDetailsFromAddress(address, data) {
807
+ return this.delegateProtocolAdapter.getDelegatorDetailsFromAddress(address, data);
808
+ }
809
+ async getDelegationDetailsFromPublicKey(publicKey, delegatees, data) {
810
+ return this.delegateProtocolAdapter.getDelegationDetailsFromPublicKey(publicKey, delegatees, data);
811
+ }
812
+ async getDelegationDetailsFromAddress(address, delegatees, data) {
813
+ return this.delegateProtocolAdapter.getDelegationDetailsFromAddress(address, delegatees, data);
814
+ }
815
+ async prepareDelegatorActionFromPublicKey(publicKey, type, data) {
816
+ return this.delegateProtocolAdapter.prepareDelegatorActionFromPublicKey(publicKey, type, data);
817
+ }
818
+ }
819
+ // Factories
820
+ export async function createICoinProtocolAdapter(protocolV1, blockExplorerV1, v3SerializerCompanion, extra = {}) {
821
+ const [protocolMetadata, crypto, network, blockExplorerMetadata] = await Promise.all([
822
+ extra.protocolMetadata ? Promise.resolve(extra.protocolMetadata) : protocolV1.getMetadata(),
823
+ extra.crypto
824
+ ? Promise.resolve(extra.crypto)
825
+ : extra.crypto === null || !isOfflineProtocol(protocolV1) || (extra.type !== 'offline' && extra.type !== 'full')
826
+ ? Promise.resolve(undefined)
827
+ : protocolV1.getCryptoConfiguration(),
828
+ extra.network
829
+ ? Promise.resolve(extra.network)
830
+ : extra.network === null || !isOnlineProtocol(protocolV1) || (extra.type !== 'online' && extra.type !== 'full')
831
+ ? Promise.resolve(undefined)
832
+ : protocolV1.getNetwork(),
833
+ extra.blockExplorerMetadata
834
+ ? Promise.resolve(extra.blockExplorerMetadata)
835
+ : extra.blockExplorerMetadata === null || blockExplorerV1 === undefined || (extra.type !== 'online' && extra.type !== 'full')
836
+ ? Promise.resolve(undefined)
837
+ : blockExplorerV1.getMetadata()
838
+ ]);
839
+ if (supportsV1Delegation(protocolV1)) {
840
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
841
+ return new ICoinDelegateProtocolAdapter(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion);
842
+ }
843
+ else {
844
+ return new ICoinProtocolAdapter(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion);
845
+ }
846
+ }
847
+ // eslint-disable-next-line complexity
848
+ export async function createICoinSubProtocolAdapter(protocolV1, blockExplorerV1, v3SerializerCompanion, extra = {}) {
849
+ const [protocolMetadata, crypto, network, blockExplorerMetadata, type, contractAddress] = await Promise.all([
850
+ extra.protocolMetadata ? Promise.resolve(extra.protocolMetadata) : protocolV1.getMetadata(),
851
+ extra.crypto
852
+ ? Promise.resolve(extra.crypto)
853
+ : extra.crypto === null || !isOfflineProtocol(protocolV1) || (extra?.type !== 'offline' && extra?.type !== 'full')
854
+ ? Promise.resolve(undefined)
855
+ : protocolV1.getCryptoConfiguration(),
856
+ extra.network
857
+ ? Promise.resolve(extra.network)
858
+ : extra.network === null || !isOnlineProtocol(protocolV1) || (extra?.type !== 'online' && extra?.type !== 'full')
859
+ ? Promise.resolve(undefined)
860
+ : protocolV1.getNetwork(),
861
+ extra.blockExplorerMetadata
862
+ ? Promise.resolve(extra.blockExplorerMetadata)
863
+ : extra.blockExplorerMetadata === null || blockExplorerV1 === undefined || (extra?.type !== 'online' && extra?.type !== 'full')
864
+ ? Promise.resolve(undefined)
865
+ : blockExplorerV1.getMetadata(),
866
+ extra.subType ? Promise.resolve(extra.subType) : protocolV1.getType(),
867
+ extra.contractAddress
868
+ ? Promise.resolve(extra.contractAddress)
869
+ : extra.contractAddress === null || !hasConfigurableContract(protocolV1)
870
+ ? Promise.resolve(undefined)
871
+ : protocolV1.getContractAddress()
872
+ ]);
873
+ if (supportsV1Delegation(protocolV1)) {
874
+ return new ICoinDelegateSubProtocolAdapter(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress);
875
+ }
876
+ else {
877
+ return new ICoinSubProtocolAdapter(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress);
878
+ }
879
+ }
880
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wtdjAtYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcHJvdG9jb2wvYWRhcHRlci9wcm90b2NvbC12MC1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhCQUE4QjtBQUM5Qix5Q0FBeUM7QUFDekMsT0FBTyxFQVlMLFdBQVcsSUFBSSxhQUFhLEVBQzVCLHFCQUFxQixJQUFJLHVCQUF1QixFQUNoRCxlQUFlLElBQUksaUJBQWlCLEVBR3BDLGtCQUFrQixFQUNsQixlQUFlLElBQUksaUJBQWlCLEVBRXJDLE1BQU0sNEJBQTRCLENBQUE7QUFJbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUM3RCxPQUFPLEVBV0wsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsZ0NBQWdDLEVBQ2hDLGNBQWMsRUFRZCx1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLG1CQUFtQixFQUNuQixRQUFRLEVBQ1IsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLDBCQUEwQixFQUUxQixTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osWUFBWSxFQUNaLFlBQVksRUFrQmIsTUFBTSwwQkFBMEIsQ0FBQTtBQUNqQyxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUE7QUFHcEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDNUQsT0FBTyxFQUFpRCx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3hJLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBQzVGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIs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QUM7UUFDTixPQUFPLElBQUksdUJBQXVCLENBQ2hDLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osZUFBZSxDQUNoQixDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlICovXG5pbXBvcnQge1xuICBDcnlwdG9DbGllbnQsXG4gIERlbGVnYXRlZURldGFpbHMsXG4gIERlbGVnYXRpb25EZXRhaWxzLFxuICBEZWxlZ2F0b3JEZXRhaWxzLFxuICBGZWVEZWZhdWx0cyBhcyBGZWVEZWZhdWx0c1YwLFxuICBJQWlyR2FwVHJhbnNhY3Rpb24sXG4gIElBaXJHYXBUcmFuc2FjdGlvblJlc3VsdCxcbiAgSUNvaW5EZWxlZ2F0ZVByb3RvY29sLFxuICBJQ29pblByb3RvY29sLFxuICBJQ29pblN1YlByb3RvY29sLFxuICBJUHJvdG9jb2xUcmFuc2FjdGlvbkN1cnNvcixcbiAgTmV0d29ya1R5cGUgYXMgTmV0d29ya1R5cGVWMCxcbiAgUHJvdG9jb2xCbG9ja0V4cGxvcmVyIGFzIFByb3RvY29sQmxvY2tFeHBsb3JlclYwLFxuICBQcm90b2NvbE5ldHdvcmsgYXMgUHJvdG9jb2xOZXR3b3JrVjAsXG4gIFByb3RvY29sU3ltYm9scyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24gYXMgU2lnbmVkVHJhbnNhY3Rpb25WMCxcbiAgU3ViUHJvdG9jb2xTeW1ib2xzLFxuICBTdWJQcm90b2NvbFR5cGUgYXMgU3ViUHJvdG9jb2xUeXBlVjAsXG4gIFVuc2lnbmVkVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUcmFuc2FjdGlvblYwXG59IGZyb20gJ0B3YWxsZnJlZS1kZXYvY29pbmxpYi1jb3JlJ1xuaW1wb3J0IHsgSVByb3RvY29sQWRkcmVzc0N1cnNvciwgSUFpckdhcEFkZHJlc3NSZXN1bHQgfSBmcm9tICdAd2FsbGZyZWUtZGV2L2NvaW5saWItY29yZS9pbnRlcmZhY2VzL0lBaXJHYXBBZGRyZXNzJ1xuaW1wb3J0IHsgQWlyR2FwVHJhbnNhY3Rpb25TdGF0dXMgYXMgQWlyR2FwVHJhbnNhY3Rpb25TdGF0dXNWMCB9IGZyb20gJ0B3YWxsZnJlZS1kZXYvY29pbmxpYi1jb3JlL2ludGVyZmFjZXMvSUFpckdhcFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsgUHJvdG9jb2xPcHRpb25zIGFzIFByb3RvY29sT3B0aW9uc1YwIH0gZnJvbSAnQHdhbGxmcmVlLWRldi9jb2lubGliLWNvcmUvdXRpbHMvUHJvdG9jb2xPcHRpb25zJ1xuaW1wb3J0IHsgZGVyaXZlLCBtbmVtb25pY1RvU2VlZCB9IGZyb20gJ0B3YWxsZnJlZS1kZXYvY3J5cHRvJ1xuaW1wb3J0IHtcbiAgQWRkcmVzc1dpdGhDdXJzb3IsXG4gIEFpckdhcEFueVByb3RvY29sLFxuICBBaXJHYXBCbG9ja0V4cGxvcmVyLFxuICBBaXJHYXBUcmFuc2FjdGlvbixcbiAgQWlyR2FwVHJhbnNhY3Rpb25TdGF0dXMsXG4gIEFpckdhcFRyYW5zYWN0aW9uc1dpdGhDdXJzb3IsXG4gIEFpckdhcFYzU2VyaWFsaXplckNvbXBhbmlvbixcbiAgQW1vdW50LFxuICBCYWxhbmNlLFxuICBCbG9ja0V4cGxvcmVyTWV0YWRhdGEsXG4gIGNhbkVuY3J5cHRBRVMsXG4gIGNhbkVuY3J5cHRBc3ltbWV0cmljLFxuICBjYW5GZXRjaERhdGFGb3JBZGRyZXNzLFxuICBjYW5GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3NlcyxcbiAgY2FuU2lnbk1lc3NhZ2UsXG4gIENyeXB0b0NvbmZpZ3VyYXRpb24sXG4gIENyeXB0b0Rlcml2YXRpdmUsXG4gIEV4dGVuZGVkS2V5UGFpcixcbiAgRXh0ZW5kZWRQdWJsaWNLZXksXG4gIEV4dGVuZGVkU2VjcmV0S2V5LFxuICBGZWVEZWZhdWx0cyxcbiAgRmVlRXN0aW1hdGlvbixcbiAgaGFzQ29uZmlndXJhYmxlQ29udHJhY3QsXG4gIGhhc011bHRpQWRkcmVzc1B1YmxpY0tleXMsXG4gIGltcGxlbWVudHNJbnRlcmZhY2UsXG4gIGlzQW1vdW50LFxuICBpc0JpcDMyUHJvdG9jb2wsXG4gIGlzTXVsdGlUb2tlblN1YlByb3RvY29sLFxuICBpc09mZmxpbmVQcm90b2NvbCxcbiAgaXNPbmxpbmVQcm90b2NvbCxcbiAgaXNUcmFuc2FjdGlvblN0YXR1c0NoZWNrZXIsXG4gIEtleVBhaXIsXG4gIG5ld0Ftb3VudCxcbiAgbmV3RXh0ZW5kZWRQdWJsaWNLZXksXG4gIG5ld0V4dGVuZGVkU2VjcmV0S2V5LFxuICBuZXdQdWJsaWNLZXksXG4gIG5ld1NlY3JldEtleSxcbiAgbmV3U2lnbmF0dXJlLFxuICBQcm90b2NvbENvbmZpZ3VyYXRpb24sXG4gIFByb3RvY29sTWV0YWRhdGEsXG4gIFByb3RvY29sTmV0d29yayxcbiAgUHJvdG9jb2xOZXR3b3JrVHlwZSxcbiAgUHJvdG9jb2xTeW1ib2wsXG4gIFByb3RvY29sVHJhbnNhY3Rpb25BcmJpdHJhcnlEYXRhTWV0YWRhdGEsXG4gIFByb3RvY29sVW5pdHNNZXRhZGF0YSxcbiAgUHVibGljS2V5LFxuICBTY2hlbWEsXG4gIFNlY3JldEtleSxcbiAgU2lnbmF0dXJlLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU3ViUHJvdG9jb2wsXG4gIFN1YlByb3RvY29sVHlwZSxcbiAgVHJhbnNhY3Rpb25DdXJzb3IsXG4gIFRyYW5zYWN0aW9uRGV0YWlscyxcbiAgVW5zaWduZWRUcmFuc2FjdGlvblxufSBmcm9tICdAd2FsbGZyZWUtZGV2L21vZHVsZS1raXQnXG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcydcbmltcG9ydCB7IFRyYW5zYWN0aW9uU2lnblJlcXVlc3QsIFRyYW5zYWN0aW9uU2lnblJlc3BvbnNlLCBUcmFuc2FjdGlvblZhbGlkYXRvciB9IGZyb20gJ0B3YWxsZnJlZS1kZXYvc2VyaWFsaXplcidcbmltcG9ydCB7IEFpckdhcERlbGVnYXRlUHJvdG9jb2wgfSBmcm9tICdAd2FsbGZyZWUtZGV2L21vZHVsZS1raXQvaW50ZXJuYWwnXG5pbXBvcnQgeyBpc1Rlem9zU2FwbGluZ1Byb3RvY29sIH0gZnJvbSAnQHdhbGxmcmVlLWRldi90ZXpvcydcbmltcG9ydCB7IEJpdGNvaW5TZWd3aXRQcm90b2NvbCwgQml0Y29pblRhcHJvb3RQcm90b2NvbCwgaXNCaXRjb2luU2Vnd2l0UHJvdG9jb2wsIGlzQml0Y29pblRhcHJvb3RQcm90b2NvbCB9IGZyb20gJ0B3YWxsZnJlZS1kZXYvYml0Y29pbidcbmltcG9ydCB7IGdldFByb3RvY29sT3B0aW9uc0J5SWRlbnRpZmllckxlZ2FjeSB9IGZyb20gJy4uLy4uL3V0aWxzL3Byb3RvY29sL3Byb3RvY29sLW9wdGlvbnMnXG5pbXBvcnQgeyBzdXBwb3J0c1YxRGVsZWdhdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3Byb3RvY29sL2RlbGVnYXRpb24nXG5pbXBvcnQge1xuICBjb252ZXJ0RmVlRGVmYXVsdHNWMVRvVjAsXG4gIGNvbnZlcnROZXR3b3JrVHlwZVYxVG9WMCxcbiAgY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCxcbiAgY29udmVydFRyYW5zYWN0aW9uU3RhdHVzVjFUb1YwLFxuICBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwLFxuICBnZXRQdWJsaWNLZXlUeXBlLFxuICBnZXRTZWNyZXRLZXlUeXBlXG59IGZyb20gJy4uLy4uL3V0aWxzL3Byb3RvY29sL3Byb3RvY29sLXYwLWFkYXB0ZXInXG5cbi8vIFByb3RvY29sQmxvY2tFeHBsb3JlclxuXG5leHBvcnQgY2xhc3MgUHJvdG9jb2xCbG9ja0V4cGxvcmVyQWRhcHRlciBleHRlbmRzIFByb3RvY29sQmxvY2tFeHBsb3JlclYwIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBibG9ja0V4cGxvcmVyVjE6IEFpckdhcEJsb2NrRXhwbG9yZXIsIHVybDogc3RyaW5nKSB7XG4gICAgc3VwZXIodXJsKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFkZHJlc3NMaW5rKGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tFeHBsb3JlclYxLmNyZWF0ZUFkZHJlc3NVcmwoYWRkcmVzcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkxpbmsodHJhbnNhY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja0V4cGxvcmVyVjEuY3JlYXRlVHJhbnNhY3Rpb25VcmwodHJhbnNhY3Rpb25JZClcbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgYmxvY2tFeHBsb3JlcjogdGhpcy5ibG9ja0V4cGxvcmVyXG4gICAgfVxuICB9XG59XG5cbi8vIFByb3RvY29sTmV0d29ya1xuXG5leHBvcnQgY2xhc3MgUHJvdG9jb2xOZXR3b3JrQWRhcHRlciBleHRlbmRzIFByb3RvY29sTmV0d29ya1YwIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHR5cGU6IFByb3RvY29sTmV0d29ya1R5cGUgfCBOZXR3b3JrVHlwZVYwLFxuICAgIHJwY1VybDogc3RyaW5nLFxuICAgIGJsb2NrRXhwbG9yZXI6IFByb3RvY29sQmxvY2tFeHBsb3JlclYwIHwgdW5kZWZpbmVkLFxuICAgIGV4dHJhczogdW5rbm93biA9IHt9XG4gICkge1xuICAgIGNvbnN0IG5ldHdvcmtUeXBlOiBOZXR3b3JrVHlwZVYwID0gT2JqZWN0LnZhbHVlcyhOZXR3b3JrVHlwZVYwKS5pbmNsdWRlcyh0eXBlIGFzIE5ldHdvcmtUeXBlVjApXG4gICAgICA/ICh0eXBlIGFzIE5ldHdvcmtUeXBlVjApXG4gICAgICA6IGNvbnZlcnROZXR3b3JrVHlwZVYxVG9WMCh0eXBlIGFzIFByb3RvY29sTmV0d29ya1R5cGUpXG5cbiAgICBzdXBlcihuYW1lLCBuZXR3b3JrVHlwZSwgcnBjVXJsLCBibG9ja0V4cGxvcmVyLCBleHRyYXMpXG4gIH1cbn1cblxuLy8gUHJvdG9jb2xPcHRpb25zXG5cbmV4cG9ydCBjbGFzcyBQcm90b2NvbE9wdGlvbnNBZGFwdGVyIGltcGxlbWVudHMgUHJvdG9jb2xPcHRpb25zVjAge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbmV0d29yazogUHJvdG9jb2xOZXR3b3JrVjAsIHB1YmxpYyByZWFkb25seSBjb25maWc6IHVua25vd24gPSB7fSkge31cbn1cblxuLy8gVHJhbnNhY3Rpb25WYWxpZGF0b3JcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uVmFsaWRhdG9yQWRhcHRlciBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm90b2NvbElkZW50aWZpZXI6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBzZXJpYWxpemVyQ29tcGFuaW9uOiBBaXJHYXBWM1NlcmlhbGl6ZXJDb21wYW5pb24pIHt9XG5cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlVW5zaWduZWRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25TaWduUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplckNvbXBhbmlvbi52YWxpZGF0ZVRyYW5zYWN0aW9uU2lnblJlcXVlc3QodGhpcy5wcm90b2NvbElkZW50aWZpZXIsIHRyYW5zYWN0aW9uKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlU2lnbmVkVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uU2lnblJlc3BvbnNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyQ29tcGFuaW9uLnZhbGlkYXRlVHJhbnNhY3Rpb25TaWduUmVzcG9uc2UodGhpcy5wcm90b2NvbElkZW50aWZpZXIsIHRyYW5zYWN0aW9uKVxuICB9XG59XG5cbi8vIElDb2luUHJvdG9jb2xcblxuZXhwb3J0IGNsYXNzIElDb2luUHJvdG9jb2xBZGFwdGVyPFQgZXh0ZW5kcyBBaXJHYXBBbnlQcm90b2NvbCA9IEFpckdhcEFueVByb3RvY29sPiBpbXBsZW1lbnRzIElDb2luUHJvdG9jb2wge1xuICBwdWJsaWMgcmVhZG9ubHkgc3ltYm9sOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgbWFya2V0U3ltYm9sOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGFzc2V0U3ltYm9sOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcHVibGljIHJlYWRvbmx5IGZlZVN5bWJvbDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBmZWVEZWZhdWx0czogRmVlRGVmYXVsdHNWMFxuICBwdWJsaWMgcmVhZG9ubHkgZGVjaW1hbHM6IG51bWJlclxuICBwdWJsaWMgcmVhZG9ubHkgZmVlRGVjaW1hbHM6IG51bWJlclxuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogUHJvdG9jb2xTeW1ib2xzXG4gIHB1YmxpYyByZWFkb25seSB1bml0czogeyB1bml0U3ltYm9sOiBzdHJpbmc7IGZhY3Rvcjogc3RyaW5nIH1bXVxuICBwdWJsaWMgcmVhZG9ubHkgc3VwcG9ydHNIRDogYm9vbGVhblxuICBwdWJsaWMgcmVhZG9ubHkgc3RhbmRhcmREZXJpdmF0aW9uUGF0aDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBhZGRyZXNzSXNDYXNlU2Vuc2l0aXZlOiBib29sZWFuXG4gIHB1YmxpYyByZWFkb25seSBhZGRyZXNzVmFsaWRhdGlvblBhdHRlcm46IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgYWRkcmVzc1BsYWNlaG9sZGVyOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IFByb3RvY29sT3B0aW9uc1YwXG4gIHB1YmxpYyByZWFkb25seSBjcnlwdG9DbGllbnQ6IENyeXB0b0NsaWVudFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya1YwOiBQcm90b2NvbE5ldHdvcmtWMFxuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrRXhwbG9yZXJWMDogUHJvdG9jb2xCbG9ja0V4cGxvcmVyQWRhcHRlciB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwcm90b2NvbFYxOiBULFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvdG9jb2xNZXRhZGF0YTogUHJvdG9jb2xNZXRhZGF0YSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNyeXB0bzogQ3J5cHRvQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5ldHdvcms6IFByb3RvY29sTmV0d29yayB8IHVuZGVmaW5lZCxcbiAgICBibG9ja0V4cGxvcmVyVjE6IEFpckdhcEJsb2NrRXhwbG9yZXIgfCB1bmRlZmluZWQsXG4gICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhOiBCbG9ja0V4cGxvcmVyTWV0YWRhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2M1NlcmlhbGl6ZXJDb21wYW5pb246IEFpckdhcFYzU2VyaWFsaXplckNvbXBhbmlvblxuICApIHtcbiAgICBjb25zdCB1bml0czogUHJvdG9jb2xVbml0c01ldGFkYXRhID0gdGhpcy5wcm90b2NvbE1ldGFkYXRhLnVuaXRzXG4gICAgY29uc3QgbWFpblVuaXQ6IHN0cmluZyA9IHRoaXMucHJvdG9jb2xNZXRhZGF0YS5tYWluVW5pdFxuICAgIGNvbnN0IHN5bWJvbDogUHJvdG9jb2xTeW1ib2wgPSB1bml0c1ttYWluVW5pdF0uc3ltYm9sXG5cbiAgICBjb25zdCBmZWVVbml0czogUHJvdG9jb2xVbml0c01ldGFkYXRhID0gcHJvdG9jb2xNZXRhZGF0YS5mZWU/LnVuaXRzID8/IHByb3RvY29sTWV0YWRhdGEudW5pdHNcbiAgICBjb25zdCBtYWluRmVlVW5pdDogc3RyaW5nID0gcHJvdG9jb2xNZXRhZGF0YS5mZWU/Lm1haW5Vbml0ID8/IHByb3RvY29sTWV0YWRhdGEubWFpblVuaXRcbiAgICBjb25zdCBmZWVTeW1ib2w6IFByb3RvY29sU3ltYm9sID0gZmVlVW5pdHNbbWFpbkZlZVVuaXRdLnN5bWJvbFxuXG4gICAgY29uc3QgZmVlRGVmYXVsdHM6IEZlZURlZmF1bHRzID0gcHJvdG9jb2xNZXRhZGF0YS5mZWU/LmRlZmF1bHRzID8/IHtcbiAgICAgIGxvdzogbmV3QW1vdW50KCcwJywgJ2Jsb2NrY2hhaW4nKSxcbiAgICAgIG1lZGl1bTogbmV3QW1vdW50KCcwJywgJ2Jsb2NrY2hhaW4nKSxcbiAgICAgIGhpZ2g6IG5ld0Ftb3VudCgnMCcsICdibG9ja2NoYWluJylcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEZWNpbWFsczogbnVtYmVyID0gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhwcm90b2NvbE1ldGFkYXRhLnVuaXRzKS5tYXAoKHVuaXQpID0+IHVuaXQuZGVjaW1hbHMpKVxuXG4gICAgdGhpcy5uYW1lID0gdGhpcy5wcm90b2NvbE1ldGFkYXRhLm5hbWVcbiAgICB0aGlzLmlkZW50aWZpZXIgPSB0aGlzLnByb3RvY29sTWV0YWRhdGEuaWRlbnRpZmllciBhcyBQcm90b2NvbFN5bWJvbHNcblxuICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sLnZhbHVlXG4gICAgdGhpcy5tYXJrZXRTeW1ib2wgPSBzeW1ib2wubWFya2V0ID8/IHN5bWJvbC52YWx1ZVxuICAgIHRoaXMuYXNzZXRTeW1ib2wgPSBzeW1ib2wuYXNzZXRcbiAgICB0aGlzLmRlY2ltYWxzID0gdW5pdHNbbWFpblVuaXRdLmRlY2ltYWxzXG5cbiAgICB0aGlzLmZlZVN5bWJvbCA9IGZlZVN5bWJvbC52YWx1ZVxuICAgIHRoaXMuZmVlRGVmYXVsdHMgPSB0aGlzLmNvbnZlcnRGZWVEZWZhdWx0c1YxVG9WMChmZWVEZWZhdWx0cylcbiAgICB0aGlzLmZlZURlY2ltYWxzID0gZmVlVW5pdHNbbWFpbkZlZVVuaXRdLmRlY2ltYWxzXG5cbiAgICB0aGlzLnVuaXRzID0gT2JqZWN0LmVudHJpZXMocHJvdG9jb2xNZXRhZGF0YS51bml0cykubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgdW5pdFN5bWJvbDogc3RyaW5nID0gZW50cnlbMF1cbiAgICAgIGNvbnN0IGZhY3Rvcjogc3RyaW5nID0gbmV3IEJpZ051bWJlcigxKS5zaGlmdGVkQnkoLShtYXhEZWNpbWFscyAtIGVudHJ5WzFdLmRlY2ltYWxzKSkudG9GaXhlZCgpXG5cbiAgICAgIHJldHVybiB7IHVuaXRTeW1ib2wsIGZhY3RvciB9XG4gICAgfSlcblxuICAgIHRoaXMuc3VwcG9ydHNIRCA9IGlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpXG5cbiAgICB0aGlzLnN0YW5kYXJkRGVyaXZhdGlvblBhdGggPSB0aGlzLnByb3RvY29sTWV0YWRhdGEuYWNjb3VudD8uc3RhbmRhcmREZXJpdmF0aW9uUGF0aCA/PyAnbS8nXG4gICAgdGhpcy5hZGRyZXNzSXNDYXNlU2Vuc2l0aXZlID0gdGhpcy5wcm90b2NvbE1ldGFkYXRhLmFjY291bnQuYWRkcmVzcz8uaXNDYXNlU2Vuc2l0aXZlID8/IGZhbHNlXG4gICAgdGhpcy5hZGRyZXNzVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLnByb3RvY29sTWV0YWRhdGEuYWNjb3VudD8uYWRkcmVzcz8ucmVnZXggPz8gJyorJ1xuICAgIHRoaXMuYWRkcmVzc1BsYWNlaG9sZGVyID0gdGhpcy5wcm90b2NvbE1ldGFkYXRhLmFjY291bnQ/LmFkZHJlc3M/LnBsYWNlaG9sZGVyID8/ICcnXG5cbiAgICBsZXQga25vd25PcHRpb25zOiBQcm90b2NvbE9wdGlvbnNWMCB8IHVuZGVmaW5lZFxuICAgIHRyeSB7XG4gICAgICBrbm93bk9wdGlvbnMgPSBnZXRQcm90b2NvbE9wdGlvbnNCeUlkZW50aWZpZXJMZWdhY3kodGhpcy5wcm90b2NvbE1ldGFkYXRhLmlkZW50aWZpZXIgYXMgUHJvdG9jb2xTeW1ib2xzKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdGhpcy5ibG9ja0V4cGxvcmVyVjAgPVxuICAgICAgYmxvY2tFeHBsb3JlclYxICYmIGJsb2NrRXhwbG9yZXJNZXRhZGF0YSA/IG5ldyBQcm90b2NvbEJsb2NrRXhwbG9yZXJBZGFwdGVyKGJsb2NrRXhwbG9yZXJWMSwgYmxvY2tFeHBsb3Jlck1ldGFkYXRhLnVybCkgOiB1bmRlZmluZWRcbiAgICB0aGlzLm5ldHdvcmtWMCA9IHRoaXMuZ2V0TmV0d29yayhrbm93bk9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gbmV3IFByb3RvY29sT3B0aW9uc0FkYXB0ZXIodGhpcy5uZXR3b3JrVjAsIGtub3duT3B0aW9ucz8uY29uZmlnID8/IHt9KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFN5bWJvbCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbFxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE5hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5uYW1lXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWFya2V0U3ltYm9sKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFya2V0U3ltYm9sXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXNzZXRTeW1ib2woKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hc3NldFN5bWJvbFxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEZlZVN5bWJvbCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZlZVN5bWJvbFxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEZlZURlZmF1bHRzKCk6IFByb21pc2U8RmVlRGVmYXVsdHNWMD4ge1xuICAgIHJldHVybiB0aGlzLmZlZURlZmF1bHRzXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVjaW1hbHMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5kZWNpbWFsc1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEZlZURlY2ltYWxzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuZmVlRGVjaW1hbHNcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRJZGVudGlmaWVyKCk6IFByb21pc2U8UHJvdG9jb2xTeW1ib2xzPiB7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpZmllclxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFVuaXRzKCk6IFByb21pc2U8eyB1bml0U3ltYm9sOiBzdHJpbmc7IGZhY3Rvcjogc3RyaW5nIH1bXT4ge1xuICAgIHJldHVybiB0aGlzLnVuaXRzXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U3VwcG9ydHNIRCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdXBwb3J0c0hEXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U3RhbmRhcmREZXJpdmF0aW9uUGF0aCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0YW5kYXJkRGVyaXZhdGlvblBhdGhcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBZGRyZXNzSXNDYXNlU2Vuc2l0aXZlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmFkZHJlc3NJc0Nhc2VTZW5zaXRpdmVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBZGRyZXNzVmFsaWRhdGlvblBhdHRlcm4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzVmFsaWRhdGlvblBhdHRlcm5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBZGRyZXNzUGxhY2Vob2xkZXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzUGxhY2Vob2xkZXJcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRPcHRpb25zKCk6IFByb21pc2U8UHJvdG9jb2xPcHRpb25zVjA+IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QmxvY2tFeHBsb3JlckxpbmtGb3JBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuYmxvY2tFeHBsb3JlclYwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIEJsb2NrRXhwbG9yZXIgbm90IGZvdW5kLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYmxvY2tFeHBsb3JlclYwLmdldEFkZHJlc3NMaW5rKGFkZHJlc3MpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QmxvY2tFeHBsb3JlckxpbmtGb3JUeElkKHR4SWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuYmxvY2tFeHBsb3JlclYwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIEJsb2NrRXhwbG9yZXIgbm90IGZvdW5kLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYmxvY2tFeHBsb3JlclYwLmdldFRyYW5zYWN0aW9uTGluayh0eElkKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFRyYW5zYWN0aW9uc0Zyb21QdWJsaWNLZXkoXG4gICAgcHVibGljS2V5OiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgICBjdXJzb3I/OiBJUHJvdG9jb2xUcmFuc2FjdGlvbkN1cnNvclxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uczogQWlyR2FwVHJhbnNhY3Rpb25zV2l0aEN1cnNvciA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRUcmFuc2FjdGlvbnNGb3JQdWJsaWNLZXkoXG4gICAgICBuZXdQdWJsaWNLZXkocHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkpLFxuICAgICAgbGltaXQsXG4gICAgICBjdXJzb3IgYXMgVHJhbnNhY3Rpb25DdXJzb3JcbiAgICApXG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25zOiBhd2FpdCB0aGlzLmNvbnZlcnRUcmFuc2FjdGlvbkRldGFpbHNWMVRvVjAodHJhbnNhY3Rpb25zLnRyYW5zYWN0aW9ucyksXG4gICAgICBjdXJzb3JcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb25zRnJvbUV4dGVuZGVkUHVibGljS2V5KFxuICAgIGV4dGVuZGVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgICBjdXJzb3I/OiBJUHJvdG9jb2xUcmFuc2FjdGlvbkN1cnNvclxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW50ZXJmYWNlOiBPbmxpbmUsIEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zOiBBaXJHYXBUcmFuc2FjdGlvbnNXaXRoQ3Vyc29yID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldFRyYW5zYWN0aW9uc0ZvclB1YmxpY0tleShcbiAgICAgIG5ld0V4dGVuZGVkUHVibGljS2V5KGV4dGVuZGVkUHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKGV4dGVuZGVkUHVibGljS2V5KSksXG4gICAgICBsaW1pdCxcbiAgICAgIGN1cnNvciBhcyBUcmFuc2FjdGlvbkN1cnNvclxuICAgIClcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IGF3YWl0IHRoaXMuY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCh0cmFuc2FjdGlvbnMudHJhbnNhY3Rpb25zKSxcbiAgICAgIGN1cnNvclxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbnNGcm9tQWRkcmVzc2VzKFxuICAgIGFkZHJlc3Nlczogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlcixcbiAgICBjdXJzb3I/OiBJUHJvdG9jb2xUcmFuc2FjdGlvbkN1cnNvclxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZSwgRmV0Y2hEYXRhRm9yQWRkcmVzcy9GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcy4nKVxuICAgIH1cblxuICAgIGxldCB0cmFuc2FjdGlvbnM6IEFpckdhcFRyYW5zYWN0aW9uc1dpdGhDdXJzb3JcbiAgICBpZiAoYWRkcmVzc2VzLmxlbmd0aCA9PT0gMSAmJiBjYW5GZXRjaERhdGFGb3JBZGRyZXNzKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRyYW5zYWN0aW9ucyA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRUcmFuc2FjdGlvbnNGb3JBZGRyZXNzKGFkZHJlc3Nlc1swXSwgbGltaXQsIGN1cnNvciBhcyBUcmFuc2FjdGlvbkN1cnNvcilcbiAgICB9IGVsc2UgaWYgKGNhbkZldGNoRGF0YUZvck11bHRpcGxlQWRkcmVzc2VzKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIHRyYW5zYWN0aW9ucyA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRUcmFuc2FjdGlvbnNGb3JBZGRyZXNzZXMoYWRkcmVzc2VzLCBsaW1pdCwgY3Vyc29yIGFzIFRyYW5zYWN0aW9uQ3Vyc29yKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZSwgRmV0Y2hEYXRhRm9yQWRkcmVzcy9GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcy4nKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IGF3YWl0IHRoaXMuY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCh0cmFuc2FjdGlvbnMudHJhbnNhY3Rpb25zKSxcbiAgICAgIGN1cnNvcjogdHJhbnNhY3Rpb25zLmN1cnNvciA/IHRyYW5zYWN0aW9ucy5jdXJzb3IgOiBjdXJzb3JcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QmFsYW5jZU9mQWRkcmVzc2VzKGFkZHJlc3Nlczogc3RyaW5nW10sIF9kYXRhPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZSwgRmV0Y2hEYXRhRm9yQWRkcmVzcy9GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcy4nKVxuICAgIH1cblxuICAgIGxldCBiYWxhbmNlOiBCYWxhbmNlXG4gICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPT09IDEgJiYgY2FuRmV0Y2hEYXRhRm9yQWRkcmVzcyh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICBiYWxhbmNlID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEJhbGFuY2VPZkFkZHJlc3MoYWRkcmVzc2VzWzBdKVxuICAgIH0gZWxzZSBpZiAoY2FuRmV0Y2hEYXRhRm9yTXVsdGlwbGVBZGRyZXNzZXModGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgYmFsYW5jZSA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRCYWxhbmNlT2ZBZGRyZXNzZXMoYWRkcmVzc2VzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZSwgRmV0Y2hEYXRhRm9yQWRkcmVzcy9GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcy4nKVxuICAgIH1cblxuICAgIHJldHVybiBuZXdBbW91bnQoYmFsYW5jZS50b3RhbCkuYmxvY2tjaGFpbih0aGlzLnByb3RvY29sTWV0YWRhdGEudW5pdHMpLnZhbHVlXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QmFsYW5jZU9mUHVibGljS2V5KFxuICAgIHB1YmxpY0tleTogc3RyaW5nLFxuICAgIGRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IGFkZHJlc3NJbmRleD86IG51bWJlcjsgYXNzZXRJRD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09ubGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT25saW5lLicpXG4gICAgfVxuXG4gICAgY29uc3QgcHVibGljS2V5VjE6IFB1YmxpY0tleSA9IG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSlcblxuICAgIGNvbnN0IGJhbGFuY2U6IEJhbGFuY2UgPVxuICAgICAgZGF0YT8uYXNzZXRJRCAmJiBpc011bHRpVG9rZW5TdWJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpXG4gICAgICAgID8gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEJhbGFuY2VPZlB1YmxpY0tleShwdWJsaWNLZXlWMSwgeyB0b2tlbklkOiBkYXRhLmFzc2V0SUQgfSlcbiAgICAgICAgOiBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0QmFsYW5jZU9mUHVibGljS2V5KHB1YmxpY0tleVYxKVxuXG4gICAgcmV0dXJuIG5ld0Ftb3VudChiYWxhbmNlLnRvdGFsKS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRCYWxhbmNlT2ZFeHRlbmRlZFB1YmxpY0tleShcbiAgICBleHRlbmRlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIF9vZmZzZXQ6IG51bWJlcixcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyBhc3NldElEPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT25saW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuZGVkUHVibGljS2V5VjE6IEV4dGVuZGVkUHVibGljS2V5ID0gbmV3RXh0ZW5kZWRQdWJsaWNLZXkoZXh0ZW5kZWRQdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAoZXh0ZW5kZWRQdWJsaWNLZXkpKVxuXG4gICAgY29uc3QgYmFsYW5jZTogQmFsYW5jZSA9XG4gICAgICBkYXRhPy5hc3NldElEICYmIGlzTXVsdGlUb2tlblN1YlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSlcbiAgICAgICAgPyBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0QmFsYW5jZU9mUHVibGljS2V5KGV4dGVuZGVkUHVibGljS2V5VjEsIHsgdG9rZW5JZDogZGF0YS5hc3NldElEIH0pXG4gICAgICAgIDogYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEJhbGFuY2VPZlB1YmxpY0tleShleHRlbmRlZFB1YmxpY0tleVYxKVxuXG4gICAgcmV0dXJuIG5ld0Ftb3VudChiYWxhbmNlLnRvdGFsKS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBdmFpbGFibGVCYWxhbmNlT2ZBZGRyZXNzZXMoYWRkcmVzc2VzOiBzdHJpbmdbXSwgX2RhdGE/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09ubGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGludGVyZmFjZTogT25saW5lLCBGZXRjaERhdGFGb3JBZGRyZXNzL0ZldGNoRGF0YUZvck11bHRpcGxlQWRkcmVzc2VzLicpXG4gICAgfVxuXG4gICAgbGV0IGJhbGFuY2U6IEJhbGFuY2VcbiAgICBpZiAoYWRkcmVzc2VzLmxlbmd0aCA9PT0gMSAmJiBjYW5GZXRjaERhdGFGb3JBZGRyZXNzKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIGJhbGFuY2UgPSBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0QmFsYW5jZU9mQWRkcmVzcyhhZGRyZXNzZXNbMF0pXG4gICAgfSBlbHNlIGlmIChjYW5GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcyh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBiYWxhbmNlID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEJhbGFuY2VPZkFkZHJlc3NlcyhhZGRyZXNzZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGludGVyZmFjZTogT25saW5lLCBGZXRjaERhdGFGb3JBZGRyZXNzL0ZldGNoRGF0YUZvck11bHRpcGxlQWRkcmVzc2VzLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0Ftb3VudChiYWxhbmNlLnRyYW5zZmVyYWJsZSA/PyBiYWxhbmNlLnRvdGFsKS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvblN0YXR1c2VzKHRyYW5zYWN0aW9uSGFzaDogc3RyaW5nW10pOiBQcm9taXNlPEFpckdhcFRyYW5zYWN0aW9uU3RhdHVzVjBbXT4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFpc1RyYW5zYWN0aW9uU3RhdHVzQ2hlY2tlcih0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9ubGluZSwgVHJhbnNhY3Rpb25TdGF0dXNDaGVja2VyLicpXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzZXM6IFJlY29yZDxzdHJpbmcsIEFpckdhcFRyYW5zYWN0aW9uU3RhdHVzPiA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRUcmFuc2FjdGlvblN0YXR1cyh0cmFuc2FjdGlvbkhhc2gpXG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25IYXNoLm1hcCgoaGFzaDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXM6IEFpckdhcFRyYW5zYWN0aW9uU3RhdHVzID0gc3RhdHVzZXNbaGFzaF1cblxuICAgICAgcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvblN0YXR1c1YxVG9WMChzdGF0dXMpXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRCYWxhbmNlT2ZQdWJsaWNLZXlGb3JTdWJQcm90b2NvbHMoX3B1YmxpY0tleTogc3RyaW5nLCBfc3ViUHJvdG9jb2xzOiBJQ29pblN1YlByb3RvY29sW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZC4nKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGVzdGltYXRlTWF4VHJhbnNhY3Rpb25WYWx1ZUZyb21FeHRlbmRlZFB1YmxpY0tleShcbiAgICBleHRlbmRlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHN0cmluZ1tdLFxuICAgIGZlZT86IHN0cmluZyxcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT25saW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IG1heEFtb3VudDogQW1vdW50ID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldFRyYW5zYWN0aW9uTWF4QW1vdW50V2l0aFB1YmxpY0tleShcbiAgICAgIG5ld0V4dGVuZGVkUHVibGljS2V5KGV4dGVuZGVkUHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKGV4dGVuZGVkUHVibGljS2V5KSksXG4gICAgICByZWNpcGllbnRzLFxuICAgICAge1xuICAgICAgICBhcmJpdHJhcnlEYXRhOiB0aGlzLmdldEFyYml0cmFyeURhdGEoZGF0YSksXG4gICAgICAgIGZlZTogZmVlID8gbmV3QW1vdW50KGZlZSwgJ2Jsb2NrY2hhaW4nKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiBuZXdBbW91bnQobWF4QW1vdW50KS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlc3RpbWF0ZU1heFRyYW5zYWN0aW9uVmFsdWVGcm9tUHVibGljS2V5KFxuICAgIHB1YmxpY0tleTogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHN0cmluZ1tdLFxuICAgIGZlZT86IHN0cmluZyxcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyBhZGRyZXNzSW5kZXg/OiBudW1iZXIgfVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9ubGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IG1heEFtb3VudDogQW1vdW50ID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldFRyYW5zYWN0aW9uTWF4QW1vdW50V2l0aFB1YmxpY0tleShcbiAgICAgIG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSksXG4gICAgICByZWNpcGllbnRzLFxuICAgICAge1xuICAgICAgICBmZWU6IGZlZSA/IG5ld0Ftb3VudChmZWUsICdibG9ja2NoYWluJykgOiB1bmRlZmluZWQsXG4gICAgICAgIGFyYml0cmFyeURhdGE6IHRoaXMuZ2V0QXJiaXRyYXJ5RGF0YShkYXRhKVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiBuZXdBbW91bnQobWF4QW1vdW50KS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlc3RpbWF0ZUZlZURlZmF1bHRzRnJvbUV4dGVuZGVkUHVibGljS2V5KFxuICAgIHB1YmxpY0tleTogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHN0cmluZ1tdLFxuICAgIHZhbHVlczogc3RyaW5nW10sXG4gICAgZGF0YT86IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cblxuICAgICAgLy8gVGV6b3MgRkEyXG4gICAgICBhc3NldElEPzogc3RyaW5nXG4gICAgfVxuICApOiBQcm9taXNlPEZlZURlZmF1bHRzVjA+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT25saW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IGZlZUVzdGltYXRpb246IEZlZUVzdGltYXRpb24gfCB1bmRlZmluZWQgPSBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0VHJhbnNhY3Rpb25GZWVXaXRoUHVibGljS2V5KFxuICAgICAgbmV3RXh0ZW5kZWRQdWJsaWNLZXkocHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkpLFxuICAgICAgdGhpcy5jb21iaW5lVHJhbnNhY3Rpb25EZXRhaWxzKHJlY2lwaWVudHMsIHZhbHVlcyksXG4gICAgICB7XG4gICAgICAgIGFyYml0cmFyeURhdGE6IHRoaXMuZ2V0QXJiaXRyYXJ5RGF0YShkYXRhKSxcbiAgICAgICAgYXNzZXRJZDogZGF0YT8uYXNzZXRJRCA/IHBhcnNlSW50KGRhdGEuYXNzZXRJRCwgMTApIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgKVxuXG4gICAgaWYgKGZlZUVzdGltYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgYGVzdGltYXRlRmVlRGVmYXVsdHNGcm9tRXh0ZW5kZWRQdWJsaWNLZXlgIG5vdCBzdXBwb3J0ZWQuJylcbiAgICB9XG5cbiAgICBjb25zdCBmZWVEZWZhdWx0czogRmVlRGVmYXVsdHMgPSBpc0Ftb3VudChmZWVFc3RpbWF0aW9uKVxuICAgICAgPyB7IGxvdzogZmVlRXN0aW1hdGlvbiwgbWVkaXVtOiBmZWVFc3RpbWF0aW9uLCBoaWdoOiBmZWVFc3RpbWF0aW9uIH1cbiAgICAgIDogZmVlRXN0aW1hdGlvblxuXG4gICAgcmV0dXJuIHRoaXMuY29udmVydEZlZURlZmF1bHRzVjFUb1YwKGZlZURlZmF1bHRzKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGVzdGltYXRlRmVlRGVmYXVsdHNGcm9tUHVibGljS2V5KFxuICAgIHB1YmxpY0tleTogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHN0cmluZ1tdLFxuICAgIHZhbHVlczogc3RyaW5nW10sXG4gICAgZGF0YT86IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cblxuICAgICAgLy8gVGV6b3MgRkEyXG4gICAgICBhc3NldElEPzogc3RyaW5nXG4gICAgfVxuICApOiBQcm9taXNlPEZlZURlZmF1bHRzVjA+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPbmxpbmUuJylcbiAgICB9XG5cbiAgICBpZiAocmVjaXBpZW50cy5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVjaXBpZW50cyBsZW5ndGggbXVzdCBtYXRjaCB2YWx1ZXMgbGVuZ3RoLicpXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25EZXRhaWxzOiBUcmFuc2FjdGlvbkRldGFpbHNbXSA9IHJlY2lwaWVudHMubWFwKChyZWNpcGllbnQ6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgIHRvOiByZWNpcGllbnQsXG4gICAgICBhbW91bnQ6IG5ld0Ftb3VudCh2YWx1ZXNbaW5kZXhdLCAnYmxvY2tjaGFpbicpXG4gICAgfSkpXG5cbiAgICBjb25zdCBmZWVFc3RpbWF0aW9uOiBGZWVFc3RpbWF0aW9uIHwgdW5kZWZpbmVkID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldFRyYW5zYWN0aW9uRmVlV2l0aFB1YmxpY0tleShcbiAgICAgIG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSksXG4gICAgICB0cmFuc2FjdGlvbkRldGFpbHMsXG4gICAgICB7XG4gICAgICAgIGFyYml0cmFyeURhdGE6IHRoaXMuZ2V0QXJiaXRyYXJ5RGF0YShkYXRhKSxcbiAgICAgICAgYXNzZXRJZDogZGF0YT8uYXNzZXRJRCA/IHBhcnNlSW50KGRhdGEuYXNzZXRJRCwgMTApIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgKVxuXG4gICAgaWYgKGZlZUVzdGltYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgYGVzdGltYXRlRmVlRGVmYXVsdHNGcm9tUHVibGljS2V5YCBub3Qgc3VwcG9ydGVkLicpXG4gICAgfVxuXG4gICAgY29uc3QgZmVlRGVmYXVsdHM6IEZlZURlZmF1bHRzID0gaXNBbW91bnQoZmVlRXN0aW1hdGlvbilcbiAgICAgID8geyBsb3c6IGZlZUVzdGltYXRpb24sIG1lZGl1bTogZmVlRXN0aW1hdGlvbiwgaGlnaDogZmVlRXN0aW1hdGlvbiB9XG4gICAgICA6IGZlZUVzdGltYXRpb25cblxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRGZWVEZWZhdWx0c1YxVG9WMChmZWVEZWZhdWx0cylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwcmVwYXJlVHJhbnNhY3Rpb25Gcm9tRXh0ZW5kZWRQdWJsaWNLZXkoXG4gICAgZXh0ZW5kZWRQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBfb2Zmc2V0OiBudW1iZXIsXG4gICAgcmVjaXBpZW50czogc3RyaW5nW10sXG4gICAgdmFsdWVzOiBzdHJpbmdbXSxcbiAgICBmZWU6IHN0cmluZyxcbiAgICBleHRyYXM/OiB7XG4gICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG5cbiAgICAgIC8vIEJpdGNvaW5cbiAgICAgIG1hc3RlckZpbmdlcnByaW50OiBzdHJpbmdcbiAgICAgIHJlcGxhY2VCeUZlZTogYm9vbGVhblxuXG4gICAgICAvLyBUZXpvcyBGQTJcbiAgICAgIGFzc2V0SUQ/OiBzdHJpbmdcbiAgICB9XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFpc09ubGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9ubGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2Vnd2l0ID0gaXNCaXRjb2luU2Vnd2l0UHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKVxuICAgIGNvbnN0IGlzVGFwcm9vdCA9IGlzQml0Y29pblRhcHJvb3RQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpXG5cbiAgICBsZXQgdHJhbnNhY3Rpb246IFVuc2lnbmVkVHJhbnNhY3Rpb25cbiAgICBpZiAoaXNTZWd3aXQgfHwgaXNUYXByb290KSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IGF3YWl0IChpc1NlZ3dpdFxuICAgICAgICA/ICh0aGlzLnByb3RvY29sVjEgYXMgQml0Y29pblNlZ3dpdFByb3RvY29sKVxuICAgICAgICA6ICh0aGlzLnByb3RvY29sVjEgYXMgQml0Y29pblRhcHJvb3RQcm90b2NvbClcbiAgICAgICkucHJlcGFyZVRyYW5zYWN0aW9uV2l0aFB1YmxpY0tleShcbiAgICAgICAgbmV3RXh0ZW5kZWRQdWJsaWNLZXkoZXh0ZW5kZWRQdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAoZXh0ZW5kZWRQdWJsaWNLZXkpKSxcbiAgICAgICAgdGhpcy5jb21iaW5lVHJhbnNhY3Rpb25EZXRhaWxzKHJlY2lwaWVudHMsIHZhbHVlcyksXG4gICAgICAgIHtcbiAgICAgICAgICBmZWU6IG5ld0Ftb3VudChmZWUsICdibG9ja2NoYWluJyksXG4gICAgICAgICAgYXJiaXRyYXJ5RGF0YTogdGhpcy5nZXRBcmJpdHJhcnlEYXRhKGV4dHJhcyksXG4gICAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ2hleCcsXG4gICAgICAgICAgICB2YWx1ZTogZXh0cmFzPy5tYXN0ZXJGaW5nZXJwcmludFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVwbGFjZUJ5RmVlOiBleHRyYXM/LnJlcGxhY2VCeUZlZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLnByZXBhcmVUcmFuc2FjdGlvbldpdGhQdWJsaWNLZXkoXG4gICAgICAgIG5ld0V4dGVuZGVkUHVibGljS2V5KGV4dGVuZGVkUHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKGV4dGVuZGVkUHVibGljS2V5KSksXG4gICAgICAgIHRoaXMuY29tYmluZVRyYW5zYWN0aW9uRGV0YWlscyhyZWNpcGllbnRzLCB2YWx1ZXMpLFxuICAgICAgICB7XG4gICAgICAgICAgZmVlOiBuZXdBbW91bnQoZmVlLCAnYmxvY2tjaGFpbicpLFxuICAgICAgICAgIGFzc2V0SWQ6IGV4dHJhcz8uYXNzZXRJRCA/IHBhcnNlSW50KGV4dHJhcy5hc3NldElELCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYXJiaXRyYXJ5RGF0YTogdGhpcy5nZXRBcmJpdHJhcnlEYXRhKGV4dHJhcylcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uVjAgPSBhd2FpdCB0aGlzLmNvbnZlcnRVbnNpZ25lZFRyYW5zYWN0aW9uVjFUb1YwKHRyYW5zYWN0aW9uLCBleHRlbmRlZFB1YmxpY0tleSlcblxuICAgIHJldHVybiB0cmFuc2FjdGlvblYwLnRyYW5zYWN0aW9uXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZVRyYW5zYWN0aW9uRnJvbVB1YmxpY0tleShcbiAgICBwdWJsaWNLZXk6IHN0cmluZyxcbiAgICByZWNpcGllbnRzOiBzdHJpbmdbXSxcbiAgICB2YWx1ZXM6IHN0cmluZ1tdLFxuICAgIGZlZTogc3RyaW5nLFxuICAgIGV4dHJhcz86IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cblxuICAgICAgLy8gVGV6b3MgRkEyXG4gICAgICBhc3NldElEPzogc3RyaW5nXG4gICAgfVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9ubGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBVbnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLnByZXBhcmVUcmFuc2FjdGlvbldpdGhQdWJsaWNLZXkoXG4gICAgICBuZXdQdWJsaWNLZXkocHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkpLFxuICAgICAgdGhpcy5jb21iaW5lVHJhbnNhY3Rpb25EZXRhaWxzKHJlY2lwaWVudHMsIHZhbHVlcyksXG4gICAgICB7XG4gICAgICAgIGZlZTogbmV3QW1vdW50KGZlZSwgJ2Jsb2NrY2hhaW4nKSxcbiAgICAgICAgYXJiaXRyYXJ5RGF0YTogdGhpcy5nZXRBcmJpdHJhcnlEYXRhKGV4dHJhcyksXG4gICAgICAgIGFzc2V0SWQ6IGV4dHJhcz8uYXNzZXRJRCA/IHBhcnNlSW50KGV4dHJhcy5hc3NldElELCAxMCkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICApXG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblYwID0gYXdhaXQgdGhpcy5jb252ZXJ0VW5zaWduZWRUcmFuc2FjdGlvblYxVG9WMCh0cmFuc2FjdGlvbiwgcHVibGljS2V5KVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uVjAudHJhbnNhY3Rpb25cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBicm9hZGNhc3RUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPbmxpbmUuJylcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHsgdHJhbnNhY3Rpb246IHJhd1RyYW5zYWN0aW9uLCBhY2NvdW50SWRlbnRpZmllcjogJycgfVxuICAgIGNvbnN0IHNpZ25lZDogU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmNvbnZlcnRTaWduZWRUcmFuc2FjdGlvblYwVG9WMSh0cmFuc2FjdGlvbilcblxuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEuYnJvYWRjYXN0VHJhbnNhY3Rpb24oc2lnbmVkKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCBfY3Vyc29yPzogSVByb3RvY29sQWRkcmVzc0N1cnNvcik6IFByb21pc2U8SUFpckdhcEFkZHJlc3NSZXN1bHQ+IHtcbiAgICBjb25zdCBhZGRyZXNzOiBBZGRyZXNzV2l0aEN1cnNvciB8IHN0cmluZyA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShcbiAgICAgIG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSlcbiAgICApXG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzczogdHlwZW9mIGFkZHJlc3MgPT09ICdzdHJpbmcnID8gYWRkcmVzcyA6IGFkZHJlc3MuYWRkcmVzcyxcbiAgICAgIGN1cnNvcjogdHlwZW9mIGFkZHJlc3MgPT09ICdvYmplY3QnID8gYWRkcmVzcy5jdXJzb3IgOiB7IGhhc05leHQ6IGZhbHNlIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWRkcmVzc2VzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZywgX2N1cnNvcj86IElQcm90b2NvbEFkZHJlc3NDdXJzb3IpOiBQcm9taXNlPElBaXJHYXBBZGRyZXNzUmVzdWx0W10+IHtcbiAgICBpZiAoaGFzTXVsdGlBZGRyZXNzUHVibGljS2V5cyh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICBjb25zdCBwazogUHVibGljS2V5ID0gbmV3UHVibGljS2V5KHB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChwdWJsaWNLZXkpKVxuICAgICAgY29uc3QgYWRkcmVzc2VzOiBBZGRyZXNzV2l0aEN1cnNvcltdID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEluaXRpYWxBZGRyZXNzZXNGcm9tUHVibGljS2V5KHBrKVxuXG4gICAgICByZXR1cm4gYWRkcmVzc2VzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBZGRyZXNzRnJvbUV4dGVuZGVkUHVibGljS2V5KFxuICAgIGV4dGVuZGVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdmlzaWJpbGl0eURlcml2YXRpb25JbmRleDogbnVtYmVyLFxuICAgIGFkZHJlc3NEZXJpdmF0aW9uSW5kZXg6IG51bWJlclxuICApOiBQcm9taXNlPElBaXJHYXBBZGRyZXNzUmVzdWx0PiB7XG4gICAgaWYgKCFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXk6IFB1YmxpY0tleSA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5kZXJpdmVGcm9tRXh0ZW5kZWRQdWJsaWNLZXkoXG4gICAgICBuZXdFeHRlbmRlZFB1YmxpY0tleShleHRlbmRlZFB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChleHRlbmRlZFB1YmxpY0tleSkpLFxuICAgICAgdmlzaWJpbGl0eURlcml2YXRpb25JbmRleCxcbiAgICAgIGFkZHJlc3NEZXJpdmF0aW9uSW5kZXhcbiAgICApXG5cbiAgICByZXR1cm4gdGhpcy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkUHVibGljS2V5LnZhbHVlKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFkZHJlc3Nlc0Zyb21FeHRlbmRlZFB1YmxpY0tleShcbiAgICBleHRlbmRlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIHZpc2liaWxpdHlEZXJpdmF0aW9uSW5kZXg6IG51bWJlcixcbiAgICBhZGRyZXNzQ291bnQ6IG51bWJlcixcbiAgICBvZmZzZXQ6IG51bWJlclxuICApOiBQcm9taXNlPElBaXJHYXBBZGRyZXNzUmVzdWx0W10+IHtcbiAgICBpZiAoIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgZ2VuZXJhdG9yQXJyYXkgPSBBcnJheS5mcm9tKG5ldyBBcnJheShhZGRyZXNzQ291bnQpLCAoXywgaSkgPT4gaSArIG9mZnNldClcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGdlbmVyYXRvckFycmF5Lm1hcCgoYWRkcmVzc0Rlcml2YXRpb25JbmRleDogbnVtYmVyKSA9PlxuICAgICAgICB0aGlzLmdldEFkZHJlc3NGcm9tRXh0ZW5kZWRQdWJsaWNLZXkoZXh0ZW5kZWRQdWJsaWNLZXksIHZpc2liaWxpdHlEZXJpdmF0aW9uSW5kZXgsIGFkZHJlc3NEZXJpdmF0aW9uSW5kZXgpXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFRyYW5zYWN0aW9uRGV0YWlscyhcbiAgICB0cmFuc2FjdGlvbjogVW5zaWduZWRUcmFuc2FjdGlvblYwLFxuICAgIGRhdGE/OiB7XG4gICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gICAgICB0cmFuc2FjdGlvbk93bmVyPzogc3RyaW5nXG5cbiAgICAgIC8vIFRlem9zU2FwbGluZ1xuICAgICAga25vd25WaWV3aW5nS2V5cz86IHN0cmluZ1tdXG4gICAgfVxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvbltdPiB7XG4gICAgY29uc3QgdW5zaWduZWQ6IFVuc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmNvbnZlcnRVbnNpZ25lZFRyYW5zYWN0aW9uVjBUb1YxKHRyYW5zYWN0aW9uLCBkYXRhPy50cmFuc2FjdGlvbk93bmVyKVxuXG4gICAgbGV0IHRyYW5zYWN0aW9uczogQWlyR2FwVHJhbnNhY3Rpb25bXVxuICAgIGlmICh0aGlzLmlzRXh0ZW5kZWRQdWJsaWNLZXkodHJhbnNhY3Rpb24ucHVibGljS2V5KSkge1xuICAgICAgaWYgKCFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IEJpcDMyLicpXG4gICAgICB9XG5cbiAgICAgIHRyYW5zYWN0aW9ucyA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXREZXRhaWxzRnJvbVRyYW5zYWN0aW9uKFxuICAgICAgICB1bnNpZ25lZCxcbiAgICAgICAgbmV3RXh0ZW5kZWRQdWJsaWNLZXkodHJhbnNhY3Rpb24ucHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHRyYW5zYWN0aW9uLnB1YmxpY0tleSkpXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHB1YmxpY0tleTogUHVibGljS2V5ID0gbmV3UHVibGljS2V5KHRyYW5zYWN0aW9uLnB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMCh0cmFuc2FjdGlvbi5wdWJsaWNLZXkpKVxuICAgICAgdHJhbnNhY3Rpb25zID1cbiAgICAgICAgZGF0YT8ua25vd25WaWV3aW5nS2V5cyAmJiBpc1Rlem9zU2FwbGluZ1Byb3RvY29sKHRoaXMucHJvdG9jb2xWMSlcbiAgICAgICAgICA/IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXREZXRhaWxzRnJvbVRyYW5zYWN0aW9uKHVuc2lnbmVkIGFzIGFueSwgcHVibGljS2V5LCBkYXRhLmtub3duVmlld2luZ0tleXMpXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0RGV0YWlsc0Zyb21UcmFuc2FjdGlvbih1bnNpZ25lZCwgcHVibGljS2V5KVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uc1YwOiBJQWlyR2FwVHJhbnNhY3Rpb25bXSA9IGF3YWl0IHRoaXMuY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCh0cmFuc2FjdGlvbnMpXG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25zVjAubWFwKFxuICAgICAgKHR4OiBJQWlyR2FwVHJhbnNhY3Rpb24pOiBJQWlyR2FwVHJhbnNhY3Rpb24gPT4gKHtcbiAgICAgICAgLi4udHgsXG4gICAgICAgIHRyYW5zYWN0aW9uRGV0YWlsczogdHgudHJhbnNhY3Rpb25EZXRhaWxzID8/IHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkRldGFpbHNGcm9tU2lnbmVkKFxuICAgIHRyYW5zYWN0aW9uOiBTaWduZWRUcmFuc2FjdGlvblYwLFxuICAgIGRhdGE/OiB7XG4gICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gICAgICB0cmFuc2FjdGlvbk93bmVyPzogc3RyaW5nXG5cbiAgICAgIC8vIFRlem9zU2FwbGluZ1xuICAgICAga25vd25WaWV3aW5nS2V5cz86IHN0cmluZ1tdXG4gICAgfVxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvbltdPiB7XG4gICAgY29uc3Qgc2lnbmVkOiBTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuY29udmVydFNpZ25lZFRyYW5zYWN0aW9uVjBUb1YxKHRyYW5zYWN0aW9uLCBkYXRhPy50cmFuc2FjdGlvbk93bmVyKVxuXG4gICAgbGV0IHRyYW5zYWN0aW9uczogQWlyR2FwVHJhbnNhY3Rpb25bXVxuICAgIGlmICh0aGlzLmlzRXh0ZW5kZWRQdWJsaWNLZXkodHJhbnNhY3Rpb24uYWNjb3VudElkZW50aWZpZXIpKSB7XG4gICAgICBpZiAoIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogQmlwMzIuJylcbiAgICAgIH1cblxuICAgICAgdHJhbnNhY3Rpb25zID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldERldGFpbHNGcm9tVHJhbnNhY3Rpb24oXG4gICAgICAgIHNpZ25lZCxcbiAgICAgICAgbmV3RXh0ZW5kZWRQdWJsaWNLZXkodHJhbnNhY3Rpb24uYWNjb3VudElkZW50aWZpZXIsIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAodHJhbnNhY3Rpb24uYWNjb3VudElkZW50aWZpZXIpKVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwdWJsaWNLZXk6IFB1YmxpY0tleSA9IG5ld1B1YmxpY0tleSh0cmFuc2FjdGlvbi5hY2NvdW50SWRlbnRpZmllciwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMCh0cmFuc2FjdGlvbi5hY2NvdW50SWRlbnRpZmllcikpXG4gICAgICB0cmFuc2FjdGlvbnMgPVxuICAgICAgICBkYXRhPy5rbm93blZpZXdpbmdLZXlzICYmIGlzVGV6b3NTYXBsaW5nUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldERldGFpbHNGcm9tVHJhbnNhY3Rpb24oc2lnbmVkIGFzIGFueSwgcHVibGljS2V5LCBkYXRhLmtub3duVmlld2luZ0tleXMpXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0RGV0YWlsc0Zyb21UcmFuc2FjdGlvbihzaWduZWQsIHB1YmxpY0tleSlcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnNWMDogSUFpckdhcFRyYW5zYWN0aW9uW10gPSBhd2FpdCB0aGlzLmNvbnZlcnRUcmFuc2FjdGlvbkRldGFpbHNWMVRvVjAodHJhbnNhY3Rpb25zKVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uc1YwLm1hcChcbiAgICAgICh0eDogSUFpckdhcFRyYW5zYWN0aW9uKTogSUFpckdhcFRyYW5zYWN0aW9uID0+ICh7XG4gICAgICAgIC4uLnR4LFxuICAgICAgICB0cmFuc2FjdGlvbkRldGFpbHM6IHR4LnRyYW5zYWN0aW9uRGV0YWlscyA/PyB0cmFuc2FjdGlvbi50cmFuc2FjdGlvblxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdmVyaWZ5TWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhY2FuU2lnbk1lc3NhZ2UodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBTaWduTWVzc2FnZS4nKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEudmVyaWZ5TWVzc2FnZVdpdGhQdWJsaWNLZXkoXG4gICAgICBtZXNzYWdlLFxuICAgICAgbmV3U2lnbmF0dXJlKHNpZ25hdHVyZSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChzaWduYXR1cmUpKSxcbiAgICAgIG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSlcbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZW5jcnlwdEFzeW1tZXRyaWMocGF5bG9hZDogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFjYW5FbmNyeXB0QXN5bW1ldHJpYyh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIEFzeW1tZXRyaWNFbmNyeXB0aW9uLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5lbmNyeXB0QXN5bW1ldHJpY1dpdGhQdWJsaWNLZXkocGF5bG9hZCwgbmV3UHVibGljS2V5KHB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChwdWJsaWNLZXkpKSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRQdWJsaWNLZXlGcm9tTW5lbW9uaWMobW5lbW9uaWM6IHN0cmluZywgZGVyaXZhdGlvblBhdGg6IHN0cmluZywgcGFzc3dvcmQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3Qgc2VlZDogQnVmZmVyID0gYXdhaXQgbW5lbW9uaWNUb1NlZWQoY3J5cHRvLCBtbmVtb25pYywgcGFzc3dvcmQpXG5cbiAgICByZXR1cm4gdGhpcy5nZXRQdWJsaWNLZXlGcm9tSGV4U2VjcmV0KHNlZWQudG9TdHJpbmcoJ2hleCcpLCBkZXJpdmF0aW9uUGF0aClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRQcml2YXRlS2V5RnJvbU1uZW1vbmljKG1uZW1vbmljOiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsIHBhc3N3b3JkPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT2ZmbGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IGNyeXB0bzogQ3J5cHRvQ29uZmlndXJhdGlvbiA9IHRoaXMuY3J5cHRvID8/IChhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0Q3J5cHRvQ29uZmlndXJhdGlvbigpKVxuICAgIGNvbnN0IHNlZWQ6IEJ1ZmZlciA9IGF3YWl0IG1uZW1vbmljVG9TZWVkKGNyeXB0bywgbW5lbW9uaWMsIHBhc3N3b3JkKVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJpdmF0ZUtleUZyb21IZXhTZWNyZXQoc2VlZC50b1N0cmluZygnaGV4JyksIGRlcml2YXRpb25QYXRoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEV4dGVuZGVkUHVibGljS2V5RnJvbU1uZW1vbmljKG1uZW1vbmljOiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsIHBhc3N3b3JkPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3Qgc2VlZDogQnVmZmVyID0gYXdhaXQgbW5lbW9uaWNUb1NlZWQoY3J5cHRvLCBtbmVtb25pYywgcGFzc3dvcmQpXG5cbiAgICByZXR1cm4gdGhpcy5nZXRFeHRlbmRlZFB1YmxpY0tleUZyb21IZXhTZWNyZXQoc2VlZC50b1N0cmluZygnaGV4JyksIGRlcml2YXRpb25QYXRoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEV4dGVuZGVkUHJpdmF0ZUtleUZyb21NbmVtb25pYyhtbmVtb25pYzogc3RyaW5nLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLCBwYXNzd29yZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IGNyeXB0bzogQ3J5cHRvQ29uZmlndXJhdGlvbiA9IHRoaXMuY3J5cHRvID8/IChhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0Q3J5cHRvQ29uZmlndXJhdGlvbigpKVxuICAgIGNvbnN0IHNlZWQ6IEJ1ZmZlciA9IGF3YWl0IG1uZW1vbmljVG9TZWVkKGNyeXB0bywgbW5lbW9uaWMsIHBhc3N3b3JkKVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RXh0ZW5kZWRQcml2YXRlS2V5RnJvbUhleFNlY3JldChzZWVkLnRvU3RyaW5nKCdoZXgnKSwgZGVyaXZhdGlvblBhdGgpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UHVibGljS2V5RnJvbUhleFNlY3JldChzZWNyZXQ6IHN0cmluZywgZGVyaXZhdGlvblBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3QgZGVyaXZhdGl2ZTogQ3J5cHRvRGVyaXZhdGl2ZSA9IGF3YWl0IGRlcml2ZShjcnlwdG8sIEJ1ZmZlci5mcm9tKHNlY3JldCwgJ2hleCcpLCBkZXJpdmF0aW9uUGF0aClcbiAgICBjb25zdCBrZXlQYWlyOiBLZXlQYWlyID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEtleVBhaXJGcm9tRGVyaXZhdGl2ZShkZXJpdmF0aXZlKVxuXG4gICAgcmV0dXJuIGtleVBhaXIucHVibGljS2V5LnZhbHVlXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UHJpdmF0ZUtleUZyb21IZXhTZWNyZXQoc2VjcmV0OiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3QgZGVyaXZhdGl2ZTogQ3J5cHRvRGVyaXZhdGl2ZSA9IGF3YWl0IGRlcml2ZShjcnlwdG8sIEJ1ZmZlci5mcm9tKHNlY3JldCwgJ2hleCcpLCBkZXJpdmF0aW9uUGF0aClcbiAgICBjb25zdCBrZXlQYWlyOiBLZXlQYWlyID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEtleVBhaXJGcm9tRGVyaXZhdGl2ZShkZXJpdmF0aXZlKVxuXG4gICAgcmV0dXJuIGtleVBhaXIuc2VjcmV0S2V5LnZhbHVlXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RXh0ZW5kZWRQdWJsaWNLZXlGcm9tSGV4U2VjcmV0KHNlY3JldDogc3RyaW5nLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3QgZGVyaXZhdGl2ZTogQ3J5cHRvRGVyaXZhdGl2ZSA9IGF3YWl0IGRlcml2ZShjcnlwdG8sIEJ1ZmZlci5mcm9tKHNlY3JldCwgJ2hleCcpLCBkZXJpdmF0aW9uUGF0aClcbiAgICBjb25zdCBrZXlQYWlyOiBFeHRlbmRlZEtleVBhaXIgPSBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0RXh0ZW5kZWRLZXlQYWlyRnJvbURlcml2YXRpdmUoZGVyaXZhdGl2ZSlcblxuICAgIHJldHVybiBrZXlQYWlyLnB1YmxpY0tleS52YWx1ZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEV4dGVuZGVkUHJpdmF0ZUtleUZyb21IZXhTZWNyZXQoc2VjcmV0OiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT2ZmbGluZSwgQmlwMzIuJylcbiAgICB9XG5cbiAgICBjb25zdCBjcnlwdG86IENyeXB0b0NvbmZpZ3VyYXRpb24gPSB0aGlzLmNyeXB0byA/PyAoYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldENyeXB0b0NvbmZpZ3VyYXRpb24oKSlcbiAgICBjb25zdCBkZXJpdmF0aXZlOiBDcnlwdG9EZXJpdmF0aXZlID0gYXdhaXQgZGVyaXZlKGNyeXB0bywgQnVmZmVyLmZyb20oc2VjcmV0LCAnaGV4JyksIGRlcml2YXRpb25QYXRoKVxuICAgIGNvbnN0IGtleVBhaXI6IEV4dGVuZGVkS2V5UGFpciA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRFeHRlbmRlZEtleVBhaXJGcm9tRGVyaXZhdGl2ZShkZXJpdmF0aXZlKVxuXG4gICAgcmV0dXJuIGtleVBhaXIuc2VjcmV0S2V5LnZhbHVlXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbldpdGhFeHRlbmRlZFByaXZhdGVLZXkoZXh0ZW5kZWRQcml2YXRlS2V5OiBzdHJpbmcsIHRyYW5zYWN0aW9uOiBhbnksIGNoaWxkRGVyaXZhdGlvblBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT2ZmbGluZSwgQmlwMzIuJylcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZDogVW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuY29udmVydFVuc2lnbmVkVHJhbnNhY3Rpb25WMFRvVjEoe1xuICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICBwdWJsaWNLZXk6ICcnXG4gICAgfSlcblxuICAgIGNvbnN0IGV4dGVuZGVkU2VjcmV0S2V5OiBFeHRlbmRlZFNlY3JldEtleSA9IG5ld0V4dGVuZGVkU2VjcmV0S2V5KGV4dGVuZGVkUHJpdmF0ZUtleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChleHRlbmRlZFByaXZhdGVLZXkpKVxuXG4gICAgY29uc3Qgc2VjcmV0S2V5OiBFeHRlbmRlZFNlY3JldEtleSB8IFNlY3JldEtleSA9IGNoaWxkRGVyaXZhdGlvblBhdGhcbiAgICAgID8gYXdhaXQgdGhpcy5kZXJpdmVTZWNyZXRLZXkoZXh0ZW5kZWRTZWNyZXRLZXksIGNoaWxkRGVyaXZhdGlvblBhdGgpXG4gICAgICA6IGV4dGVuZGVkU2VjcmV0S2V5XG5cbiAgICBjb25zdCBzaWduZWQ6IFNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLnNpZ25UcmFuc2FjdGlvbldpdGhTZWNyZXRLZXkodW5zaWduZWQsIHNlY3JldEtleSlcbiAgICBjb25zdCBzaWduZWRWMDogVHJhbnNhY3Rpb25TaWduUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnZlcnRTaWduZWRUcmFuc2FjdGlvblYxVG9WMChzaWduZWQsICcnKVxuXG4gICAgcmV0dXJuIHNpZ25lZFYwLnRyYW5zYWN0aW9uXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbldpdGhQcml2YXRlS2V5KHByaXZhdGVLZXk6IHN0cmluZywgdHJhbnNhY3Rpb246IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUuJylcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZDogVW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuY29udmVydFVuc2lnbmVkVHJhbnNhY3Rpb25WMFRvVjEoe1xuICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICBwdWJsaWNLZXk6ICcnXG4gICAgfSlcblxuICAgIGNvbnN0IHNpZ25lZDogU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnByb3RvY29sVjEuc2lnblRyYW5zYWN0aW9uV2l0aFNlY3JldEtleShcbiAgICAgIHVuc2lnbmVkLFxuICAgICAgbmV3U2VjcmV0S2V5KHByaXZhdGVLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHJpdmF0ZUtleSkpXG4gICAgKVxuICAgIGNvbnN0IHNpZ25lZFYwOiBUcmFuc2FjdGlvblNpZ25SZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udmVydFNpZ25lZFRyYW5zYWN0aW9uVjFUb1YwKHNpZ25lZCwgJycpXG5cbiAgICByZXR1cm4gc2lnbmVkVjAudHJhbnNhY3Rpb25cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIGtleXBhaXI6IHsgcHVibGljS2V5Pzogc3RyaW5nOyBwcml2YXRlS2V5OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFjYW5TaWduTWVzc2FnZSh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIFNpZ25NZXNzYWdlLicpXG4gICAgfVxuXG4gICAgY29uc3QgcHJpdmF0ZUtleSA9XG4gICAgICBnZXRTZWNyZXRLZXlUeXBlKGtleXBhaXIucHJpdmF0ZUtleSkgPT09ICd4cHJpdidcbiAgICAgICAgPyBhd2FpdCB0aGlzLmdldFByaXZhdGVLZXlGcm9tRXh0ZW5kZWRQcml2YXRlS2V5KGtleXBhaXIucHJpdmF0ZUtleSlcbiAgICAgICAgOiBrZXlwYWlyLnByaXZhdGVLZXlcblxuICAgIGNvbnN0IHB1YmxpY0tleSA9IGtleXBhaXIucHVibGljS2V5XG4gICAgICA/IGdldFB1YmxpY0tleVR5cGUoa2V5cGFpci5wdWJsaWNLZXkpID09PSAneHB1YidcbiAgICAgICAgPyBhd2FpdCB0aGlzLmdldFB1YmxpY0tleUZyb21FeHRlbmRlZFByaXZhdGVLZXkoa2V5cGFpci5wdWJsaWNLZXkpXG4gICAgICAgIDoga2V5cGFpci5wdWJsaWNLZXlcbiAgICAgIDogJydcblxuICAgIGNvbnN0IHNpZ25hdHVyZTogU2lnbmF0dXJlID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLnNpZ25NZXNzYWdlV2l0aEtleVBhaXIobWVzc2FnZSwge1xuICAgICAgc2VjcmV0S2V5OiBuZXdTZWNyZXRLZXkocHJpdmF0ZUtleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChwcml2YXRlS2V5KSksXG4gICAgICBwdWJsaWNLZXk6IG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNpZ25hdHVyZS52YWx1ZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlY3J5cHRBc3ltbWV0cmljKGVuY3J5cHRlZFBheWxvYWQ6IHN0cmluZywga2V5cGFpcjogeyBwdWJsaWNLZXk/OiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWNhbkVuY3J5cHRBc3ltbWV0cmljKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT2ZmbGluZSwgQXN5bW1ldHJpY0VuY3J5cHRpb24uJylcbiAgICB9XG5cbiAgICBjb25zdCBwcml2YXRlS2V5ID1cbiAgICAgIGdldFNlY3JldEtleVR5cGUoa2V5cGFpci5wcml2YXRlS2V5KSA9PT0gJ3hwcml2J1xuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0UHJpdmF0ZUtleUZyb21FeHRlbmRlZFByaXZhdGVLZXkoa2V5cGFpci5wcml2YXRlS2V5KVxuICAgICAgICA6IGtleXBhaXIucHJpdmF0ZUtleVxuXG4gICAgY29uc3QgcHVibGljS2V5ID0ga2V5cGFpci5wdWJsaWNLZXlcbiAgICAgID8gZ2V0UHVibGljS2V5VHlwZShrZXlwYWlyLnB1YmxpY0tleSkgPT09ICd4cHViJ1xuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0UHVibGljS2V5RnJvbUV4dGVuZGVkUHJpdmF0ZUtleShrZXlwYWlyLnB1YmxpY0tleSlcbiAgICAgICAgOiBrZXlwYWlyLnB1YmxpY0tleVxuICAgICAgOiAnJ1xuXG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5kZWNyeXB0QXN5bW1ldHJpY1dpdGhLZXlQYWlyKGVuY3J5cHRlZFBheWxvYWQsIHtcbiAgICAgIHNlY3JldEtleTogbmV3U2VjcmV0S2V5KHByaXZhdGVLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHJpdmF0ZUtleSkpLFxuICAgICAgcHVibGljS2V5OiBuZXdQdWJsaWNLZXkocHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkpXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlbmNyeXB0QUVTKHBheWxvYWQ6IHN0cmluZywgcHJpdmF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWNhbkVuY3J5cHRBRVModGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBBRVMuJylcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBwcml2YXRlS2V5ID0gZ2V0U2VjcmV0S2V5VHlwZShwcml2YXRlS2V5KSA9PT0gJ3hwcml2JyA/IGF3YWl0IHRoaXMuZ2V0UHJpdmF0ZUtleUZyb21FeHRlbmRlZFByaXZhdGVLZXkocHJpdmF0ZUtleSkgOiBwcml2YXRlS2V5XG5cbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmVuY3J5cHRBRVNXaXRoU2VjcmV0S2V5KHBheWxvYWQsIG5ld1NlY3JldEtleShwcml2YXRlS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHByaXZhdGVLZXkpKSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWNyeXB0QUVTKGVuY3J5cHRlZFBheWxvYWQ6IHN0cmluZywgcHJpdmF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWNhbkVuY3J5cHRBRVModGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBBRVMuJylcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBwcml2YXRlS2V5ID0gZ2V0U2VjcmV0S2V5VHlwZShwcml2YXRlS2V5KSA9PT0gJ3hwcml2JyA/IGF3YWl0IHRoaXMuZ2V0UHJpdmF0ZUtleUZyb21FeHRlbmRlZFByaXZhdGVLZXkocHJpdmF0ZUtleSkgOiBwcml2YXRlS2V5XG5cbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmRlY3J5cHRBRVNXaXRoU2VjcmV0S2V5KGVuY3J5cHRlZFBheWxvYWQsIG5ld1NlY3JldEtleShwcml2YXRlS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHByaXZhdGVLZXkpKSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRQcml2YXRlS2V5RnJvbUV4dGVuZGVkUHJpdmF0ZUtleShleHRlbmRlZFByaXZhdGVLZXk6IHN0cmluZywgY2hpbGREZXJpdmF0aW9uUGF0aD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IHNlY3JldEtleTogU2VjcmV0S2V5ID0gYXdhaXQgdGhpcy5kZXJpdmVTZWNyZXRLZXkoXG4gICAgICBuZXdFeHRlbmRlZFNlY3JldEtleShleHRlbmRlZFByaXZhdGVLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAoZXh0ZW5kZWRQcml2YXRlS2V5KSksXG4gICAgICBjaGlsZERlcml2YXRpb25QYXRoXG4gICAgKVxuXG4gICAgcmV0dXJuIHNlY3JldEtleS52YWx1ZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFB1YmxpY0tleUZyb21FeHRlbmRlZFByaXZhdGVLZXkoZXh0ZW5kZWRQdWJsaWNLZXk6IHN0cmluZywgY2hpbGREZXJpdmF0aW9uUGF0aD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IHB1YmxpY0tleTogUHVibGljS2V5ID0gYXdhaXQgdGhpcy5kZXJpdmVQdWJsaWNLZXkoXG4gICAgICBuZXdFeHRlbmRlZFB1YmxpY0tleShleHRlbmRlZFB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChleHRlbmRlZFB1YmxpY0tleSkpLFxuICAgICAgY2hpbGREZXJpdmF0aW9uUGF0aFxuICAgIClcblxuICAgIHJldHVybiBwdWJsaWNLZXkudmFsdWVcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXR3b3JrKHByb3RvY29sT3B0aW9ucz86IFByb3RvY29sT3B0aW9uc1YwKTogUHJvdG9jb2xOZXR3b3JrVjAge1xuICAgIGxldCBrbm93bk9wdGlvbnM6IFByb3RvY29sT3B0aW9uc1YwIHwgdW5kZWZpbmVkXG4gICAgdHJ5IHtcbiAgICAgIGtub3duT3B0aW9ucyA9IHByb3RvY29sT3B0aW9ucyA/PyBnZXRQcm90b2NvbE9wdGlvbnNCeUlkZW50aWZpZXJMZWdhY3kodGhpcy5pZGVudGlmaWVyKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgY29uc3QgeyBuYW1lLCB0eXBlLCBycGNVcmwsIC4uLnJlc3QgfSA9IHRoaXMubmV0d29yayA/PyB7fVxuXG4gICAgcmV0dXJuIG5ldyBQcm90b2NvbE5ldHdvcmtBZGFwdGVyKFxuICAgICAgbmFtZSA/PyBrbm93bk9wdGlvbnM/Lm5ldHdvcmsubmFtZSA/PyAnJyxcbiAgICAgIHR5cGUgPz8ga25vd25PcHRpb25zPy5uZXR3b3JrLnR5cGUgPz8gJ21haW5uZXQnLFxuICAgICAgcnBjVXJsID8/IGtub3duT3B0aW9ucz8ubmV0d29yay5ycGNVcmwgPz8gJycsXG4gICAgICB0aGlzLmJsb2NrRXhwbG9yZXJWMCxcbiAgICAgIHJlc3QgfHwgKGtub3duT3B0aW9ucz8ubmV0d29yay5leHRyYXMgPz8ge30pXG4gICAgKVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlcml2ZVNlY3JldEtleShleHRlbmRlZFNlY3JldEtleTogRXh0ZW5kZWRTZWNyZXRLZXksIGNoaWxkRGVyaXZhdGlvblBhdGg6IHN0cmluZyA9ICcwLzAnKTogUHJvbWlzZTxTZWNyZXRLZXk+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3RvY29sIGRvZXNuJ3Qgc3VwcG9ydCBzZWNyZXQga2V5IGRlcml2YXRpb24sIG1pc3NpbmcgaW5mZXJmYWNlOiBPZmZsaW5lLCBCaXAzMi5gKVxuICAgIH1cblxuICAgIGlmIChjaGlsZERlcml2YXRpb25QYXRoLnN0YXJ0c1dpdGgoJ20nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBmdWxsIGRlcml2YXRpb24gcGF0aCwgZXhwZWN0ZWQgY2hpbGQgZGVyaXZhdGlvbiBwYXRoJylcbiAgICB9XG5cbiAgICBpZiAoY2hpbGREZXJpdmF0aW9uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdoJykgfHwgY2hpbGREZXJpdmF0aW9uUGF0aC5pbmNsdWRlcyhgJ2ApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIGRlcml2YXRpb24gcGF0aCBjYW5ub3QgaW5jbHVkZSBoYXJkZW5lZCBjaGlsZHJlbicpXG4gICAgfVxuXG4gICAgY29uc3QgW3Zpc2liaWxpdHlJbmRleCwgYWRkcmVzc0luZGV4XTogbnVtYmVyW10gPSBjaGlsZERlcml2YXRpb25QYXRoLnNwbGl0KCcvJykubWFwKChpbmRleDogc3RyaW5nKSA9PiBwYXJzZUludChpbmRleCwgMTApKVxuXG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5kZXJpdmVGcm9tRXh0ZW5kZWRTZWNyZXRLZXkoZXh0ZW5kZWRTZWNyZXRLZXksIHZpc2liaWxpdHlJbmRleCwgYWRkcmVzc0luZGV4KVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlcml2ZVB1YmxpY0tleShleHRlbmRlZFB1YmxpY0tleTogRXh0ZW5kZWRQdWJsaWNLZXksIGNoaWxkRGVyaXZhdGlvblBhdGg6IHN0cmluZyA9ICcwLzAnKTogUHJvbWlzZTxQdWJsaWNLZXk+IHtcbiAgICBpZiAoIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3RvY29sIGRvZXNuJ3Qgc3VwcG9ydCBwdWJsaWMga2V5IGRlcml2YXRpb24sIG1pc3NpbmcgaW5mZXJmYWNlOiBCaXAzMi5gKVxuICAgIH1cblxuICAgIGlmIChjaGlsZERlcml2YXRpb25QYXRoLnN0YXJ0c1dpdGgoJ20nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBmdWxsIGRlcml2YXRpb24gcGF0aCwgZXhwZWN0ZWQgY2hpbGQgZGVyaXZhdGlvbiBwYXRoJylcbiAgICB9XG5cbiAgICBpZiAoY2hpbGREZXJpdmF0aW9uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdoJykgfHwgY2hpbGREZXJpdmF0aW9uUGF0aC5pbmNsdWRlcyhgJ2ApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIGRlcml2YXRpb24gcGF0aCBjYW5ub3QgaW5jbHVkZSBoYXJkZW5lZCBjaGlsZHJlbicpXG4gICAgfVxuXG4gICAgY29uc3QgW3Zpc2liaWxpdHlJbmRleCwgYWRkcmVzc0luZGV4XTogbnVtYmVyW10gPSBjaGlsZERlcml2YXRpb25QYXRoLnNwbGl0KCcvJykubWFwKChpbmRleDogc3RyaW5nKSA9PiBwYXJzZUludChpbmRleCwgMTApKVxuXG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5kZXJpdmVGcm9tRXh0ZW5kZWRQdWJsaWNLZXkoZXh0ZW5kZWRQdWJsaWNLZXksIHZpc2liaWxpdHlJbmRleCwgYWRkcmVzc0luZGV4KVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFNlcmlhbGl6ZXJJZGVudGlmaWVyKGJhc2U/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGlkZW50aWZpZXI6IHN0cmluZyA9IGJhc2UgPz8gKGF3YWl0IHRoaXMuZ2V0SWRlbnRpZmllcigpKVxuXG4gICAgcmV0dXJuIGlkZW50aWZpZXIuc3RhcnRzV2l0aChTdWJQcm90b2NvbFN5bWJvbHMuRVRIX0VSQzIwKVxuICAgICAgPyBTdWJQcm90b2NvbFN5bWJvbHMuRVRIX0VSQzIwXG4gICAgICA6IGlkZW50aWZpZXIuc3RhcnRzV2l0aChTdWJQcm90b2NvbFN5bWJvbHMuT1BUSU1JU01fRVJDMjApXG4gICAgICA/IFN1YlByb3RvY29sU3ltYm9scy5PUFRJTUlTTV9FUkMyMFxuICAgICAgOiBpZGVudGlmaWVyXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY29udmVydFVuc2lnbmVkVHJhbnNhY3Rpb25WMFRvVjEodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uU2lnblJlcXVlc3QsIG93bmVyPzogc3RyaW5nKTogUHJvbWlzZTxVbnNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaWRlbnRpZmllcjogc3RyaW5nID0gYXdhaXQgdGhpcy5nZXRTZXJpYWxpemVySWRlbnRpZmllcihvd25lcilcblxuICAgIHJldHVybiB0aGlzLnYzU2VyaWFsaXplckNvbXBhbmlvbi5mcm9tVHJhbnNhY3Rpb25TaWduUmVxdWVzdChpZGVudGlmaWVyLCB0cmFuc2FjdGlvbilcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb252ZXJ0VW5zaWduZWRUcmFuc2FjdGlvblYxVG9WMChcbiAgICB0cmFuc2FjdGlvbjogVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgICBwdWJsaWNLZXk6IHN0cmluZyxcbiAgICBjYWxsYmFja1VybD86IHN0cmluZyxcbiAgICBvd25lcj86IHN0cmluZ1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uU2lnblJlcXVlc3Q+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyOiBzdHJpbmcgPSBhd2FpdCB0aGlzLmdldFNlcmlhbGl6ZXJJZGVudGlmaWVyKG93bmVyKVxuXG4gICAgcmV0dXJuIHRoaXMudjNTZXJpYWxpemVyQ29tcGFuaW9uLnRvVHJhbnNhY3Rpb25TaWduUmVxdWVzdChpZGVudGlmaWVyLCB0cmFuc2FjdGlvbiwgcHVibGljS2V5LCBjYWxsYmFja1VybClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb252ZXJ0U2lnbmVkVHJhbnNhY3Rpb25WMFRvVjEodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uU2lnblJlc3BvbnNlLCBvd25lcj86IHN0cmluZyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyOiBzdHJpbmcgPSBhd2FpdCB0aGlzLmdldFNlcmlhbGl6ZXJJZGVudGlmaWVyKG93bmVyKVxuXG4gICAgcmV0dXJuIHRoaXMudjNTZXJpYWxpemVyQ29tcGFuaW9uLmZyb21UcmFuc2FjdGlvblNpZ25SZXNwb25zZShpZGVudGlmaWVyLCB0cmFuc2FjdGlvbilcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb252ZXJ0U2lnbmVkVHJhbnNhY3Rpb25WMVRvVjAoXG4gICAgdHJhbnNhY3Rpb246IFNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIGFjY291bnRJZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgb3duZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblNpZ25SZXNwb25zZT4ge1xuICAgIGNvbnN0IGlkZW50aWZpZXI6IHN0cmluZyA9IGF3YWl0IHRoaXMuZ2V0U2VyaWFsaXplcklkZW50aWZpZXIob3duZXIpXG5cbiAgICByZXR1cm4gdGhpcy52M1NlcmlhbGl6ZXJDb21wYW5pb24udG9UcmFuc2FjdGlvblNpZ25SZXNwb25zZShpZGVudGlmaWVyLCB0cmFuc2FjdGlvbiwgYWNjb3VudElkZW50aWZpZXIpXG4gIH1cblxuICBwdWJsaWMgY29udmVydEZlZURlZmF1bHRzVjFUb1YwKGZlZURlZmF1bHRzOiBGZWVEZWZhdWx0cyk6IEZlZURlZmF1bHRzVjAge1xuICAgIHJldHVybiBjb252ZXJ0RmVlRGVmYXVsdHNWMVRvVjAoZmVlRGVmYXVsdHMsIHRoaXMucHJvdG9jb2xNZXRhZGF0YSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb252ZXJ0VHJhbnNhY3Rpb25EZXRhaWxzVjFUb1YwKHR4czogQWlyR2FwVHJhbnNhY3Rpb25bXSk6IFByb21pc2U8SUFpckdhcFRyYW5zYWN0aW9uW10+IHtcbiAgICByZXR1cm4gY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCh0eHMsIHRoaXMucHJvdG9jb2xNZXRhZGF0YSwgdGhpcy5uZXR3b3JrVjApXG4gIH1cblxuICBwcm90ZWN0ZWQgY29tYmluZVRyYW5zYWN0aW9uRGV0YWlsczxfVW5pdHMgZXh0ZW5kcyBzdHJpbmc+KHJlY2lwaWVudHM6IHN0cmluZ1tdLCB2YWx1ZXM6IHN0cmluZ1tdKTogVHJhbnNhY3Rpb25EZXRhaWxzPF9Vbml0cz5bXSB7XG4gICAgaWYgKHJlY2lwaWVudHMubGVuZ3RoICE9PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2lwaWVudHMgbGVuZ3RoIG11c3QgbWF0Y2ggdmFsdWVzIGxlbmd0aC4nKVxuICAgIH1cblxuICAgIHJldHVybiByZWNpcGllbnRzLm1hcCgocmVjaXBpZW50OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICB0bzogcmVjaXBpZW50LFxuICAgICAgYW1vdW50OiBuZXdBbW91bnQodmFsdWVzW2luZGV4XSwgJ2Jsb2NrY2hhaW4nKVxuICAgIH0pKVxuICB9XG5cbiAgcHJvdGVjdGVkIGlzRXh0ZW5kZWRQdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHVibGljS2V5LnN0YXJ0c1dpdGgoJ3hwdWInKSB8fCBwdWJsaWNLZXkuc3RhcnRzV2l0aCgneXB1YicpIHx8IHB1YmxpY0tleS5zdGFydHNXaXRoKCd6cHViJylcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBcmJpdHJhcnlEYXRhKGRhdGE6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2ltcGxlQXJiaXRyYXJ5RGF0YU1ldGFkYXRhU2NoZW1hOiBTY2hlbWE8UHJvdG9jb2xUcmFuc2FjdGlvbkFyYml0cmFyeURhdGFNZXRhZGF0YT4gPSB7XG4gICAgICBuYW1lOiAncmVxdWlyZWQnLFxuICAgICAgbWF4TGVuZ3RoOiAnb3B0aW9uYWwnLFxuICAgICAgcmVnZXg6ICdvcHRpb25hbCdcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbE1ldGFkYXRhLnRyYW5zYWN0aW9uPy5hcmJpdHJhcnlEYXRhXG4gICAgICA/IGltcGxlbWVudHNJbnRlcmZhY2U8UHJvdG9jb2xUcmFuc2FjdGlvbkFyYml0cmFyeURhdGFNZXRhZGF0YT4oXG4gICAgICAgICAgdGhpcy5wcm90b2NvbE1ldGFkYXRhLnRyYW5zYWN0aW9uPy5hcmJpdHJhcnlEYXRhLFxuICAgICAgICAgIHNpbXBsZUFyYml0cmFyeURhdGFNZXRhZGF0YVNjaGVtYVxuICAgICAgICApXG4gICAgICAgID8gZGF0YVt0aGlzLnByb3RvY29sTWV0YWRhdGEudHJhbnNhY3Rpb24uYXJiaXRyYXJ5RGF0YS5uYW1lXVxuICAgICAgICA6IGRhdGFbdGhpcy5wcm90b2NvbE1ldGFkYXRhLnRyYW5zYWN0aW9uLmFyYml0cmFyeURhdGEucm9vdD8ubmFtZSA/PyB0aGlzLnByb3RvY29sTWV0YWRhdGEudHJhbnNhY3Rpb24uYXJiaXRyYXJ5RGF0YS5pbm5lcj8ubmFtZV1cbiAgICAgIDogdW5kZWZpbmVkXG4gIH1cbn1cblxuLy8gSUNvaW5EZWxlZ2F0ZVByb3RvY29sXG5cbmV4cG9ydCBjbGFzcyBJQ29pbkRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyPFQgZXh0ZW5kcyBBaXJHYXBBbnlQcm90b2NvbCAmIEFpckdhcERlbGVnYXRlUHJvdG9jb2w+XG4gIGV4dGVuZHMgSUNvaW5Qcm90b2NvbEFkYXB0ZXI8VD5cbiAgaW1wbGVtZW50cyBJQ29pbkRlbGVnYXRlUHJvdG9jb2xcbntcbiAgcHVibGljIGFzeW5jIGdldERlZmF1bHREZWxlZ2F0ZWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmdldERlZmF1bHREZWxlZ2F0ZWUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnREZWxlZ2F0ZWVzRm9yUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEuZ2V0Q3VycmVudERlbGVnYXRlZXNGb3JQdWJsaWNLZXkoXG4gICAgICB7IHR5cGU6ICdwdWInLCB2YWx1ZTogcHVibGljS2V5LCBmb3JtYXQ6IGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSB9LFxuICAgICAgZGF0YVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDdXJyZW50RGVsZWdhdGVlc0ZvckFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEuZ2V0Q3VycmVudERlbGVnYXRlZXNGb3JBZGRyZXNzKGFkZHJlc3MsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdGVlRGV0YWlscyhhZGRyZXNzOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRlZURldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmdldERlbGVnYXRlZURldGFpbHMoYWRkcmVzcywgZGF0YSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpc1B1YmxpY0tleURlbGVnYXRpbmcocHVibGljS2V5OiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmlzUHVibGljS2V5RGVsZWdhdGluZyh7IHR5cGU6ICdwdWInLCB2YWx1ZTogcHVibGljS2V5LCBmb3JtYXQ6IGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSB9LCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzQWRkcmVzc0RlbGVnYXRpbmcoYWRkcmVzczogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5pc0FkZHJlc3NEZWxlZ2F0aW5nKGFkZHJlc3MsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21QdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRvckRldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmdldERlbGVnYXRvckRldGFpbHNGcm9tUHVibGljS2V5KFxuICAgICAgeyB0eXBlOiAncHViJywgdmFsdWU6IHB1YmxpY0tleSwgZm9ybWF0OiBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkgfSxcbiAgICAgIGRhdGFcbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8RGVsZWdhdG9yRGV0YWlscz4ge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEuZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3MsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdGlvbkRldGFpbHNGcm9tUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCBkZWxlZ2F0ZWVzOiBzdHJpbmdbXSwgZGF0YT86IGFueSk6IFByb21pc2U8RGVsZWdhdGlvbkRldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmdldERlbGVnYXRpb25EZXRhaWxzRnJvbVB1YmxpY0tleShcbiAgICAgIHsgdHlwZTogJ3B1YicsIHZhbHVlOiBwdWJsaWNLZXksIGZvcm1hdDogZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChwdWJsaWNLZXkpIH0sXG4gICAgICBkZWxlZ2F0ZWVzLFxuICAgICAgZGF0YVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZWxlZ2F0aW9uRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZGVsZWdhdGVlczogc3RyaW5nW10sIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRpb25EZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5nZXREZWxlZ2F0aW9uRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3MsIGRlbGVnYXRlZXMsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZURlbGVnYXRvckFjdGlvbkZyb21QdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcsIHR5cGU6IGFueSwgZGF0YT86IGFueSk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCB0aGlzLnByb3RvY29sVjEucHJlcGFyZURlbGVnYXRvckFjdGlvbkZyb21QdWJsaWNLZXkoXG4gICAgICB7IHR5cGU6ICdwdWInLCB2YWx1ZTogcHVibGljS2V5LCBmb3JtYXQ6IGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSB9LFxuICAgICAgdHlwZSxcbiAgICAgIGRhdGFcbiAgICApXG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnNWMCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHJhbnNhY3Rpb25zLm1hcCgodHJhbnNhY3Rpb24pID0+IHRoaXMuY29udmVydFVuc2lnbmVkVHJhbnNhY3Rpb25WMVRvVjAodHJhbnNhY3Rpb24sIHB1YmxpY0tleSkpXG4gICAgKVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uc1YwLm1hcCgodHJhbnNhY3Rpb24pID0+IHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uKVxuICB9XG59XG5cbi8vIElDb2luU3ViUHJvdG9jb2xcblxuZXhwb3J0IGNsYXNzIElDb2luU3ViUHJvdG9jb2xBZGFwdGVyPFQgZXh0ZW5kcyBBaXJHYXBBbnlQcm90b2NvbCAmIFN1YlByb3RvY29sID0gQWlyR2FwQW55UHJvdG9jb2wgJiBTdWJQcm90b2NvbD5cbiAgZXh0ZW5kcyBJQ29pblByb3RvY29sQWRhcHRlcjxUPlxuICBpbXBsZW1lbnRzIElDb2luU3ViUHJvdG9jb2xcbntcbiAgcHVibGljIHJlYWRvbmx5IGlzU3ViUHJvdG9jb2w6IGJvb2xlYW4gPSB0cnVlXG4gIHB1YmxpYyByZWFkb25seSBzdWJQcm90b2NvbFR5cGU6IFN1YlByb3RvY29sVHlwZVYwXG4gIHB1YmxpYyByZWFkb25seSBjb250cmFjdEFkZHJlc3M/OiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90b2NvbFYxOiBULFxuICAgIHByb3RvY29sTWV0YWRhdGE6IFByb3RvY29sTWV0YWRhdGEsXG4gICAgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuICAgIG5ldHdvcms6IFByb3RvY29sTmV0d29yayB8IHVuZGVmaW5lZCxcbiAgICB2MUJsb2NrRXhwbG9yZXI6IEFpckdhcEJsb2NrRXhwbG9yZXIgfCB1bmRlZmluZWQsXG4gICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhOiBCbG9ja0V4cGxvcmVyTWV0YWRhdGEgfCB1bmRlZmluZWQsXG4gICAgdjNTZXJpYWxpemVyQ29tcGFuaW9uOiBBaXJHYXBWM1NlcmlhbGl6ZXJDb21wYW5pb24sXG4gICAgdHlwZTogU3ViUHJvdG9jb2xUeXBlLFxuICAgIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKHByb3RvY29sVjEsIHByb3RvY29sTWV0YWRhdGEsIGNyeXB0bywgbmV0d29yaywgdjFCbG9ja0V4cGxvcmVyLCBibG9ja0V4cGxvcmVyTWV0YWRhdGEsIHYzU2VyaWFsaXplckNvbXBhbmlvbilcblxuICAgIHRoaXMuc3ViUHJvdG9jb2xUeXBlID0gdHlwZSA9PT0gJ2FjY291bnQnID8gU3ViUHJvdG9jb2xUeXBlVjAuQUNDT1VOVCA6IFN1YlByb3RvY29sVHlwZVYwLlRPS0VOXG4gICAgdGhpcy5jb250cmFjdEFkZHJlc3MgPSBjb250cmFjdEFkZHJlc3NcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRJc1N1YlByb3RvY29sKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzU3ViUHJvdG9jb2xcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTdWJQcm90b2NvbFR5cGUoKTogUHJvbWlzZTxTdWJQcm90b2NvbFR5cGVWMD4ge1xuICAgIHJldHVybiB0aGlzLnN1YlByb3RvY29sVHlwZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENvbnRyYWN0QWRkcmVzcygpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyYWN0QWRkcmVzc1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJQ29pbkRlbGVnYXRlU3ViUHJvdG9jb2xBZGFwdGVyPFxuICAgIFQgZXh0ZW5kcyBBaXJHYXBBbnlQcm90b2NvbCAmIEFpckdhcERlbGVnYXRlUHJvdG9jb2wgJiBTdWJQcm90b2NvbCA9IEFpckdhcEFueVByb3RvY29sICYgQWlyR2FwRGVsZWdhdGVQcm90b2NvbCAmIFN1YlByb3RvY29sXG4gID5cbiAgZXh0ZW5kcyBJQ29pblN1YlByb3RvY29sQWRhcHRlcjxUPlxuICBpbXBsZW1lbnRzIElDb2luU3ViUHJvdG9jb2wsIElDb2luRGVsZWdhdGVQcm90b2NvbFxue1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyOiBJQ29pbkRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyPFQ+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdG9jb2xWMTogVCxcbiAgICBwcm90b2NvbE1ldGFkYXRhOiBQcm90b2NvbE1ldGFkYXRhLFxuICAgIGNyeXB0bzogQ3J5cHRvQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcbiAgICBuZXR3b3JrOiBQcm90b2NvbE5ldHdvcmsgfCB1bmRlZmluZWQsXG4gICAgdjFCbG9ja0V4cGxvcmVyOiBBaXJHYXBCbG9ja0V4cGxvcmVyIHwgdW5kZWZpbmVkLFxuICAgIGJsb2NrRXhwbG9yZXJNZXRhZGF0YTogQmxvY2tFeHBsb3Jlck1ldGFkYXRhIHwgdW5kZWZpbmVkLFxuICAgIHYzU2VyaWFsaXplckNvbXBhbmlvbjogQWlyR2FwVjNTZXJpYWxpemVyQ29tcGFuaW9uLFxuICAgIHR5cGU6IFN1YlByb3RvY29sVHlwZSxcbiAgICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIHByb3RvY29sVjEsXG4gICAgICBwcm90b2NvbE1ldGFkYXRhLFxuICAgICAgY3J5cHRvLFxuICAgICAgbmV0d29yayxcbiAgICAgIHYxQmxvY2tFeHBsb3JlcixcbiAgICAgIGJsb2NrRXhwbG9yZXJNZXRhZGF0YSxcbiAgICAgIHYzU2VyaWFsaXplckNvbXBhbmlvbixcbiAgICAgIHR5cGUsXG4gICAgICBjb250cmFjdEFkZHJlc3NcbiAgICApXG5cbiAgICB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyID0gbmV3IElDb2luRGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIoXG4gICAgICBwcm90b2NvbFYxLFxuICAgICAgcHJvdG9jb2xNZXRhZGF0YSxcbiAgICAgIGNyeXB0byxcbiAgICAgIG5ldHdvcmssXG4gICAgICB2MUJsb2NrRXhwbG9yZXIsXG4gICAgICBibG9ja0V4cGxvcmVyTWV0YWRhdGEsXG4gICAgICB2M1NlcmlhbGl6ZXJDb21wYW5pb25cbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVmYXVsdERlbGVnYXRlZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmdldERlZmF1bHREZWxlZ2F0ZWUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnREZWxlZ2F0ZWVzRm9yUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmdldEN1cnJlbnREZWxlZ2F0ZWVzRm9yUHVibGljS2V5KHB1YmxpY0tleSwgZGF0YSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDdXJyZW50RGVsZWdhdGVlc0ZvckFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmdldEN1cnJlbnREZWxlZ2F0ZWVzRm9yQWRkcmVzcyhhZGRyZXNzLCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERlbGVnYXRlZURldGFpbHMoYWRkcmVzczogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxEZWxlZ2F0ZWVEZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIuZ2V0RGVsZWdhdGVlRGV0YWlscyhhZGRyZXNzLCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzUHVibGljS2V5RGVsZWdhdGluZyhwdWJsaWNLZXk6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmlzUHVibGljS2V5RGVsZWdhdGluZyhwdWJsaWNLZXksIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaXNBZGRyZXNzRGVsZWdhdGluZyhhZGRyZXNzOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZVByb3RvY29sQWRhcHRlci5pc0FkZHJlc3NEZWxlZ2F0aW5nKGFkZHJlc3MsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21QdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRvckRldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZVByb3RvY29sQWRhcHRlci5nZXREZWxlZ2F0b3JEZXRhaWxzRnJvbVB1YmxpY0tleShwdWJsaWNLZXksIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8RGVsZWdhdG9yRGV0YWlscz4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmdldERlbGVnYXRvckRldGFpbHNGcm9tQWRkcmVzcyhhZGRyZXNzLCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERlbGVnYXRpb25EZXRhaWxzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZywgZGVsZWdhdGVlczogc3RyaW5nW10sIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRpb25EZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIuZ2V0RGVsZWdhdGlvbkRldGFpbHNGcm9tUHVibGljS2V5KHB1YmxpY0tleSwgZGVsZWdhdGVlcywgZGF0YSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZWxlZ2F0aW9uRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZGVsZWdhdGVlczogc3RyaW5nW10sIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRpb25EZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIuZ2V0RGVsZWdhdGlvbkRldGFpbHNGcm9tQWRkcmVzcyhhZGRyZXNzLCBkZWxlZ2F0ZWVzLCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHByZXBhcmVEZWxlZ2F0b3JBY3Rpb25Gcm9tUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCB0eXBlOiBhbnksIGRhdGE/OiBhbnkpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIucHJlcGFyZURlbGVnYXRvckFjdGlvbkZyb21QdWJsaWNLZXkocHVibGljS2V5LCB0eXBlLCBkYXRhKVxuICB9XG59XG5cbi8vIEZhY3Rvcmllc1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSUNvaW5Qcm90b2NvbEFkYXB0ZXI8VCBleHRlbmRzIEFpckdhcEFueVByb3RvY29sPihcbiAgcHJvdG9jb2xWMTogVCxcbiAgYmxvY2tFeHBsb3JlclYxOiBBaXJHYXBCbG9ja0V4cGxvcmVyIHwgdW5kZWZpbmVkLFxuICB2M1NlcmlhbGl6ZXJDb21wYW5pb246IEFpckdhcFYzU2VyaWFsaXplckNvbXBhbmlvbixcbiAgZXh0cmE6IHtcbiAgICB0eXBlPzogUHJvdG9jb2xDb25maWd1cmF0aW9uWyd0eXBlJ11cbiAgICBwcm90b2NvbE1ldGFkYXRhPzogUHJvdG9jb2xNZXRhZGF0YVxuICAgIGNyeXB0bz86IENyeXB0b0NvbmZpZ3VyYXRpb24gfCBudWxsXG4gICAgbmV0d29yaz86IFByb3RvY29sTmV0d29yayB8IG51bGxcbiAgICBibG9ja0V4cGxvcmVyTWV0YWRhdGE/OiBCbG9ja0V4cGxvcmVyTWV0YWRhdGEgfCBudWxsXG4gIH0gPSB7fVxuKTogUHJvbWlzZTxJQ29pblByb3RvY29sQWRhcHRlcjxUPj4ge1xuICBjb25zdCBbcHJvdG9jb2xNZXRhZGF0YSwgY3J5cHRvLCBuZXR3b3JrLCBibG9ja0V4cGxvcmVyTWV0YWRhdGFdOiBbXG4gICAgUHJvdG9jb2xNZXRhZGF0YSxcbiAgICBDcnlwdG9Db25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuICAgIFByb3RvY29sTmV0d29yayB8IHVuZGVmaW5lZCxcbiAgICBCbG9ja0V4cGxvcmVyTWV0YWRhdGEgfCB1bmRlZmluZWRcbiAgXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBleHRyYS5wcm90b2NvbE1ldGFkYXRhID8gUHJvbWlzZS5yZXNvbHZlKGV4dHJhLnByb3RvY29sTWV0YWRhdGEpIDogcHJvdG9jb2xWMS5nZXRNZXRhZGF0YSgpLFxuICAgIGV4dHJhLmNyeXB0b1xuICAgICAgPyBQcm9taXNlLnJlc29sdmUoZXh0cmEuY3J5cHRvKVxuICAgICAgOiBleHRyYS5jcnlwdG8gPT09IG51bGwgfHwgIWlzT2ZmbGluZVByb3RvY29sKHByb3RvY29sVjEpIHx8IChleHRyYS50eXBlICE9PSAnb2ZmbGluZScgJiYgZXh0cmEudHlwZSAhPT0gJ2Z1bGwnKVxuICAgICAgPyBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgOiBwcm90b2NvbFYxLmdldENyeXB0b0NvbmZpZ3VyYXRpb24oKSxcbiAgICBleHRyYS5uZXR3b3JrXG4gICAgICA/IFByb21pc2UucmVzb2x2ZShleHRyYS5uZXR3b3JrKVxuICAgICAgOiBleHRyYS5uZXR3b3JrID09PSBudWxsIHx8ICFpc09ubGluZVByb3RvY29sKHByb3RvY29sVjEpIHx8IChleHRyYS50eXBlICE9PSAnb25saW5lJyAmJiBleHRyYS50eXBlICE9PSAnZnVsbCcpXG4gICAgICA/IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICA6IHByb3RvY29sVjEuZ2V0TmV0d29yaygpLFxuICAgIGV4dHJhLmJsb2NrRXhwbG9yZXJNZXRhZGF0YVxuICAgICAgPyBQcm9taXNlLnJlc29sdmUoZXh0cmEuYmxvY2tFeHBsb3Jlck1ldGFkYXRhKVxuICAgICAgOiBleHRyYS5ibG9ja0V4cGxvcmVyTWV0YWRhdGEgPT09IG51bGwgfHwgYmxvY2tFeHBsb3JlclYxID09PSB1bmRlZmluZWQgfHwgKGV4dHJhLnR5cGUgIT09ICdvbmxpbmUnICYmIGV4dHJhLnR5cGUgIT09ICdmdWxsJylcbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIDogYmxvY2tFeHBsb3JlclYxLmdldE1ldGFkYXRhKClcbiAgXSlcblxuICBpZiAoc3VwcG9ydHNWMURlbGVnYXRpb24ocHJvdG9jb2xWMSkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgcmV0dXJuIG5ldyBJQ29pbkRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyKFxuICAgICAgcHJvdG9jb2xWMSxcbiAgICAgIHByb3RvY29sTWV0YWRhdGEsXG4gICAgICBjcnlwdG8sXG4gICAgICBuZXR3b3JrLFxuICAgICAgYmxvY2tFeHBsb3JlclYxLFxuICAgICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhLFxuICAgICAgdjNTZXJpYWxpemVyQ29tcGFuaW9uXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgSUNvaW5Qcm90b2NvbEFkYXB0ZXIoXG4gICAgICBwcm90b2NvbFYxLFxuICAgICAgcHJvdG9jb2xNZXRhZGF0YSxcbiAgICAgIGNyeXB0byxcbiAgICAgIG5ldHdvcmssXG4gICAgICBibG9ja0V4cGxvcmVyVjEsXG4gICAgICBibG9ja0V4cGxvcmVyTWV0YWRhdGEsXG4gICAgICB2M1NlcmlhbGl6ZXJDb21wYW5pb25cbiAgICApXG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVJQ29pblN1YlByb3RvY29sQWRhcHRlcjxUIGV4dGVuZHMgQWlyR2FwQW55UHJvdG9jb2wgJiBTdWJQcm90b2NvbD4oXG4gIHByb3RvY29sVjE6IFQsXG4gIGJsb2NrRXhwbG9yZXJWMTogQWlyR2FwQmxvY2tFeHBsb3JlciB8IHVuZGVmaW5lZCxcbiAgdjNTZXJpYWxpemVyQ29tcGFuaW9uOiBBaXJHYXBWM1NlcmlhbGl6ZXJDb21wYW5pb24sXG4gIGV4dHJhOiB7XG4gICAgdHlwZT86IFByb3RvY29sQ29uZmlndXJhdGlvblsndHlwZSddXG4gICAgcHJvdG9jb2xNZXRhZGF0YT86IFByb3RvY29sTWV0YWRhdGFcbiAgICBjcnlwdG8/OiBDcnlwdG9Db25maWd1cmF0aW9uIHwgbnVsbFxuICAgIG5ldHdvcms/OiBQcm90b2NvbE5ldHdvcmsgfCBudWxsXG4gICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhPzogQmxvY2tFeHBsb3Jlck1ldGFkYXRhIHwgbnVsbFxuICAgIHN1YlR5cGU/OiBTdWJQcm90b2NvbFR5cGVcbiAgICBjb250cmFjdEFkZHJlc3M/OiBzdHJpbmcgfCBudWxsXG4gIH0gPSB7fVxuKTogUHJvbWlzZTxJQ29pblN1YlByb3RvY29sQWRhcHRlcjxUPj4ge1xuICBjb25zdCBbcHJvdG9jb2xNZXRhZGF0YSwgY3J5cHRvLCBuZXR3b3JrLCBibG9ja0V4cGxvcmVyTWV0YWRhdGEsIHR5cGUsIGNvbnRyYWN0QWRkcmVzc106IFtcbiAgICBQcm90b2NvbE1ldGFkYXRhLFxuICAgIENyeXB0b0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQsXG4gICAgUHJvdG9jb2xOZXR3b3JrIHwgdW5kZWZpbmVkLFxuICAgIEJsb2NrRXhwbG9yZXJNZXRhZGF0YSB8IHVuZGVmaW5lZCxcbiAgICBTdWJQcm90b2NvbFR5cGUsXG4gICAgc3RyaW5nIHwgdW5kZWZpbmVkXG4gIF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZXh0cmEucHJvdG9jb2xNZXRhZGF0YSA/IFByb21pc2UucmVzb2x2ZShleHRyYS5wcm90b2NvbE1ldGFkYXRhKSA6IHByb3RvY29sVjEuZ2V0TWV0YWRhdGEoKSxcbiAgICBleHRyYS5jcnlwdG9cbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKGV4dHJhLmNyeXB0bylcbiAgICAgIDogZXh0cmEuY3J5cHRvID09PSBudWxsIHx8ICFpc09mZmxpbmVQcm90b2NvbChwcm90b2NvbFYxKSB8fCAoZXh0cmE/LnR5cGUgIT09ICdvZmZsaW5lJyAmJiBleHRyYT8udHlwZSAhPT0gJ2Z1bGwnKVxuICAgICAgPyBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgOiBwcm90b2NvbFYxLmdldENyeXB0b0NvbmZpZ3VyYXRpb24oKSxcbiAgICBleHRyYS5uZXR3b3JrXG4gICAgICA/IFByb21pc2UucmVzb2x2ZShleHRyYS5uZXR3b3JrKVxuICAgICAgOiBleHRyYS5uZXR3b3JrID09PSBudWxsIHx8ICFpc09ubGluZVByb3RvY29sKHByb3RvY29sVjEpIHx8IChleHRyYT8udHlwZSAhPT0gJ29ubGluZScgJiYgZXh0cmE/LnR5cGUgIT09ICdmdWxsJylcbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIDogcHJvdG9jb2xWMS5nZXROZXR3b3JrKCksXG4gICAgZXh0cmEuYmxvY2tFeHBsb3Jlck1ldGFkYXRhXG4gICAgICA/IFByb21pc2UucmVzb2x2ZShleHRyYS5ibG9ja0V4cGxvcmVyTWV0YWRhdGEpXG4gICAgICA6IGV4dHJhLmJsb2NrRXhwbG9yZXJNZXRhZGF0YSA9PT0gbnVsbCB8fCBibG9ja0V4cGxvcmVyVjEgPT09IHVuZGVmaW5lZCB8fCAoZXh0cmE/LnR5cGUgIT09ICdvbmxpbmUnICYmIGV4dHJhPy50eXBlICE9PSAnZnVsbCcpXG4gICAgICA/IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICA6IGJsb2NrRXhwbG9yZXJWMS5nZXRNZXRhZGF0YSgpLFxuICAgIGV4dHJhLnN1YlR5cGUgPyBQcm9taXNlLnJlc29sdmUoZXh0cmEuc3ViVHlwZSkgOiBwcm90b2NvbFYxLmdldFR5cGUoKSxcbiAgICBleHRyYS5jb250cmFjdEFkZHJlc3NcbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKGV4dHJhLmNvbnRyYWN0QWRkcmVzcylcbiAgICAgIDogZXh0cmEuY29udHJhY3RBZGRyZXNzID09PSBudWxsIHx8ICFoYXNDb25maWd1cmFibGVDb250cmFjdChwcm90b2NvbFYxKVxuICAgICAgPyBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgOiBwcm90b2NvbFYxLmdldENvbnRyYWN0QWRkcmVzcygpXG4gIF0pXG5cbiAgaWYgKHN1cHBvcnRzVjFEZWxlZ2F0aW9uKHByb3RvY29sVjEpKSB7XG4gICAgcmV0dXJuIG5ldyBJQ29pbkRlbGVnYXRlU3ViUHJvdG9jb2xBZGFwdGVyKFxuICAgICAgcHJvdG9jb2xWMSxcbiAgICAgIHByb3RvY29sTWV0YWRhdGEsXG4gICAgICBjcnlwdG8sXG4gICAgICBuZXR3b3JrLFxuICAgICAgYmxvY2tFeHBsb3JlclYxLFxuICAgICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhLFxuICAgICAgdjNTZXJpYWxpemVyQ29tcGFuaW9uLFxuICAgICAgdHlwZSxcbiAgICAgIGNvbnRyYWN0QWRkcmVzc1xuICAgIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IElDb2luU3ViUHJvdG9jb2xBZGFwdGVyKFxuICAgICAgcHJvdG9jb2xWMSxcbiAgICAgIHByb3RvY29sTWV0YWRhdGEsXG4gICAgICBjcnlwdG8sXG4gICAgICBuZXR3b3JrLFxuICAgICAgYmxvY2tFeHBsb3JlclYxLFxuICAgICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhLFxuICAgICAgdjNTZXJpYWxpemVyQ29tcGFuaW9uLFxuICAgICAgdHlwZSxcbiAgICAgIGNvbnRyYWN0QWRkcmVzc1xuICAgIClcbiAgfVxufVxuIl19