@bitgo-beta/sdk-coin-sol 7.6.4-beta.71 → 7.6.4-beta.710

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 (496) hide show
  1. package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
  2. package/dist/cjs/src/bigint-buffer-guard.js +29 -0
  3. package/dist/cjs/src/index.d.ts.map +1 -0
  4. package/dist/{src → cjs/src}/index.js +1 -1
  5. package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +12 -1
  6. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  7. package/dist/cjs/src/lib/ataInitializationBuilder.js +231 -0
  8. package/dist/cjs/src/lib/closeAtaBuilder.d.ts +55 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/closeAtaBuilder.js +162 -0
  11. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +128 -0
  12. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/confidentialTransferBuilder.js +311 -0
  14. package/dist/{src → cjs/src}/lib/constants.d.ts +89 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +269 -0
  17. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  18. package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
  19. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  20. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  21. package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
  22. package/dist/cjs/src/lib/iface.d.ts +526 -0
  23. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  24. package/dist/cjs/src/lib/iface.js +7 -0
  25. package/dist/{src → cjs/src}/lib/index.d.ts +5 -0
  26. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/index.js +93 -0
  28. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  29. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  30. package/dist/cjs/src/lib/instructionParamsFactory.js +1220 -0
  31. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  32. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  33. package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
  34. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  35. package/dist/cjs/src/lib/keyPair.js +112 -0
  36. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  37. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  38. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  40. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  41. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  42. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  43. package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
  44. package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
  45. package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
  46. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
  47. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  48. package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
  49. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  50. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  51. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
  52. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
  53. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  54. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
  55. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +30 -0
  56. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  57. package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +205 -0
  58. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
  59. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  60. package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
  61. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
  62. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
  63. package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
  64. package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
  65. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  66. package/dist/cjs/src/lib/solInstructionFactory.js +1094 -0
  67. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  68. package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
  69. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  70. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  71. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
  73. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  74. package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
  75. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  77. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  78. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
  79. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  80. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  81. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  82. package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
  83. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  84. package/dist/cjs/src/lib/tokenExtensions.js +105 -0
  85. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  86. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  87. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  88. package/dist/{src → cjs/src}/lib/transaction.d.ts +22 -0
  89. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  90. package/dist/cjs/src/lib/transaction.js +661 -0
  91. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +9 -1
  92. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  93. package/dist/cjs/src/lib/transactionBuilder.js +388 -0
  94. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +14 -0
  95. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  96. package/dist/cjs/src/lib/transactionBuilderFactory.js +222 -0
  97. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  98. package/dist/cjs/src/lib/transferBuilder.js +81 -0
  99. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  100. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  101. package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
  102. package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
  103. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  104. package/dist/cjs/src/lib/utils.js +657 -0
  105. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  106. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  107. package/dist/cjs/src/register.d.ts +5 -0
  108. package/dist/cjs/src/register.d.ts.map +1 -0
  109. package/dist/cjs/src/register.js +29 -0
  110. package/dist/{src → cjs/src}/sol.d.ts +114 -3
  111. package/dist/cjs/src/sol.d.ts.map +1 -0
  112. package/dist/cjs/src/sol.js +1670 -0
  113. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  114. package/dist/cjs/src/solToken.d.ts.map +1 -0
  115. package/dist/cjs/src/solToken.js +79 -0
  116. package/dist/cjs/src/tsol.d.ts.map +1 -0
  117. package/dist/cjs/src/tsol.js +24 -0
  118. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  119. package/dist/cjs/test/fixtures/sol.js +1433 -0
  120. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  121. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  122. package/dist/cjs/test/resources/sol.js +320 -0
  123. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  124. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  125. package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
  126. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  127. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  128. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  129. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  130. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  131. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  132. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  133. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  134. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  135. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  136. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  137. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  138. package/dist/cjs/test/unit/keyPair.js +177 -0
  139. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  140. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  141. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  142. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  143. package/dist/cjs/test/unit/register.d.ts +2 -0
  144. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  145. package/dist/cjs/test/unit/register.js +65 -0
  146. package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
  147. package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
  148. package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
  149. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  150. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  151. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  152. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  153. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  154. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  155. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  156. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  157. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  158. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  159. package/dist/cjs/test/unit/sol.js +5038 -0
  160. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  161. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  162. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  163. package/dist/cjs/test/unit/solToken.js +37 -0
  164. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  165. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  166. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  167. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  168. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  169. package/dist/cjs/test/unit/tokenExtensions.js +58 -0
  170. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  171. package/dist/cjs/test/unit/transaction.js +1108 -0
  172. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  173. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  174. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  175. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  176. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  177. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  178. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  179. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  180. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  181. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
  182. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  183. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  184. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +144 -0
  185. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  186. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  187. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
  188. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  189. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  190. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  192. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  193. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  194. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  195. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  196. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  198. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  199. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  200. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  201. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  202. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  204. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  205. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  206. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  207. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  208. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  209. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  210. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  211. package/dist/cjs/test/unit/utils.js +628 -0
  212. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  213. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  214. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  215. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  216. package/dist/esm/index.d.ts +7 -0
  217. package/dist/esm/index.js +7 -0
  218. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  219. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  220. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  221. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  222. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  223. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  224. package/dist/esm/lib/confidentialTransferBuilder.d.ts +128 -0
  225. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  226. package/dist/esm/lib/confidentialTransferBuilder.js +304 -0
  227. package/dist/esm/lib/constants.d.ts +227 -0
  228. package/dist/esm/lib/constants.d.ts.map +1 -0
  229. package/dist/esm/lib/constants.js +266 -0
  230. package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
  231. package/dist/esm/lib/customInstructionBuilder.js +282 -0
  232. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  233. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  234. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  235. package/dist/esm/lib/iface.d.ts +526 -0
  236. package/dist/esm/lib/iface.d.ts.map +1 -0
  237. package/dist/esm/lib/iface.js +3 -0
  238. package/dist/esm/lib/index.d.ts +27 -0
  239. package/dist/esm/lib/index.d.ts.map +1 -0
  240. package/dist/esm/lib/index.js +27 -0
  241. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  242. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  243. package/dist/esm/lib/instructionParamsFactory.js +1212 -0
  244. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  245. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  246. package/dist/esm/lib/keyPair.d.ts +32 -0
  247. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  248. package/dist/esm/lib/keyPair.js +75 -0
  249. package/dist/esm/lib/messages/index.d.ts +2 -0
  250. package/dist/esm/lib/messages/index.js +2 -0
  251. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  252. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  253. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  254. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  255. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  256. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  257. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  258. package/dist/esm/lib/scaledUiAmount.js +108 -0
  259. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  260. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  261. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  262. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  263. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  264. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  265. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  266. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  267. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  268. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +30 -0
  269. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  270. package/dist/esm/lib/serialization/compileTransactionMessage.js +202 -0
  271. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  272. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  273. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  274. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  275. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  276. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  277. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  278. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  279. package/dist/esm/lib/solInstructionFactory.js +1088 -0
  280. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  281. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  282. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  283. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  284. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  285. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  286. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  287. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  288. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  289. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  290. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  291. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  292. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  293. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  294. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  295. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  296. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  297. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  298. package/dist/esm/lib/token2022Resolve.js +194 -0
  299. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  300. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  301. package/dist/esm/lib/tokenExtensions.js +99 -0
  302. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  303. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  304. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  305. package/dist/esm/lib/transaction.d.ts +125 -0
  306. package/dist/esm/lib/transaction.d.ts.map +1 -0
  307. package/dist/esm/lib/transaction.js +654 -0
  308. package/dist/esm/lib/transactionBuilder.d.ts +136 -0
  309. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  310. package/dist/esm/lib/transactionBuilder.js +381 -0
  311. package/dist/esm/lib/transactionBuilderFactory.d.ts +129 -0
  312. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  313. package/dist/esm/lib/transactionBuilderFactory.js +218 -0
  314. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  315. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  316. package/dist/esm/lib/transferBuilder.js +74 -0
  317. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  318. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  319. package/dist/esm/lib/transferBuilderV2.js +245 -0
  320. package/dist/esm/lib/utils.d.ts +205 -0
  321. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  322. package/dist/esm/lib/utils.js +619 -0
  323. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  324. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  325. package/dist/esm/register.d.ts +5 -0
  326. package/dist/esm/register.d.ts.map +1 -0
  327. package/dist/esm/register.js +24 -0
  328. package/dist/esm/sol.d.ts +351 -0
  329. package/dist/esm/sol.d.ts.map +1 -0
  330. package/dist/esm/sol.js +1629 -0
  331. package/dist/esm/solToken.d.ts +44 -0
  332. package/dist/esm/solToken.d.ts.map +1 -0
  333. package/dist/esm/solToken.js +75 -0
  334. package/dist/esm/tsol.d.ts +11 -0
  335. package/dist/esm/tsol.js +20 -0
  336. package/package.json +36 -16
  337. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  338. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  339. package/dist/src/config/token2022StaticConfig.js +0 -50
  340. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  341. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  342. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  343. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  344. package/dist/src/lib/closeAtaBuilder.js +0 -69
  345. package/dist/src/lib/constants.d.ts.map +0 -1
  346. package/dist/src/lib/constants.js +0 -171
  347. package/dist/src/lib/customInstructionBuilder.js +0 -289
  348. package/dist/src/lib/iface.d.ts +0 -244
  349. package/dist/src/lib/iface.d.ts.map +0 -1
  350. package/dist/src/lib/iface.js +0 -7
  351. package/dist/src/lib/index.d.ts.map +0 -1
  352. package/dist/src/lib/index.js +0 -77
  353. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  354. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  355. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  356. package/dist/src/lib/keyPair.d.ts.map +0 -1
  357. package/dist/src/lib/keyPair.js +0 -63
  358. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  359. package/dist/src/lib/solInstructionFactory.js +0 -572
  360. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  361. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  362. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  363. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  364. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  365. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  366. package/dist/src/lib/token2022Config.d.ts +0 -44
  367. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  368. package/dist/src/lib/token2022Config.js +0 -27
  369. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  370. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  371. package/dist/src/lib/transaction.d.ts.map +0 -1
  372. package/dist/src/lib/transaction.js +0 -595
  373. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  374. package/dist/src/lib/transactionBuilder.js +0 -380
  375. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  376. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  377. package/dist/src/lib/transferBuilder.js +0 -70
  378. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  379. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  380. package/dist/src/lib/transferBuilderV2.js +0 -210
  381. package/dist/src/lib/utils.js +0 -589
  382. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  383. package/dist/src/register.d.ts +0 -3
  384. package/dist/src/register.d.ts.map +0 -1
  385. package/dist/src/register.js +0 -15
  386. package/dist/src/sol.d.ts.map +0 -1
  387. package/dist/src/sol.js +0 -1324
  388. package/dist/src/solToken.d.ts.map +0 -1
  389. package/dist/src/solToken.js +0 -69
  390. package/dist/src/tsol.js +0 -24
  391. package/dist/test/fixtures/sol.js +0 -1433
  392. package/dist/test/resources/sol.d.ts.map +0 -1
  393. package/dist/test/resources/sol.js +0 -320
  394. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  395. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  396. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  397. package/dist/test/unit/getBuilderFactory.js +0 -10
  398. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  399. package/dist/test/unit/instructionParamsFactory.js +0 -412
  400. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  401. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  402. package/dist/test/unit/keyPair.js +0 -177
  403. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  404. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  405. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  406. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  407. package/dist/test/unit/sol.js +0 -3180
  408. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  409. package/dist/test/unit/solInstructionFactory.js +0 -454
  410. package/dist/test/unit/solToken.d.ts.map +0 -1
  411. package/dist/test/unit/solToken.js +0 -31
  412. package/dist/test/unit/transaction.d.ts.map +0 -1
  413. package/dist/test/unit/transaction.js +0 -983
  414. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  415. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  416. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  417. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  418. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  419. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  420. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  421. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  422. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  423. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  424. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  425. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  426. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  427. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  428. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  429. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  430. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  431. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  432. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  433. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  434. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  435. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  436. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  437. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  438. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  439. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  440. package/dist/test/unit/utils.js +0 -517
  441. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  442. package/dist/test/unit/versionedTransaction.js +0 -207
  443. package/dist/tsconfig.tsbuildinfo +0 -1
  444. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  445. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  446. /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
  447. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  448. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  449. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  450. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  451. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  452. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  453. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  454. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  455. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  456. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  457. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  458. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  459. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  460. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  461. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  462. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  463. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  464. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  465. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  466. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  467. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  468. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  469. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  470. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  471. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  472. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  473. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  474. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  475. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  476. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  477. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  478. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  479. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  480. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  481. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  482. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  483. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  484. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  485. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  486. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  487. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  488. /package/dist/{src → esm}/index.d.ts.map +0 -0
  489. /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
  490. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  491. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  492. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  493. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  494. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  495. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  496. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,909 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const src_1 = require("../../../src");
40
+ const should_1 = __importDefault(require("should"));
41
+ const testData = __importStar(require("../../resources/sol"));
42
+ const getBuilderFactory_1 = require("../getBuilderFactory");
43
+ describe('Solana Confidential Transfer Builder', () => {
44
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
45
+ const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
46
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
47
+ // Test addresses (Token-2022 mint + ATAs)
48
+ const mintAddress = testData.associatedTokenAccountsForSol2022.mintId;
49
+ const tokenAddress = testData.associatedTokenAccountsForSol2022.accounts[0].ata;
50
+ const destinationTokenAddress = 'ENn8a2tGMS9bR5XV7smGHJvNgzkyxJmnD2eUvQxY5jSP';
51
+ const authorityAddress = account.pub;
52
+ // Valid base58 addresses for context state accounts (any valid Solana pubkey)
53
+ const eqCtxAddress = testData.associatedTokenAccounts.accounts[0].ata;
54
+ const validityCtxAddress = testData.associatedTokenAccounts.accounts[0].pub;
55
+ const rangeCtxAddress = testData.nonceAccount.pub;
56
+ // Hex test data
57
+ const zeroBytes36 = '00'.repeat(36);
58
+ const zeroBytes64 = '00'.repeat(64);
59
+ const proofDataHex = '00'.repeat(320); // typical equality proof size
60
+ const ctBuilder = () => {
61
+ const txBuilder = factory.getConfidentialTransferBuilder();
62
+ txBuilder.nonce(recentBlockHash);
63
+ txBuilder.sender(account.pub);
64
+ return txBuilder;
65
+ };
66
+ /** Access the raw Solana Transaction from the built tx */
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ const solTx = (tx) => tx.solTransaction;
69
+ describe('ConfigureAccount', () => {
70
+ it('should build a configure account instruction with correct 47-byte layout', async () => {
71
+ const builder = ctBuilder();
72
+ builder.configureAccount({
73
+ tokenAddress,
74
+ mintAddress,
75
+ authorityAddress,
76
+ decryptableZeroBalance: zeroBytes36,
77
+ maximumPendingBalanceCreditCounter: '65536',
78
+ proofInstructionOffset: 1,
79
+ });
80
+ const tx = await builder.build();
81
+ const instructions = tx.toJson().instructionsData;
82
+ instructions.should.have.length(1);
83
+ instructions[0].type.should.equal('ConfigureConfidentialTransferAccount');
84
+ // Verify raw instruction data
85
+ const rawInstructions = solTx(tx).instructions;
86
+ rawInstructions.should.have.length(1);
87
+ const data = rawInstructions[0].data;
88
+ data.length.should.equal(47);
89
+ data[0].should.equal(27); // ConfidentialTransferExtension
90
+ data[1].should.equal(2); // ConfigureAccount
91
+ data.slice(2, 38).toString('hex').should.equal(zeroBytes36); // decryptable_zero_balance
92
+ data.readBigUInt64LE(38).toString().should.equal('65536'); // max pending balance credit counter
93
+ data[46].should.equal(1); // proof_instruction_offset
94
+ // Verify accounts
95
+ const keys = rawInstructions[0].keys;
96
+ keys.should.have.length(4);
97
+ keys[0].pubkey.toString().should.equal(tokenAddress);
98
+ keys[0].isWritable.should.be.true();
99
+ keys[1].pubkey.toString().should.equal(mintAddress);
100
+ keys[1].isWritable.should.be.false();
101
+ keys[2].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111'); // instructions sysvar
102
+ keys[3].pubkey.toString().should.equal(authorityAddress);
103
+ keys[3].isSigner.should.be.true();
104
+ });
105
+ it('should use context state address when provided', async () => {
106
+ const contextStateAddress = testData.associatedTokenAccounts.accounts[0].pub;
107
+ const builder = ctBuilder();
108
+ builder.configureAccount({
109
+ tokenAddress,
110
+ mintAddress,
111
+ authorityAddress,
112
+ instructionsSysvarOrContextStateAddress: contextStateAddress,
113
+ decryptableZeroBalance: zeroBytes36,
114
+ maximumPendingBalanceCreditCounter: '65536',
115
+ proofInstructionOffset: 0,
116
+ });
117
+ const tx = await builder.build();
118
+ const keys = solTx(tx).instructions[0].keys;
119
+ keys[2].pubkey.toString().should.equal(contextStateAddress);
120
+ const data = solTx(tx).instructions[0].data;
121
+ data[46].should.equal(0); // proof_instruction_offset = 0 (context state)
122
+ });
123
+ });
124
+ describe('ApplyPendingBalance', () => {
125
+ it('should build an apply pending balance instruction with correct 46-byte layout', async () => {
126
+ const builder = ctBuilder();
127
+ builder.applyPendingBalance({
128
+ tokenAddress,
129
+ authorityAddress,
130
+ expectedPendingBalanceCreditCounter: '3',
131
+ newDecryptableAvailableBalance: zeroBytes36,
132
+ });
133
+ const tx = await builder.build();
134
+ const instructions = tx.toJson().instructionsData;
135
+ instructions.should.have.length(1);
136
+ instructions[0].type.should.equal('ApplyPendingBalance');
137
+ const rawInstructions = solTx(tx).instructions;
138
+ rawInstructions.should.have.length(1);
139
+ const data = rawInstructions[0].data;
140
+ data.length.should.equal(46);
141
+ data[0].should.equal(27); // ConfidentialTransferExtension
142
+ data[1].should.equal(8); // ApplyPendingBalance
143
+ data.readBigUInt64LE(2).toString().should.equal('3'); // expected_pending_balance_credit_counter
144
+ data.slice(10, 46).toString('hex').should.equal(zeroBytes36); // new_decryptable_available_balance
145
+ // Verify accounts: [token(writable), authority(signer)]
146
+ const keys = rawInstructions[0].keys;
147
+ keys.should.have.length(2);
148
+ keys[0].pubkey.toString().should.equal(tokenAddress);
149
+ keys[0].isWritable.should.be.true();
150
+ keys[1].pubkey.toString().should.equal(authorityAddress);
151
+ keys[1].isSigner.should.be.true();
152
+ });
153
+ });
154
+ describe('Deposit', () => {
155
+ it('should build a deposit instruction with correct 11-byte layout', async () => {
156
+ const builder = ctBuilder();
157
+ builder.confidentialDeposit({
158
+ tokenAddress,
159
+ mintAddress,
160
+ authorityAddress,
161
+ amount: '1000000',
162
+ decimals: 6,
163
+ });
164
+ const tx = await builder.build();
165
+ const instructions = tx.toJson().instructionsData;
166
+ instructions.should.have.length(1);
167
+ instructions[0].type.should.equal('ConfidentialDeposit');
168
+ const rawInstructions = solTx(tx).instructions;
169
+ rawInstructions.should.have.length(1);
170
+ const data = rawInstructions[0].data;
171
+ data.length.should.equal(11);
172
+ data[0].should.equal(27); // ConfidentialTransferExtension
173
+ data[1].should.equal(5); // Deposit
174
+ data.readBigUInt64LE(2).toString().should.equal('1000000'); // amount
175
+ data[10].should.equal(6); // decimals
176
+ // Verify accounts: [token(writable), mint, authority(signer)]
177
+ const keys = rawInstructions[0].keys;
178
+ keys.should.have.length(3);
179
+ keys[0].pubkey.toString().should.equal(tokenAddress);
180
+ keys[0].isWritable.should.be.true();
181
+ keys[1].pubkey.toString().should.equal(mintAddress);
182
+ keys[2].pubkey.toString().should.equal(authorityAddress);
183
+ keys[2].isSigner.should.be.true();
184
+ });
185
+ });
186
+ describe('Withdraw', () => {
187
+ it('should build a withdraw instruction with correct 49-byte layout and inline proofs', async () => {
188
+ const builder = ctBuilder();
189
+ builder.confidentialWithdraw({
190
+ tokenAddress,
191
+ mintAddress,
192
+ authorityAddress,
193
+ amount: '500000',
194
+ decimals: 6,
195
+ newDecryptableAvailableBalance: zeroBytes36,
196
+ equalityProofInstructionOffset: 1,
197
+ rangeProofInstructionOffset: 2,
198
+ });
199
+ const tx = await builder.build();
200
+ const instructions = tx.toJson().instructionsData;
201
+ instructions.should.have.length(1);
202
+ instructions[0].type.should.equal('ConfidentialWithdraw');
203
+ const rawInstructions = solTx(tx).instructions;
204
+ rawInstructions.should.have.length(1);
205
+ const data = rawInstructions[0].data;
206
+ data.length.should.equal(49);
207
+ data[0].should.equal(27); // ConfidentialTransferExtension
208
+ data[1].should.equal(6); // Withdraw
209
+ data.readBigUInt64LE(2).toString().should.equal('500000'); // amount
210
+ data[10].should.equal(6); // decimals
211
+ data.slice(11, 47).toString('hex').should.equal(zeroBytes36); // new_decryptable
212
+ data[47].should.equal(1); // equality proof offset
213
+ data[48].should.equal(2); // range proof offset
214
+ // Verify accounts: [token(writable), mint, sysvar, authority(signer)]
215
+ const keys = rawInstructions[0].keys;
216
+ keys.should.have.length(4);
217
+ keys[0].pubkey.toString().should.equal(tokenAddress);
218
+ keys[0].isWritable.should.be.true();
219
+ keys[1].pubkey.toString().should.equal(mintAddress);
220
+ keys[2].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111');
221
+ keys[3].pubkey.toString().should.equal(authorityAddress);
222
+ keys[3].isSigner.should.be.true();
223
+ });
224
+ it('should build a withdraw instruction with context state accounts', async () => {
225
+ const builder = ctBuilder();
226
+ builder.confidentialWithdraw({
227
+ tokenAddress,
228
+ mintAddress,
229
+ authorityAddress,
230
+ equalityProofContextStateAddress: eqCtxAddress,
231
+ rangeProofContextStateAddress: rangeCtxAddress,
232
+ amount: '500000',
233
+ decimals: 6,
234
+ newDecryptableAvailableBalance: zeroBytes36,
235
+ equalityProofInstructionOffset: 0,
236
+ rangeProofInstructionOffset: 0,
237
+ });
238
+ const tx = await builder.build();
239
+ const keys = solTx(tx).instructions[0].keys;
240
+ // [token, mint, eqCtx, rgCtx, authority] — no sysvar since all proofs use context state
241
+ keys.should.have.length(5);
242
+ keys[2].pubkey.toString().should.equal(eqCtxAddress);
243
+ keys[3].pubkey.toString().should.equal(rangeCtxAddress);
244
+ keys[4].pubkey.toString().should.equal(authorityAddress);
245
+ keys[4].isSigner.should.be.true();
246
+ });
247
+ });
248
+ describe('ConfidentialTransfer', () => {
249
+ it('should build a transfer instruction with correct 169-byte layout and inline proofs', async () => {
250
+ const builder = ctBuilder();
251
+ builder.confidentialTransfer({
252
+ sourceTokenAddress: tokenAddress,
253
+ mintAddress,
254
+ destinationTokenAddress,
255
+ authorityAddress,
256
+ newSourceDecryptableAvailableBalance: zeroBytes36,
257
+ transferAmountAuditorCiphertextLo: zeroBytes64,
258
+ transferAmountAuditorCiphertextHi: zeroBytes64,
259
+ equalityProofInstructionOffset: 1,
260
+ ciphertextValidityProofInstructionOffset: 2,
261
+ rangeProofInstructionOffset: 3,
262
+ });
263
+ const tx = await builder.build();
264
+ const instructions = tx.toJson().instructionsData;
265
+ instructions.should.have.length(1);
266
+ instructions[0].type.should.equal('ConfidentialTransfer');
267
+ const rawInstructions = solTx(tx).instructions;
268
+ rawInstructions.should.have.length(1);
269
+ const data = rawInstructions[0].data;
270
+ data.length.should.equal(169);
271
+ data[0].should.equal(27); // ConfidentialTransferExtension
272
+ data[1].should.equal(7); // Transfer
273
+ data.slice(2, 38).toString('hex').should.equal(zeroBytes36); // new_source_decryptable
274
+ data.slice(38, 102).toString('hex').should.equal(zeroBytes64); // auditor_ct_lo
275
+ data.slice(102, 166).toString('hex').should.equal(zeroBytes64); // auditor_ct_hi
276
+ data[166].should.equal(1); // equality proof offset
277
+ data[167].should.equal(2); // validity proof offset
278
+ data[168].should.equal(3); // range proof offset
279
+ // Verify accounts: [source(writable), mint, dest(writable), sysvar, authority(signer)]
280
+ const keys = rawInstructions[0].keys;
281
+ keys.should.have.length(5);
282
+ keys[0].pubkey.toString().should.equal(tokenAddress);
283
+ keys[0].isWritable.should.be.true();
284
+ keys[1].pubkey.toString().should.equal(mintAddress);
285
+ keys[2].pubkey.toString().should.equal(destinationTokenAddress);
286
+ keys[2].isWritable.should.be.true();
287
+ keys[3].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111');
288
+ keys[4].pubkey.toString().should.equal(authorityAddress);
289
+ keys[4].isSigner.should.be.true();
290
+ });
291
+ it('should build a transfer instruction with context state accounts', async () => {
292
+ const builder = ctBuilder();
293
+ builder.confidentialTransfer({
294
+ sourceTokenAddress: tokenAddress,
295
+ mintAddress,
296
+ destinationTokenAddress,
297
+ authorityAddress,
298
+ equalityProofContextStateAddress: eqCtxAddress,
299
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
300
+ rangeProofContextStateAddress: rangeCtxAddress,
301
+ newSourceDecryptableAvailableBalance: zeroBytes36,
302
+ transferAmountAuditorCiphertextLo: zeroBytes64,
303
+ transferAmountAuditorCiphertextHi: zeroBytes64,
304
+ equalityProofInstructionOffset: 0,
305
+ ciphertextValidityProofInstructionOffset: 0,
306
+ rangeProofInstructionOffset: 0,
307
+ });
308
+ const tx = await builder.build();
309
+ const keys = solTx(tx).instructions[0].keys;
310
+ // [source, mint, dest, eqCtx, validityCtx, rangeCtx, authority] — no sysvar
311
+ keys.should.have.length(7);
312
+ keys[3].pubkey.toString().should.equal(eqCtxAddress);
313
+ keys[4].pubkey.toString().should.equal(validityCtxAddress);
314
+ keys[5].pubkey.toString().should.equal(rangeCtxAddress);
315
+ keys[6].pubkey.toString().should.equal(authorityAddress);
316
+ keys[6].isSigner.should.be.true();
317
+ });
318
+ });
319
+ describe('VerifyPubkeyValidity', () => {
320
+ it('should build a verify pubkey validity instruction with inline proof data', async () => {
321
+ const builder = ctBuilder();
322
+ builder.verifyPubkeyValidity({ proofData: proofDataHex });
323
+ const tx = await builder.build();
324
+ const rawInstructions = solTx(tx).instructions;
325
+ rawInstructions.should.have.length(1);
326
+ const data = rawInstructions[0].data;
327
+ data[0].should.equal(4); // VerifyPubkeyValidity discriminator
328
+ data.length.should.equal(1 + 320); // discriminator + proof data
329
+ data.slice(1).toString('hex').should.equal(proofDataHex);
330
+ // No accounts for inline proof
331
+ rawInstructions[0].keys.should.have.length(0);
332
+ // Verify program id (canonical on-chain id)
333
+ rawInstructions[0].programId.toString().should.equal('ZkE1Gama1Proof11111111111111111111111111111');
334
+ });
335
+ it('should build with context state account (fix #3)', async () => {
336
+ const builder = ctBuilder();
337
+ builder.verifyPubkeyValidity({
338
+ contextStateAccountAddress: eqCtxAddress,
339
+ contextStateAuthorityAddress: authorityAddress,
340
+ });
341
+ const tx = await builder.build();
342
+ const rawIx = solTx(tx).instructions[0];
343
+ const data = rawIx.data;
344
+ data[0].should.equal(4); // VerifyPubkeyValidity discriminator
345
+ // Context state accounts: [contextState(writable), authority]
346
+ rawIx.keys.should.have.length(2);
347
+ rawIx.keys[0].pubkey.toString().should.equal(eqCtxAddress);
348
+ rawIx.keys[0].isWritable.should.be.true();
349
+ rawIx.keys[1].pubkey.toString().should.equal(authorityAddress);
350
+ });
351
+ });
352
+ describe('VerifyEqualityProof', () => {
353
+ it('should build with inline proof data', async () => {
354
+ const builder = ctBuilder();
355
+ builder.verifyEqualityProof({ proofData: proofDataHex });
356
+ const tx = await builder.build();
357
+ const data = solTx(tx).instructions[0].data;
358
+ data[0].should.equal(3); // VerifyCiphertextCommitmentEquality discriminator
359
+ data.length.should.equal(1 + 320);
360
+ data.slice(1).toString('hex').should.equal(proofDataHex);
361
+ });
362
+ it('should build with context state offset', async () => {
363
+ const builder = ctBuilder();
364
+ builder.verifyEqualityProof({
365
+ contextStateAccountAddress: eqCtxAddress,
366
+ contextStateAuthorityAddress: authorityAddress,
367
+ offset: 0,
368
+ });
369
+ const tx = await builder.build();
370
+ const rawIx = solTx(tx).instructions[0];
371
+ const data = rawIx.data;
372
+ data[0].should.equal(3);
373
+ data.readUInt32LE(1).should.equal(0); // offset as u32
374
+ // Context state accounts: [contextState(writable), authority]
375
+ rawIx.keys.should.have.length(2);
376
+ rawIx.keys[0].pubkey.toString().should.equal(eqCtxAddress);
377
+ rawIx.keys[0].isWritable.should.be.true();
378
+ rawIx.keys[1].pubkey.toString().should.equal(authorityAddress);
379
+ });
380
+ });
381
+ describe('VerifyValidityProof', () => {
382
+ it('should build with inline proof data', async () => {
383
+ const builder = ctBuilder();
384
+ builder.verifyValidityProof({ proofData: proofDataHex });
385
+ const tx = await builder.build();
386
+ const data = solTx(tx).instructions[0].data;
387
+ data[0].should.equal(12); // VerifyBatchedGroupedCiphertext3HandlesValidity
388
+ data.length.should.equal(1 + 320);
389
+ });
390
+ });
391
+ describe('VerifyRangeProof', () => {
392
+ it('should build with inline proof data', async () => {
393
+ const builder = ctBuilder();
394
+ builder.verifyRangeProof({ proofData: '00'.repeat(1000) }); // range proof is ~1000 bytes
395
+ const tx = await builder.build();
396
+ const data = solTx(tx).instructions[0].data;
397
+ data[0].should.equal(7); // VerifyBatchedRangeProofU128
398
+ data.length.should.equal(1 + 1000);
399
+ });
400
+ });
401
+ describe('Multiple instructions (v1 tx simulation)', () => {
402
+ it('should build ApplyPendingBalance + 3 proofs + Transfer in correct order', async () => {
403
+ const builder = ctBuilder();
404
+ builder
405
+ .applyPendingBalance({
406
+ tokenAddress,
407
+ authorityAddress,
408
+ expectedPendingBalanceCreditCounter: '2',
409
+ newDecryptableAvailableBalance: zeroBytes36,
410
+ })
411
+ .verifyEqualityProof({ proofData: proofDataHex })
412
+ .verifyValidityProof({ proofData: proofDataHex })
413
+ .verifyRangeProof({ proofData: '00'.repeat(1000) })
414
+ .confidentialTransfer({
415
+ sourceTokenAddress: tokenAddress,
416
+ mintAddress,
417
+ destinationTokenAddress,
418
+ authorityAddress,
419
+ newSourceDecryptableAvailableBalance: zeroBytes36,
420
+ transferAmountAuditorCiphertextLo: zeroBytes64,
421
+ transferAmountAuditorCiphertextHi: zeroBytes64,
422
+ equalityProofInstructionOffset: 1,
423
+ ciphertextValidityProofInstructionOffset: 2,
424
+ rangeProofInstructionOffset: 3,
425
+ });
426
+ const tx = await builder.build();
427
+ const instructions = tx.toJson().instructionsData;
428
+ instructions.should.have.length(5);
429
+ instructions[0].type.should.equal('ApplyPendingBalance');
430
+ instructions[1].type.should.equal('VerifyEqualityProof');
431
+ instructions[2].type.should.equal('VerifyValidityProof');
432
+ instructions[3].type.should.equal('VerifyRangeProof');
433
+ instructions[4].type.should.equal('ConfidentialTransfer');
434
+ // Note: Cannot verify toBroadcastFormat() here because 3 proofs (320+320+1000 bytes)
435
+ // + transfer (169B) exceeds v0 tx size limit (1232B). These are v1 transactions (4132B).
436
+ // The instruction data layouts are verified individually in the tests above.
437
+ });
438
+ it('should build ConfigureAccount + VerifyPubkeyValidity', async () => {
439
+ const builder = ctBuilder();
440
+ builder
441
+ .configureAccount({
442
+ tokenAddress,
443
+ mintAddress,
444
+ authorityAddress,
445
+ decryptableZeroBalance: zeroBytes36,
446
+ maximumPendingBalanceCreditCounter: '65536',
447
+ proofInstructionOffset: 1,
448
+ })
449
+ .verifyPubkeyValidity({ proofData: proofDataHex });
450
+ const tx = await builder.build();
451
+ const instructions = tx.toJson().instructionsData;
452
+ instructions.should.have.length(2);
453
+ instructions[0].type.should.equal('ConfigureConfidentialTransferAccount');
454
+ instructions[1].type.should.equal('VerifyPubkeyValidity');
455
+ const rawTx = tx.toBroadcastFormat();
456
+ src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
457
+ });
458
+ });
459
+ describe('Raw transaction validity', () => {
460
+ it('should produce a valid raw transaction', async () => {
461
+ const builder = ctBuilder();
462
+ builder.configureAccount({
463
+ tokenAddress,
464
+ mintAddress,
465
+ authorityAddress,
466
+ decryptableZeroBalance: zeroBytes36,
467
+ maximumPendingBalanceCreditCounter: '65536',
468
+ proofInstructionOffset: 1,
469
+ });
470
+ const tx = await builder.build();
471
+ const rawTx = tx.toBroadcastFormat();
472
+ src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
473
+ });
474
+ });
475
+ describe('Validation', () => {
476
+ it('should reject empty builder', async () => {
477
+ const builder = ctBuilder();
478
+ await builder.build().should.be.rejectedWith(/confidential transfer instruction/);
479
+ });
480
+ it('should reject missing tokenAddress on configureAccount', () => {
481
+ const builder = ctBuilder();
482
+ should_1.default.throws(() => builder.configureAccount({
483
+ tokenAddress: '',
484
+ mintAddress,
485
+ authorityAddress,
486
+ decryptableZeroBalance: zeroBytes36,
487
+ maximumPendingBalanceCreditCounter: '65536',
488
+ proofInstructionOffset: 1,
489
+ }));
490
+ });
491
+ });
492
+ // ─── Fix-specific tests ────────────────────────────────────────────────────
493
+ describe('Fix #1: signed i8 proof instruction offsets', () => {
494
+ it('should correctly encode negative offset on ConfigureAccount', async () => {
495
+ const builder = ctBuilder();
496
+ builder.configureAccount({
497
+ tokenAddress,
498
+ mintAddress,
499
+ authorityAddress,
500
+ decryptableZeroBalance: zeroBytes36,
501
+ maximumPendingBalanceCreditCounter: '65536',
502
+ proofInstructionOffset: -1, // proof is the previous instruction
503
+ });
504
+ const tx = await builder.build();
505
+ const data = solTx(tx).instructions[0].data;
506
+ data[46].should.equal(255); // -1 as i8 = 255 as u8 (two's complement)
507
+ });
508
+ it('should correctly encode negative offset on Withdraw', async () => {
509
+ const builder = ctBuilder();
510
+ builder.confidentialWithdraw({
511
+ tokenAddress,
512
+ mintAddress,
513
+ authorityAddress,
514
+ equalityProofContextStateAddress: eqCtxAddress,
515
+ rangeProofContextStateAddress: rangeCtxAddress,
516
+ amount: '100',
517
+ decimals: 6,
518
+ newDecryptableAvailableBalance: zeroBytes36,
519
+ equalityProofInstructionOffset: -1,
520
+ rangeProofInstructionOffset: -2,
521
+ });
522
+ const tx = await builder.build();
523
+ const data = solTx(tx).instructions[0].data;
524
+ data[47].should.equal(255); // -1 as i8
525
+ data[48].should.equal(254); // -2 as i8
526
+ });
527
+ it('should correctly encode negative offsets on Transfer', async () => {
528
+ const builder = ctBuilder();
529
+ builder.confidentialTransfer({
530
+ sourceTokenAddress: tokenAddress,
531
+ mintAddress,
532
+ destinationTokenAddress,
533
+ authorityAddress,
534
+ equalityProofContextStateAddress: eqCtxAddress,
535
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
536
+ rangeProofContextStateAddress: rangeCtxAddress,
537
+ newSourceDecryptableAvailableBalance: zeroBytes36,
538
+ transferAmountAuditorCiphertextLo: zeroBytes64,
539
+ transferAmountAuditorCiphertextHi: zeroBytes64,
540
+ equalityProofInstructionOffset: -3,
541
+ ciphertextValidityProofInstructionOffset: -2,
542
+ rangeProofInstructionOffset: -1,
543
+ });
544
+ const tx = await builder.build();
545
+ const data = solTx(tx).instructions[0].data;
546
+ data[166].should.equal(253); // -3 as i8
547
+ data[167].should.equal(254); // -2 as i8
548
+ data[168].should.equal(255); // -1 as i8
549
+ });
550
+ });
551
+ describe('Fix #2: instruction order preservation in parser', () => {
552
+ it('should preserve interleaved CT and custom instruction order', async () => {
553
+ const builder = ctBuilder();
554
+ builder
555
+ .applyPendingBalance({
556
+ tokenAddress,
557
+ authorityAddress,
558
+ expectedPendingBalanceCreditCounter: '1',
559
+ newDecryptableAvailableBalance: zeroBytes36,
560
+ })
561
+ .verifyEqualityProof({ proofData: proofDataHex })
562
+ .confidentialTransfer({
563
+ sourceTokenAddress: tokenAddress,
564
+ mintAddress,
565
+ destinationTokenAddress,
566
+ authorityAddress,
567
+ equalityProofContextStateAddress: eqCtxAddress,
568
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
569
+ rangeProofContextStateAddress: rangeCtxAddress,
570
+ newSourceDecryptableAvailableBalance: zeroBytes36,
571
+ transferAmountAuditorCiphertextLo: zeroBytes64,
572
+ transferAmountAuditorCiphertextHi: zeroBytes64,
573
+ equalityProofInstructionOffset: 0,
574
+ ciphertextValidityProofInstructionOffset: 0,
575
+ rangeProofInstructionOffset: 0,
576
+ });
577
+ const tx = await builder.build();
578
+ const instructions = tx.toJson().instructionsData;
579
+ // Order should be: ApplyPendingBalance, VerifyEqualityProof, ConfidentialTransfer
580
+ instructions.should.have.length(3);
581
+ instructions[0].type.should.equal('ApplyPendingBalance');
582
+ instructions[1].type.should.equal('VerifyEqualityProof');
583
+ instructions[2].type.should.equal('ConfidentialTransfer');
584
+ });
585
+ });
586
+ describe('Fix #3: VerifyPubkeyValidity context state mode', () => {
587
+ it('should not throw when only context state accounts are provided (no proofData)', async () => {
588
+ const builder = ctBuilder();
589
+ builder.verifyPubkeyValidity({
590
+ contextStateAccountAddress: eqCtxAddress,
591
+ contextStateAuthorityAddress: authorityAddress,
592
+ });
593
+ const tx = await builder.build();
594
+ const rawIx = solTx(tx).instructions[0];
595
+ // Should produce an offset-based instruction, not throw
596
+ rawIx.data[0].should.equal(4);
597
+ rawIx.keys.should.have.length(2);
598
+ });
599
+ });
600
+ describe('Fix #4: context state address required when offset == 0', () => {
601
+ it('should reject Withdraw with offset 0 but missing equality context state address', async () => {
602
+ const builder = ctBuilder();
603
+ builder.confidentialWithdraw({
604
+ tokenAddress,
605
+ mintAddress,
606
+ authorityAddress,
607
+ rangeProofContextStateAddress: rangeCtxAddress,
608
+ amount: '100',
609
+ decimals: 6,
610
+ newDecryptableAvailableBalance: zeroBytes36,
611
+ equalityProofInstructionOffset: 0, // context state mode but no address
612
+ rangeProofInstructionOffset: 0,
613
+ });
614
+ await builder.build().should.be.rejectedWith(/equalityProofContextStateAddress is required/);
615
+ });
616
+ it('should reject Transfer with offset 0 but missing range context state address', async () => {
617
+ const builder = ctBuilder();
618
+ builder.confidentialTransfer({
619
+ sourceTokenAddress: tokenAddress,
620
+ mintAddress,
621
+ destinationTokenAddress,
622
+ authorityAddress,
623
+ equalityProofContextStateAddress: eqCtxAddress,
624
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
625
+ newSourceDecryptableAvailableBalance: zeroBytes36,
626
+ transferAmountAuditorCiphertextLo: zeroBytes64,
627
+ transferAmountAuditorCiphertextHi: zeroBytes64,
628
+ equalityProofInstructionOffset: 0,
629
+ ciphertextValidityProofInstructionOffset: 0,
630
+ rangeProofInstructionOffset: 0, // context state mode but no address
631
+ });
632
+ await builder.build().should.be.rejectedWith(/rangeProofContextStateAddress is required/);
633
+ });
634
+ });
635
+ describe('Fix #5: numeric string validation', () => {
636
+ it('should reject non-numeric amount on Deposit', async () => {
637
+ const builder = ctBuilder();
638
+ builder.confidentialDeposit({
639
+ tokenAddress,
640
+ mintAddress,
641
+ authorityAddress,
642
+ amount: 'abc',
643
+ decimals: 6,
644
+ });
645
+ await builder.build().should.be.rejectedWith(/Invalid amount: expected non-negative integer string/);
646
+ });
647
+ it('should reject negative amount on Deposit', async () => {
648
+ const builder = ctBuilder();
649
+ builder.confidentialDeposit({
650
+ tokenAddress,
651
+ mintAddress,
652
+ authorityAddress,
653
+ amount: '-100',
654
+ decimals: 6,
655
+ });
656
+ await builder.build().should.be.rejectedWith(/Invalid amount: expected non-negative integer string/);
657
+ });
658
+ it('should reject non-numeric counter on ApplyPendingBalance', async () => {
659
+ const builder = ctBuilder();
660
+ builder.applyPendingBalance({
661
+ tokenAddress,
662
+ authorityAddress,
663
+ expectedPendingBalanceCreditCounter: 'not-a-number',
664
+ newDecryptableAvailableBalance: zeroBytes36,
665
+ });
666
+ await builder.build().should.be.rejectedWith(/Invalid expectedPendingBalanceCreditCounter/);
667
+ });
668
+ it('should reject non-numeric counter on ConfigureAccount', async () => {
669
+ const builder = ctBuilder();
670
+ builder.configureAccount({
671
+ tokenAddress,
672
+ mintAddress,
673
+ authorityAddress,
674
+ decryptableZeroBalance: zeroBytes36,
675
+ maximumPendingBalanceCreditCounter: 'foo',
676
+ proofInstructionOffset: 1,
677
+ });
678
+ await builder.build().should.be.rejectedWith(/Invalid maximumPendingBalanceCreditCounter/);
679
+ });
680
+ it('should accept amount of 0 on Deposit', async () => {
681
+ const builder = ctBuilder();
682
+ builder.confidentialDeposit({
683
+ tokenAddress,
684
+ mintAddress,
685
+ authorityAddress,
686
+ amount: '0',
687
+ decimals: 6,
688
+ });
689
+ const tx = await builder.build();
690
+ const data = solTx(tx).instructions[0].data;
691
+ data.readBigUInt64LE(2).toString().should.equal('0');
692
+ });
693
+ });
694
+ describe('Fix #6: canonical ZK proof program ID', () => {
695
+ it('should use canonical zk-elgamal-proof program id', async () => {
696
+ const builder = ctBuilder();
697
+ builder.verifyEqualityProof({ proofData: proofDataHex });
698
+ const tx = await builder.build();
699
+ solTx(tx).instructions[0].programId.toString().should.equal('ZkE1Gama1Proof11111111111111111111111111111');
700
+ });
701
+ it('should allow overriding ZK proof program id', async () => {
702
+ const customProgramId = testData.associatedTokenAccounts.accounts[0].pub; // any valid pubkey
703
+ const builder = ctBuilder();
704
+ builder.zkProofProgramId(customProgramId);
705
+ builder.verifyEqualityProof({ proofData: proofDataHex });
706
+ const tx = await builder.build();
707
+ solTx(tx).instructions[0].programId.toString().should.equal(customProgramId);
708
+ });
709
+ });
710
+ describe('Fix #8: from() routing for CT transactions', () => {
711
+ it('should route CT transaction to ConfidentialTransferBuilder on from()', async () => {
712
+ // Build a CT transaction
713
+ const builder = ctBuilder();
714
+ builder.configureAccount({
715
+ tokenAddress,
716
+ mintAddress,
717
+ authorityAddress,
718
+ decryptableZeroBalance: zeroBytes36,
719
+ maximumPendingBalanceCreditCounter: '65536',
720
+ proofInstructionOffset: 1,
721
+ });
722
+ const tx = await builder.build();
723
+ const rawTx = tx.toBroadcastFormat();
724
+ // Parse it back via factory.from()
725
+ const parsedBuilder = factory.from(rawTx);
726
+ // Should be a ConfidentialTransferBuilder, not CustomInstructionBuilder
727
+ parsedBuilder.constructor.name.should.equal('ConfidentialTransferBuilder');
728
+ });
729
+ it('should route non-CT custom transaction to CustomInstructionBuilder on from()', async () => {
730
+ // Build a non-CT custom transaction
731
+ const customBuilder = factory.getCustomInstructionBuilder();
732
+ customBuilder.nonce(recentBlockHash);
733
+ customBuilder.sender(account.pub);
734
+ customBuilder.addCustomInstruction({
735
+ programId: 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr',
736
+ keys: [],
737
+ data: 'hello',
738
+ });
739
+ const tx = await customBuilder.build();
740
+ const rawTx = tx.toBroadcastFormat();
741
+ // Parse it back via factory.from()
742
+ const parsedBuilder = factory.from(rawTx);
743
+ parsedBuilder.constructor.name.should.equal('CustomInstructionBuilder');
744
+ });
745
+ });
746
+ describe('Fix #9: range validation for decimals and proof offsets', () => {
747
+ it('should reject decimals > 255 on Deposit', async () => {
748
+ const builder = ctBuilder();
749
+ builder.confidentialDeposit({
750
+ tokenAddress,
751
+ mintAddress,
752
+ authorityAddress,
753
+ amount: '100',
754
+ decimals: 256,
755
+ });
756
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
757
+ });
758
+ it('should reject negative decimals on Deposit', async () => {
759
+ const builder = ctBuilder();
760
+ builder.confidentialDeposit({
761
+ tokenAddress,
762
+ mintAddress,
763
+ authorityAddress,
764
+ amount: '100',
765
+ decimals: -1,
766
+ });
767
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
768
+ });
769
+ it('should reject non-integer decimals on Deposit', async () => {
770
+ const builder = ctBuilder();
771
+ builder.confidentialDeposit({
772
+ tokenAddress,
773
+ mintAddress,
774
+ authorityAddress,
775
+ amount: '100',
776
+ decimals: 6.5,
777
+ });
778
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
779
+ });
780
+ it('should reject proof offset > 127 on ConfigureAccount', async () => {
781
+ const builder = ctBuilder();
782
+ builder.configureAccount({
783
+ tokenAddress,
784
+ mintAddress,
785
+ authorityAddress,
786
+ decryptableZeroBalance: zeroBytes36,
787
+ maximumPendingBalanceCreditCounter: '65536',
788
+ proofInstructionOffset: 128,
789
+ });
790
+ await builder.build().should.be.rejectedWith(/Invalid proofInstructionOffset: expected i8 \(-128 to 127\)/);
791
+ });
792
+ it('should reject proof offset < -128 on ConfigureAccount', async () => {
793
+ const builder = ctBuilder();
794
+ builder.configureAccount({
795
+ tokenAddress,
796
+ mintAddress,
797
+ authorityAddress,
798
+ decryptableZeroBalance: zeroBytes36,
799
+ maximumPendingBalanceCreditCounter: '65536',
800
+ proofInstructionOffset: -129,
801
+ });
802
+ await builder.build().should.be.rejectedWith(/Invalid proofInstructionOffset: expected i8 \(-128 to 127\)/);
803
+ });
804
+ it('should reject equality proof offset > 127 on Withdraw', async () => {
805
+ const builder = ctBuilder();
806
+ builder.confidentialWithdraw({
807
+ tokenAddress,
808
+ mintAddress,
809
+ authorityAddress,
810
+ equalityProofContextStateAddress: eqCtxAddress,
811
+ rangeProofContextStateAddress: rangeCtxAddress,
812
+ amount: '100',
813
+ decimals: 6,
814
+ newDecryptableAvailableBalance: zeroBytes36,
815
+ equalityProofInstructionOffset: 200,
816
+ rangeProofInstructionOffset: 0,
817
+ });
818
+ await builder.build().should.be.rejectedWith(/Invalid equalityProofInstructionOffset: expected i8/);
819
+ });
820
+ it('should reject range proof offset < -128 on Withdraw', async () => {
821
+ const builder = ctBuilder();
822
+ builder.confidentialWithdraw({
823
+ tokenAddress,
824
+ mintAddress,
825
+ authorityAddress,
826
+ equalityProofContextStateAddress: eqCtxAddress,
827
+ rangeProofContextStateAddress: rangeCtxAddress,
828
+ amount: '100',
829
+ decimals: 6,
830
+ newDecryptableAvailableBalance: zeroBytes36,
831
+ equalityProofInstructionOffset: 0,
832
+ rangeProofInstructionOffset: -200,
833
+ });
834
+ await builder.build().should.be.rejectedWith(/Invalid rangeProofInstructionOffset: expected i8/);
835
+ });
836
+ it('should reject validity proof offset out of i8 range on Transfer', async () => {
837
+ const builder = ctBuilder();
838
+ builder.confidentialTransfer({
839
+ sourceTokenAddress: tokenAddress,
840
+ mintAddress,
841
+ destinationTokenAddress,
842
+ authorityAddress,
843
+ equalityProofContextStateAddress: eqCtxAddress,
844
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
845
+ rangeProofContextStateAddress: rangeCtxAddress,
846
+ newSourceDecryptableAvailableBalance: zeroBytes36,
847
+ transferAmountAuditorCiphertextLo: zeroBytes64,
848
+ transferAmountAuditorCiphertextHi: zeroBytes64,
849
+ equalityProofInstructionOffset: 0,
850
+ ciphertextValidityProofInstructionOffset: 255,
851
+ rangeProofInstructionOffset: 0,
852
+ });
853
+ await builder.build().should.be.rejectedWith(/Invalid ciphertextValidityProofInstructionOffset: expected i8/);
854
+ });
855
+ it('should accept boundary offset values (-128 and 127)', async () => {
856
+ const builder = ctBuilder();
857
+ builder.configureAccount({
858
+ tokenAddress,
859
+ mintAddress,
860
+ authorityAddress,
861
+ decryptableZeroBalance: zeroBytes36,
862
+ maximumPendingBalanceCreditCounter: '65536',
863
+ proofInstructionOffset: 127,
864
+ });
865
+ const tx = await builder.build();
866
+ const data = solTx(tx).instructions[0].data;
867
+ data[46].should.equal(127);
868
+ });
869
+ });
870
+ describe('Fix #10: u64 overflow validation', () => {
871
+ it('should reject amount exceeding u64 max on Deposit', async () => {
872
+ const builder = ctBuilder();
873
+ builder.confidentialDeposit({
874
+ tokenAddress,
875
+ mintAddress,
876
+ authorityAddress,
877
+ amount: '18446744073709551616', // 2^64
878
+ decimals: 6,
879
+ });
880
+ await builder.build().should.be.rejectedWith(/Invalid amount: value exceeds u64 max/);
881
+ });
882
+ it('should accept amount at u64 max on Deposit', async () => {
883
+ const builder = ctBuilder();
884
+ builder.confidentialDeposit({
885
+ tokenAddress,
886
+ mintAddress,
887
+ authorityAddress,
888
+ amount: '18446744073709551615', // 2^64 - 1
889
+ decimals: 6,
890
+ });
891
+ const tx = await builder.build();
892
+ const data = solTx(tx).instructions[0].data;
893
+ data.readBigUInt64LE(2).toString().should.equal('18446744073709551615');
894
+ });
895
+ it('should reject counter exceeding u64 max on ConfigureAccount', async () => {
896
+ const builder = ctBuilder();
897
+ builder.configureAccount({
898
+ tokenAddress,
899
+ mintAddress,
900
+ authorityAddress,
901
+ decryptableZeroBalance: zeroBytes36,
902
+ maximumPendingBalanceCreditCounter: '18446744073709551616', // 2^64
903
+ proofInstructionOffset: 1,
904
+ });
905
+ await builder.build().should.be.rejectedWith(/Invalid maximumPendingBalanceCreditCounter: value exceeds u64 max/);
906
+ });
907
+ });
908
+ });
909
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBMkQ7QUFDM0Qsb0RBQTRCO0FBQzVCLDhEQUFnRDtBQUNoRCw0REFBeUQ7QUFFekQsUUFBUSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwRixNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUV2RSwwQ0FBMEM7SUFDMUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQztJQUN0RSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNoRixNQUFNLHVCQUF1QixHQUFHLDhDQUE4QyxDQUFDO0lBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNyQyw4RUFBOEU7SUFDOUUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1RSxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUVsRCxnQkFBZ0I7SUFDaEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyw4QkFBOEI7SUFFckUsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFO1FBQ3JCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzNELFNBQVMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsMERBQTBEO0lBQzFELDhEQUE4RDtJQUM5RCxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQU8sRUFBTyxFQUFFLENBQUUsRUFBa0IsQ0FBQyxjQUFjLENBQUM7SUFFbkUsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtRQUNoQyxFQUFFLENBQUMsMEVBQTBFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDeEYsTUFBTSxPQUFPLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLGdCQUFnQixDQUFDO2dCQUN2QixZQUFZO2dCQUNaLFdBQVc7Z0JBQ1gsZ0JBQWdCO2dCQUNoQixzQkFBc0IsRUFBRSxXQUFXO2dCQUNuQyxrQ0FBa0MsRUFBRSxPQUFPO2dCQUMzQyxzQkFBc0IsRUFBRSxDQUFDO2FBQzFCLENBQUMsQ0FBQztZQUVILE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsRCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFFMUUsOEJBQThCO1lBQzlCLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDL0MsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO1lBQzFELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1lBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1lBQ3hGLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHFDQUFxQztZQUNoRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQjtZQUVyRCxrQkFBa0I7WUFDbEIsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO1lBQzdHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM5RCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzdFLE1BQU0sT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDdkIsWUFBWTtnQkFDWixXQUFXO2dCQUNYLGdCQUFnQjtnQkFDaEIsdUNBQXVDLEVBQUUsbUJBQW1CO2dCQUM1RCxzQkFBc0IsRUFBRSxXQUFXO2dCQUNuQyxrQ0FBa0MsRUFBRSxPQUFPO2dCQUMzQyxzQkFBc0IsRUFBRSxDQUFDO2FBQzFCLENBQUMsQ0FBQztZQUVILE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzVDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzVELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzVDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsK0NBQStDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsQ0FBQywrRUFBK0UsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM3RixNQUFNLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUM1QixPQUFPLENBQUMsbUJBQW1CLENBQUM7Z0JBQzFCLFlBQVk7Z0JBQ1osZ0JBQWdCO2dCQUNoQixtQ0FBbUMsRUFBRSxHQUFHO2dCQUN4Qyw4QkFBOEIsRUFBRSxXQUFXO2FBQzVDLENBQUMsQ0FBQztZQUVILE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsRCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFFekQsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUMvQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7WUFDMUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7WUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQTBDO1lBQ2hHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0NBQW9DO1lBRWxHLHdEQUF3RDtZQUN4RCxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzlFLE1BQU0sT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztnQkFDMUIsWUFBWTtnQkFDWixXQUFXO2dCQUNYLGdCQUFnQjtnQkFDaEIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLFFBQVEsRUFBRSxDQUFDO2FBQ1osQ0FBQyxDQUFDO1lBRUgsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDO1lBQ2xELFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUV6RCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQy9DLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztZQUMxRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNyRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7WUFFckMsOERBQThEO1lBQzlELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFD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ZXlQYWlyLCBVdGlscywgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcblxuZGVzY3JpYmUoJ1NvbGFuYSBDb25maWRlbnRpYWwgVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCdzb2wnKTtcbiAgY29uc3QgYWNjb3VudCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdKS5nZXRLZXlzKCk7XG4gIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG5cbiAgLy8gVGVzdCBhZGRyZXNzZXMgKFRva2VuLTIwMjIgbWludCArIEFUQXMpXG4gIGNvbnN0IG1pbnRBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLm1pbnRJZDtcbiAgY29uc3QgdG9rZW5BZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MgPSAnRU5uOGEydEdNUzliUjVYVjdzbUdISnZOZ3preXhKbW5EMmVVdlF4WTVqU1AnO1xuICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gYWNjb3VudC5wdWI7XG4gIC8vIFZhbGlkIGJhc2U1OCBhZGRyZXNzZXMgZm9yIGNvbnRleHQgc3RhdGUgYWNjb3VudHMgKGFueSB2YWxpZCBTb2xhbmEgcHVia2V5KVxuICBjb25zdCBlcUN0eEFkZHJlc3MgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5hdGE7XG4gIGNvbnN0IHZhbGlkaXR5Q3R4QWRkcmVzcyA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YjtcbiAgY29uc3QgcmFuZ2VDdHhBZGRyZXNzID0gdGVzdERhdGEubm9uY2VBY2NvdW50LnB1YjtcblxuICAvLyBIZXggdGVzdCBkYXRhXG4gIGNvbnN0IHplcm9CeXRlczM2ID0gJzAwJy5yZXBlYXQoMzYpO1xuICBjb25zdCB6ZXJvQnl0ZXM2NCA9ICcwMCcucmVwZWF0KDY0KTtcbiAgY29uc3QgcHJvb2ZEYXRhSGV4ID0gJzAwJy5yZXBlYXQoMzIwKTsgLy8gdHlwaWNhbCBlcXVhbGl0eSBwcm9vZiBzaXplXG5cbiAgY29uc3QgY3RCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhY2NvdW50LnB1Yik7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICAvKiogQWNjZXNzIHRoZSByYXcgU29sYW5hIFRyYW5zYWN0aW9uIGZyb20gdGhlIGJ1aWx0IHR4ICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IHNvbFR4ID0gKHR4OiBhbnkpOiBhbnkgPT4gKHR4IGFzIFRyYW5zYWN0aW9uKS5zb2xUcmFuc2FjdGlvbjtcblxuICBkZXNjcmliZSgnQ29uZmlndXJlQWNjb3VudCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgY29uZmlndXJlIGFjY291bnQgaW5zdHJ1Y3Rpb24gd2l0aCBjb3JyZWN0IDQ3LWJ5dGUgbGF5b3V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSByYXcgaW5zdHJ1Y3Rpb24gZGF0YVxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNDcpO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMjcpOyAvLyBDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvblxuICAgICAgZGF0YVsxXS5zaG91bGQuZXF1YWwoMik7IC8vIENvbmZpZ3VyZUFjY291bnRcbiAgICAgIGRhdGEuc2xpY2UoMiwgMzgpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzMzYpOyAvLyBkZWNyeXB0YWJsZV96ZXJvX2JhbGFuY2VcbiAgICAgIGRhdGEucmVhZEJpZ1VJbnQ2NExFKDM4KS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnNjU1MzYnKTsgLy8gbWF4IHBlbmRpbmcgYmFsYW5jZSBjcmVkaXQgY291bnRlclxuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDEpOyAvLyBwcm9vZl9pbnN0cnVjdGlvbl9vZmZzZXRcblxuICAgICAgLy8gVmVyaWZ5IGFjY291bnRzXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCg0KTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMV0uaXNXcml0YWJsZS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7IC8vIGluc3RydWN0aW9ucyBzeXN2YXJcbiAgICAgIGtleXNbM10ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1szXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgY29udGV4dCBzdGF0ZSBhZGRyZXNzIHdoZW4gcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0U3RhdGVBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViO1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zU3lzdmFyT3JDb250ZXh0U3RhdGVBZGRyZXNzOiBjb250ZXh0U3RhdGVBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGtleXMgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChjb250ZXh0U3RhdGVBZGRyZXNzKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzQ2XS5zaG91bGQuZXF1YWwoMCk7IC8vIHByb29mX2luc3RydWN0aW9uX29mZnNldCA9IDAgKGNvbnRleHQgc3RhdGUpXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBcHBseVBlbmRpbmdCYWxhbmNlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gYXBwbHkgcGVuZGluZyBiYWxhbmNlIGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA0Ni1ieXRlIGxheW91dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuYXBwbHlQZW5kaW5nQmFsYW5jZSh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXhwZWN0ZWRQZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICczJyxcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG4gICAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdBcHBseVBlbmRpbmdCYWxhbmNlJyk7XG5cbiAgICAgIGNvbnN0IHJhd0luc3RydWN0aW9ucyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnM7XG4gICAgICByYXdJbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgZGF0YSA9IHJhd0luc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDQ2KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDI3KTsgLy8gQ29uZmlkZW50aWFsVHJhbnNmZXJFeHRlbnNpb25cbiAgICAgIGRhdGFbMV0uc2hvdWxkLmVxdWFsKDgpOyAvLyBBcHBseVBlbmRpbmdCYWxhbmNlXG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnMycpOyAvLyBleHBlY3RlZF9wZW5kaW5nX2JhbGFuY2VfY3JlZGl0X2NvdW50ZXJcbiAgICAgIGRhdGEuc2xpY2UoMTAsIDQ2KS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHplcm9CeXRlczM2KTsgLy8gbmV3X2RlY3J5cHRhYmxlX2F2YWlsYWJsZV9iYWxhbmNlXG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3Rva2VuKHdyaXRhYmxlKSwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1sxXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVwb3NpdCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZGVwb3NpdCBpbnN0cnVjdGlvbiB3aXRoIGNvcnJlY3QgMTEtYnl0ZSBsYXlvdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsRGVwb3NpdCcpO1xuXG4gICAgICBjb25zdCByYXdJbnN0cnVjdGlvbnMgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zO1xuICAgICAgcmF3SW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdJbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgxMSk7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbCgyNyk7IC8vIENvbmZpZGVudGlhbFRyYW5zZmVyRXh0ZW5zaW9uXG4gICAgICBkYXRhWzFdLnNob3VsZC5lcXVhbCg1KTsgLy8gRGVwb3NpdFxuICAgICAgZGF0YS5yZWFkQmlnVUludDY0TEUoMikudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTsgLy8gYW1vdW50XG4gICAgICBkYXRhWzEwXS5zaG91bGQuZXF1YWwoNik7IC8vIGRlY2ltYWxzXG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3Rva2VuKHdyaXRhYmxlKSwgbWludCwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgzKTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1syXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2l0aGRyYXcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHdpdGhkcmF3IGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA0OS1ieXRlIGxheW91dCBhbmQgaW5saW5lIHByb29mcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsV2l0aGRyYXcnKTtcblxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNDkpO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMjcpOyAvLyBDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvblxuICAgICAgZGF0YVsxXS5zaG91bGQuZXF1YWwoNik7IC8vIFdpdGhkcmF3XG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnNTAwMDAwJyk7IC8vIGFtb3VudFxuICAgICAgZGF0YVsxMF0uc2hvdWxkLmVxdWFsKDYpOyAvLyBkZWNpbWFsc1xuICAgICAgZGF0YS5zbGljZSgxMSwgNDcpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzMzYpOyAvLyBuZXdfZGVjcnlwdGFibGVcbiAgICAgIGRhdGFbNDddLnNob3VsZC5lcXVhbCgxKTsgLy8gZXF1YWxpdHkgcHJvb2Ygb2Zmc2V0XG4gICAgICBkYXRhWzQ4XS5zaG91bGQuZXF1YWwoMik7IC8vIHJhbmdlIHByb29mIG9mZnNldFxuXG4gICAgICAvLyBWZXJpZnkgYWNjb3VudHM6IFt0b2tlbih3cml0YWJsZSksIG1pbnQsIHN5c3ZhciwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCg0KTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbM10uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB3aXRoZHJhdyBpbnN0cnVjdGlvbiB3aXRoIGNvbnRleHQgc3RhdGUgYWNjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnNTAwMDAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qga2V5cyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ua2V5cztcbiAgICAgIC8vIFt0b2tlbiwgbWludCwgZXFDdHgsIHJnQ3R4LCBhdXRob3JpdHldIOKAlCBubyBzeXN2YXIgc2luY2UgYWxsIHByb29mcyB1c2UgY29udGV4dCBzdGF0ZVxuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNSk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChlcUN0eEFkZHJlc3MpO1xuICAgICAga2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwocmFuZ2VDdHhBZGRyZXNzKTtcbiAgICAgIGtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1s0XS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uZmlkZW50aWFsVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGluc3RydWN0aW9uIHdpdGggY29ycmVjdCAxNjktYnl0ZSBsYXlvdXQgYW5kIGlubGluZSBwcm9vZnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dExvOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcblxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMTY5KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDI3KTsgLy8gQ29uZmlkZW50aWFsVHJhbnNmZXJFeHRlbnNpb25cbiAgICAgIGRhdGFbMV0uc2hvdWxkLmVxdWFsKDcpOyAvLyBUcmFuc2ZlclxuICAgICAgZGF0YS5zbGljZSgyLCAzOCkudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh6ZXJvQnl0ZXMzNik7IC8vIG5ld19zb3VyY2VfZGVjcnlwdGFibGVcbiAgICAgIGRhdGEuc2xpY2UoMzgsIDEwMikudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh6ZXJvQnl0ZXM2NCk7IC8vIGF1ZGl0b3JfY3RfbG9cbiAgICAgIGRhdGEuc2xpY2UoMTAyLCAxNjYpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzNjQpOyAvLyBhdWRpdG9yX2N0X2hpXG4gICAgICBkYXRhWzE2Nl0uc2hvdWxkLmVxdWFsKDEpOyAvLyBlcXVhbGl0eSBwcm9vZiBvZmZzZXRcbiAgICAgIGRhdGFbMTY3XS5zaG91bGQuZXF1YWwoMik7IC8vIHZhbGlkaXR5IHByb29mIG9mZnNldFxuICAgICAgZGF0YVsxNjhdLnNob3VsZC5lcXVhbCgzKTsgLy8gcmFuZ2UgcHJvb2Ygb2Zmc2V0XG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3NvdXJjZSh3cml0YWJsZSksIG1pbnQsIGRlc3Qod3JpdGFibGUpLCBzeXN2YXIsIGF1dGhvcml0eShzaWduZXIpXVxuICAgICAgY29uc3Qga2V5cyA9IHJhd0luc3RydWN0aW9uc1swXS5rZXlzO1xuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNSk7XG4gICAgICBrZXlzWzBdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MpO1xuICAgICAga2V5c1swXS5pc1dyaXRhYmxlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXlzWzFdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChtaW50QWRkcmVzcyk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChkZXN0aW5hdGlvblRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzJdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbM10ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgICBrZXlzWzRdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbNF0uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciBpbnN0cnVjdGlvbiB3aXRoIGNvbnRleHQgc3RhdGUgYWNjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qga2V5cyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ua2V5cztcbiAgICAgIC8vIFtzb3VyY2UsIG1pbnQsIGRlc3QsIGVxQ3R4LCB2YWxpZGl0eUN0eCwgcmFuZ2VDdHgsIGF1dGhvcml0eV0g4oCUIG5vIHN5c3ZhclxuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNyk7XG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChlcUN0eEFkZHJlc3MpO1xuICAgICAga2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwodmFsaWRpdHlDdHhBZGRyZXNzKTtcbiAgICAgIGtleXNbNV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHJhbmdlQ3R4QWRkcmVzcyk7XG4gICAgICBrZXlzWzZdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbNl0uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ZlcmlmeVB1YmtleVZhbGlkaXR5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB2ZXJpZnkgcHVia2V5IHZhbGlkaXR5IGluc3RydWN0aW9uIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbCg0KTsgLy8gVmVyaWZ5UHVia2V5VmFsaWRpdHkgZGlzY3JpbWluYXRvclxuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDEgKyAzMjApOyAvLyBkaXNjcmltaW5hdG9yICsgcHJvb2YgZGF0YVxuICAgICAgZGF0YS5zbGljZSgxKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHByb29mRGF0YUhleCk7XG5cbiAgICAgIC8vIE5vIGFjY291bnRzIGZvciBpbmxpbmUgcHJvb2ZcbiAgICAgIHJhd0luc3RydWN0aW9uc1swXS5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcblxuICAgICAgLy8gVmVyaWZ5IHByb2dyYW0gaWQgKGNhbm9uaWNhbCBvbi1jaGFpbiBpZClcbiAgICAgIHJhd0luc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJ1prRTFHYW1hMVByb29mMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBjb250ZXh0IHN0YXRlIGFjY291bnQgKGZpeCAjMyknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHtcbiAgICAgICAgY29udGV4dFN0YXRlQWNjb3VudEFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY29udGV4dFN0YXRlQXV0aG9yaXR5QWRkcmVzczogYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd0l4ID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdJeC5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoNCk7IC8vIFZlcmlmeVB1YmtleVZhbGlkaXR5IGRpc2NyaW1pbmF0b3JcbiAgICAgIC8vIENvbnRleHQgc3RhdGUgYWNjb3VudHM6IFtjb250ZXh0U3RhdGUod3JpdGFibGUpLCBhdXRob3JpdHldXG4gICAgICByYXdJeC5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJhd0l4LmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGVxQ3R4QWRkcmVzcyk7XG4gICAgICByYXdJeC5rZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJhd0l4LmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5RXF1YWxpdHlQcm9vZicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMyk7IC8vIFZlcmlmeUNpcGhlcnRleHRDb21taXRtZW50RXF1YWxpdHkgZGlzY3JpbWluYXRvclxuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDEgKyAzMjApO1xuICAgICAgZGF0YS5zbGljZSgxKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHByb29mRGF0YUhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggY29udGV4dCBzdGF0ZSBvZmZzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2Yoe1xuICAgICAgICBjb250ZXh0U3RhdGVBY2NvdW50QWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICBjb250ZXh0U3RhdGVBdXRob3JpdHlBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdJeCA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF07XG4gICAgICBjb25zdCBkYXRhID0gcmF3SXguZGF0YTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgZGF0YS5yZWFkVUludDMyTEUoMSkuc2hvdWxkLmVxdWFsKDApOyAvLyBvZmZzZXQgYXMgdTMyXG5cbiAgICAgIC8vIENvbnRleHQgc3RhdGUgYWNjb3VudHM6IFtjb250ZXh0U3RhdGUod3JpdGFibGUpLCBhdXRob3JpdHldXG4gICAgICByYXdJeC5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJhd0l4LmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGVxQ3R4QWRkcmVzcyk7XG4gICAgICByYXdJeC5rZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJhd0l4LmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5VmFsaWRpdHlQcm9vZicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVZhbGlkaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMTIpOyAvLyBWZXJpZnlCYXRjaGVkR3JvdXBlZENpcGhlcnRleHQzSGFuZGxlc1ZhbGlkaXR5XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMSArIDMyMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWZXJpZnlSYW5nZVByb29mJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBpbmxpbmUgcHJvb2YgZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5UmFuZ2VQcm9vZih7IHByb29mRGF0YTogJzAwJy5yZXBlYXQoMTAwMCkgfSk7IC8vIHJhbmdlIHByb29mIGlzIH4xMDAwIGJ5dGVzXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDcpOyAvLyBWZXJpZnlCYXRjaGVkUmFuZ2VQcm9vZlUxMjhcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgxICsgMTAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdNdWx0aXBsZSBpbnN0cnVjdGlvbnMgKHYxIHR4IHNpbXVsYXRpb24pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgQXBwbHlQZW5kaW5nQmFsYW5jZSArIDMgcHJvb2ZzICsgVHJhbnNmZXIgaW4gY29ycmVjdCBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFwcGx5UGVuZGluZ0JhbGFuY2Uoe1xuICAgICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIGV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnMicsXG4gICAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgfSlcbiAgICAgICAgLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KVxuICAgICAgICAudmVyaWZ5VmFsaWRpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pXG4gICAgICAgIC52ZXJpZnlSYW5nZVByb29mKHsgcHJvb2ZEYXRhOiAnMDAnLnJlcGVhdCgxMDAwKSB9KVxuICAgICAgICAuY29uZmlkZW50aWFsVHJhbnNmZXIoe1xuICAgICAgICAgIHNvdXJjZVRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgIGRlc3RpbmF0aW9uVG9rZW5BZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG86IHplcm9CeXRlczY0LFxuICAgICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAzLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCg1KTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQXBwbHlQZW5kaW5nQmFsYW5jZScpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdWZXJpZnlFcXVhbGl0eVByb29mJyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMl0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeVZhbGlkaXR5UHJvb2YnKTtcbiAgICAgIGluc3RydWN0aW9uc1szXS50eXBlLnNob3VsZC5lcXVhbCgnVmVyaWZ5UmFuZ2VQcm9vZicpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzRdLnR5cGUuc2hvdWxkLmVxdWFsKCdDb25maWRlbnRpYWxUcmFuc2ZlcicpO1xuXG4gICAgICAvLyBOb3RlOiBDYW5ub3QgdmVyaWZ5IHRvQnJvYWRjYXN0Rm9ybWF0KCkgaGVyZSBiZWNhdXNlIDMgcHJvb2ZzICgzMjArMzIwKzEwMDAgYnl0ZXMpXG4gICAgICAvLyArIHRyYW5zZmVyICgxNjlCKSBleGNlZWRzIHYwIHR4IHNpemUgbGltaXQgKDEyMzJCKS4gVGhlc2UgYXJlIHYxIHRyYW5zYWN0aW9ucyAoNDEzMkIpLlxuICAgICAgLy8gVGhlIGluc3RydWN0aW9uIGRhdGEgbGF5b3V0cyBhcmUgdmVyaWZpZWQgaW5kaXZpZHVhbGx5IGluIHRoZSB0ZXN0cyBhYm92ZS5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgQ29uZmlndXJlQWNjb3VudCArIFZlcmlmeVB1YmtleVZhbGlkaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICB9KVxuICAgICAgICAudmVyaWZ5UHVia2V5VmFsaWRpdHkoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50Jyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMV0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeVB1YmtleVZhbGlkaXR5Jyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmF3IHRyYW5zYWN0aW9uIHZhbGlkaXR5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBhIHZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGVtcHR5IGJ1aWxkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvY29uZmlkZW50aWFsIHRyYW5zZmVyIGluc3RydWN0aW9uLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtaXNzaW5nIHRva2VuQWRkcmVzcyBvbiBjb25maWd1cmVBY2NvdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PlxuICAgICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICAgIHRva2VuQWRkcmVzczogJycsXG4gICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyDilIDilIDilIAgRml4LXNwZWNpZmljIHRlc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGRlc2NyaWJlKCdGaXggIzE6IHNpZ25lZCBpOCBwcm9vZiBpbnN0cnVjdGlvbiBvZmZzZXRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGVuY29kZSBuZWdhdGl2ZSBvZmZzZXQgb24gQ29uZmlndXJlQWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMSwgLy8gcHJvb2YgaXMgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDI1NSk7IC8vIC0xIGFzIGk4ID0gMjU1IGFzIHU4ICh0d28ncyBjb21wbGVtZW50KVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIG5lZ2F0aXZlIG9mZnNldCBvbiBXaXRoZHJhdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMSxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzQ3XS5zaG91bGQuZXF1YWwoMjU1KTsgLy8gLTEgYXMgaThcbiAgICAgIGRhdGFbNDhdLnNob3VsZC5lcXVhbCgyNTQpOyAvLyAtMiBhcyBpOFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIG5lZ2F0aXZlIG9mZnNldHMgb24gVHJhbnNmZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogLTMsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0yLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0xLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbMTY2XS5zaG91bGQuZXF1YWwoMjUzKTsgLy8gLTMgYXMgaThcbiAgICAgIGRhdGFbMTY3XS5zaG91bGQuZXF1YWwoMjU0KTsgLy8gLTIgYXMgaThcbiAgICAgIGRhdGFbMTY4XS5zaG91bGQuZXF1YWwoMjU1KTsgLy8gLTEgYXMgaThcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjMjogaW5zdHJ1Y3Rpb24gb3JkZXIgcHJlc2VydmF0aW9uIGluIHBhcnNlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIGludGVybGVhdmVkIENUIGFuZCBjdXN0b20gaW5zdHJ1Y3Rpb24gb3JkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzEnLFxuICAgICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIH0pXG4gICAgICAgIC52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgICAgLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgICBzb3VyY2VUb2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIGVxdWFsaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiBlcUN0eEFkZHJlc3MsXG4gICAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgICBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG4gICAgICAvLyBPcmRlciBzaG91bGQgYmU6IEFwcGx5UGVuZGluZ0JhbGFuY2UsIFZlcmlmeUVxdWFsaXR5UHJvb2YsIENvbmZpZGVudGlhbFRyYW5zZmVyXG4gICAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDMpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdBcHBseVBlbmRpbmdCYWxhbmNlJyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMV0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeUVxdWFsaXR5UHJvb2YnKTtcbiAgICAgIGluc3RydWN0aW9uc1syXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjMzogVmVyaWZ5UHVia2V5VmFsaWRpdHkgY29udGV4dCBzdGF0ZSBtb2RlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgbm90IHRocm93IHdoZW4gb25seSBjb250ZXh0IHN0YXRlIGFjY291bnRzIGFyZSBwcm92aWRlZCAobm8gcHJvb2ZEYXRhKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5UHVia2V5VmFsaWRpdHkoe1xuICAgICAgICBjb250ZXh0U3RhdGVBY2NvdW50QWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICBjb250ZXh0U3RhdGVBdXRob3JpdHlBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SXggPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdO1xuICAgICAgLy8gU2hvdWxkIHByb2R1Y2UgYW4gb2Zmc2V0LWJhc2VkIGluc3RydWN0aW9uLCBub3QgdGhyb3dcbiAgICAgIHJhd0l4LmRhdGFbMF0uc2hvdWxkLmVxdWFsKDQpO1xuICAgICAgcmF3SXgua2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzQ6IGNvbnRleHQgc3RhdGUgYWRkcmVzcyByZXF1aXJlZCB3aGVuIG9mZnNldCA9PSAwJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IFdpdGhkcmF3IHdpdGggb2Zmc2V0IDAgYnV0IG1pc3NpbmcgZXF1YWxpdHkgY29udGV4dCBzdGF0ZSBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxXaXRoZHJhdyh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgICBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsIC8vIGNvbnRleHQgc3RhdGUgbW9kZSBidXQgbm8gYWRkcmVzc1xuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9lcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzcyBpcyByZXF1aXJlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgVHJhbnNmZXIgd2l0aCBvZmZzZXQgMCBidXQgbWlzc2luZyByYW5nZSBjb250ZXh0IHN0YXRlIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLCAvLyBjb250ZXh0IHN0YXRlIG1vZGUgYnV0IG5vIGFkZHJlc3NcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzIGlzIHJlcXVpcmVkLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzU6IG51bWVyaWMgc3RyaW5nIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLW51bWVyaWMgYW1vdW50IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICdhYmMnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgYW1vdW50OiBleHBlY3RlZCBub24tbmVnYXRpdmUgaW50ZWdlciBzdHJpbmcvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGFtb3VudCBvbiBEZXBvc2l0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxEZXBvc2l0KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnLTEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBhbW91bnQ6IGV4cGVjdGVkIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHN0cmluZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLW51bWVyaWMgY291bnRlciBvbiBBcHBseVBlbmRpbmdCYWxhbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJ25vdC1hLW51bWJlcicsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBub24tbnVtZXJpYyBjb3VudGVyIG9uIENvbmZpZ3VyZUFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJ2ZvbycsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXIvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFtb3VudCBvZiAwIG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YS5yZWFkQmlnVUludDY0TEUoMikudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjNjogY2Fub25pY2FsIFpLIHByb29mIHByb2dyYW0gSUQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB1c2UgY2Fub25pY2FsIHprLWVsZ2FtYWwtcHJvb2YgcHJvZ3JhbSBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5RXF1YWxpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdaa0UxR2FtYTFQcm9vZjExMTExMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IG92ZXJyaWRpbmcgWksgcHJvb2YgcHJvZ3JhbSBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVByb2dyYW1JZCA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YjsgLy8gYW55IHZhbGlkIHB1YmtleVxuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci56a1Byb29mUHJvZ3JhbUlkKGN1c3RvbVByb2dyYW1JZCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpLnNob3VsZC5lcXVhbChjdXN0b21Qcm9ncmFtSWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRml4ICM4OiBmcm9tKCkgcm91dGluZyBmb3IgQ1QgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcm91dGUgQ1QgdHJhbnNhY3Rpb24gdG8gQ29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyIG9uIGZyb20oKScsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGEgQ1QgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBQYXJzZSBpdCBiYWNrIHZpYSBmYWN0b3J5LmZyb20oKVxuICAgICAgY29uc3QgcGFyc2VkQnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICAvLyBTaG91bGQgYmUgYSBDb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIsIG5vdCBDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXJcbiAgICAgIHBhcnNlZEJ1aWxkZXIuY29uc3RydWN0b3IubmFtZS5zaG91bGQuZXF1YWwoJ0NvbmZpZGVudGlhbFRyYW5zZmVyQnVpbGRlcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb3V0ZSBub24tQ1QgY3VzdG9tIHRyYW5zYWN0aW9uIHRvIEN1c3RvbUluc3RydWN0aW9uQnVpbGRlciBvbiBmcm9tKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBCdWlsZCBhIG5vbi1DVCBjdXN0b20gdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGN1c3RvbUJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY3VzdG9tQnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgY3VzdG9tQnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgY3VzdG9tQnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih7XG4gICAgICAgIHByb2dyYW1JZDogJ01lbW9TcTRncUFCQVhLYjk2cW5IOFR5c05jV3hNeVdDcVhnRExHbWZjSHInLFxuICAgICAgICBrZXlzOiBbXSxcbiAgICAgICAgZGF0YTogJ2hlbGxvJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGN1c3RvbUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gUGFyc2UgaXQgYmFjayB2aWEgZmFjdG9yeS5mcm9tKClcbiAgICAgIGNvbnN0IHBhcnNlZEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcGFyc2VkQnVpbGRlci5jb25zdHJ1Y3Rvci5uYW1lLnNob3VsZC5lcXVhbCgnQ3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzk6IHJhbmdlIHZhbGlkYXRpb24gZm9yIGRlY2ltYWxzIGFuZCBwcm9vZiBvZmZzZXRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGRlY2ltYWxzID4gMjU1IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogMjU2LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBkZWNpbWFsczogZXhwZWN0ZWQgdTggXFwoMC0yNTVcXCkvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGRlY2ltYWxzIG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogLTEsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlY2ltYWxzOiBleHBlY3RlZCB1OCBcXCgwLTI1NVxcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLWludGVnZXIgZGVjaW1hbHMgb24gRGVwb3NpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsRGVwb3NpdCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LjUsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlY2ltYWxzOiBleHBlY3RlZCB1OCBcXCgwLTI1NVxcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHJvb2Ygb2Zmc2V0ID4gMTI3IG9uIENvbmZpZ3VyZUFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMTI4LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiBleHBlY3RlZCBpOCBcXCgtMTI4IHRvIDEyN1xcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHJvb2Ygb2Zmc2V0IDwgLTEyOCBvbiBDb25maWd1cmVBY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0xMjksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IGV4cGVjdGVkIGk4IFxcKC0xMjggdG8gMTI3XFwpLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBlcXVhbGl0eSBwcm9vZiBvZmZzZXQgPiAxMjcgb24gV2l0aGRyYXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMjAwLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogZXhwZWN0ZWQgaTgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHJhbmdlIHByb29mIG9mZnNldCA8IC0xMjggb24gV2l0aGRyYXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMjAwLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IGV4cGVjdGVkIGk4Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB2YWxpZGl0eSBwcm9vZiBvZmZzZXQgb3V0IG9mIGk4IHJhbmdlIG9uIFRyYW5zZmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxUcmFuc2Zlcih7XG4gICAgICAgIHNvdXJjZVRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiBlcUN0eEFkZHJlc3MsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogdmFsaWRpdHlDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG86IHplcm9CeXRlczY0LFxuICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0SGk6IHplcm9CeXRlczY0LFxuICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDI1NSxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiBleHBlY3RlZCBpOC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYm91bmRhcnkgb2Zmc2V0IHZhbHVlcyAoLTEyOCBhbmQgMTI3KScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxMjcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDEyNyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzEwOiB1NjQgb3ZlcmZsb3cgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbW91bnQgZXhjZWVkaW5nIHU2NCBtYXggb24gRGVwb3NpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsRGVwb3NpdCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzE4NDQ2NzQ0MDczNzA5NTUxNjE2JywgLy8gMl42NFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgYW1vdW50OiB2YWx1ZSBleGNlZWRzIHU2NCBtYXgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFtb3VudCBhdCB1NjQgbWF4IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIDJeNjQgLSAxXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGEucmVhZEJpZ1VJbnQ2NExFKDIpLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgY291bnRlciBleGNlZWRpbmcgdTY0IG1heCBvbiBDb25maWd1cmVBY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNicsIC8vIDJeNjRcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogdmFsdWUgZXhjZWVkcyB1NjQgbWF4Lyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=