@decaf-ts/for-fabric 0.5.6 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (826) hide show
  1. package/dist/for-fabric.cjs +2 -3796
  2. package/dist/for-fabric.cjs.map +1 -0
  3. package/dist/for-fabric.js +2 -3900
  4. package/dist/for-fabric.js.map +1 -0
  5. package/lib/cjs/bin/cli.cjs +9 -0
  6. package/lib/cjs/bin/cli.js.map +1 -0
  7. package/lib/cjs/cli-module.cjs +479 -0
  8. package/lib/cjs/cli-module.js.map +1 -0
  9. package/lib/cjs/cli-utils.cjs +309 -0
  10. package/lib/cjs/cli-utils.js.map +1 -0
  11. package/lib/cjs/client/FabricClientAdapter.cjs +1362 -0
  12. package/lib/cjs/client/FabricClientAdapter.js.map +1 -0
  13. package/lib/cjs/client/FabricClientDispatch.cjs +290 -0
  14. package/lib/cjs/client/FabricClientDispatch.js.map +1 -0
  15. package/lib/cjs/client/FabricClientPaginator.cjs +21 -0
  16. package/lib/cjs/client/FabricClientPaginator.js.map +1 -0
  17. package/lib/cjs/client/FabricClientRepository.cjs +259 -0
  18. package/lib/cjs/client/FabricClientRepository.js.map +1 -0
  19. package/lib/cjs/client/FabricClientStatement.cjs +451 -0
  20. package/lib/cjs/client/FabricClientStatement.js.map +1 -0
  21. package/lib/cjs/client/collections/generation.cjs +113 -0
  22. package/lib/cjs/client/collections/generation.js.map +1 -0
  23. package/lib/{client/indexes → cjs/client/collections}/index.cjs +1 -1
  24. package/lib/cjs/client/collections/index.js.map +1 -0
  25. package/lib/cjs/client/constants.cjs +16 -0
  26. package/lib/cjs/client/constants.js.map +1 -0
  27. package/lib/cjs/client/crypto.cjs +368 -0
  28. package/lib/cjs/client/crypto.js.map +1 -0
  29. package/lib/{esm/client/erc20/FabricERC20ClientRepository.d.ts → cjs/client/erc20/FabricERC20ClientRepository.cjs} +139 -30
  30. package/lib/cjs/client/erc20/FabricERC20ClientRepository.js.map +1 -0
  31. package/lib/{client → cjs/client}/erc20/index.cjs +1 -1
  32. package/lib/cjs/client/erc20/index.js.map +1 -0
  33. package/lib/cjs/client/fabric-fs.cjs +234 -0
  34. package/lib/cjs/client/fabric-fs.js.map +1 -0
  35. package/lib/cjs/client/fabric-hsm.cjs +165 -0
  36. package/lib/cjs/client/fabric-hsm.js.map +1 -0
  37. package/lib/cjs/client/ids/id-extraction.cjs +30 -0
  38. package/lib/cjs/client/ids/id-extraction.js.map +1 -0
  39. package/lib/{client → cjs/client}/ids/index.cjs +1 -1
  40. package/lib/cjs/client/ids/index.js.map +1 -0
  41. package/lib/{client → cjs/client}/index.cjs +1 -1
  42. package/lib/cjs/client/index.js.map +1 -0
  43. package/lib/cjs/client/indexes/generation.cjs +95 -0
  44. package/lib/cjs/client/indexes/generation.js.map +1 -0
  45. package/lib/{client/collections → cjs/client/indexes}/index.cjs +1 -1
  46. package/lib/cjs/client/indexes/index.js.map +1 -0
  47. package/lib/{esm/client/logging.d.ts → cjs/client/logging.cjs} +51 -9
  48. package/lib/cjs/client/logging.js.map +1 -0
  49. package/lib/cjs/client/services/FabricEnrollmentService.cjs +363 -0
  50. package/lib/cjs/client/services/FabricEnrollmentService.js.map +1 -0
  51. package/lib/cjs/client/services/FabricIdentityService.cjs +324 -0
  52. package/lib/cjs/client/services/FabricIdentityService.js.map +1 -0
  53. package/lib/cjs/client/services/RegistrationRequestBuilder.cjs +91 -0
  54. package/lib/cjs/client/services/RegistrationRequestBuilder.js.map +1 -0
  55. package/lib/{esm/client/services/constants.d.ts → cjs/client/services/constants.cjs} +10 -5
  56. package/lib/cjs/client/services/constants.js.map +1 -0
  57. package/lib/cjs/client/services/index.cjs +21 -0
  58. package/lib/cjs/client/services/index.js.map +1 -0
  59. package/lib/cjs/client/types.cjs +3 -0
  60. package/lib/cjs/client/types.js.map +1 -0
  61. package/lib/cjs/client/utils.cjs +262 -0
  62. package/lib/cjs/client/utils.js.map +1 -0
  63. package/lib/{contract → cjs/contract}/Address.cjs +1 -1
  64. package/lib/cjs/contract/Address.js.map +1 -0
  65. package/lib/{contract → cjs/contract}/AddressContract.cjs +1 -1
  66. package/lib/cjs/contract/AddressContract.js.map +1 -0
  67. package/lib/{contract → cjs/contract}/AuditContract.cjs +1 -1
  68. package/lib/cjs/contract/AuditContract.js.map +1 -0
  69. package/lib/{contract → cjs/contract}/BatchContract.cjs +1 -1
  70. package/lib/cjs/contract/BatchContract.js.map +1 -0
  71. package/lib/{contract → cjs/contract}/MarketContract.cjs +1 -1
  72. package/lib/cjs/contract/MarketContract.js.map +1 -0
  73. package/lib/{contract → cjs/contract}/OtherAuditContract.cjs +1 -1
  74. package/lib/cjs/contract/OtherAuditContract.js.map +1 -0
  75. package/lib/{contract → cjs/contract}/OtherBatchContract.cjs +1 -1
  76. package/lib/cjs/contract/OtherBatchContract.js.map +1 -0
  77. package/lib/{contract → cjs/contract}/OtherMarketContract.cjs +1 -1
  78. package/lib/cjs/contract/OtherMarketContract.js.map +1 -0
  79. package/lib/{contract → cjs/contract}/OtherProductContract.cjs +1 -1
  80. package/lib/cjs/contract/OtherProductContract.js.map +1 -0
  81. package/lib/{contract → cjs/contract}/OtherProductImageContract.cjs +1 -1
  82. package/lib/cjs/contract/OtherProductImageContract.js.map +1 -0
  83. package/lib/{contract → cjs/contract}/OtherProductSharedContract.cjs +1 -1
  84. package/lib/cjs/contract/OtherProductSharedContract.js.map +1 -0
  85. package/lib/{contract → cjs/contract}/OtherProductStrengthContract.cjs +1 -1
  86. package/lib/cjs/contract/OtherProductStrengthContract.js.map +1 -0
  87. package/lib/{contract → cjs/contract}/Product.cjs +1 -1
  88. package/lib/cjs/contract/Product.js.map +1 -0
  89. package/lib/{contract → cjs/contract}/ProductContract.cjs +1 -1
  90. package/lib/cjs/contract/ProductContract.js.map +1 -0
  91. package/lib/{contract → cjs/contract}/ProductStrengthContract.cjs +1 -1
  92. package/lib/cjs/contract/ProductStrengthContract.js.map +1 -0
  93. package/lib/{contract → cjs/contract}/SegregatedPrivateDocumentContract.cjs +1 -1
  94. package/lib/cjs/contract/SegregatedPrivateDocumentContract.js.map +1 -0
  95. package/lib/{contract → cjs/contract}/SegregatedSharedDocumentContract.cjs +1 -1
  96. package/lib/cjs/contract/SegregatedSharedDocumentContract.js.map +1 -0
  97. package/lib/{contract → cjs/contract}/User.cjs +1 -1
  98. package/lib/cjs/contract/User.js.map +1 -0
  99. package/lib/{contract → cjs/contract}/UserContract.cjs +1 -1
  100. package/lib/cjs/contract/UserContract.js.map +1 -0
  101. package/lib/cjs/contract/index.cjs +36 -0
  102. package/lib/cjs/contract/index.js.map +1 -0
  103. package/lib/cjs/contract/logging-context.cjs +77 -0
  104. package/lib/cjs/contract/logging-context.js.map +1 -0
  105. package/lib/cjs/contract/models/Audit.cjs +106 -0
  106. package/lib/cjs/contract/models/Audit.js.map +1 -0
  107. package/lib/{contract → cjs/contract}/models/BaseIdentifiedModel.cjs +1 -1
  108. package/lib/cjs/contract/models/BaseIdentifiedModel.js.map +1 -0
  109. package/lib/{contract → cjs/contract}/models/BaseModel.cjs +1 -1
  110. package/lib/cjs/contract/models/BaseModel.js.map +1 -0
  111. package/lib/cjs/contract/models/Batch.cjs +174 -0
  112. package/lib/cjs/contract/models/Batch.js.map +1 -0
  113. package/lib/cjs/contract/models/GtinOwner.cjs +59 -0
  114. package/lib/cjs/contract/models/GtinOwner.js.map +1 -0
  115. package/lib/cjs/contract/models/History.cjs +75 -0
  116. package/lib/cjs/contract/models/History.js.map +1 -0
  117. package/lib/cjs/contract/models/Leaflet.cjs +95 -0
  118. package/lib/cjs/contract/models/Leaflet.js.map +1 -0
  119. package/lib/cjs/contract/models/LeafletFile.cjs +58 -0
  120. package/lib/cjs/contract/models/LeafletFile.js.map +1 -0
  121. package/lib/cjs/contract/models/Market.cjs +75 -0
  122. package/lib/cjs/contract/models/Market.js.map +1 -0
  123. package/lib/cjs/contract/models/OtherAudit.cjs +118 -0
  124. package/lib/cjs/contract/models/OtherAudit.js.map +1 -0
  125. package/lib/cjs/contract/models/OtherBatchShared.cjs +127 -0
  126. package/lib/cjs/contract/models/OtherBatchShared.js.map +1 -0
  127. package/lib/cjs/contract/models/OtherLeaflet.cjs +115 -0
  128. package/lib/cjs/contract/models/OtherLeaflet.js.map +1 -0
  129. package/lib/cjs/contract/models/OtherLeafletFile.cjs +65 -0
  130. package/lib/cjs/contract/models/OtherLeafletFile.js.map +1 -0
  131. package/lib/cjs/contract/models/OtherMarket.cjs +84 -0
  132. package/lib/cjs/contract/models/OtherMarket.js.map +1 -0
  133. package/lib/cjs/contract/models/OtherProduct.cjs +77 -0
  134. package/lib/cjs/contract/models/OtherProduct.js.map +1 -0
  135. package/lib/cjs/contract/models/OtherProductImage.cjs +59 -0
  136. package/lib/cjs/contract/models/OtherProductImage.js.map +1 -0
  137. package/lib/cjs/contract/models/OtherProductShared.cjs +99 -0
  138. package/lib/cjs/contract/models/OtherProductShared.js.map +1 -0
  139. package/lib/cjs/contract/models/OtherProductStrength.cjs +87 -0
  140. package/lib/cjs/contract/models/OtherProductStrength.js.map +1 -0
  141. package/lib/cjs/contract/models/Product.cjs +78 -0
  142. package/lib/cjs/contract/models/Product.js.map +1 -0
  143. package/lib/cjs/contract/models/ProductStrength.cjs +78 -0
  144. package/lib/cjs/contract/models/ProductStrength.js.map +1 -0
  145. package/lib/{contract → cjs/contract}/models/SegregatedDocument.cjs +1 -1
  146. package/lib/cjs/contract/models/SegregatedDocument.js.map +1 -0
  147. package/lib/cjs/contract/models/constants.cjs +30 -0
  148. package/lib/cjs/contract/models/constants.js.map +1 -0
  149. package/lib/cjs/contract/models/decorators-private.cjs +158 -0
  150. package/lib/cjs/contract/models/decorators-private.js.map +1 -0
  151. package/lib/cjs/contract/models/decorators.cjs +182 -0
  152. package/lib/cjs/contract/models/decorators.js.map +1 -0
  153. package/lib/cjs/contract/models/gtin.cjs +88 -0
  154. package/lib/cjs/contract/models/gtin.js.map +1 -0
  155. package/lib/cjs/contract/models/history-dec.cjs +83 -0
  156. package/lib/cjs/contract/models/history-dec.js.map +1 -0
  157. package/lib/cjs/contracts/ContractAdapter.cjs +1193 -0
  158. package/lib/cjs/contracts/ContractAdapter.js.map +1 -0
  159. package/lib/cjs/contracts/ContractContext.cjs +157 -0
  160. package/lib/cjs/contracts/ContractContext.js.map +1 -0
  161. package/lib/cjs/contracts/FabricContractDispatch.cjs +79 -0
  162. package/lib/cjs/contracts/FabricContractDispatch.js.map +1 -0
  163. package/lib/{esm/contracts/FabricContractPaginator.d.ts → cjs/contracts/FabricContractPaginator.cjs} +77 -9
  164. package/lib/cjs/contracts/FabricContractPaginator.js.map +1 -0
  165. package/lib/cjs/contracts/FabricContractRepository.cjs +322 -0
  166. package/lib/cjs/contracts/FabricContractRepository.js.map +1 -0
  167. package/lib/{esm/contracts/FabricContractRepositoryObservableHandler.d.ts → cjs/contracts/FabricContractRepositoryObservableHandler.cjs} +42 -8
  168. package/lib/cjs/contracts/FabricContractRepositoryObservableHandler.js.map +1 -0
  169. package/lib/cjs/contracts/FabricContractSequence.cjs +338 -0
  170. package/lib/cjs/contracts/FabricContractSequence.js.map +1 -0
  171. package/lib/cjs/contracts/FabricContractStatement.cjs +180 -0
  172. package/lib/cjs/contracts/FabricContractStatement.js.map +1 -0
  173. package/lib/cjs/contracts/MigrationContract.cjs +147 -0
  174. package/lib/cjs/contracts/MigrationContract.js.map +1 -0
  175. package/lib/{contracts → cjs/contracts}/PrivateSequence.cjs +1 -1
  176. package/lib/cjs/contracts/PrivateSequence.js.map +1 -0
  177. package/lib/cjs/contracts/auth/decorators.cjs +84 -0
  178. package/lib/cjs/contracts/auth/decorators.js.map +1 -0
  179. package/lib/{contracts → cjs/contracts}/auth/index.cjs +1 -1
  180. package/lib/cjs/contracts/auth/index.js.map +1 -0
  181. package/lib/cjs/contracts/crud/crud-contract.cjs +416 -0
  182. package/lib/cjs/contracts/crud/crud-contract.js.map +1 -0
  183. package/lib/{contracts → cjs/contracts}/crud/index.cjs +1 -1
  184. package/lib/cjs/contracts/crud/index.js.map +1 -0
  185. package/lib/cjs/contracts/crud/serialized-crud-contract.cjs +284 -0
  186. package/lib/cjs/contracts/crud/serialized-crud-contract.js.map +1 -0
  187. package/lib/cjs/contracts/erc20/erc20contract.cjs +581 -0
  188. package/lib/cjs/contracts/erc20/erc20contract.js.map +1 -0
  189. package/lib/cjs/contracts/erc20/index.cjs +21 -0
  190. package/lib/cjs/contracts/erc20/index.js.map +1 -0
  191. package/lib/cjs/contracts/erc20/models.cjs +209 -0
  192. package/lib/cjs/contracts/erc20/models.js.map +1 -0
  193. package/lib/{contracts → cjs/contracts}/index.cjs +1 -1
  194. package/lib/cjs/contracts/index.js.map +1 -0
  195. package/lib/cjs/contracts/logging.cjs +118 -0
  196. package/lib/cjs/contracts/logging.js.map +1 -0
  197. package/lib/cjs/contracts/overrides.cjs +8 -0
  198. package/lib/cjs/contracts/overrides.js.map +1 -0
  199. package/lib/cjs/contracts/types.cjs +3 -0
  200. package/lib/cjs/contracts/types.js.map +1 -0
  201. package/lib/cjs/contracts/uuid.cjs +75 -0
  202. package/lib/cjs/contracts/uuid.js.map +1 -0
  203. package/lib/{index.cjs → cjs/index.cjs} +1 -1
  204. package/lib/cjs/index.js.map +1 -0
  205. package/lib/{shared/ClientSerializer.d.ts → cjs/shared/ClientSerializer.cjs} +35 -6
  206. package/lib/cjs/shared/ClientSerializer.js.map +1 -0
  207. package/lib/cjs/shared/DeterministicSerializer.cjs +106 -0
  208. package/lib/cjs/shared/DeterministicSerializer.js.map +1 -0
  209. package/lib/cjs/shared/SimpleDeterministicSerializer.cjs +69 -0
  210. package/lib/cjs/shared/SimpleDeterministicSerializer.js.map +1 -0
  211. package/lib/{shared/constants.d.ts → cjs/shared/constants.cjs} +18 -12
  212. package/lib/cjs/shared/constants.js.map +1 -0
  213. package/lib/cjs/shared/decorators.cjs +595 -0
  214. package/lib/cjs/shared/decorators.js.map +1 -0
  215. package/lib/{shared/erc20/erc20-constants.d.ts → cjs/shared/erc20/erc20-constants.cjs} +9 -4
  216. package/lib/cjs/shared/erc20/erc20-constants.js.map +1 -0
  217. package/lib/{shared → cjs/shared}/erc20/index.cjs +1 -1
  218. package/lib/cjs/shared/erc20/index.js.map +1 -0
  219. package/lib/cjs/shared/errors.cjs +190 -0
  220. package/lib/cjs/shared/errors.js.map +1 -0
  221. package/lib/{shared/events.d.ts → cjs/shared/events.cjs} +21 -7
  222. package/lib/cjs/shared/events.js.map +1 -0
  223. package/lib/cjs/shared/fabric-types.cjs +3 -0
  224. package/lib/cjs/shared/fabric-types.js.map +1 -0
  225. package/lib/{shared → cjs/shared}/index.cjs +1 -1
  226. package/lib/cjs/shared/index.js.map +1 -0
  227. package/lib/cjs/shared/interfaces/Checkable.cjs +3 -0
  228. package/lib/cjs/shared/interfaces/Checkable.js.map +1 -0
  229. package/lib/{shared → cjs/shared}/interfaces/index.cjs +1 -1
  230. package/lib/cjs/shared/interfaces/index.js.map +1 -0
  231. package/lib/cjs/shared/math.cjs +66 -0
  232. package/lib/cjs/shared/math.js.map +1 -0
  233. package/lib/{shared → cjs/shared}/model/FabricBaseModel.cjs +1 -1
  234. package/lib/cjs/shared/model/FabricBaseModel.js.map +1 -0
  235. package/lib/{shared → cjs/shared}/model/FabricIdentifiedBaseModel.cjs +1 -1
  236. package/lib/cjs/shared/model/FabricIdentifiedBaseModel.js.map +1 -0
  237. package/lib/cjs/shared/model/Identity.cjs +71 -0
  238. package/lib/cjs/shared/model/Identity.js.map +1 -0
  239. package/lib/cjs/shared/model/IdentityCredentials.cjs +66 -0
  240. package/lib/cjs/shared/model/IdentityCredentials.js.map +1 -0
  241. package/lib/cjs/shared/model/index.cjs +21 -0
  242. package/lib/cjs/shared/model/index.js.map +1 -0
  243. package/lib/cjs/shared/overrides/Model.cjs +4 -0
  244. package/lib/cjs/shared/overrides/Model.js.map +1 -0
  245. package/lib/{shared → cjs/shared}/overrides/index.cjs +1 -1
  246. package/lib/cjs/shared/overrides/index.js.map +1 -0
  247. package/lib/cjs/shared/overrides/overrides.cjs +93 -0
  248. package/lib/cjs/shared/overrides/overrides.js.map +1 -0
  249. package/lib/cjs/shared/types.cjs +3 -0
  250. package/lib/cjs/shared/types.js.map +1 -0
  251. package/lib/cjs/version.cjs +8 -0
  252. package/lib/cjs/version.js.map +1 -0
  253. package/lib/esm/bin/cli.js +1 -1
  254. package/lib/esm/bin/cli.js.map +1 -0
  255. package/lib/esm/cli-module.js +1 -1
  256. package/lib/esm/cli-module.js.map +1 -0
  257. package/lib/esm/cli-utils.js +1 -1
  258. package/lib/esm/cli-utils.js.map +1 -0
  259. package/lib/esm/client/FabricClientAdapter.js +1 -1
  260. package/lib/esm/client/FabricClientAdapter.js.map +1 -0
  261. package/lib/esm/client/FabricClientDispatch.js +1 -1
  262. package/lib/esm/client/FabricClientDispatch.js.map +1 -0
  263. package/lib/esm/client/FabricClientPaginator.js +1 -1
  264. package/lib/esm/client/FabricClientPaginator.js.map +1 -0
  265. package/lib/esm/client/FabricClientRepository.js +1 -1
  266. package/lib/esm/client/FabricClientRepository.js.map +1 -0
  267. package/lib/esm/client/FabricClientStatement.js +1 -1
  268. package/lib/esm/client/FabricClientStatement.js.map +1 -0
  269. package/lib/esm/client/collections/generation.js +1 -1
  270. package/lib/esm/client/collections/generation.js.map +1 -0
  271. package/lib/esm/client/collections/index.js +1 -1
  272. package/lib/esm/client/collections/index.js.map +1 -0
  273. package/lib/esm/client/constants.js +1 -1
  274. package/lib/esm/client/constants.js.map +1 -0
  275. package/lib/esm/client/crypto.js +1 -1
  276. package/lib/esm/client/crypto.js.map +1 -0
  277. package/lib/esm/client/erc20/FabricERC20ClientRepository.js +1 -1
  278. package/lib/esm/client/erc20/FabricERC20ClientRepository.js.map +1 -0
  279. package/lib/esm/client/erc20/index.js +1 -1
  280. package/lib/esm/client/erc20/index.js.map +1 -0
  281. package/lib/esm/client/fabric-fs.js +1 -1
  282. package/lib/esm/client/fabric-fs.js.map +1 -0
  283. package/lib/esm/client/fabric-hsm.js +1 -1
  284. package/lib/esm/client/fabric-hsm.js.map +1 -0
  285. package/lib/esm/client/ids/id-extraction.js +1 -1
  286. package/lib/esm/client/ids/id-extraction.js.map +1 -0
  287. package/lib/esm/client/ids/index.js +1 -1
  288. package/lib/esm/client/ids/index.js.map +1 -0
  289. package/lib/esm/client/index.js +1 -1
  290. package/lib/esm/client/index.js.map +1 -0
  291. package/lib/esm/client/indexes/generation.js +1 -1
  292. package/lib/esm/client/indexes/generation.js.map +1 -0
  293. package/lib/esm/client/indexes/index.js +1 -1
  294. package/lib/esm/client/indexes/index.js.map +1 -0
  295. package/lib/esm/client/logging.js +1 -1
  296. package/lib/esm/client/logging.js.map +1 -0
  297. package/lib/esm/client/services/FabricEnrollmentService.js +1 -1
  298. package/lib/esm/client/services/FabricEnrollmentService.js.map +1 -0
  299. package/lib/esm/client/services/FabricIdentityService.js +1 -1
  300. package/lib/esm/client/services/FabricIdentityService.js.map +1 -0
  301. package/lib/esm/client/services/RegistrationRequestBuilder.js +1 -1
  302. package/lib/esm/client/services/RegistrationRequestBuilder.js.map +1 -0
  303. package/lib/esm/client/services/constants.js +1 -1
  304. package/lib/esm/client/services/constants.js.map +1 -0
  305. package/lib/esm/client/services/index.js +1 -1
  306. package/lib/esm/client/services/index.js.map +1 -0
  307. package/lib/esm/client/types.js +1 -1
  308. package/lib/esm/client/types.js.map +1 -0
  309. package/lib/esm/client/utils.js +1 -1
  310. package/lib/esm/client/utils.js.map +1 -0
  311. package/lib/esm/contract/Address.js +1 -1
  312. package/lib/esm/contract/Address.js.map +1 -0
  313. package/lib/esm/contract/AddressContract.js +1 -1
  314. package/lib/esm/contract/AddressContract.js.map +1 -0
  315. package/lib/esm/contract/AuditContract.js +1 -1
  316. package/lib/esm/contract/AuditContract.js.map +1 -0
  317. package/lib/esm/contract/BatchContract.js +1 -1
  318. package/lib/esm/contract/BatchContract.js.map +1 -0
  319. package/lib/esm/contract/MarketContract.js +1 -1
  320. package/lib/esm/contract/MarketContract.js.map +1 -0
  321. package/lib/esm/contract/OtherAuditContract.js +1 -1
  322. package/lib/esm/contract/OtherAuditContract.js.map +1 -0
  323. package/lib/esm/contract/OtherBatchContract.js +1 -1
  324. package/lib/esm/contract/OtherBatchContract.js.map +1 -0
  325. package/lib/esm/contract/OtherMarketContract.js +1 -1
  326. package/lib/esm/contract/OtherMarketContract.js.map +1 -0
  327. package/lib/esm/contract/OtherProductContract.js +1 -1
  328. package/lib/esm/contract/OtherProductContract.js.map +1 -0
  329. package/lib/esm/contract/OtherProductImageContract.js +1 -1
  330. package/lib/esm/contract/OtherProductImageContract.js.map +1 -0
  331. package/lib/esm/contract/OtherProductSharedContract.js +1 -1
  332. package/lib/esm/contract/OtherProductSharedContract.js.map +1 -0
  333. package/lib/esm/contract/OtherProductStrengthContract.js +1 -1
  334. package/lib/esm/contract/OtherProductStrengthContract.js.map +1 -0
  335. package/lib/esm/contract/Product.js +1 -1
  336. package/lib/esm/contract/Product.js.map +1 -0
  337. package/lib/esm/contract/ProductContract.js +1 -1
  338. package/lib/esm/contract/ProductContract.js.map +1 -0
  339. package/lib/esm/contract/ProductStrengthContract.js +1 -1
  340. package/lib/esm/contract/ProductStrengthContract.js.map +1 -0
  341. package/lib/esm/contract/SegregatedPrivateDocumentContract.js +1 -1
  342. package/lib/esm/contract/SegregatedPrivateDocumentContract.js.map +1 -0
  343. package/lib/esm/contract/SegregatedSharedDocumentContract.js +1 -1
  344. package/lib/esm/contract/SegregatedSharedDocumentContract.js.map +1 -0
  345. package/lib/esm/contract/User.js +1 -1
  346. package/lib/esm/contract/User.js.map +1 -0
  347. package/lib/esm/contract/UserContract.js +1 -1
  348. package/lib/esm/contract/UserContract.js.map +1 -0
  349. package/lib/esm/contract/index.js +1 -1
  350. package/lib/esm/contract/index.js.map +1 -0
  351. package/lib/esm/contract/logging-context.js +1 -1
  352. package/lib/esm/contract/logging-context.js.map +1 -0
  353. package/lib/esm/contract/models/Audit.js +1 -1
  354. package/lib/esm/contract/models/Audit.js.map +1 -0
  355. package/lib/esm/contract/models/BaseIdentifiedModel.js +1 -1
  356. package/lib/esm/contract/models/BaseIdentifiedModel.js.map +1 -0
  357. package/lib/esm/contract/models/BaseModel.js +1 -1
  358. package/lib/esm/contract/models/BaseModel.js.map +1 -0
  359. package/lib/esm/contract/models/Batch.js +1 -1
  360. package/lib/esm/contract/models/Batch.js.map +1 -0
  361. package/lib/esm/contract/models/GtinOwner.js +1 -1
  362. package/lib/esm/contract/models/GtinOwner.js.map +1 -0
  363. package/lib/esm/contract/models/History.js +1 -1
  364. package/lib/esm/contract/models/History.js.map +1 -0
  365. package/lib/esm/contract/models/Leaflet.js +1 -1
  366. package/lib/esm/contract/models/Leaflet.js.map +1 -0
  367. package/lib/esm/contract/models/LeafletFile.js +1 -1
  368. package/lib/esm/contract/models/LeafletFile.js.map +1 -0
  369. package/lib/esm/contract/models/Market.js +1 -1
  370. package/lib/esm/contract/models/Market.js.map +1 -0
  371. package/lib/esm/contract/models/OtherAudit.js +1 -1
  372. package/lib/esm/contract/models/OtherAudit.js.map +1 -0
  373. package/lib/esm/contract/models/OtherBatchShared.js +1 -1
  374. package/lib/esm/contract/models/OtherBatchShared.js.map +1 -0
  375. package/lib/esm/contract/models/OtherLeaflet.js +1 -1
  376. package/lib/esm/contract/models/OtherLeaflet.js.map +1 -0
  377. package/lib/esm/contract/models/OtherLeafletFile.js +1 -1
  378. package/lib/esm/contract/models/OtherLeafletFile.js.map +1 -0
  379. package/lib/esm/contract/models/OtherMarket.js +1 -1
  380. package/lib/esm/contract/models/OtherMarket.js.map +1 -0
  381. package/lib/esm/contract/models/OtherProduct.js +1 -1
  382. package/lib/esm/contract/models/OtherProduct.js.map +1 -0
  383. package/lib/esm/contract/models/OtherProductImage.js +1 -1
  384. package/lib/esm/contract/models/OtherProductImage.js.map +1 -0
  385. package/lib/esm/contract/models/OtherProductShared.js +1 -1
  386. package/lib/esm/contract/models/OtherProductShared.js.map +1 -0
  387. package/lib/esm/contract/models/OtherProductStrength.js +1 -1
  388. package/lib/esm/contract/models/OtherProductStrength.js.map +1 -0
  389. package/lib/esm/contract/models/Product.js +1 -1
  390. package/lib/esm/contract/models/Product.js.map +1 -0
  391. package/lib/esm/contract/models/ProductStrength.js +1 -1
  392. package/lib/esm/contract/models/ProductStrength.js.map +1 -0
  393. package/lib/esm/contract/models/SegregatedDocument.js +1 -1
  394. package/lib/esm/contract/models/SegregatedDocument.js.map +1 -0
  395. package/lib/esm/contract/models/constants.js +1 -1
  396. package/lib/esm/contract/models/constants.js.map +1 -0
  397. package/lib/esm/contract/models/decorators-private.js +1 -1
  398. package/lib/esm/contract/models/decorators-private.js.map +1 -0
  399. package/lib/esm/contract/models/decorators.js +1 -1
  400. package/lib/esm/contract/models/decorators.js.map +1 -0
  401. package/lib/esm/contract/models/gtin.js +1 -1
  402. package/lib/esm/contract/models/gtin.js.map +1 -0
  403. package/lib/esm/contract/models/history-dec.js +1 -1
  404. package/lib/esm/contract/models/history-dec.js.map +1 -0
  405. package/lib/esm/contracts/ContractAdapter.js +1 -1
  406. package/lib/esm/contracts/ContractAdapter.js.map +1 -0
  407. package/lib/esm/contracts/ContractContext.js +1 -1
  408. package/lib/esm/contracts/ContractContext.js.map +1 -0
  409. package/lib/esm/contracts/FabricContractDispatch.js +1 -1
  410. package/lib/esm/contracts/FabricContractDispatch.js.map +1 -0
  411. package/lib/esm/contracts/FabricContractPaginator.js +1 -1
  412. package/lib/esm/contracts/FabricContractPaginator.js.map +1 -0
  413. package/lib/esm/contracts/FabricContractRepository.js +1 -1
  414. package/lib/esm/contracts/FabricContractRepository.js.map +1 -0
  415. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +1 -1
  416. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js.map +1 -0
  417. package/lib/esm/contracts/FabricContractSequence.js +1 -1
  418. package/lib/esm/contracts/FabricContractSequence.js.map +1 -0
  419. package/lib/esm/contracts/FabricContractStatement.js +1 -1
  420. package/lib/esm/contracts/FabricContractStatement.js.map +1 -0
  421. package/lib/esm/contracts/MigrationContract.js +1 -1
  422. package/lib/esm/contracts/MigrationContract.js.map +1 -0
  423. package/lib/esm/contracts/PrivateSequence.js +1 -1
  424. package/lib/esm/contracts/PrivateSequence.js.map +1 -0
  425. package/lib/esm/contracts/auth/decorators.js +1 -1
  426. package/lib/esm/contracts/auth/decorators.js.map +1 -0
  427. package/lib/esm/contracts/auth/index.js +1 -1
  428. package/lib/esm/contracts/auth/index.js.map +1 -0
  429. package/lib/esm/contracts/crud/crud-contract.js +1 -1
  430. package/lib/esm/contracts/crud/crud-contract.js.map +1 -0
  431. package/lib/esm/contracts/crud/index.js +1 -1
  432. package/lib/esm/contracts/crud/index.js.map +1 -0
  433. package/lib/esm/contracts/crud/serialized-crud-contract.js +1 -1
  434. package/lib/esm/contracts/crud/serialized-crud-contract.js.map +1 -0
  435. package/lib/esm/contracts/erc20/erc20contract.js +1 -1
  436. package/lib/esm/contracts/erc20/erc20contract.js.map +1 -0
  437. package/lib/esm/contracts/erc20/index.js +1 -1
  438. package/lib/esm/contracts/erc20/index.js.map +1 -0
  439. package/lib/esm/contracts/erc20/models.js +1 -1
  440. package/lib/esm/contracts/erc20/models.js.map +1 -0
  441. package/lib/esm/contracts/index.js +1 -1
  442. package/lib/esm/contracts/index.js.map +1 -0
  443. package/lib/esm/contracts/logging.js +1 -1
  444. package/lib/esm/contracts/logging.js.map +1 -0
  445. package/lib/esm/contracts/overrides.js +1 -1
  446. package/lib/esm/contracts/overrides.js.map +1 -0
  447. package/lib/esm/contracts/types.js +1 -1
  448. package/lib/esm/contracts/types.js.map +1 -0
  449. package/lib/esm/contracts/uuid.js +1 -1
  450. package/lib/esm/contracts/uuid.js.map +1 -0
  451. package/lib/esm/index.js +1 -1
  452. package/lib/esm/index.js.map +1 -0
  453. package/lib/esm/shared/ClientSerializer.js +1 -1
  454. package/lib/esm/shared/ClientSerializer.js.map +1 -0
  455. package/lib/esm/shared/DeterministicSerializer.js +1 -1
  456. package/lib/esm/shared/DeterministicSerializer.js.map +1 -0
  457. package/lib/esm/shared/SimpleDeterministicSerializer.js +1 -1
  458. package/lib/esm/shared/SimpleDeterministicSerializer.js.map +1 -0
  459. package/lib/esm/shared/constants.js +1 -1
  460. package/lib/esm/shared/constants.js.map +1 -0
  461. package/lib/esm/shared/decorators.js +5 -3
  462. package/lib/esm/shared/decorators.js.map +1 -0
  463. package/lib/esm/shared/erc20/erc20-constants.js +1 -1
  464. package/lib/esm/shared/erc20/erc20-constants.js.map +1 -0
  465. package/lib/esm/shared/erc20/index.js +1 -1
  466. package/lib/esm/shared/erc20/index.js.map +1 -0
  467. package/lib/esm/shared/errors.js +1 -1
  468. package/lib/esm/shared/errors.js.map +1 -0
  469. package/lib/esm/shared/events.js +1 -1
  470. package/lib/esm/shared/events.js.map +1 -0
  471. package/lib/esm/shared/fabric-types.js +1 -1
  472. package/lib/esm/shared/fabric-types.js.map +1 -0
  473. package/lib/esm/shared/index.js +1 -1
  474. package/lib/esm/shared/index.js.map +1 -0
  475. package/lib/esm/shared/interfaces/Checkable.js +1 -1
  476. package/lib/esm/shared/interfaces/Checkable.js.map +1 -0
  477. package/lib/esm/shared/interfaces/index.js +1 -1
  478. package/lib/esm/shared/interfaces/index.js.map +1 -0
  479. package/lib/esm/shared/math.js +1 -1
  480. package/lib/esm/shared/math.js.map +1 -0
  481. package/lib/esm/shared/model/FabricBaseModel.js +1 -1
  482. package/lib/esm/shared/model/FabricBaseModel.js.map +1 -0
  483. package/lib/esm/shared/model/FabricIdentifiedBaseModel.js +1 -1
  484. package/lib/esm/shared/model/FabricIdentifiedBaseModel.js.map +1 -0
  485. package/lib/esm/shared/model/Identity.js +1 -1
  486. package/lib/esm/shared/model/Identity.js.map +1 -0
  487. package/lib/esm/shared/model/IdentityCredentials.js +1 -1
  488. package/lib/esm/shared/model/IdentityCredentials.js.map +1 -0
  489. package/lib/esm/shared/model/index.js +1 -1
  490. package/lib/esm/shared/model/index.js.map +1 -0
  491. package/lib/esm/shared/overrides/Model.js +1 -1
  492. package/lib/esm/shared/overrides/Model.js.map +1 -0
  493. package/lib/esm/shared/overrides/index.js +1 -1
  494. package/lib/esm/shared/overrides/index.js.map +1 -0
  495. package/lib/esm/shared/overrides/overrides.js +1 -1
  496. package/lib/esm/shared/overrides/overrides.js.map +1 -0
  497. package/lib/esm/shared/types.js +1 -1
  498. package/lib/esm/shared/types.js.map +1 -0
  499. package/lib/esm/version.js +2 -2
  500. package/lib/esm/version.js.map +1 -0
  501. package/lib/{esm → types}/version.d.ts +1 -1
  502. package/package.json +22 -18
  503. package/lib/bin/cli.cjs +0 -9
  504. package/lib/cli-module.cjs +0 -479
  505. package/lib/cli-utils.cjs +0 -309
  506. package/lib/client/FabricClientAdapter.cjs +0 -1362
  507. package/lib/client/FabricClientDispatch.cjs +0 -290
  508. package/lib/client/FabricClientPaginator.cjs +0 -21
  509. package/lib/client/FabricClientRepository.cjs +0 -259
  510. package/lib/client/FabricClientStatement.cjs +0 -451
  511. package/lib/client/collections/generation.cjs +0 -113
  512. package/lib/client/constants.cjs +0 -16
  513. package/lib/client/crypto.cjs +0 -368
  514. package/lib/client/erc20/FabricERC20ClientRepository.cjs +0 -363
  515. package/lib/client/fabric-fs.cjs +0 -234
  516. package/lib/client/fabric-hsm.cjs +0 -165
  517. package/lib/client/ids/id-extraction.cjs +0 -30
  518. package/lib/client/indexes/generation.cjs +0 -95
  519. package/lib/client/logging.cjs +0 -102
  520. package/lib/client/services/FabricEnrollmentService.cjs +0 -363
  521. package/lib/client/services/FabricIdentityService.cjs +0 -324
  522. package/lib/client/services/RegistrationRequestBuilder.cjs +0 -91
  523. package/lib/client/services/constants.cjs +0 -20
  524. package/lib/client/services/index.cjs +0 -21
  525. package/lib/client/types.cjs +0 -3
  526. package/lib/client/utils.cjs +0 -262
  527. package/lib/contract/index.cjs +0 -36
  528. package/lib/contract/logging-context.cjs +0 -77
  529. package/lib/contract/models/Audit.cjs +0 -106
  530. package/lib/contract/models/Batch.cjs +0 -174
  531. package/lib/contract/models/GtinOwner.cjs +0 -59
  532. package/lib/contract/models/History.cjs +0 -75
  533. package/lib/contract/models/Leaflet.cjs +0 -95
  534. package/lib/contract/models/LeafletFile.cjs +0 -58
  535. package/lib/contract/models/Market.cjs +0 -75
  536. package/lib/contract/models/OtherAudit.cjs +0 -118
  537. package/lib/contract/models/OtherBatchShared.cjs +0 -127
  538. package/lib/contract/models/OtherLeaflet.cjs +0 -115
  539. package/lib/contract/models/OtherLeafletFile.cjs +0 -65
  540. package/lib/contract/models/OtherMarket.cjs +0 -84
  541. package/lib/contract/models/OtherProduct.cjs +0 -77
  542. package/lib/contract/models/OtherProductImage.cjs +0 -59
  543. package/lib/contract/models/OtherProductShared.cjs +0 -99
  544. package/lib/contract/models/OtherProductStrength.cjs +0 -87
  545. package/lib/contract/models/Product.cjs +0 -78
  546. package/lib/contract/models/ProductStrength.cjs +0 -78
  547. package/lib/contract/models/constants.cjs +0 -30
  548. package/lib/contract/models/decorators-private.cjs +0 -158
  549. package/lib/contract/models/decorators.cjs +0 -182
  550. package/lib/contract/models/gtin.cjs +0 -88
  551. package/lib/contract/models/history-dec.cjs +0 -83
  552. package/lib/contracts/ContractAdapter.cjs +0 -1193
  553. package/lib/contracts/ContractContext.cjs +0 -157
  554. package/lib/contracts/FabricContractDispatch.cjs +0 -79
  555. package/lib/contracts/FabricContractPaginator.cjs +0 -173
  556. package/lib/contracts/FabricContractRepository.cjs +0 -322
  557. package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +0 -96
  558. package/lib/contracts/FabricContractSequence.cjs +0 -338
  559. package/lib/contracts/FabricContractStatement.cjs +0 -180
  560. package/lib/contracts/MigrationContract.cjs +0 -147
  561. package/lib/contracts/auth/decorators.cjs +0 -84
  562. package/lib/contracts/crud/crud-contract.cjs +0 -416
  563. package/lib/contracts/crud/serialized-crud-contract.cjs +0 -284
  564. package/lib/contracts/erc20/erc20contract.cjs +0 -581
  565. package/lib/contracts/erc20/index.cjs +0 -21
  566. package/lib/contracts/erc20/models.cjs +0 -209
  567. package/lib/contracts/logging.cjs +0 -118
  568. package/lib/contracts/overrides.cjs +0 -8
  569. package/lib/contracts/types.cjs +0 -3
  570. package/lib/contracts/uuid.cjs +0 -75
  571. package/lib/esm/bin/cli.d.ts +0 -1
  572. package/lib/esm/cli-module.d.ts +0 -3
  573. package/lib/esm/cli-utils.d.ts +0 -21
  574. package/lib/esm/client/FabricClientAdapter.d.ts +0 -404
  575. package/lib/esm/client/FabricClientDispatch.d.ts +0 -133
  576. package/lib/esm/client/FabricClientPaginator.d.ts +0 -12
  577. package/lib/esm/client/FabricClientRepository.d.ts +0 -71
  578. package/lib/esm/client/FabricClientStatement.d.ts +0 -64
  579. package/lib/esm/client/collections/generation.d.ts +0 -46
  580. package/lib/esm/client/collections/index.d.ts +0 -1
  581. package/lib/esm/client/constants.d.ts +0 -2
  582. package/lib/esm/client/crypto.d.ts +0 -107
  583. package/lib/esm/client/erc20/index.d.ts +0 -1
  584. package/lib/esm/client/fabric-fs.d.ts +0 -92
  585. package/lib/esm/client/fabric-hsm.d.ts +0 -24
  586. package/lib/esm/client/ids/id-extraction.d.ts +0 -4
  587. package/lib/esm/client/ids/index.d.ts +0 -1
  588. package/lib/esm/client/index.d.ts +0 -23
  589. package/lib/esm/client/indexes/generation.d.ts +0 -10
  590. package/lib/esm/client/indexes/index.d.ts +0 -1
  591. package/lib/esm/client/services/FabricEnrollmentService.d.ts +0 -176
  592. package/lib/esm/client/services/FabricIdentityService.d.ts +0 -98
  593. package/lib/esm/client/services/RegistrationRequestBuilder.d.ts +0 -19
  594. package/lib/esm/client/services/index.d.ts +0 -4
  595. package/lib/esm/client/types.d.ts +0 -20
  596. package/lib/esm/client/utils.d.ts +0 -71
  597. package/lib/esm/contract/Address.d.ts +0 -13
  598. package/lib/esm/contract/AddressContract.d.ts +0 -5
  599. package/lib/esm/contract/AuditContract.d.ts +0 -5
  600. package/lib/esm/contract/BatchContract.d.ts +0 -5
  601. package/lib/esm/contract/MarketContract.d.ts +0 -5
  602. package/lib/esm/contract/OtherAuditContract.d.ts +0 -5
  603. package/lib/esm/contract/OtherBatchContract.d.ts +0 -5
  604. package/lib/esm/contract/OtherMarketContract.d.ts +0 -5
  605. package/lib/esm/contract/OtherProductContract.d.ts +0 -5
  606. package/lib/esm/contract/OtherProductImageContract.d.ts +0 -5
  607. package/lib/esm/contract/OtherProductSharedContract.d.ts +0 -5
  608. package/lib/esm/contract/OtherProductStrengthContract.d.ts +0 -5
  609. package/lib/esm/contract/Product.d.ts +0 -7
  610. package/lib/esm/contract/ProductContract.d.ts +0 -5
  611. package/lib/esm/contract/ProductStrengthContract.d.ts +0 -5
  612. package/lib/esm/contract/SegregatedPrivateDocumentContract.d.ts +0 -5
  613. package/lib/esm/contract/SegregatedSharedDocumentContract.d.ts +0 -5
  614. package/lib/esm/contract/User.d.ts +0 -7
  615. package/lib/esm/contract/UserContract.d.ts +0 -5
  616. package/lib/esm/contract/index.d.ts +0 -2
  617. package/lib/esm/contract/logging-context.d.ts +0 -8
  618. package/lib/esm/contract/models/Audit.d.ts +0 -13
  619. package/lib/esm/contract/models/BaseIdentifiedModel.d.ts +0 -7
  620. package/lib/esm/contract/models/BaseModel.d.ts +0 -7
  621. package/lib/esm/contract/models/Batch.d.ts +0 -18
  622. package/lib/esm/contract/models/GtinOwner.d.ts +0 -8
  623. package/lib/esm/contract/models/History.d.ts +0 -9
  624. package/lib/esm/contract/models/Leaflet.d.ts +0 -12
  625. package/lib/esm/contract/models/LeafletFile.d.ts +0 -9
  626. package/lib/esm/contract/models/Market.d.ts +0 -12
  627. package/lib/esm/contract/models/OtherAudit.d.ts +0 -15
  628. package/lib/esm/contract/models/OtherBatchShared.d.ts +0 -18
  629. package/lib/esm/contract/models/OtherLeaflet.d.ts +0 -16
  630. package/lib/esm/contract/models/OtherLeafletFile.d.ts +0 -10
  631. package/lib/esm/contract/models/OtherMarket.d.ts +0 -13
  632. package/lib/esm/contract/models/OtherProduct.d.ts +0 -12
  633. package/lib/esm/contract/models/OtherProductImage.d.ts +0 -9
  634. package/lib/esm/contract/models/OtherProductShared.d.ts +0 -18
  635. package/lib/esm/contract/models/OtherProductStrength.d.ts +0 -12
  636. package/lib/esm/contract/models/Product.d.ts +0 -15
  637. package/lib/esm/contract/models/ProductStrength.d.ts +0 -11
  638. package/lib/esm/contract/models/SegregatedDocument.d.ts +0 -18
  639. package/lib/esm/contract/models/constants.d.ts +0 -24
  640. package/lib/esm/contract/models/decorators-private.d.ts +0 -16
  641. package/lib/esm/contract/models/decorators.d.ts +0 -28
  642. package/lib/esm/contract/models/gtin.d.ts +0 -8
  643. package/lib/esm/contract/models/history-dec.d.ts +0 -6
  644. package/lib/esm/contracts/ContractAdapter.d.ts +0 -287
  645. package/lib/esm/contracts/ContractContext.d.ts +0 -89
  646. package/lib/esm/contracts/FabricContractDispatch.d.ts +0 -7
  647. package/lib/esm/contracts/FabricContractRepository.d.ts +0 -119
  648. package/lib/esm/contracts/FabricContractSequence.d.ts +0 -87
  649. package/lib/esm/contracts/FabricContractStatement.d.ts +0 -36
  650. package/lib/esm/contracts/MigrationContract.d.ts +0 -22
  651. package/lib/esm/contracts/PrivateSequence.d.ts +0 -15
  652. package/lib/esm/contracts/auth/decorators.d.ts +0 -6
  653. package/lib/esm/contracts/auth/index.d.ts +0 -1
  654. package/lib/esm/contracts/crud/crud-contract.d.ts +0 -199
  655. package/lib/esm/contracts/crud/index.d.ts +0 -2
  656. package/lib/esm/contracts/crud/serialized-crud-contract.d.ts +0 -42
  657. package/lib/esm/contracts/erc20/erc20contract.d.ts +0 -152
  658. package/lib/esm/contracts/erc20/index.d.ts +0 -2
  659. package/lib/esm/contracts/erc20/models.d.ts +0 -114
  660. package/lib/esm/contracts/index.d.ts +0 -19
  661. package/lib/esm/contracts/logging.d.ts +0 -54
  662. package/lib/esm/contracts/types.d.ts +0 -38
  663. package/lib/esm/contracts/uuid.d.ts +0 -2
  664. package/lib/esm/shared/overrides/overrides.d.ts +0 -1
  665. package/lib/index.d.ts +0 -8
  666. package/lib/shared/ClientSerializer.cjs +0 -81
  667. package/lib/shared/DeterministicSerializer.cjs +0 -106
  668. package/lib/shared/DeterministicSerializer.d.ts +0 -47
  669. package/lib/shared/SimpleDeterministicSerializer.cjs +0 -69
  670. package/lib/shared/SimpleDeterministicSerializer.d.ts +0 -7
  671. package/lib/shared/constants.cjs +0 -41
  672. package/lib/shared/decorators.cjs +0 -593
  673. package/lib/shared/decorators.d.ts +0 -81
  674. package/lib/shared/erc20/erc20-constants.cjs +0 -30
  675. package/lib/shared/erc20/index.d.ts +0 -1
  676. package/lib/shared/errors.cjs +0 -190
  677. package/lib/shared/errors.d.ts +0 -140
  678. package/lib/shared/events.cjs +0 -51
  679. package/lib/shared/fabric-types.cjs +0 -3
  680. package/lib/shared/fabric-types.d.ts +0 -32
  681. package/lib/shared/index.d.ts +0 -20
  682. package/lib/shared/interfaces/Checkable.cjs +0 -3
  683. package/lib/shared/interfaces/Checkable.d.ts +0 -23
  684. package/lib/shared/interfaces/index.d.ts +0 -1
  685. package/lib/shared/math.cjs +0 -66
  686. package/lib/shared/math.d.ts +0 -34
  687. package/lib/shared/model/FabricBaseModel.d.ts +0 -7
  688. package/lib/shared/model/FabricIdentifiedBaseModel.d.ts +0 -7
  689. package/lib/shared/model/Identity.cjs +0 -71
  690. package/lib/shared/model/Identity.d.ts +0 -42
  691. package/lib/shared/model/IdentityCredentials.cjs +0 -66
  692. package/lib/shared/model/IdentityCredentials.d.ts +0 -41
  693. package/lib/shared/model/index.cjs +0 -21
  694. package/lib/shared/model/index.d.ts +0 -4
  695. package/lib/shared/overrides/Model.cjs +0 -4
  696. package/lib/shared/overrides/Model.d.ts +0 -22
  697. package/lib/shared/overrides/index.d.ts +0 -2
  698. package/lib/shared/overrides/overrides.cjs +0 -93
  699. package/lib/shared/overrides/overrides.d.ts +0 -1
  700. package/lib/shared/types.cjs +0 -3
  701. package/lib/shared/types.d.ts +0 -125
  702. package/lib/version.cjs +0 -8
  703. package/lib/version.d.ts +0 -2
  704. /package/lib/{bin → types/bin}/cli.d.ts +0 -0
  705. /package/lib/{cli-module.d.ts → types/cli-module.d.ts} +0 -0
  706. /package/lib/{cli-utils.d.ts → types/cli-utils.d.ts} +0 -0
  707. /package/lib/{client → types/client}/FabricClientAdapter.d.ts +0 -0
  708. /package/lib/{client → types/client}/FabricClientDispatch.d.ts +0 -0
  709. /package/lib/{client → types/client}/FabricClientPaginator.d.ts +0 -0
  710. /package/lib/{client → types/client}/FabricClientRepository.d.ts +0 -0
  711. /package/lib/{client → types/client}/FabricClientStatement.d.ts +0 -0
  712. /package/lib/{client → types/client}/collections/generation.d.ts +0 -0
  713. /package/lib/{client → types/client}/collections/index.d.ts +0 -0
  714. /package/lib/{client → types/client}/constants.d.ts +0 -0
  715. /package/lib/{client → types/client}/crypto.d.ts +0 -0
  716. /package/lib/{client → types/client}/erc20/FabricERC20ClientRepository.d.ts +0 -0
  717. /package/lib/{client → types/client}/erc20/index.d.ts +0 -0
  718. /package/lib/{client → types/client}/fabric-fs.d.ts +0 -0
  719. /package/lib/{client → types/client}/fabric-hsm.d.ts +0 -0
  720. /package/lib/{client → types/client}/ids/id-extraction.d.ts +0 -0
  721. /package/lib/{client → types/client}/ids/index.d.ts +0 -0
  722. /package/lib/{client → types/client}/index.d.ts +0 -0
  723. /package/lib/{client → types/client}/indexes/generation.d.ts +0 -0
  724. /package/lib/{client → types/client}/indexes/index.d.ts +0 -0
  725. /package/lib/{client → types/client}/logging.d.ts +0 -0
  726. /package/lib/{client → types/client}/services/FabricEnrollmentService.d.ts +0 -0
  727. /package/lib/{client → types/client}/services/FabricIdentityService.d.ts +0 -0
  728. /package/lib/{client → types/client}/services/RegistrationRequestBuilder.d.ts +0 -0
  729. /package/lib/{client → types/client}/services/constants.d.ts +0 -0
  730. /package/lib/{client → types/client}/services/index.d.ts +0 -0
  731. /package/lib/{client → types/client}/types.d.ts +0 -0
  732. /package/lib/{client → types/client}/utils.d.ts +0 -0
  733. /package/lib/{contract → types/contract}/Address.d.ts +0 -0
  734. /package/lib/{contract → types/contract}/AddressContract.d.ts +0 -0
  735. /package/lib/{contract → types/contract}/AuditContract.d.ts +0 -0
  736. /package/lib/{contract → types/contract}/BatchContract.d.ts +0 -0
  737. /package/lib/{contract → types/contract}/MarketContract.d.ts +0 -0
  738. /package/lib/{contract → types/contract}/OtherAuditContract.d.ts +0 -0
  739. /package/lib/{contract → types/contract}/OtherBatchContract.d.ts +0 -0
  740. /package/lib/{contract → types/contract}/OtherMarketContract.d.ts +0 -0
  741. /package/lib/{contract → types/contract}/OtherProductContract.d.ts +0 -0
  742. /package/lib/{contract → types/contract}/OtherProductImageContract.d.ts +0 -0
  743. /package/lib/{contract → types/contract}/OtherProductSharedContract.d.ts +0 -0
  744. /package/lib/{contract → types/contract}/OtherProductStrengthContract.d.ts +0 -0
  745. /package/lib/{contract → types/contract}/Product.d.ts +0 -0
  746. /package/lib/{contract → types/contract}/ProductContract.d.ts +0 -0
  747. /package/lib/{contract → types/contract}/ProductStrengthContract.d.ts +0 -0
  748. /package/lib/{contract → types/contract}/SegregatedPrivateDocumentContract.d.ts +0 -0
  749. /package/lib/{contract → types/contract}/SegregatedSharedDocumentContract.d.ts +0 -0
  750. /package/lib/{contract → types/contract}/User.d.ts +0 -0
  751. /package/lib/{contract → types/contract}/UserContract.d.ts +0 -0
  752. /package/lib/{contract → types/contract}/index.d.ts +0 -0
  753. /package/lib/{contract → types/contract}/logging-context.d.ts +0 -0
  754. /package/lib/{contract → types/contract}/models/Audit.d.ts +0 -0
  755. /package/lib/{contract → types/contract}/models/BaseIdentifiedModel.d.ts +0 -0
  756. /package/lib/{contract → types/contract}/models/BaseModel.d.ts +0 -0
  757. /package/lib/{contract → types/contract}/models/Batch.d.ts +0 -0
  758. /package/lib/{contract → types/contract}/models/GtinOwner.d.ts +0 -0
  759. /package/lib/{contract → types/contract}/models/History.d.ts +0 -0
  760. /package/lib/{contract → types/contract}/models/Leaflet.d.ts +0 -0
  761. /package/lib/{contract → types/contract}/models/LeafletFile.d.ts +0 -0
  762. /package/lib/{contract → types/contract}/models/Market.d.ts +0 -0
  763. /package/lib/{contract → types/contract}/models/OtherAudit.d.ts +0 -0
  764. /package/lib/{contract → types/contract}/models/OtherBatchShared.d.ts +0 -0
  765. /package/lib/{contract → types/contract}/models/OtherLeaflet.d.ts +0 -0
  766. /package/lib/{contract → types/contract}/models/OtherLeafletFile.d.ts +0 -0
  767. /package/lib/{contract → types/contract}/models/OtherMarket.d.ts +0 -0
  768. /package/lib/{contract → types/contract}/models/OtherProduct.d.ts +0 -0
  769. /package/lib/{contract → types/contract}/models/OtherProductImage.d.ts +0 -0
  770. /package/lib/{contract → types/contract}/models/OtherProductShared.d.ts +0 -0
  771. /package/lib/{contract → types/contract}/models/OtherProductStrength.d.ts +0 -0
  772. /package/lib/{contract → types/contract}/models/Product.d.ts +0 -0
  773. /package/lib/{contract → types/contract}/models/ProductStrength.d.ts +0 -0
  774. /package/lib/{contract → types/contract}/models/SegregatedDocument.d.ts +0 -0
  775. /package/lib/{contract → types/contract}/models/constants.d.ts +0 -0
  776. /package/lib/{contract → types/contract}/models/decorators-private.d.ts +0 -0
  777. /package/lib/{contract → types/contract}/models/decorators.d.ts +0 -0
  778. /package/lib/{contract → types/contract}/models/gtin.d.ts +0 -0
  779. /package/lib/{contract → types/contract}/models/history-dec.d.ts +0 -0
  780. /package/lib/{contracts → types/contracts}/ContractAdapter.d.ts +0 -0
  781. /package/lib/{contracts → types/contracts}/ContractContext.d.ts +0 -0
  782. /package/lib/{contracts → types/contracts}/FabricContractDispatch.d.ts +0 -0
  783. /package/lib/{contracts → types/contracts}/FabricContractPaginator.d.ts +0 -0
  784. /package/lib/{contracts → types/contracts}/FabricContractRepository.d.ts +0 -0
  785. /package/lib/{contracts → types/contracts}/FabricContractRepositoryObservableHandler.d.ts +0 -0
  786. /package/lib/{contracts → types/contracts}/FabricContractSequence.d.ts +0 -0
  787. /package/lib/{contracts → types/contracts}/FabricContractStatement.d.ts +0 -0
  788. /package/lib/{contracts → types/contracts}/MigrationContract.d.ts +0 -0
  789. /package/lib/{contracts → types/contracts}/PrivateSequence.d.ts +0 -0
  790. /package/lib/{contracts → types/contracts}/auth/decorators.d.ts +0 -0
  791. /package/lib/{contracts → types/contracts}/auth/index.d.ts +0 -0
  792. /package/lib/{contracts → types/contracts}/crud/crud-contract.d.ts +0 -0
  793. /package/lib/{contracts → types/contracts}/crud/index.d.ts +0 -0
  794. /package/lib/{contracts → types/contracts}/crud/serialized-crud-contract.d.ts +0 -0
  795. /package/lib/{contracts → types/contracts}/erc20/erc20contract.d.ts +0 -0
  796. /package/lib/{contracts → types/contracts}/erc20/index.d.ts +0 -0
  797. /package/lib/{contracts → types/contracts}/erc20/models.d.ts +0 -0
  798. /package/lib/{contracts → types/contracts}/index.d.ts +0 -0
  799. /package/lib/{contracts → types/contracts}/logging.d.ts +0 -0
  800. /package/lib/{contracts → types/contracts}/overrides.d.ts +0 -0
  801. /package/lib/{contracts → types/contracts}/types.d.ts +0 -0
  802. /package/lib/{contracts → types/contracts}/uuid.d.ts +0 -0
  803. /package/lib/{esm → types}/index.d.ts +0 -0
  804. /package/lib/{esm → types}/shared/ClientSerializer.d.ts +0 -0
  805. /package/lib/{esm → types}/shared/DeterministicSerializer.d.ts +0 -0
  806. /package/lib/{esm → types}/shared/SimpleDeterministicSerializer.d.ts +0 -0
  807. /package/lib/{esm → types}/shared/constants.d.ts +0 -0
  808. /package/lib/{esm → types}/shared/decorators.d.ts +0 -0
  809. /package/lib/{esm → types}/shared/erc20/erc20-constants.d.ts +0 -0
  810. /package/lib/{esm → types}/shared/erc20/index.d.ts +0 -0
  811. /package/lib/{esm → types}/shared/errors.d.ts +0 -0
  812. /package/lib/{esm → types}/shared/events.d.ts +0 -0
  813. /package/lib/{esm → types}/shared/fabric-types.d.ts +0 -0
  814. /package/lib/{esm → types}/shared/index.d.ts +0 -0
  815. /package/lib/{esm → types}/shared/interfaces/Checkable.d.ts +0 -0
  816. /package/lib/{esm → types}/shared/interfaces/index.d.ts +0 -0
  817. /package/lib/{esm → types}/shared/math.d.ts +0 -0
  818. /package/lib/{esm → types}/shared/model/FabricBaseModel.d.ts +0 -0
  819. /package/lib/{esm → types}/shared/model/FabricIdentifiedBaseModel.d.ts +0 -0
  820. /package/lib/{esm → types}/shared/model/Identity.d.ts +0 -0
  821. /package/lib/{esm → types}/shared/model/IdentityCredentials.d.ts +0 -0
  822. /package/lib/{esm → types}/shared/model/index.d.ts +0 -0
  823. /package/lib/{esm → types}/shared/overrides/Model.d.ts +0 -0
  824. /package/lib/{esm → types}/shared/overrides/index.d.ts +0 -0
  825. /package/lib/{esm/contracts → types/shared/overrides}/overrides.d.ts +0 -0
  826. /package/lib/{esm → types}/shared/types.d.ts +0 -0
@@ -1,593 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SEGREGATED_COLLECTION_EXTRACTION_PRIORITY = exports.ImplicitPrivateCollection = exports.ModelCollection = void 0;
4
- exports.extractMspId = extractMspId;
5
- exports.Owner = Owner;
6
- exports.ownedByOnCreate = ownedByOnCreate;
7
- exports.ownedBy = ownedBy;
8
- exports.transactionIdOnCreate = transactionIdOnCreate;
9
- exports.transactionId = transactionId;
10
- exports.evalMirrorMetadata = evalMirrorMetadata;
11
- exports.createMirrorHandler = createMirrorHandler;
12
- exports.updateMirrorHandler = updateMirrorHandler;
13
- exports.deleteMirrorHandler = deleteMirrorHandler;
14
- exports.mirrorWriteGuard = mirrorWriteGuard;
15
- exports.readMirrorHandler = readMirrorHandler;
16
- exports.mirror = mirror;
17
- exports.NamespaceCollection = NamespaceCollection;
18
- exports.applySegregationFlags = applySegregationFlags;
19
- exports.applyMirrorFlags = applyMirrorFlags;
20
- exports.extractSegregatedCollections = extractSegregatedCollections;
21
- exports.segregatedDataOnCreate = segregatedDataOnCreate;
22
- exports.segregatedDataOnRead = segregatedDataOnRead;
23
- exports.segregatedDataOnUpdate = segregatedDataOnUpdate;
24
- exports.segregatedDataOnDelete = segregatedDataOnDelete;
25
- exports.privateData = privateData;
26
- exports.sharedData = sharedData;
27
- const core_1 = require("@decaf-ts/core");
28
- const db_decorators_1 = require("@decaf-ts/db-decorators");
29
- const decorator_validation_1 = require("@decaf-ts/decorator-validation");
30
- const constants_1 = require("./constants.cjs");
31
- const decoration_1 = require("@decaf-ts/decoration");
32
- const logging_1 = require("@decaf-ts/logging");
33
- require("./overrides/index.cjs");
34
- /**
35
- * @description Extracts the MSP ID from either a string or ClientIdentity object
36
- * @param identity - The identity value which can be a string MSP ID or ClientIdentity object
37
- * @returns The MSP ID as a string, or undefined if not available
38
- */
39
- function extractMspId(identity) {
40
- if (!identity)
41
- return undefined;
42
- if (typeof identity === "string")
43
- return identity;
44
- return identity.getMSPID();
45
- }
46
- /**
47
- * Decorator for marking methods that require ownership authorization.
48
- * Checks the owner of the token before allowing the method to be executed.
49
- *
50
- * @example
51
- * ```typescript
52
- * class TokenContract extends Contract {
53
- * @Owner()
54
- * async Mint(ctx: Context, amount: number) {
55
- * // Mint token logic
56
- * }
57
- * }
58
- * ```
59
- *
60
- * @returns {MethodDecorator} A method decorator that checks ownership authorization.
61
- */
62
- function Owner() {
63
- return function (target, propertyKey, descriptor) {
64
- const originalMethod = descriptor.value;
65
- descriptor.value = async function (...args) {
66
- const ctx = args[0];
67
- const acountId = ctx.clientIdentity.getID();
68
- const select = await this["tokenRepository"].select();
69
- const tokens = await select.execute(ctx);
70
- if (tokens.length == 0) {
71
- throw new db_decorators_1.NotFoundError("No tokens avaialble");
72
- }
73
- if (tokens.length > 1) {
74
- throw new db_decorators_1.NotFoundError(`To many token available : ${tokens.length}`);
75
- }
76
- if (tokens[0].owner != acountId) {
77
- throw new core_1.AuthorizationError(`User not authorized to run ${propertyKey} on the token`);
78
- }
79
- return await originalMethod.apply(this, args);
80
- };
81
- return descriptor;
82
- };
83
- }
84
- async function ownedByOnCreate(context, data, key, model) {
85
- const { stub } = context;
86
- const allowGenerationOverride = context.getOrUndefined("allowGenerationOverride") || false;
87
- const creator = await stub.getCreator();
88
- let owner = creator.mspid;
89
- context.logger.info(`Expected mspid to be ${model[key]} | ${owner}. \n Using allowGenerationOverride: ${allowGenerationOverride}`);
90
- if (allowGenerationOverride)
91
- owner = model[key] ? model[key] : owner;
92
- const setOwnedByKeyValue = function (target, propertyKey, value) {
93
- Object.defineProperty(target, propertyKey, {
94
- enumerable: true,
95
- writable: false,
96
- configurable: true,
97
- value: value,
98
- });
99
- };
100
- setOwnedByKeyValue(model, key, owner);
101
- }
102
- function ownedBy() {
103
- function ownedBy() {
104
- return function (obj, attribute) {
105
- return (0, decoration_1.apply)((0, decorator_validation_1.required)(), (0, db_decorators_1.generated)(), (0, db_decorators_1.readonly)(), (0, db_decorators_1.onCreate)(ownedByOnCreate), (0, decoration_1.propMetadata)(decoration_1.Metadata.key(constants_1.FabricModelKeys.FABRIC, constants_1.FabricModelKeys.OWNED_BY), attribute))(obj, attribute);
106
- };
107
- }
108
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.OWNED_BY)
109
- .define({
110
- decorator: ownedBy,
111
- args: [],
112
- })
113
- .apply();
114
- }
115
- async function transactionIdOnCreate(context, data, key, model) {
116
- const { stub } = context;
117
- model[key] = stub.getTxID();
118
- }
119
- function transactionId() {
120
- function transactionId() {
121
- return function (obj, attribute) {
122
- return (0, decoration_1.apply)((0, decorator_validation_1.required)(), (0, db_decorators_1.readonly)(), (0, db_decorators_1.onCreate)(transactionIdOnCreate), (0, db_decorators_1.onUpdate)(transactionIdOnCreate), (0, decoration_1.propMetadata)(decoration_1.Metadata.key(constants_1.FabricModelKeys.FABRIC, attribute, constants_1.FabricModelKeys.TRANSACTION_ID), attribute))(obj, attribute);
123
- };
124
- }
125
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.TRANSACTION_ID)
126
- .define({
127
- decorator: transactionId,
128
- args: [],
129
- })
130
- .apply();
131
- }
132
- async function evalMirrorMetadata(model, resolver, ctx) {
133
- let collection = resolver;
134
- if (typeof collection !== "string") {
135
- try {
136
- const owner = decorator_validation_1.Model.ownerOf(model) || ctx.get("stub").getCreator().toString();
137
- if (resolver && typeof resolver === "function")
138
- collection = await resolver(model, owner, ctx);
139
- }
140
- catch (e) {
141
- throw new db_decorators_1.InternalError(`Failed to resolve collection mirror name: ${e}`);
142
- }
143
- }
144
- if (!collection || typeof collection !== "string")
145
- throw new db_decorators_1.InternalError(`No collection found model ${model.constructor.name}`);
146
- return collection;
147
- }
148
- async function createMirrorHandler(context, data, key, model) {
149
- const collection = await evalMirrorMetadata(model, data.resolver, context);
150
- const fabricCtx = context;
151
- const sourceModel = model;
152
- // Put mirror flags directly on context so adapter.prepare() and adapter.create() can see them
153
- fabricCtx.put("mirror", true);
154
- fabricCtx.put("mirrorCollection", collection);
155
- try {
156
- const repo = this.override(Object.assign({}, this._overrides, {
157
- mirror: true,
158
- mirrorCollection: collection,
159
- ignoreValidation: true,
160
- ignoreHandlers: true,
161
- }));
162
- const mirror = await repo.create(sourceModel, context);
163
- context.logger.info(`Mirror for ${decorator_validation_1.Model.tableName(this.class)} created with ${decorator_validation_1.Model.pk(model)}: ${mirror[decorator_validation_1.Model.pk(model)]}`);
164
- }
165
- finally {
166
- // Clean up mirror flags from context
167
- fabricCtx.put("mirror", undefined);
168
- fabricCtx.put("mirrorCollection", undefined);
169
- }
170
- }
171
- async function updateMirrorHandler(context, data, key, model) {
172
- const collection = await evalMirrorMetadata(model, data.resolver, context);
173
- const fabricCtx = context;
174
- const sourceModel = model;
175
- fabricCtx.put("mirror", true);
176
- fabricCtx.put("mirrorCollection", collection);
177
- try {
178
- const repo = this.override(Object.assign({}, this._overrides, {
179
- mirror: true,
180
- mirrorCollection: collection,
181
- ignoreValidation: true,
182
- ignoreHandlers: true,
183
- applyUpdateValidation: false,
184
- mergeForUpdate: false,
185
- }));
186
- await repo.update(sourceModel, context);
187
- context.logger.info(`Mirror for ${decorator_validation_1.Model.tableName(this.class)} updated: ${model[decorator_validation_1.Model.pk(model)]}`);
188
- }
189
- finally {
190
- fabricCtx.put("mirror", undefined);
191
- fabricCtx.put("mirrorCollection", undefined);
192
- }
193
- }
194
- async function deleteMirrorHandler(context, data, key, model) {
195
- const collection = await evalMirrorMetadata(model, data.resolver, context);
196
- const fabricCtx = context;
197
- fabricCtx.put("mirror", true);
198
- fabricCtx.put("mirrorCollection", collection);
199
- fabricCtx.put("segregated", collection);
200
- try {
201
- const pkProp = decorator_validation_1.Model.pk(model);
202
- const id = model[pkProp];
203
- const repo = this.override(Object.assign({}, this._overrides, {
204
- segregated: collection,
205
- mirror: true,
206
- ignoreValidation: true,
207
- ignoreHandlers: true,
208
- }));
209
- try {
210
- await repo.delete(id, context);
211
- }
212
- catch {
213
- // May already be deleted by adapter.deleteSegregatedCollections
214
- }
215
- context.logger.info(`Mirror for ${decorator_validation_1.Model.tableName(this.class)} deleted: ${String(id)}`);
216
- }
217
- finally {
218
- fabricCtx.put("mirror", undefined);
219
- fabricCtx.put("mirrorCollection", undefined);
220
- fabricCtx.put("segregated", undefined);
221
- }
222
- }
223
- async function mirrorWriteGuard(context, data,
224
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
225
- key,
226
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
227
- model) {
228
- const msp = extractMspId(context.get("identity"));
229
- if (!msp)
230
- return;
231
- if (msp === data.mspId || (data.condition && data.condition(msp))) {
232
- throw new core_1.AuthorizationError(`Organization ${msp} is not authorized to modify mirrored data`);
233
- }
234
- }
235
- async function readMirrorHandler(context, data, key, model) {
236
- const msp = extractMspId(context.get("identity"));
237
- if (!msp)
238
- return;
239
- const collection = await evalMirrorMetadata(model, data.resolver, context);
240
- const fabricCtx = context;
241
- const matches = msp === data.mspId || (data.condition && data.condition(msp));
242
- if (matches) {
243
- context.logger.info(`Mirror read: MSP ${msp} matches, routing reads to mirror collection ${collection}`);
244
- // Route reads exclusively through the mirror collection
245
- fabricCtx.put("mirror", true);
246
- fabricCtx.put("mirrorCollection", collection);
247
- fabricCtx.put("fullySegregated", true);
248
- fabricCtx.readFrom(collection);
249
- }
250
- // When MSP does NOT match, normal read flow — all data is in public state
251
- }
252
- function mirror(collection, mspIdOrCondition, condition) {
253
- const isConditionOnly = typeof mspIdOrCondition !== "string" && Boolean(mspIdOrCondition);
254
- const mspId = isConditionOnly
255
- ? undefined
256
- : mspIdOrCondition;
257
- const cond = isConditionOnly
258
- ? mspIdOrCondition
259
- : condition;
260
- function mirror(resolver, mspId, condition) {
261
- const meta = {
262
- condition: condition,
263
- mspId: mspId,
264
- resolver: resolver,
265
- };
266
- return (0, decoration_1.apply)((0, decoration_1.metadata)(decoration_1.Metadata.key(constants_1.FabricModelKeys.FABRIC, constants_1.FabricModelKeys.MIRROR), meta),
267
- // Read handler runs early (priority 30) to set up context before any reads
268
- (0, db_decorators_1.onRead)(readMirrorHandler, meta, { priority: 30 }),
269
- // Write guards — reject matching MSPs before any processing
270
- (0, db_decorators_1.onCreate)(mirrorWriteGuard, meta, { priority: 20 }), (0, db_decorators_1.onUpdate)(mirrorWriteGuard, meta, { priority: 20 }), (0, db_decorators_1.onDelete)(mirrorWriteGuard, meta, { priority: 20 }),
271
- // Mirror sync handlers — write full model after other handlers (priority 100)
272
- (0, db_decorators_1.onCreate)(createMirrorHandler, meta, { priority: 100 }), (0, db_decorators_1.onUpdate)(updateMirrorHandler, meta, { priority: 100 }), (0, db_decorators_1.onDelete)(deleteMirrorHandler, meta, { priority: 100 }));
273
- }
274
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.MIRROR)
275
- .define({
276
- decorator: mirror,
277
- args: [collection, mspId, cond],
278
- })
279
- .apply();
280
- }
281
- const ModelCollection = (model, mspId) => {
282
- const orgName = mspId || (typeof model !== "function" ? decorator_validation_1.Model.ownerOf(model) : undefined);
283
- const constr = typeof model === "function" ? model : model.constructor;
284
- if (!orgName)
285
- throw new db_decorators_1.InternalError(`Model ${constr.name} is not owned by any organization. did you use @ownedBy() (or provide the name)?`);
286
- return `${(0, logging_1.toPascalCase)(constr.name)}${orgName ? (0, logging_1.toPascalCase)(orgName) : ""}`;
287
- };
288
- exports.ModelCollection = ModelCollection;
289
- function NamespaceCollection(namespace) {
290
- return (model, mspId) => {
291
- const orgName = mspId || (typeof model !== "function" ? decorator_validation_1.Model.ownerOf(model) : undefined);
292
- const constr = typeof model === "function" ? model : model.constructor;
293
- if (!orgName)
294
- throw new db_decorators_1.InternalError(`Model ${constr.name} is not owned by any organization. did you use @ownedBy() (or provide the name)?`);
295
- return `${namespace}${orgName ? (0, logging_1.toPascalCase)(orgName) : ""}`;
296
- };
297
- }
298
- const ImplicitPrivateCollection = (model, mspId) => {
299
- const orgName = mspId || (typeof model !== "function" ? decorator_validation_1.Model.ownerOf(model) : undefined);
300
- if (!orgName)
301
- throw new db_decorators_1.InternalError(`Model ${model.constructor.name} is not owned by any organization. did you use @ownedBy() (or provide the name)?`);
302
- return `__${(0, logging_1.toPascalCase)(orgName)}PrivateCollection`;
303
- };
304
- exports.ImplicitPrivateCollection = ImplicitPrivateCollection;
305
- /**
306
- * @description Priority for early collection extraction (before pk generation at priority 60)
307
- * @summary This priority ensures collections are registered in context before any sequence
308
- * operations occur, allowing sequences to be replicated to private/shared collections.
309
- */
310
- exports.SEGREGATED_COLLECTION_EXTRACTION_PRIORITY = 35;
311
- function applySegregationFlags(clazz, collections, ctx) {
312
- // Register collections early using readFrom - this allows sequence code
313
- // to know which collections to replicate to during pk generation
314
- if (collections.length > 0) {
315
- ctx.readFrom(collections);
316
- }
317
- // Check if model is fully segregated (all non-pk properties are private/shared/transient).
318
- // Use Model.segregate() which is the canonical way to determine what's transient,
319
- // rather than reading DBKeys.TRANSIENT metadata which may not accumulate correctly
320
- // when class-level @privateData applies decorators iteratively.
321
- if (!ctx.isFullySegregated && collections.length) {
322
- if (!hasPublicProperties(clazz.constructor)) {
323
- ctx.markFullySegregated();
324
- }
325
- }
326
- }
327
- async function applyMirrorFlags(clazz, msp, ctx) {
328
- if (!msp)
329
- return;
330
- const mirrorMeta = decorator_validation_1.Model.mirroredAt(clazz);
331
- if (!mirrorMeta)
332
- return;
333
- const matches = msp === mirrorMeta.mspId ||
334
- (mirrorMeta.condition && mirrorMeta.condition(msp));
335
- if (!matches)
336
- return;
337
- const collection = await evalMirrorMetadata(new clazz(), mirrorMeta.resolver, ctx);
338
- // Mirror MSP matches — route reads exclusively through the mirror
339
- // collection. Clear any previously registered collections so queries
340
- // go ONLY to the mirror, not to the regular private/shared ones.
341
- ctx.put("segregateRead", undefined);
342
- ctx.put("segregateReadStack", undefined);
343
- ctx.put("fullySegregated", true);
344
- ctx.put("mirror", true);
345
- ctx.put("mirrorCollection", collection);
346
- ctx.readFrom(collection);
347
- }
348
- function hasPublicProperties(clazz) {
349
- const attributes = decoration_1.Metadata.getAttributes(clazz) || [];
350
- const pk = decorator_validation_1.Model.pk(clazz);
351
- const transientMeta = decoration_1.Metadata.get(clazz, db_decorators_1.DBKeys.TRANSIENT) || {};
352
- const privateMeta = decoration_1.Metadata.get(clazz, decoration_1.Metadata.key(constants_1.FabricModelKeys.PRIVATE)) || {};
353
- const sharedMeta = decoration_1.Metadata.get(clazz, decoration_1.Metadata.key(constants_1.FabricModelKeys.SHARED)) || {};
354
- return attributes.some((attr) => {
355
- if (attr === pk)
356
- return false;
357
- if (attr in transientMeta)
358
- return false;
359
- if (attr in privateMeta)
360
- return false;
361
- if (attr in sharedMeta)
362
- return false;
363
- return true;
364
- });
365
- }
366
- /**
367
- * @description Early handler to extract and register collections in context
368
- * @summary Runs with priority < 40 to extract collection names before pk generation (priority 60).
369
- * This allows FabricContractSequence to know which collections to replicate to.
370
- * @template M - Type that extends Model
371
- * @param {ContextOf<Repository<M, any>>} context - The execution context
372
- * @param {SegregatedDataMetadata | SegregatedDataMetadata[]} data - The segregated data metadata
373
- * @param {string | string[]} keys - The property key(s) being segregated
374
- * @param {M} model - The model instance
375
- * @return {Promise<void>}
376
- */
377
- async function extractSegregatedCollections(context, data, keys, model) {
378
- const dataArray = (Array.isArray(data) ? data : [data]);
379
- const msp = decorator_validation_1.Model.ownerOf(model) ||
380
- extractMspId(context.get("identity"));
381
- if (!msp) {
382
- // Can't extract collections without MSP, will be caught by later handlers
383
- return;
384
- }
385
- const collections = [];
386
- for (const metadata of dataArray) {
387
- const collectionResolver = metadata.collections;
388
- const collection = typeof collectionResolver === "string"
389
- ? collectionResolver
390
- : collectionResolver(model, msp, context);
391
- if (collection && !collections.includes(collection)) {
392
- collections.push(collection);
393
- }
394
- }
395
- applySegregationFlags(model, collections, context);
396
- // Store segregation metadata per-sequence so FabricContractSequence can decide
397
- // where to store/replicate sequence records (public vs private/shared).
398
- //
399
- // - `@pk()` sequences use the shared name `${table}_pk` (no id component).
400
- // - `@sequence()` / persistent `@version(true)` sequences are per-model-instance:
401
- // `${table}_${id}_${property}`.
402
- const keyArray = (Array.isArray(keys) ? keys : [keys]);
403
- const pkKey = decorator_validation_1.Model.pk(model.constructor);
404
- const pkSeqName = decorator_validation_1.Model.sequenceName(model, "pk");
405
- const idValue = model[pkKey];
406
- const canBuildPerInstance = typeof idValue !== "undefined" && idValue !== null;
407
- // Always union collections for the pk sequence when the model uses segregated data.
408
- context.setSequenceSegregation(pkSeqName, context.isFullySegregated, collections);
409
- // For per-property sequences, only register when we can compute an id-scoped name.
410
- // This keeps sequences constrained to the collections the attribute exists in.
411
- if (canBuildPerInstance) {
412
- for (const k of keyArray) {
413
- const propSeqName = decorator_validation_1.Model.sequenceName(model, String(idValue), String(k));
414
- context.setSequenceSegregation(propSeqName, context.isFullySegregated, collections);
415
- }
416
- }
417
- }
418
- async function segregatedDataOnCreate(context, data, keys, model) {
419
- const dataArray = (Array.isArray(data) ? data : [data]);
420
- const keyArray = (Array.isArray(keys) ? keys : [keys]);
421
- if (keyArray.length !== dataArray.length)
422
- throw new db_decorators_1.InternalError(`Segregated data keys and metadata length mismatch`);
423
- const msp = decorator_validation_1.Model.ownerOf(model) ||
424
- extractMspId(context.get("identity"));
425
- if (!msp)
426
- throw new db_decorators_1.ValidationError(`There's no assigned organization for model ${model.constructor.name}`);
427
- const collectionResolver = dataArray[0].collections;
428
- const collection = typeof collectionResolver === "string"
429
- ? collectionResolver
430
- : collectionResolver(model, msp, context);
431
- // Validate all keys resolve to the same collection
432
- keyArray.forEach((_k, i) => {
433
- const c = typeof dataArray[i].collections === "string"
434
- ? dataArray[i].collections
435
- : dataArray[i].collections(model, msp, context);
436
- if (c !== collection)
437
- throw new core_1.UnsupportedError(`Segregated data collection mismatch: ${c} vs ${collection}`);
438
- });
439
- const keyStrings = keyArray.map((key) => String(key));
440
- // Store the segregated model — prepare() will filter to collection-specific fields
441
- context.writeTo(collection, keyStrings);
442
- }
443
- async function segregatedDataOnRead(context, data, keys, model) {
444
- const dataArray = (Array.isArray(data) ? data : [data]);
445
- const keyArray = (Array.isArray(keys) ? keys : [keys]);
446
- if (keyArray.length !== dataArray.length)
447
- throw new db_decorators_1.InternalError(`Segregated data keys and metadata length mismatch`);
448
- const m = context.getOrUndefined("allowGenerationOverride") || false
449
- ? context.getOrUndefined("ownerOverride")
450
- : undefined;
451
- const msp = m || decorator_validation_1.Model.ownerOf(model) || extractMspId(context.get("identity"));
452
- if (!msp)
453
- throw new db_decorators_1.ValidationError(`There's no assigned organization for model ${model.constructor.name}`);
454
- const collectionResolver = dataArray[0].collections;
455
- const collection = typeof collectionResolver === "string"
456
- ? collectionResolver
457
- : await collectionResolver(model, msp, context);
458
- context.readFrom(collection);
459
- }
460
- async function segregatedDataOnUpdate(context, data, key, model,
461
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
462
- oldModel) {
463
- const dataArray = (Array.isArray(data) ? data : [data]);
464
- const keyArray = (Array.isArray(key) ? key : [key]);
465
- if (keyArray.length !== dataArray.length)
466
- throw new db_decorators_1.InternalError(`Segregated data keys and metadata length mismatch`);
467
- const msp = decorator_validation_1.Model.ownerOf(model) ||
468
- extractMspId(context.get("identity"));
469
- if (!msp)
470
- throw new db_decorators_1.ValidationError(`There's no assigned organization for model ${model.constructor.name}`);
471
- const collectionResolver = dataArray[0].collections;
472
- const collection = typeof collectionResolver === "string"
473
- ? collectionResolver
474
- : collectionResolver(model, msp, context);
475
- keyArray.forEach((k, i) => {
476
- const c = typeof dataArray[i].collections === "string"
477
- ? dataArray[i].collections
478
- : dataArray[i].collections(model, msp, context);
479
- if (c !== collection)
480
- throw new core_1.UnsupportedError(`Segregated data collection mismatch: ${c} vs ${collection}`);
481
- });
482
- const keyStrings = keyArray.map((key) => String(key));
483
- // Store the original model — prepare() will filter to collection-specific fields
484
- context.writeTo(collection, keyStrings);
485
- }
486
- async function segregatedDataOnDelete(context, data, key, model) {
487
- const dataArray = (Array.isArray(data) ? data : [data]);
488
- const keyArray = (Array.isArray(key) ? key : [key]);
489
- if (keyArray.length !== dataArray.length)
490
- throw new db_decorators_1.InternalError(`Segregated data keys and metadata length mismatch`);
491
- const m = context.getOrUndefined("allowGenerationOverride") || false
492
- ? context.getOrUndefined("ownerOverride")
493
- : undefined;
494
- const msp = m ||
495
- decorator_validation_1.Model.ownerOf(model) ||
496
- extractMspId(context.get("identity"));
497
- if (!msp)
498
- throw new db_decorators_1.ValidationError(`There's no assigned organization for model ${model.constructor.name}`);
499
- const collectionResolver = dataArray[0].collections;
500
- const collection = typeof collectionResolver === "string"
501
- ? collectionResolver
502
- : collectionResolver(model, msp, context);
503
- context.readFrom(collection);
504
- }
505
- function segregated(collection, type, filter) {
506
- return function innerSegregated(target, propertyKey) {
507
- function segregatedDec(target, propertyKey) {
508
- const key = decoration_1.Metadata.key(type, propertyKey);
509
- const constr = target.constructor;
510
- const meta = decoration_1.Metadata.get(constr, key) || {};
511
- const collections = new Set(meta.collections || []);
512
- collections.add(collection);
513
- meta.collections = [...collections];
514
- decoration_1.Metadata.set(constr, key, meta);
515
- const constrMeta = decoration_1.Metadata.get(constr, type) || {};
516
- const constrCollections = new Set(constrMeta.collections || []);
517
- constrCollections.add(collection);
518
- constrMeta.collections = [...constrCollections];
519
- decoration_1.Metadata.set(constr, type, constrMeta);
520
- const transientMeta = decoration_1.Metadata.get(constr, db_decorators_1.DBKeys.TRANSIENT) || {};
521
- const updatedTransientMeta = {
522
- ...transientMeta,
523
- [propertyKey]: {},
524
- };
525
- decoration_1.Metadata.set(constr, db_decorators_1.DBKeys.TRANSIENT, updatedTransientMeta);
526
- }
527
- const decs = [];
528
- if (!propertyKey) {
529
- // decorated at the class level
530
- const properties = decoration_1.Metadata.getAttributes(target);
531
- properties?.forEach((p) => {
532
- if (!filter || filter(p)) {
533
- segregated(collection, type)(target.prototype, p);
534
- }
535
- });
536
- return target;
537
- }
538
- else {
539
- const groupName = typeof collection === "string" ? collection : collection.toString();
540
- // Use different group names for extraction vs data handlers to prevent merging
541
- const extractGroupName = `${groupName}:extract`;
542
- const dataGroupName = `${groupName}:data`;
543
- const earlyExtractionMeta = { collections: collection };
544
- const earlyExtractionGroupSort = {
545
- priority: exports.SEGREGATED_COLLECTION_EXTRACTION_PRIORITY,
546
- group: extractGroupName,
547
- };
548
- decs.push((0, decoration_1.prop)(), (0, db_decorators_1.transient)(), segregatedDec,
549
- // Early extraction handlers - run BEFORE pk generation (priority 60)
550
- // This ensures collections are registered in context for sequence replication
551
- // We register for each operation explicitly to ensure proper handler lookup
552
- (0, db_decorators_1.on)(db_decorators_1.DBOperations.ALL, extractSegregatedCollections, earlyExtractionMeta, earlyExtractionGroupSort),
553
- // Main handlers for segregated data operations (priority 95)
554
- (0, db_decorators_1.onCreate)(segregatedDataOnCreate, { collections: collection }, {
555
- priority: 95,
556
- group: dataGroupName,
557
- }), (0, db_decorators_1.onRead)(segregatedDataOnRead, { collections: collection }, {
558
- priority: 95,
559
- group: dataGroupName,
560
- }), (0, db_decorators_1.onUpdate)(segregatedDataOnUpdate, { collections: collection }, {
561
- priority: 95,
562
- group: dataGroupName,
563
- }), (0, db_decorators_1.onDelete)(segregatedDataOnDelete, { collections: collection }, {
564
- priority: 95,
565
- group: dataGroupName,
566
- }));
567
- }
568
- return (0, decoration_1.apply)(...decs)(target, propertyKey);
569
- };
570
- }
571
- function privateData(collection = exports.ImplicitPrivateCollection) {
572
- function privateData(collection) {
573
- return segregated(collection, constants_1.FabricModelKeys.PRIVATE);
574
- }
575
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.PRIVATE)
576
- .define({
577
- decorator: privateData,
578
- args: [collection],
579
- })
580
- .apply();
581
- }
582
- function sharedData(collection) {
583
- function sharedData(collection) {
584
- return segregated(collection, constants_1.FabricModelKeys.SHARED);
585
- }
586
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.SHARED)
587
- .define({
588
- decorator: sharedData,
589
- args: [collection],
590
- })
591
- .apply();
592
- }
593
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFyZWQvZGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnREEsb0NBTUM7QUFrQkQsc0JBd0NDO0FBRUQsMENBc0NDO0FBRUQsMEJBc0JDO0FBRUQsc0RBYUM7QUFFRCxzQ0EwQkM7QUFVRCxnREFzQkM7QUFFRCxrREFrQ0M7QUFFRCxrREFrQ0M7QUFFRCxrREF1Q0M7QUFFRCw0Q0FxQkM7QUFFRCw4Q0ErQkM7QUFFRCx3QkFnREM7QUFzQkQsa0RBV0M7QUEwQkQsc0RBb0JDO0FBRUQsNENBMEJDO0FBK0JELG9FQW1FQztBQUVELHdEQStDQztBQUVELG9EQW1DQztBQUVELHdEQWdEQztBQUVELHdEQXlDQztBQThHRCxrQ0FhQztBQUVELGdDQVdDO0FBOTlCRCx5Q0FPd0I7QUFDeEIsMkRBY2lDO0FBQ2pDLHlFQUFpRTtBQUNqRSwrQ0FBOEM7QUFJOUMscURBUThCO0FBRTlCLCtDQUFpRDtBQUVqRCxpQ0FBNkI7QUFHN0I7Ozs7R0FJRztBQUNILFNBQWdCLFlBQVksQ0FDMUIsUUFBNkM7SUFFN0MsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNsRCxPQUFPLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsS0FBSztJQUNuQixPQUFPLFVBQ0wsTUFBVyxFQUNYLFdBQW1CLEVBQ25CLFVBQThCO1FBRTlCLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFeEMsVUFBVSxDQUFDLEtBQUssR0FBRyxLQUFLLFdBRXRCLEdBQUcsSUFBVztZQUVkLE1BQU0sR0FBRyxHQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFN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YUFBYTthQUNyQixDQUNGLEVBQ0QsSUFBQSx3QkFBUSxFQUNOLHNCQUE2QixFQUM3QixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsRUFDM0I7Z0JBQ0UsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osS0FBSyxFQUFFLGFBQWE7YUFDckIsQ0FDRixDQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFBLGtCQUFLLEVBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FDekIsYUFBMEMsaUNBQXlCO0lBRW5FLFNBQVMsV0FBVyxDQUFDLFVBQXVDO1FBQzFELE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSwyQkFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxPQUFPLHVCQUFVLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsT0FBTyxDQUFDO1NBQzNDLE1BQU0sQ0FBQztRQUNOLFNBQVMsRUFBRSxXQUFXO1FBQ3RCLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQztLQUNuQixDQUFDO1NBQ0QsS0FBSyxFQUFFLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLFVBQXVDO0lBQ2hFLFNBQVMsVUFBVSxDQUFDLFVBQXVDO1FBQ3pELE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSwyQkFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxPQUFPLHVCQUFVLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsTUFBTSxDQUFDO1NBQzFDLE1BQU0sQ0FBQztRQUNOLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQztLQUNuQixDQUFDO1NBQ0QsS0FBSyxFQUFFLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBSZXBvLFxuICBDb250ZXh0LFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBSZXBvc2l0b3J5LFxuICBDb250ZXh0T2YsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVkLFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25EZWxldGUsXG4gIG9uUmVhZCxcbiAgb25VcGRhdGUsXG4gIHJlYWRvbmx5LFxuICB0cmFuc2llbnQsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgREJLZXlzLFxuICBEQk9wZXJhdGlvbnMsXG4gIG9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY01vZGVsS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IGFzIEhMQ29udGV4dCB9IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5pbXBvcnQgeyBDbGllbnRJZGVudGl0eSB9IGZyb20gXCJmYWJyaWMtc2hpbS1hcGlcIjtcbmltcG9ydCB7IEZhYnJpY0VSQzIwQ29udHJhY3QgfSBmcm9tIFwiLi4vY29udHJhY3RzL2VyYzIwL2VyYzIwY29udHJhY3RcIjtcbmltcG9ydCB7XG4gIGFwcGx5LFxuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbWV0YWRhdGEsXG4gIE1ldGFkYXRhLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdEZsYWdzIH0gZnJvbSBcIi4uL2NvbnRyYWN0cy90eXBlc1wiO1xuaW1wb3J0IFwiLi4vc2hhcmVkL292ZXJyaWRlc1wiO1xuaW1wb3J0IHsgdHlwZSBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi4vY29udHJhY3RzL0NvbnRyYWN0Q29udGV4dFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyB0aGUgTVNQIElEIGZyb20gZWl0aGVyIGEgc3RyaW5nIG9yIENsaWVudElkZW50aXR5IG9iamVjdFxuICogQHBhcmFtIGlkZW50aXR5IC0gVGhlIGlkZW50aXR5IHZhbHVlIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBNU1AgSUQgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgTVNQIElEIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1zcElkKFxuICBpZGVudGl0eTogc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaWRlbnRpdHkgPT09IFwic3RyaW5nXCIpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIGlkZW50aXR5LmdldE1TUElEKCk7XG59XG5cbi8qKlxuICogRGVjb3JhdG9yIGZvciBtYXJraW5nIG1ldGhvZHMgdGhhdCByZXF1aXJlIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICogQ2hlY2tzIHRoZSBvd25lciBvZiB0aGUgdG9rZW4gYmVmb3JlIGFsbG93aW5nIHRoZSBtZXRob2QgdG8gYmUgZXhlY3V0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7XG4gKiAgIEBPd25lcigpXG4gKiAgIGFzeW5jIE1pbnQoY3R4OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcikge1xuICogICAgIC8vIE1pbnQgdG9rZW4gbG9naWNcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQHJldHVybnMge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgY2hlY2tzIG93bmVyc2hpcCBhdXRob3JpemF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT3duZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEZhYnJpY0VSQzIwQ29udHJhY3QsXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgY29uc3QgY3R4OiBITENvbnRleHQgPSBhcmdzWzBdO1xuICAgICAgY29uc3QgYWNvdW50SWQgPSBjdHguY2xpZW50SWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ID0gYXdhaXQgKHRoaXMgYXMgRmFicmljRVJDMjBDb250cmFjdClbXG4gICAgICAgIFwidG9rZW5SZXBvc2l0b3J5XCJcbiAgICAgIF0uc2VsZWN0KCk7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCk7XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXCJObyB0b2tlbnMgYXZhaWFsYmxlXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRvIG1hbnkgdG9rZW4gYXZhaWxhYmxlIDogJHt0b2tlbnMubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW5zWzBdLm93bmVyICE9IGFjb3VudElkKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgICAgYFVzZXIgbm90IGF1dGhvcml6ZWQgdG8gcnVuICR7cHJvcGVydHlLZXl9IG9uIHRoZSB0b2tlbmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG93bmVkQnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc3R1YiB9ID0gY29udGV4dCBhcyBhbnk7XG5cbiAgY29uc3QgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUgPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZTtcblxuICBjb25zdCBjcmVhdG9yID0gYXdhaXQgc3R1Yi5nZXRDcmVhdG9yKCk7XG4gIGxldCBvd25lciA9IGNyZWF0b3IubXNwaWQ7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEV4cGVjdGVkIG1zcGlkIHRvIGJlICR7bW9kZWxba2V5XX0gfCAke293bmVyfS4gXFxuIFVzaW5nIGFsbG93R2VuZXJhdGlvbk92ZXJyaWRlOiAke2FsbG93R2VuZXJhdGlvbk92ZXJyaWRlfWBcbiAgKTtcblxuICBpZiAoYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGUpIG93bmVyID0gbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBvd25lcjtcblxuICBjb25zdCBzZXRPd25lZEJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldE93bmVkQnlLZXlWYWx1ZShtb2RlbCwga2V5IGFzIHN0cmluZywgb3duZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgZ2VuZXJhdGVkKCksXG4gICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgIG9uQ3JlYXRlKG93bmVkQnlPbkNyZWF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShcbiAgICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk9XTkVEX0JZKSxcbiAgICAgICAgICBhdHRyaWJ1dGVcbiAgICAgICAgKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZE9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcbiAgbW9kZWxba2V5XSA9IHN0dWIuZ2V0VHhJRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgZnVuY3Rpb24gdHJhbnNhY3Rpb25JZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgb25VcGRhdGUodHJhbnNhY3Rpb25JZE9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5GQUJSSUMsXG4gICAgICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgICAgICBGYWJyaWNNb2RlbEtleXMuVFJBTlNBQ1RJT05fSURcbiAgICAgICAgICApLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCB0eXBlIE1pcnJvckNvbmRpdGlvbiA9IChtc3A6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTWlycm9yTWV0YWRhdGEgPSB7XG4gIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvbjtcbiAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZztcbiAgbXNwSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsTWlycm9yTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJlc29sdmVyOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIGN0eDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPlxuKSB7XG4gIGxldCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQgPSByZXNvbHZlcjtcbiAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgY3R4LmdldChcInN0dWJcIikuZ2V0Q3JlYXRvcigpLnRvU3RyaW5nKCk7XG4gICAgICBpZiAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGNvbGxlY3Rpb24gPSBhd2FpdCByZXNvbHZlcihtb2RlbCwgb3duZXIsIGN0eCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGNvbGxlY3Rpb24gbWlycm9yIG5hbWU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbGxlY3Rpb24gfHwgdHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gY29sbGVjdGlvbiBmb3VuZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIC8vIFB1dCBtaXJyb3IgZmxhZ3MgZGlyZWN0bHkgb24gY29udGV4dCBzbyBhZGFwdGVyLnByZXBhcmUoKSBhbmQgYWRhcHRlci5jcmVhdGUoKSBjYW4gc2VlIHRoZW1cbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBjb25zdCBtaXJyb3IgPSBhd2FpdCByZXBvLmNyZWF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkIHdpdGggJHtNb2RlbC5wayhtb2RlbCkgYXMgc3RyaW5nfTogJHttaXJyb3JbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhbiB1cCBtaXJyb3IgZmxhZ3MgZnJvbSBjb250ZXh0XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWw7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBtaXJyb3JDb2xsZWN0aW9uOiBjb2xsZWN0aW9uLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgICAgYXBwbHlVcGRhdGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgbWVyZ2VGb3JVcGRhdGU6IGZhbHNlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICBhd2FpdCByZXBvLnVwZGF0ZShzb3VyY2VNb2RlbCwgY29udGV4dCk7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSB1cGRhdGVkOiAkeyhtb2RlbCBhcyBhbnkpW01vZGVsLnBrKG1vZGVsKV19YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlTWlycm9ySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGZhYnJpY0N0eC5wdXQoXCJzZWdyZWdhdGVkXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3AgPSBNb2RlbC5wayhtb2RlbCkgYXMga2V5b2YgTTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrUHJvcF07XG4gICAgY29uc3QgcmVwbyA9IHRoaXMub3ZlcnJpZGUoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAodGhpcyBhcyBhbnkpLl9vdmVycmlkZXMsIHtcbiAgICAgICAgc2VncmVnYXRlZDogY29sbGVjdGlvbixcbiAgICAgICAgbWlycm9yOiB0cnVlLFxuICAgICAgICBpZ25vcmVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICBpZ25vcmVIYW5kbGVyczogdHJ1ZSxcbiAgICAgIH0gYXMgYW55KVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkIGFzIGFueSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNYXkgYWxyZWFkeSBiZSBkZWxldGVkIGJ5IGFkYXB0ZXIuZGVsZXRlU2VncmVnYXRlZENvbGxlY3Rpb25zXG4gICAgfVxuICAgIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgICBgTWlycm9yIGZvciAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gZGVsZXRlZDogJHtTdHJpbmcoaWQpfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pcnJvcldyaXRlR3VhcmQ8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGtleToga2V5b2YgTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG4gIGlmICghbXNwKSByZXR1cm47XG4gIGlmIChtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1zcCA9IGV4dHJhY3RNc3BJZChcbiAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICk7XG5cbiAgaWYgKCFtc3ApIHJldHVybjtcblxuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKG1vZGVsLCBkYXRhLnJlc29sdmVyLCBjb250ZXh0KTtcbiAgY29uc3QgZmFicmljQ3R4ID0gY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIGNvbnN0IG1hdGNoZXMgPSBtc3AgPT09IGRhdGEubXNwSWQgfHwgKGRhdGEuY29uZGl0aW9uICYmIGRhdGEuY29uZGl0aW9uKG1zcCkpO1xuXG4gIGlmIChtYXRjaGVzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgcmVhZDogTVNQICR7bXNwfSBtYXRjaGVzLCByb3V0aW5nIHJlYWRzIHRvIG1pcnJvciBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn1gXG4gICAgKTtcbiAgICAvLyBSb3V0ZSByZWFkcyBleGNsdXNpdmVseSB0aHJvdWdoIHRoZSBtaXJyb3IgY29sbGVjdGlvblxuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgICBmYWJyaWNDdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICAgIGZhYnJpY0N0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbiAgfVxuICAvLyBXaGVuIE1TUCBkb2VzIE5PVCBtYXRjaCwgbm9ybWFsIHJlYWQgZmxvdyDigJQgYWxsIGRhdGEgaXMgaW4gcHVibGljIHN0YXRlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXJyb3IoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgbXNwSWRPckNvbmRpdGlvbj86IHN0cmluZyB8IE1pcnJvckNvbmRpdGlvbixcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uXG4pIHtcbiAgY29uc3QgaXNDb25kaXRpb25Pbmx5ID1cbiAgICB0eXBlb2YgbXNwSWRPckNvbmRpdGlvbiAhPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1zcElkT3JDb25kaXRpb24pO1xuICBjb25zdCBtc3BJZCA9IGlzQ29uZGl0aW9uT25seVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAobXNwSWRPckNvbmRpdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICBjb25zdCBjb25kID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyAobXNwSWRPckNvbmRpdGlvbiBhcyBNaXJyb3JDb25kaXRpb24pXG4gICAgOiBjb25kaXRpb247XG5cbiAgZnVuY3Rpb24gbWlycm9yKFxuICAgIHJlc29sdmVyOiBDb2xsZWN0aW9uUmVzb2x2ZXIgfCBzdHJpbmcsXG4gICAgbXNwSWQ6IHN0cmluZyxcbiAgICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogTWlycm9yTWV0YWRhdGEgPSB7XG4gICAgICBjb25kaXRpb246IGNvbmRpdGlvbixcbiAgICAgIG1zcElkOiBtc3BJZCxcbiAgICAgIHJlc29sdmVyOiByZXNvbHZlcixcbiAgICB9O1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLkZBQlJJQywgRmFicmljTW9kZWxLZXlzLk1JUlJPUiksXG4gICAgICAgIG1ldGFcbiAgICAgICksXG4gICAgICAvLyBSZWFkIGhhbmRsZXIgcnVucyBlYXJseSAocHJpb3JpdHkgMzApIHRvIHNldCB1cCBjb250ZXh0IGJlZm9yZSBhbnkgcmVhZHNcbiAgICAgIG9uUmVhZChyZWFkTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDMwIH0pLFxuICAgICAgLy8gV3JpdGUgZ3VhcmRzIOKAlCByZWplY3QgbWF0Y2hpbmcgTVNQcyBiZWZvcmUgYW55IHByb2Nlc3NpbmdcbiAgICAgIG9uQ3JlYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uVXBkYXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIG9uRGVsZXRlKG1pcnJvcldyaXRlR3VhcmQgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAyMCB9KSxcbiAgICAgIC8vIE1pcnJvciBzeW5jIGhhbmRsZXJzIOKAlCB3cml0ZSBmdWxsIG1vZGVsIGFmdGVyIG90aGVyIGhhbmRsZXJzIChwcmlvcml0eSAxMDApXG4gICAgICBvbkNyZWF0ZShjcmVhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25VcGRhdGUodXBkYXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KSxcbiAgICAgIG9uRGVsZXRlKGRlbGV0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5NSVJST1IpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1pcnJvcixcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uLCBtc3BJZCwgY29uZF0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcD86IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbikgPT4gc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTW9kZWxDb2xsZWN0aW9uOiBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwSWQ/OiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBvcmdOYW1lID1cbiAgICBtc3BJZCB8fCAodHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyBNb2RlbC5vd25lck9mKG1vZGVsKSA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgKTtcbiAgcmV0dXJuIGAke3RvUGFzY2FsQ2FzZShjb25zdHIubmFtZSl9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5hbWVzcGFjZUNvbGxlY3Rpb24obmFtZXNwYWNlOiBzdHJpbmcpOiBDb2xsZWN0aW9uUmVzb2x2ZXIge1xuICByZXR1cm4gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPiwgbXNwSWQ/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvcmdOYW1lID1cbiAgICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb25zdHIgPSB0eXBlb2YgbW9kZWwgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsIDogbW9kZWwuY29uc3RydWN0b3I7XG4gICAgaWYgKCFvcmdOYW1lKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke2NvbnN0ci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICAgKTtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7b3JnTmFtZSA/IHRvUGFzY2FsQ2FzZShvcmdOYW1lKSA6IFwiXCJ9YDtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFvcmdOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYF9fJHt0b1Bhc2NhbENhc2Uob3JnTmFtZSl9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW9yaXR5IGZvciBlYXJseSBjb2xsZWN0aW9uIGV4dHJhY3Rpb24gKGJlZm9yZSBwayBnZW5lcmF0aW9uIGF0IHByaW9yaXR5IDYwKVxuICogQHN1bW1hcnkgVGhpcyBwcmlvcml0eSBlbnN1cmVzIGNvbGxlY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIGNvbnRleHQgYmVmb3JlIGFueSBzZXF1ZW5jZVxuICogb3BlcmF0aW9ucyBvY2N1ciwgYWxsb3dpbmcgc2VxdWVuY2VzIHRvIGJlIHJlcGxpY2F0ZWQgdG8gcHJpdmF0ZS9zaGFyZWQgY29sbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdSRUdBVEVEX0NPTExFQ1RJT05fRVhUUkFDVElPTl9QUklPUklUWSA9IDM1O1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTZWdyZWdhdGlvbkZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBNLFxuICBjb2xsZWN0aW9uczogc3RyaW5nW10sXG4gIGN0eDogYW55XG4pIHtcbiAgLy8gUmVnaXN0ZXIgY29sbGVjdGlvbnMgZWFybHkgdXNpbmcgcmVhZEZyb20gLSB0aGlzIGFsbG93cyBzZXF1ZW5jZSBjb2RlXG4gIC8vIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvIGR1cmluZyBwayBnZW5lcmF0aW9uXG4gIGlmIChjb2xsZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgKGN0eCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb25zKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG1vZGVsIGlzIGZ1bGx5IHNlZ3JlZ2F0ZWQgKGFsbCBub24tcGsgcHJvcGVydGllcyBhcmUgcHJpdmF0ZS9zaGFyZWQvdHJhbnNpZW50KS5cbiAgLy8gVXNlIE1vZGVsLnNlZ3JlZ2F0ZSgpIHdoaWNoIGlzIHRoZSBjYW5vbmljYWwgd2F5IHRvIGRldGVybWluZSB3aGF0J3MgdHJhbnNpZW50LFxuICAvLyByYXRoZXIgdGhhbiByZWFkaW5nIERCS2V5cy5UUkFOU0lFTlQgbWV0YWRhdGEgd2hpY2ggbWF5IG5vdCBhY2N1bXVsYXRlIGNvcnJlY3RseVxuICAvLyB3aGVuIGNsYXNzLWxldmVsIEBwcml2YXRlRGF0YSBhcHBsaWVzIGRlY29yYXRvcnMgaXRlcmF0aXZlbHkuXG4gIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgIGlmICghaGFzUHVibGljUHJvcGVydGllcyhjbGF6ei5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikpIHtcbiAgICAgIGN0eC5tYXJrRnVsbHlTZWdyZWdhdGVkKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU1pcnJvckZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4pIHtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgY29uc3QgbWF0Y2hlcyA9XG4gICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybjtcbiAgY29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IGV2YWxNaXJyb3JNZXRhZGF0YShcbiAgICBuZXcgY2xhenooKSxcbiAgICBtaXJyb3JNZXRhLnJlc29sdmVyLFxuICAgIGN0eFxuICApO1xuICAvLyBNaXJyb3IgTVNQIG1hdGNoZXMg4oCUIHJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvclxuICAvLyBjb2xsZWN0aW9uLiBDbGVhciBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkIGNvbGxlY3Rpb25zIHNvIHF1ZXJpZXNcbiAgLy8gZ28gT05MWSB0byB0aGUgbWlycm9yLCBub3QgdG8gdGhlIHJlZ3VsYXIgcHJpdmF0ZS9zaGFyZWQgb25lcy5cbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRcIiwgdW5kZWZpbmVkKTtcbiAgY3R4LnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwiZnVsbHlTZWdyZWdhdGVkXCIsIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICBjdHgucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGhhc1B1YmxpY1Byb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pOiBib29sZWFuIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXMoY2xhenopIHx8IFtdO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgY29uc3QgdHJhbnNpZW50TWV0YSA9IE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICBjb25zdCBwcml2YXRlTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKSkgfHwge307XG4gIGNvbnN0IHNoYXJlZE1ldGEgPVxuICAgIE1ldGFkYXRhLmdldChjbGF6eiBhcyBhbnksIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuU0hBUkVEKSkgfHwge307XG5cbiAgcmV0dXJuIGF0dHJpYnV0ZXMuc29tZSgoYXR0cikgPT4ge1xuICAgIGlmIChhdHRyID09PSBwaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHRyYW5zaWVudE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXR0ciBpbiBwcml2YXRlTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHNoYXJlZE1ldGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVhcmx5IGhhbmRsZXIgdG8gZXh0cmFjdCBhbmQgcmVnaXN0ZXIgY29sbGVjdGlvbnMgaW4gY29udGV4dFxuICogQHN1bW1hcnkgUnVucyB3aXRoIHByaW9yaXR5IDwgNDAgdG8gZXh0cmFjdCBjb2xsZWN0aW9uIG5hbWVzIGJlZm9yZSBwayBnZW5lcmF0aW9uIChwcmlvcml0eSA2MCkuXG4gKiBUaGlzIGFsbG93cyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIHRvIGtub3cgd2hpY2ggY29sbGVjdGlvbnMgdG8gcmVwbGljYXRlIHRvLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtDb250ZXh0T2Y8UmVwb3NpdG9yeTxNLCBhbnk+Pn0gY29udGV4dCAtIFRoZSBleGVjdXRpb24gY29udGV4dFxuICogQHBhcmFtIHtTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdfSBkYXRhIC0gVGhlIHNlZ3JlZ2F0ZWQgZGF0YSBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0ga2V5cyAtIFRoZSBwcm9wZXJ0eSBrZXkocykgYmVpbmcgc2VncmVnYXRlZFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0T2Y8dHlwZW9mIHRoaXM+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApIHtcbiAgICAvLyBDYW4ndCBleHRyYWN0IGNvbGxlY3Rpb25zIHdpdGhvdXQgTVNQLCB3aWxsIGJlIGNhdWdodCBieSBsYXRlciBoYW5kbGVyc1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG1ldGFkYXRhIG9mIGRhdGFBcnJheSkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IG1ldGFkYXRhLmNvbGxlY3Rpb25zO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcbiAgICBpZiAoY29sbGVjdGlvbiAmJiAhY29sbGVjdGlvbnMuaW5jbHVkZXMoY29sbGVjdGlvbikpIHtcbiAgICAgIGNvbGxlY3Rpb25zLnB1c2goY29sbGVjdGlvbik7XG4gICAgfVxuICB9XG4gIGFwcGx5U2VncmVnYXRpb25GbGFncyhtb2RlbCwgY29sbGVjdGlvbnMsIGNvbnRleHQpO1xuXG4gIC8vIFN0b3JlIHNlZ3JlZ2F0aW9uIG1ldGFkYXRhIHBlci1zZXF1ZW5jZSBzbyBGYWJyaWNDb250cmFjdFNlcXVlbmNlIGNhbiBkZWNpZGVcbiAgLy8gd2hlcmUgdG8gc3RvcmUvcmVwbGljYXRlIHNlcXVlbmNlIHJlY29yZHMgKHB1YmxpYyB2cyBwcml2YXRlL3NoYXJlZCkuXG4gIC8vXG4gIC8vIC0gYEBwaygpYCBzZXF1ZW5jZXMgdXNlIHRoZSBzaGFyZWQgbmFtZSBgJHt0YWJsZX1fcGtgIChubyBpZCBjb21wb25lbnQpLlxuICAvLyAtIGBAc2VxdWVuY2UoKWAgLyBwZXJzaXN0ZW50IGBAdmVyc2lvbih0cnVlKWAgc2VxdWVuY2VzIGFyZSBwZXItbW9kZWwtaW5zdGFuY2U6XG4gIC8vICAgYCR7dGFibGV9XyR7aWR9XyR7cHJvcGVydHl9YC5cbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c10pIGFzIChrZXlvZiBNKVtdO1xuICBjb25zdCBwa0tleSA9IE1vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgYXMga2V5b2YgTTtcbiAgY29uc3QgcGtTZXFOYW1lID0gTW9kZWwuc2VxdWVuY2VOYW1lKG1vZGVsLCBcInBrXCIpO1xuXG4gIGNvbnN0IGlkVmFsdWUgPSAobW9kZWwgYXMgYW55KVtwa0tleSBhcyBhbnldO1xuICBjb25zdCBjYW5CdWlsZFBlckluc3RhbmNlID1cbiAgICB0eXBlb2YgaWRWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpZFZhbHVlICE9PSBudWxsO1xuXG4gIC8vIEFsd2F5cyB1bmlvbiBjb2xsZWN0aW9ucyBmb3IgdGhlIHBrIHNlcXVlbmNlIHdoZW4gdGhlIG1vZGVsIHVzZXMgc2VncmVnYXRlZCBkYXRhLlxuICAoY29udGV4dCBhcyBhbnkpLnNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgcGtTZXFOYW1lLFxuICAgIChjb250ZXh0IGFzIGFueSkuaXNGdWxseVNlZ3JlZ2F0ZWQsXG4gICAgY29sbGVjdGlvbnNcbiAgKTtcblxuICAvLyBGb3IgcGVyLXByb3BlcnR5IHNlcXVlbmNlcywgb25seSByZWdpc3RlciB3aGVuIHdlIGNhbiBjb21wdXRlIGFuIGlkLXNjb3BlZCBuYW1lLlxuICAvLyBUaGlzIGtlZXBzIHNlcXVlbmNlcyBjb25zdHJhaW5lZCB0byB0aGUgY29sbGVjdGlvbnMgdGhlIGF0dHJpYnV0ZSBleGlzdHMgaW4uXG4gIGlmIChjYW5CdWlsZFBlckluc3RhbmNlKSB7XG4gICAgZm9yIChjb25zdCBrIG9mIGtleUFycmF5KSB7XG4gICAgICBjb25zdCBwcm9wU2VxTmFtZSA9IE1vZGVsLnNlcXVlbmNlTmFtZShtb2RlbCwgU3RyaW5nKGlkVmFsdWUpLCBTdHJpbmcoaykpO1xuICAgICAgKGNvbnRleHQgYXMgYW55KS5zZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uKFxuICAgICAgICBwcm9wU2VxTmFtZSxcbiAgICAgICAgKGNvbnRleHQgYXMgYW55KS5pc0Z1bGx5U2VncmVnYXRlZCxcbiAgICAgICAgY29sbGVjdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c10pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAvLyBWYWxpZGF0ZSBhbGwga2V5cyByZXNvbHZlIHRvIHRoZSBzYW1lIGNvbGxlY3Rpb25cbiAga2V5QXJyYXkuZm9yRWFjaCgoX2ssIGkpID0+IHtcbiAgICBjb25zdCBjID1cbiAgICAgIHR5cGVvZiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnNcbiAgICAgICAgOiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGMgIT09IGNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICApO1xuICB9KTtcblxuICBjb25zdCBrZXlTdHJpbmdzID0ga2V5QXJyYXkubWFwKChrZXkpID0+IFN0cmluZyhrZXkpKTtcbiAgLy8gU3RvcmUgdGhlIHNlZ3JlZ2F0ZWQgbW9kZWwg4oCUIHByZXBhcmUoKSB3aWxsIGZpbHRlciB0byBjb2xsZWN0aW9uLXNwZWNpZmljIGZpZWxkc1xuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLndyaXRlVG8oY29sbGVjdGlvbiwga2V5U3RyaW5ncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uUmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljRmxhZ3M+LFxuICBkYXRhOiBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhIHwgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXlzOiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IFtrZXlzXSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG0gPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZVxuICAgICAgPyBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3duZXJPdmVycmlkZVwiKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbXNwID1cbiAgICBtIHx8IE1vZGVsLm93bmVyT2YobW9kZWwpIHx8IGV4dHJhY3RNc3BJZChjb250ZXh0LmdldChcImlkZW50aXR5XCIpKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogYXdhaXQgY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uVXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dE9mPHR5cGVvZiB0aGlzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5OiBrZXlvZiBNIHwgKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG9sZE1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGF0YUFycmF5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogW2RhdGFdXG4gICkgYXMgU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIGtleUFycmF5LmZvckVhY2goKGssIGkpID0+IHtcbiAgICBjb25zdCBjID1cbiAgICAgIHR5cGVvZiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnNcbiAgICAgICAgOiBkYXRhQXJyYXlbaV0uY29sbGVjdGlvbnMobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGMgIT09IGNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICApO1xuICB9KTtcblxuICBjb25zdCBrZXlTdHJpbmdzID0gKGtleUFycmF5IGFzIChrZXlvZiBNKVtdKS5tYXAoKGtleSkgPT4gU3RyaW5nKGtleSkpO1xuICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgbW9kZWwg4oCUIHByZXBhcmUoKSB3aWxsIGZpbHRlciB0byBjb2xsZWN0aW9uLXNwZWNpZmljIGZpZWxkc1xuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLndyaXRlVG8oY29sbGVjdGlvbiwga2V5U3RyaW5ncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIFYgZXh0ZW5kcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWIHwgVltdLFxuICBrZXk6IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXSkgYXMgVltdO1xuICBjb25zdCBrZXlBcnJheSA9IChBcnJheS5pc0FycmF5KGtleSkgPyBrZXkgOiBba2V5XSkgYXMgKGtleW9mIE0pW107XG4gIGlmIChrZXlBcnJheS5sZW5ndGggIT09IGRhdGFBcnJheS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgU2VncmVnYXRlZCBkYXRhIGtleXMgYW5kIG1ldGFkYXRhIGxlbmd0aCBtaXNtYXRjaGBcbiAgICApO1xuXG4gIGNvbnN0IG0gPVxuICAgIGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJhbGxvd0dlbmVyYXRpb25PdmVycmlkZVwiKSB8fCBmYWxzZVxuICAgICAgPyBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwib3duZXJPdmVycmlkZVwiKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbXNwID1cbiAgICBtIHx8XG4gICAgTW9kZWwub3duZXJPZihtb2RlbCkgfHxcbiAgICBleHRyYWN0TXNwSWQoXG4gICAgICBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIHN0cmluZyB8IENsaWVudElkZW50aXR5IHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgaWYgKCFtc3ApXG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBUaGVyZSdzIG5vIGFzc2lnbmVkIG9yZ2FuaXphdGlvbiBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICApO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25SZXNvbHZlciA9IGRhdGFBcnJheVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuXG4gIChjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIHNlZ3JlZ2F0ZWQoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgdHlwZTogRmFicmljTW9kZWxLZXlzLlBSSVZBVEUgfCBGYWJyaWNNb2RlbEtleXMuU0hBUkVELFxuICBmaWx0ZXI/OiAocHJvcE5hbWU6IHN0cmluZykgPT4gYm9vbGVhblxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbm5lclNlZ3JlZ2F0ZWQodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgZnVuY3Rpb24gc2VncmVnYXRlZERlYyh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICAgIGNvbnN0IGtleSA9IE1ldGFkYXRhLmtleSh0eXBlLCBwcm9wZXJ0eUtleSk7XG4gICAgICBjb25zdCBjb25zdHI6IENvbnN0cnVjdG9yID0gdGFyZ2V0LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yO1xuXG4gICAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5KSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gbmV3IFNldChtZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIG1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5LCBtZXRhKTtcblxuICAgICAgY29uc3QgY29uc3RyTWV0YSA9IE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIHR5cGUpIHx8IHt9O1xuICAgICAgY29uc3QgY29uc3RyQ29sbGVjdGlvbnMgPSBuZXcgU2V0KGNvbnN0ck1ldGEuY29sbGVjdGlvbnMgfHwgW10pO1xuICAgICAgY29uc3RyQ29sbGVjdGlvbnMuYWRkKGNvbGxlY3Rpb24pO1xuICAgICAgY29uc3RyTWV0YS5jb2xsZWN0aW9ucyA9IFsuLi5jb25zdHJDb2xsZWN0aW9uc107XG4gICAgICBNZXRhZGF0YS5zZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCB0eXBlLCBjb25zdHJNZXRhKTtcblxuICAgICAgY29uc3QgdHJhbnNpZW50TWV0YSA9XG4gICAgICAgIE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIERCS2V5cy5UUkFOU0lFTlQpIHx8IHt9O1xuICAgICAgY29uc3QgdXBkYXRlZFRyYW5zaWVudE1ldGEgPSB7XG4gICAgICAgIC4uLnRyYW5zaWVudE1ldGEsXG4gICAgICAgIFtwcm9wZXJ0eUtleSBhcyBhbnldOiB7fSxcbiAgICAgIH07XG4gICAgICBNZXRhZGF0YS5zZXQoXG4gICAgICAgIGNvbnN0ciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgREJLZXlzLlRSQU5TSUVOVCxcbiAgICAgICAgdXBkYXRlZFRyYW5zaWVudE1ldGFcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjczogYW55W10gPSBbXTtcbiAgICBpZiAoIXByb3BlcnR5S2V5KSB7XG4gICAgICAvLyBkZWNvcmF0ZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyh0YXJnZXQgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgcHJvcGVydGllcz8uZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIocCkpIHtcbiAgICAgICAgICBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIHR5cGUpKCh0YXJnZXQgYXMgYW55KS5wcm90b3R5cGUsIHApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdyb3VwTmFtZSA9XG4gICAgICAgIHR5cGVvZiBjb2xsZWN0aW9uID09PSBcInN0cmluZ1wiID8gY29sbGVjdGlvbiA6IGNvbGxlY3Rpb24udG9TdHJpbmcoKTtcbiAgICAgIC8vIFVzZSBkaWZmZXJlbnQgZ3JvdXAgbmFtZXMgZm9yIGV4dHJhY3Rpb24gdnMgZGF0YSBoYW5kbGVycyB0byBwcmV2ZW50IG1lcmdpbmdcbiAgICAgIGNvbnN0IGV4dHJhY3RHcm91cE5hbWUgPSBgJHtncm91cE5hbWV9OmV4dHJhY3RgO1xuICAgICAgY29uc3QgZGF0YUdyb3VwTmFtZSA9IGAke2dyb3VwTmFtZX06ZGF0YWA7XG4gICAgICBjb25zdCBlYXJseUV4dHJhY3Rpb25NZXRhID0geyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9O1xuICAgICAgY29uc3QgZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0ID0ge1xuICAgICAgICBwcmlvcml0eTogU0VHUkVHQVRFRF9DT0xMRUNUSU9OX0VYVFJBQ1RJT05fUFJJT1JJVFksXG4gICAgICAgIGdyb3VwOiBleHRyYWN0R3JvdXBOYW1lLFxuICAgICAgfTtcbiAgICAgIGRlY3MucHVzaChcbiAgICAgICAgcHJvcCgpLFxuICAgICAgICB0cmFuc2llbnQoKSxcbiAgICAgICAgc2VncmVnYXRlZERlYyxcbiAgICAgICAgLy8gRWFybHkgZXh0cmFjdGlvbiBoYW5kbGVycyAtIHJ1biBCRUZPUkUgcGsgZ2VuZXJhdGlvbiAocHJpb3JpdHkgNjApXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBjb2xsZWN0aW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiBjb250ZXh0IGZvciBzZXF1ZW5jZSByZXBsaWNhdGlvblxuICAgICAgICAvLyBXZSByZWdpc3RlciBmb3IgZWFjaCBvcGVyYXRpb24gZXhwbGljaXRseSB0byBlbnN1cmUgcHJvcGVyIGhhbmRsZXIgbG9va3VwXG4gICAgICAgIG9uKFxuICAgICAgICAgIERCT3BlcmF0aW9ucy5BTEwsXG4gICAgICAgICAgZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyBhcyBhbnksXG4gICAgICAgICAgZWFybHlFeHRyYWN0aW9uTWV0YSxcbiAgICAgICAgICBlYXJseUV4dHJhY3Rpb25Hcm91cFNvcnRcbiAgICAgICAgKSxcbiAgICAgICAgLy8gTWFpbiBoYW5kbGVycyBmb3Igc2VncmVnYXRlZCBkYXRhIG9wZXJhdGlvbnMgKHByaW9yaXR5IDk1KVxuICAgICAgICBvbkNyZWF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlLFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uUmVhZChcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uUmVhZCBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25VcGRhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblVwZGF0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25EZWxldGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkRlbGV0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhR3JvdXBOYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY3MpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZURhdGEoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlciA9IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb25cbikge1xuICBmdW5jdGlvbiBwcml2YXRlRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHByaXZhdGVEYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHNoYXJlZERhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiJdfQ==