@decaf-ts/for-fabric 0.3.52 → 0.3.53

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 (497) hide show
  1. package/dist/for-fabric.cjs +3748 -2
  2. package/dist/for-fabric.js +3852 -2
  3. package/lib/bin/cli.cjs +2 -1
  4. package/lib/cli-module.cjs +1 -1
  5. package/lib/cli-utils.cjs +1 -1
  6. package/lib/client/FabricClientAdapter.cjs +1 -1
  7. package/lib/client/FabricClientDispatch.cjs +1 -1
  8. package/lib/client/FabricClientPaginator.cjs +1 -1
  9. package/lib/client/FabricClientRepository.cjs +1 -1
  10. package/lib/client/FabricClientStatement.cjs +1 -1
  11. package/lib/client/collections/generation.cjs +1 -1
  12. package/lib/client/collections/index.cjs +1 -1
  13. package/lib/client/constants.cjs +1 -1
  14. package/lib/client/crypto.cjs +1 -1
  15. package/lib/client/erc20/FabricERC20ClientRepository.cjs +1 -1
  16. package/lib/client/erc20/index.cjs +1 -1
  17. package/lib/client/fabric-fs.cjs +1 -1
  18. package/lib/client/fabric-hsm.cjs +1 -1
  19. package/lib/client/ids/id-extraction.cjs +1 -1
  20. package/lib/client/ids/index.cjs +1 -1
  21. package/lib/client/index.cjs +1 -1
  22. package/lib/client/indexes/generation.cjs +1 -1
  23. package/lib/client/indexes/index.cjs +1 -1
  24. package/lib/client/logging.cjs +1 -1
  25. package/lib/client/services/FabricEnrollmentService.cjs +1 -1
  26. package/lib/client/services/FabricIdentityService.cjs +1 -1
  27. package/lib/client/services/RegistrationRequestBuilder.cjs +1 -1
  28. package/lib/client/services/constants.cjs +1 -1
  29. package/lib/client/services/index.cjs +1 -1
  30. package/lib/client/types.cjs +1 -1
  31. package/lib/client/utils.cjs +1 -1
  32. package/lib/contract/Address.cjs +1 -1
  33. package/lib/contract/AddressContract.cjs +1 -1
  34. package/lib/contract/AuditContract.cjs +1 -1
  35. package/lib/contract/BatchContract.cjs +1 -1
  36. package/lib/contract/MarketContract.cjs +1 -1
  37. package/lib/contract/OtherAuditContract.cjs +1 -1
  38. package/lib/contract/OtherBatchContract.cjs +1 -1
  39. package/lib/contract/OtherMarketContract.cjs +1 -1
  40. package/lib/contract/OtherProductContract.cjs +1 -1
  41. package/lib/contract/OtherProductImageContract.cjs +1 -1
  42. package/lib/contract/OtherProductSharedContract.cjs +1 -1
  43. package/lib/contract/OtherProductStrengthContract.cjs +1 -1
  44. package/lib/contract/Product.cjs +1 -1
  45. package/lib/contract/ProductContract.cjs +1 -1
  46. package/lib/contract/ProductStrengthContract.cjs +1 -1
  47. package/lib/contract/SegregatedPrivateDocumentContract.cjs +1 -1
  48. package/lib/contract/SegregatedSharedDocumentContract.cjs +1 -1
  49. package/lib/contract/User.cjs +1 -1
  50. package/lib/contract/UserContract.cjs +1 -1
  51. package/lib/contract/index.cjs +1 -1
  52. package/lib/contract/models/Audit.cjs +1 -1
  53. package/lib/contract/models/BaseIdentifiedModel.cjs +1 -1
  54. package/lib/contract/models/BaseModel.cjs +1 -1
  55. package/lib/contract/models/Batch.cjs +1 -1
  56. package/lib/contract/models/GtinOwner.cjs +1 -1
  57. package/lib/contract/models/History.cjs +1 -1
  58. package/lib/contract/models/Leaflet.cjs +1 -1
  59. package/lib/contract/models/LeafletFile.cjs +1 -1
  60. package/lib/contract/models/Market.cjs +1 -1
  61. package/lib/contract/models/OtherAudit.cjs +1 -1
  62. package/lib/contract/models/OtherBatchShared.cjs +1 -1
  63. package/lib/contract/models/OtherLeaflet.cjs +1 -1
  64. package/lib/contract/models/OtherLeafletFile.cjs +1 -1
  65. package/lib/contract/models/OtherMarket.cjs +1 -1
  66. package/lib/contract/models/OtherProduct.cjs +1 -1
  67. package/lib/contract/models/OtherProductImage.cjs +1 -1
  68. package/lib/contract/models/OtherProductShared.cjs +1 -1
  69. package/lib/contract/models/OtherProductStrength.cjs +1 -1
  70. package/lib/contract/models/Product.cjs +1 -1
  71. package/lib/contract/models/ProductStrength.cjs +1 -1
  72. package/lib/contract/models/SegregatedDocument.cjs +1 -1
  73. package/lib/contract/models/constants.cjs +1 -1
  74. package/lib/contract/models/decorators-private.cjs +1 -1
  75. package/lib/contract/models/decorators.cjs +1 -1
  76. package/lib/contract/models/gtin.cjs +1 -1
  77. package/lib/contract/models/history-dec.cjs +1 -1
  78. package/lib/contracts/ContractAdapter.cjs +50 -79
  79. package/lib/contracts/ContractAdapter.d.ts +9 -0
  80. package/lib/contracts/ContractContext.cjs +1 -1
  81. package/lib/contracts/FabricContractDispatch.cjs +1 -1
  82. package/lib/contracts/FabricContractPaginator.cjs +1 -1
  83. package/lib/contracts/FabricContractRepository.cjs +1 -1
  84. package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +1 -1
  85. package/lib/contracts/FabricContractSequence.cjs +1 -1
  86. package/lib/contracts/FabricContractStatement.cjs +1 -1
  87. package/lib/contracts/PrivateSequence.cjs +1 -1
  88. package/lib/contracts/auth/decorators.cjs +1 -1
  89. package/lib/contracts/auth/index.cjs +1 -1
  90. package/lib/contracts/crud/crud-contract.cjs +1 -1
  91. package/lib/contracts/crud/index.cjs +1 -1
  92. package/lib/contracts/crud/serialized-crud-contract.cjs +1 -1
  93. package/lib/contracts/erc20/erc20contract.cjs +1 -1
  94. package/lib/contracts/erc20/index.cjs +1 -1
  95. package/lib/contracts/erc20/models.cjs +1 -1
  96. package/lib/contracts/index.cjs +1 -1
  97. package/lib/contracts/logging.cjs +1 -1
  98. package/lib/contracts/overrides.cjs +1 -1
  99. package/lib/contracts/types.cjs +1 -1
  100. package/lib/contracts/uuid.cjs +1 -1
  101. package/lib/esm/bin/cli.js +1 -1
  102. package/lib/esm/cli-module.js +1 -1
  103. package/lib/esm/cli-utils.js +1 -1
  104. package/lib/esm/client/FabricClientAdapter.js +1 -1
  105. package/lib/esm/client/FabricClientDispatch.js +1 -1
  106. package/lib/esm/client/FabricClientPaginator.js +1 -1
  107. package/lib/esm/client/FabricClientRepository.js +1 -1
  108. package/lib/esm/client/FabricClientStatement.js +1 -1
  109. package/lib/esm/client/collections/generation.js +1 -1
  110. package/lib/esm/client/collections/index.js +1 -1
  111. package/lib/esm/client/constants.js +1 -1
  112. package/lib/esm/client/crypto.js +1 -1
  113. package/lib/esm/client/erc20/FabricERC20ClientRepository.js +1 -1
  114. package/lib/esm/client/erc20/index.js +1 -1
  115. package/lib/esm/client/fabric-fs.js +1 -1
  116. package/lib/esm/client/fabric-hsm.js +1 -1
  117. package/lib/esm/client/ids/id-extraction.js +1 -1
  118. package/lib/esm/client/ids/index.js +1 -1
  119. package/lib/esm/client/index.js +1 -1
  120. package/lib/esm/client/indexes/generation.js +1 -1
  121. package/lib/esm/client/indexes/index.js +1 -1
  122. package/lib/esm/client/logging.js +1 -1
  123. package/lib/esm/client/services/FabricEnrollmentService.js +1 -1
  124. package/lib/esm/client/services/FabricIdentityService.js +1 -1
  125. package/lib/esm/client/services/RegistrationRequestBuilder.js +1 -1
  126. package/lib/esm/client/services/constants.js +1 -1
  127. package/lib/esm/client/services/index.js +1 -1
  128. package/lib/esm/client/types.js +1 -1
  129. package/lib/esm/client/utils.js +1 -1
  130. package/lib/esm/contract/Address.js +1 -1
  131. package/lib/esm/contract/AddressContract.js +1 -1
  132. package/lib/esm/contract/AuditContract.js +1 -1
  133. package/lib/esm/contract/BatchContract.js +1 -1
  134. package/lib/esm/contract/MarketContract.js +1 -1
  135. package/lib/esm/contract/OtherAuditContract.js +1 -1
  136. package/lib/esm/contract/OtherBatchContract.js +1 -1
  137. package/lib/esm/contract/OtherMarketContract.js +1 -1
  138. package/lib/esm/contract/OtherProductContract.js +1 -1
  139. package/lib/esm/contract/OtherProductImageContract.js +1 -1
  140. package/lib/esm/contract/OtherProductSharedContract.js +1 -1
  141. package/lib/esm/contract/OtherProductStrengthContract.js +1 -1
  142. package/lib/esm/contract/Product.js +1 -1
  143. package/lib/esm/contract/ProductContract.js +1 -1
  144. package/lib/esm/contract/ProductStrengthContract.js +1 -1
  145. package/lib/esm/contract/SegregatedPrivateDocumentContract.js +1 -1
  146. package/lib/esm/contract/SegregatedSharedDocumentContract.js +1 -1
  147. package/lib/esm/contract/User.js +1 -1
  148. package/lib/esm/contract/UserContract.js +1 -1
  149. package/lib/esm/contract/index.js +1 -1
  150. package/lib/esm/contract/models/Audit.js +1 -1
  151. package/lib/esm/contract/models/BaseIdentifiedModel.js +1 -1
  152. package/lib/esm/contract/models/BaseModel.js +1 -1
  153. package/lib/esm/contract/models/Batch.js +1 -1
  154. package/lib/esm/contract/models/GtinOwner.js +1 -1
  155. package/lib/esm/contract/models/History.js +1 -1
  156. package/lib/esm/contract/models/Leaflet.js +1 -1
  157. package/lib/esm/contract/models/LeafletFile.js +1 -1
  158. package/lib/esm/contract/models/Market.js +1 -1
  159. package/lib/esm/contract/models/OtherAudit.js +1 -1
  160. package/lib/esm/contract/models/OtherBatchShared.js +1 -1
  161. package/lib/esm/contract/models/OtherLeaflet.js +1 -1
  162. package/lib/esm/contract/models/OtherLeafletFile.js +1 -1
  163. package/lib/esm/contract/models/OtherMarket.js +1 -1
  164. package/lib/esm/contract/models/OtherProduct.js +1 -1
  165. package/lib/esm/contract/models/OtherProductImage.js +1 -1
  166. package/lib/esm/contract/models/OtherProductShared.js +1 -1
  167. package/lib/esm/contract/models/OtherProductStrength.js +1 -1
  168. package/lib/esm/contract/models/Product.js +1 -1
  169. package/lib/esm/contract/models/ProductStrength.js +1 -1
  170. package/lib/esm/contract/models/SegregatedDocument.js +1 -1
  171. package/lib/esm/contract/models/constants.js +1 -1
  172. package/lib/esm/contract/models/decorators-private.js +1 -1
  173. package/lib/esm/contract/models/decorators.js +1 -1
  174. package/lib/esm/contract/models/gtin.js +1 -1
  175. package/lib/esm/contract/models/history-dec.js +1 -1
  176. package/lib/esm/contracts/ContractAdapter.d.ts +9 -0
  177. package/lib/esm/contracts/ContractAdapter.js +52 -81
  178. package/lib/esm/contracts/ContractContext.js +1 -1
  179. package/lib/esm/contracts/FabricContractDispatch.js +1 -1
  180. package/lib/esm/contracts/FabricContractPaginator.js +1 -1
  181. package/lib/esm/contracts/FabricContractRepository.js +1 -1
  182. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +1 -1
  183. package/lib/esm/contracts/FabricContractSequence.js +1 -1
  184. package/lib/esm/contracts/FabricContractStatement.js +1 -1
  185. package/lib/esm/contracts/PrivateSequence.js +1 -1
  186. package/lib/esm/contracts/auth/decorators.js +1 -1
  187. package/lib/esm/contracts/auth/index.js +1 -1
  188. package/lib/esm/contracts/crud/crud-contract.js +1 -1
  189. package/lib/esm/contracts/crud/index.js +1 -1
  190. package/lib/esm/contracts/crud/serialized-crud-contract.js +1 -1
  191. package/lib/esm/contracts/erc20/erc20contract.js +1 -1
  192. package/lib/esm/contracts/erc20/index.js +1 -1
  193. package/lib/esm/contracts/erc20/models.js +1 -1
  194. package/lib/esm/contracts/index.js +1 -1
  195. package/lib/esm/contracts/logging.js +1 -1
  196. package/lib/esm/contracts/overrides.js +1 -1
  197. package/lib/esm/contracts/types.js +1 -1
  198. package/lib/esm/contracts/uuid.js +1 -1
  199. package/lib/esm/index.js +1 -1
  200. package/lib/esm/shared/ClientSerializer.js +1 -1
  201. package/lib/esm/shared/DeterministicSerializer.js +1 -1
  202. package/lib/esm/shared/SimpleDeterministicSerializer.js +1 -1
  203. package/lib/esm/shared/constants.js +1 -1
  204. package/lib/esm/shared/decorators.js +1 -1
  205. package/lib/esm/shared/erc20/erc20-constants.js +1 -1
  206. package/lib/esm/shared/erc20/index.js +1 -1
  207. package/lib/esm/shared/errors.js +1 -1
  208. package/lib/esm/shared/events.js +1 -1
  209. package/lib/esm/shared/fabric-types.js +1 -1
  210. package/lib/esm/shared/index.js +1 -1
  211. package/lib/esm/shared/interfaces/Checkable.js +1 -1
  212. package/lib/esm/shared/interfaces/index.js +1 -1
  213. package/lib/esm/shared/math.js +1 -1
  214. package/lib/esm/shared/model/FabricBaseModel.js +1 -1
  215. package/lib/esm/shared/model/FabricIdentifiedBaseModel.js +1 -1
  216. package/lib/esm/shared/model/Identity.js +1 -1
  217. package/lib/esm/shared/model/IdentityCredentials.js +1 -1
  218. package/lib/esm/shared/model/index.js +1 -1
  219. package/lib/esm/shared/overrides/Model.js +1 -1
  220. package/lib/esm/shared/overrides/index.js +1 -1
  221. package/lib/esm/shared/overrides/overrides.js +1 -1
  222. package/lib/esm/shared/types.js +1 -1
  223. package/lib/esm/version.d.ts +1 -1
  224. package/lib/esm/version.js +2 -2
  225. package/lib/index.cjs +1 -1
  226. package/lib/shared/ClientSerializer.cjs +1 -1
  227. package/lib/shared/DeterministicSerializer.cjs +1 -1
  228. package/lib/shared/SimpleDeterministicSerializer.cjs +1 -1
  229. package/lib/shared/constants.cjs +1 -1
  230. package/lib/shared/decorators.cjs +1 -1
  231. package/lib/shared/erc20/erc20-constants.cjs +1 -1
  232. package/lib/shared/erc20/index.cjs +1 -1
  233. package/lib/shared/errors.cjs +1 -1
  234. package/lib/shared/events.cjs +1 -1
  235. package/lib/shared/fabric-types.cjs +1 -1
  236. package/lib/shared/index.cjs +1 -1
  237. package/lib/shared/interfaces/Checkable.cjs +1 -1
  238. package/lib/shared/interfaces/index.cjs +1 -1
  239. package/lib/shared/math.cjs +1 -1
  240. package/lib/shared/model/FabricBaseModel.cjs +1 -1
  241. package/lib/shared/model/FabricIdentifiedBaseModel.cjs +1 -1
  242. package/lib/shared/model/Identity.cjs +1 -1
  243. package/lib/shared/model/IdentityCredentials.cjs +1 -1
  244. package/lib/shared/model/index.cjs +1 -1
  245. package/lib/shared/overrides/Model.cjs +1 -1
  246. package/lib/shared/overrides/index.cjs +1 -1
  247. package/lib/shared/overrides/overrides.cjs +1 -1
  248. package/lib/shared/types.cjs +1 -1
  249. package/lib/version.cjs +2 -2
  250. package/lib/version.d.ts +1 -1
  251. package/package.json +1 -1
  252. package/dist/for-fabric.cjs.map +0 -1
  253. package/dist/for-fabric.js.map +0 -1
  254. package/lib/bin/cli.js.map +0 -1
  255. package/lib/cli-module.js.map +0 -1
  256. package/lib/cli-utils.js.map +0 -1
  257. package/lib/client/FabricClientAdapter.js.map +0 -1
  258. package/lib/client/FabricClientDispatch.js.map +0 -1
  259. package/lib/client/FabricClientPaginator.js.map +0 -1
  260. package/lib/client/FabricClientRepository.js.map +0 -1
  261. package/lib/client/FabricClientStatement.js.map +0 -1
  262. package/lib/client/collections/generation.js.map +0 -1
  263. package/lib/client/collections/index.js.map +0 -1
  264. package/lib/client/constants.js.map +0 -1
  265. package/lib/client/crypto.js.map +0 -1
  266. package/lib/client/erc20/FabricERC20ClientRepository.js.map +0 -1
  267. package/lib/client/erc20/index.js.map +0 -1
  268. package/lib/client/fabric-fs.js.map +0 -1
  269. package/lib/client/fabric-hsm.js.map +0 -1
  270. package/lib/client/ids/id-extraction.js.map +0 -1
  271. package/lib/client/ids/index.js.map +0 -1
  272. package/lib/client/index.js.map +0 -1
  273. package/lib/client/indexes/generation.js.map +0 -1
  274. package/lib/client/indexes/index.js.map +0 -1
  275. package/lib/client/logging.js.map +0 -1
  276. package/lib/client/services/FabricEnrollmentService.js.map +0 -1
  277. package/lib/client/services/FabricIdentityService.js.map +0 -1
  278. package/lib/client/services/RegistrationRequestBuilder.js.map +0 -1
  279. package/lib/client/services/constants.js.map +0 -1
  280. package/lib/client/services/index.js.map +0 -1
  281. package/lib/client/types.js.map +0 -1
  282. package/lib/client/utils.js.map +0 -1
  283. package/lib/contract/Address.js.map +0 -1
  284. package/lib/contract/AddressContract.js.map +0 -1
  285. package/lib/contract/AuditContract.js.map +0 -1
  286. package/lib/contract/BatchContract.js.map +0 -1
  287. package/lib/contract/MarketContract.js.map +0 -1
  288. package/lib/contract/OtherAuditContract.js.map +0 -1
  289. package/lib/contract/OtherBatchContract.js.map +0 -1
  290. package/lib/contract/OtherMarketContract.js.map +0 -1
  291. package/lib/contract/OtherProductContract.js.map +0 -1
  292. package/lib/contract/OtherProductImageContract.js.map +0 -1
  293. package/lib/contract/OtherProductSharedContract.js.map +0 -1
  294. package/lib/contract/OtherProductStrengthContract.js.map +0 -1
  295. package/lib/contract/Product.js.map +0 -1
  296. package/lib/contract/ProductContract.js.map +0 -1
  297. package/lib/contract/ProductStrengthContract.js.map +0 -1
  298. package/lib/contract/SegregatedPrivateDocumentContract.js.map +0 -1
  299. package/lib/contract/SegregatedSharedDocumentContract.js.map +0 -1
  300. package/lib/contract/User.js.map +0 -1
  301. package/lib/contract/UserContract.js.map +0 -1
  302. package/lib/contract/index.js.map +0 -1
  303. package/lib/contract/models/Audit.js.map +0 -1
  304. package/lib/contract/models/BaseIdentifiedModel.js.map +0 -1
  305. package/lib/contract/models/BaseModel.js.map +0 -1
  306. package/lib/contract/models/Batch.js.map +0 -1
  307. package/lib/contract/models/GtinOwner.js.map +0 -1
  308. package/lib/contract/models/History.js.map +0 -1
  309. package/lib/contract/models/Leaflet.js.map +0 -1
  310. package/lib/contract/models/LeafletFile.js.map +0 -1
  311. package/lib/contract/models/Market.js.map +0 -1
  312. package/lib/contract/models/OtherAudit.js.map +0 -1
  313. package/lib/contract/models/OtherBatchShared.js.map +0 -1
  314. package/lib/contract/models/OtherLeaflet.js.map +0 -1
  315. package/lib/contract/models/OtherLeafletFile.js.map +0 -1
  316. package/lib/contract/models/OtherMarket.js.map +0 -1
  317. package/lib/contract/models/OtherProduct.js.map +0 -1
  318. package/lib/contract/models/OtherProductImage.js.map +0 -1
  319. package/lib/contract/models/OtherProductShared.js.map +0 -1
  320. package/lib/contract/models/OtherProductStrength.js.map +0 -1
  321. package/lib/contract/models/Product.js.map +0 -1
  322. package/lib/contract/models/ProductStrength.js.map +0 -1
  323. package/lib/contract/models/SegregatedDocument.js.map +0 -1
  324. package/lib/contract/models/constants.js.map +0 -1
  325. package/lib/contract/models/decorators-private.js.map +0 -1
  326. package/lib/contract/models/decorators.js.map +0 -1
  327. package/lib/contract/models/gtin.js.map +0 -1
  328. package/lib/contract/models/history-dec.js.map +0 -1
  329. package/lib/contracts/ContractAdapter.js.map +0 -1
  330. package/lib/contracts/ContractContext.js.map +0 -1
  331. package/lib/contracts/FabricContractDispatch.js.map +0 -1
  332. package/lib/contracts/FabricContractPaginator.js.map +0 -1
  333. package/lib/contracts/FabricContractRepository.js.map +0 -1
  334. package/lib/contracts/FabricContractRepositoryObservableHandler.js.map +0 -1
  335. package/lib/contracts/FabricContractSequence.js.map +0 -1
  336. package/lib/contracts/FabricContractStatement.js.map +0 -1
  337. package/lib/contracts/PrivateSequence.js.map +0 -1
  338. package/lib/contracts/auth/decorators.js.map +0 -1
  339. package/lib/contracts/auth/index.js.map +0 -1
  340. package/lib/contracts/crud/crud-contract.js.map +0 -1
  341. package/lib/contracts/crud/index.js.map +0 -1
  342. package/lib/contracts/crud/serialized-crud-contract.js.map +0 -1
  343. package/lib/contracts/erc20/erc20contract.js.map +0 -1
  344. package/lib/contracts/erc20/index.js.map +0 -1
  345. package/lib/contracts/erc20/models.js.map +0 -1
  346. package/lib/contracts/index.js.map +0 -1
  347. package/lib/contracts/logging.js.map +0 -1
  348. package/lib/contracts/overrides.js.map +0 -1
  349. package/lib/contracts/types.js.map +0 -1
  350. package/lib/contracts/uuid.js.map +0 -1
  351. package/lib/esm/bin/cli.js.map +0 -1
  352. package/lib/esm/cli-module.js.map +0 -1
  353. package/lib/esm/cli-utils.js.map +0 -1
  354. package/lib/esm/client/FabricClientAdapter.js.map +0 -1
  355. package/lib/esm/client/FabricClientDispatch.js.map +0 -1
  356. package/lib/esm/client/FabricClientPaginator.js.map +0 -1
  357. package/lib/esm/client/FabricClientRepository.js.map +0 -1
  358. package/lib/esm/client/FabricClientStatement.js.map +0 -1
  359. package/lib/esm/client/collections/generation.js.map +0 -1
  360. package/lib/esm/client/collections/index.js.map +0 -1
  361. package/lib/esm/client/constants.js.map +0 -1
  362. package/lib/esm/client/crypto.js.map +0 -1
  363. package/lib/esm/client/erc20/FabricERC20ClientRepository.js.map +0 -1
  364. package/lib/esm/client/erc20/index.js.map +0 -1
  365. package/lib/esm/client/fabric-fs.js.map +0 -1
  366. package/lib/esm/client/fabric-hsm.js.map +0 -1
  367. package/lib/esm/client/ids/id-extraction.js.map +0 -1
  368. package/lib/esm/client/ids/index.js.map +0 -1
  369. package/lib/esm/client/index.js.map +0 -1
  370. package/lib/esm/client/indexes/generation.js.map +0 -1
  371. package/lib/esm/client/indexes/index.js.map +0 -1
  372. package/lib/esm/client/logging.js.map +0 -1
  373. package/lib/esm/client/services/FabricEnrollmentService.js.map +0 -1
  374. package/lib/esm/client/services/FabricIdentityService.js.map +0 -1
  375. package/lib/esm/client/services/RegistrationRequestBuilder.js.map +0 -1
  376. package/lib/esm/client/services/constants.js.map +0 -1
  377. package/lib/esm/client/services/index.js.map +0 -1
  378. package/lib/esm/client/types.js.map +0 -1
  379. package/lib/esm/client/utils.js.map +0 -1
  380. package/lib/esm/contract/Address.js.map +0 -1
  381. package/lib/esm/contract/AddressContract.js.map +0 -1
  382. package/lib/esm/contract/AuditContract.js.map +0 -1
  383. package/lib/esm/contract/BatchContract.js.map +0 -1
  384. package/lib/esm/contract/MarketContract.js.map +0 -1
  385. package/lib/esm/contract/OtherAuditContract.js.map +0 -1
  386. package/lib/esm/contract/OtherBatchContract.js.map +0 -1
  387. package/lib/esm/contract/OtherMarketContract.js.map +0 -1
  388. package/lib/esm/contract/OtherProductContract.js.map +0 -1
  389. package/lib/esm/contract/OtherProductImageContract.js.map +0 -1
  390. package/lib/esm/contract/OtherProductSharedContract.js.map +0 -1
  391. package/lib/esm/contract/OtherProductStrengthContract.js.map +0 -1
  392. package/lib/esm/contract/Product.js.map +0 -1
  393. package/lib/esm/contract/ProductContract.js.map +0 -1
  394. package/lib/esm/contract/ProductStrengthContract.js.map +0 -1
  395. package/lib/esm/contract/SegregatedPrivateDocumentContract.js.map +0 -1
  396. package/lib/esm/contract/SegregatedSharedDocumentContract.js.map +0 -1
  397. package/lib/esm/contract/User.js.map +0 -1
  398. package/lib/esm/contract/UserContract.js.map +0 -1
  399. package/lib/esm/contract/index.js.map +0 -1
  400. package/lib/esm/contract/models/Audit.js.map +0 -1
  401. package/lib/esm/contract/models/BaseIdentifiedModel.js.map +0 -1
  402. package/lib/esm/contract/models/BaseModel.js.map +0 -1
  403. package/lib/esm/contract/models/Batch.js.map +0 -1
  404. package/lib/esm/contract/models/GtinOwner.js.map +0 -1
  405. package/lib/esm/contract/models/History.js.map +0 -1
  406. package/lib/esm/contract/models/Leaflet.js.map +0 -1
  407. package/lib/esm/contract/models/LeafletFile.js.map +0 -1
  408. package/lib/esm/contract/models/Market.js.map +0 -1
  409. package/lib/esm/contract/models/OtherAudit.js.map +0 -1
  410. package/lib/esm/contract/models/OtherBatchShared.js.map +0 -1
  411. package/lib/esm/contract/models/OtherLeaflet.js.map +0 -1
  412. package/lib/esm/contract/models/OtherLeafletFile.js.map +0 -1
  413. package/lib/esm/contract/models/OtherMarket.js.map +0 -1
  414. package/lib/esm/contract/models/OtherProduct.js.map +0 -1
  415. package/lib/esm/contract/models/OtherProductImage.js.map +0 -1
  416. package/lib/esm/contract/models/OtherProductShared.js.map +0 -1
  417. package/lib/esm/contract/models/OtherProductStrength.js.map +0 -1
  418. package/lib/esm/contract/models/Product.js.map +0 -1
  419. package/lib/esm/contract/models/ProductStrength.js.map +0 -1
  420. package/lib/esm/contract/models/SegregatedDocument.js.map +0 -1
  421. package/lib/esm/contract/models/constants.js.map +0 -1
  422. package/lib/esm/contract/models/decorators-private.js.map +0 -1
  423. package/lib/esm/contract/models/decorators.js.map +0 -1
  424. package/lib/esm/contract/models/gtin.js.map +0 -1
  425. package/lib/esm/contract/models/history-dec.js.map +0 -1
  426. package/lib/esm/contracts/ContractAdapter.js.map +0 -1
  427. package/lib/esm/contracts/ContractContext.js.map +0 -1
  428. package/lib/esm/contracts/FabricContractDispatch.js.map +0 -1
  429. package/lib/esm/contracts/FabricContractPaginator.js.map +0 -1
  430. package/lib/esm/contracts/FabricContractRepository.js.map +0 -1
  431. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js.map +0 -1
  432. package/lib/esm/contracts/FabricContractSequence.js.map +0 -1
  433. package/lib/esm/contracts/FabricContractStatement.js.map +0 -1
  434. package/lib/esm/contracts/PrivateSequence.js.map +0 -1
  435. package/lib/esm/contracts/auth/decorators.js.map +0 -1
  436. package/lib/esm/contracts/auth/index.js.map +0 -1
  437. package/lib/esm/contracts/crud/crud-contract.js.map +0 -1
  438. package/lib/esm/contracts/crud/index.js.map +0 -1
  439. package/lib/esm/contracts/crud/serialized-crud-contract.js.map +0 -1
  440. package/lib/esm/contracts/erc20/erc20contract.js.map +0 -1
  441. package/lib/esm/contracts/erc20/index.js.map +0 -1
  442. package/lib/esm/contracts/erc20/models.js.map +0 -1
  443. package/lib/esm/contracts/index.js.map +0 -1
  444. package/lib/esm/contracts/logging.js.map +0 -1
  445. package/lib/esm/contracts/overrides.js.map +0 -1
  446. package/lib/esm/contracts/types.js.map +0 -1
  447. package/lib/esm/contracts/uuid.js.map +0 -1
  448. package/lib/esm/index.js.map +0 -1
  449. package/lib/esm/shared/ClientSerializer.js.map +0 -1
  450. package/lib/esm/shared/DeterministicSerializer.js.map +0 -1
  451. package/lib/esm/shared/SimpleDeterministicSerializer.js.map +0 -1
  452. package/lib/esm/shared/constants.js.map +0 -1
  453. package/lib/esm/shared/decorators.js.map +0 -1
  454. package/lib/esm/shared/erc20/erc20-constants.js.map +0 -1
  455. package/lib/esm/shared/erc20/index.js.map +0 -1
  456. package/lib/esm/shared/errors.js.map +0 -1
  457. package/lib/esm/shared/events.js.map +0 -1
  458. package/lib/esm/shared/fabric-types.js.map +0 -1
  459. package/lib/esm/shared/index.js.map +0 -1
  460. package/lib/esm/shared/interfaces/Checkable.js.map +0 -1
  461. package/lib/esm/shared/interfaces/index.js.map +0 -1
  462. package/lib/esm/shared/math.js.map +0 -1
  463. package/lib/esm/shared/model/FabricBaseModel.js.map +0 -1
  464. package/lib/esm/shared/model/FabricIdentifiedBaseModel.js.map +0 -1
  465. package/lib/esm/shared/model/Identity.js.map +0 -1
  466. package/lib/esm/shared/model/IdentityCredentials.js.map +0 -1
  467. package/lib/esm/shared/model/index.js.map +0 -1
  468. package/lib/esm/shared/overrides/Model.js.map +0 -1
  469. package/lib/esm/shared/overrides/index.js.map +0 -1
  470. package/lib/esm/shared/overrides/overrides.js.map +0 -1
  471. package/lib/esm/shared/types.js.map +0 -1
  472. package/lib/esm/version.js.map +0 -1
  473. package/lib/index.js.map +0 -1
  474. package/lib/shared/ClientSerializer.js.map +0 -1
  475. package/lib/shared/DeterministicSerializer.js.map +0 -1
  476. package/lib/shared/SimpleDeterministicSerializer.js.map +0 -1
  477. package/lib/shared/constants.js.map +0 -1
  478. package/lib/shared/decorators.js.map +0 -1
  479. package/lib/shared/erc20/erc20-constants.js.map +0 -1
  480. package/lib/shared/erc20/index.js.map +0 -1
  481. package/lib/shared/errors.js.map +0 -1
  482. package/lib/shared/events.js.map +0 -1
  483. package/lib/shared/fabric-types.js.map +0 -1
  484. package/lib/shared/index.js.map +0 -1
  485. package/lib/shared/interfaces/Checkable.js.map +0 -1
  486. package/lib/shared/interfaces/index.js.map +0 -1
  487. package/lib/shared/math.js.map +0 -1
  488. package/lib/shared/model/FabricBaseModel.js.map +0 -1
  489. package/lib/shared/model/FabricIdentifiedBaseModel.js.map +0 -1
  490. package/lib/shared/model/Identity.js.map +0 -1
  491. package/lib/shared/model/IdentityCredentials.js.map +0 -1
  492. package/lib/shared/model/index.js.map +0 -1
  493. package/lib/shared/overrides/Model.js.map +0 -1
  494. package/lib/shared/overrides/index.js.map +0 -1
  495. package/lib/shared/overrides/overrides.js.map +0 -1
  496. package/lib/shared/types.js.map +0 -1
  497. package/lib/version.js.map +0 -1
@@ -179,4 +179,4 @@ function publicContext(ctx) {
179
179
  segregateReadStack: undefined,
180
180
  });
181
181
  }
182
- //# sourceMappingURL=decorators.js.map
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250cmFjdC9tb2RlbHMvZGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXFCQSxvRUFzQ0M7QUFNRCw4Q0FnREM7QUFFRCxnREE4QkM7QUFFRCxnREE0Q0M7QUFFRCxnREE2QkM7QUFNRCxzQkFVQztBQUVELG9FQXFCQztBQUVELG9FQWtCQztBQUVELGdEQUtDO0FBaFNELHlFQUF1RDtBQUN2RCxxREFBb0U7QUFDcEUsMkRBT2lDO0FBQ2pDLHVDQUFnQztBQUNoQyx5Q0FLd0I7QUFHeEIsK0NBQXdDO0FBRWpDLEtBQUssVUFBVSw0QkFBNEIsQ0FDaEQsS0FBUSxFQUNSLE9BQVksRUFDWixXQUdDO0lBRUQsTUFBTSxnQkFBZ0IsR0FDcEIsV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsSUFBSSxJQUFJLEdBQXlCLFNBQVMsQ0FBQztJQUMzQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsTUFBTSxHQUFHLEdBQUcsNEJBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDNUUsSUFBSSxHQUFHO1lBQ0wsR0FBRyxJQUFJLEdBQUcsQ0FDUixDQUFDLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDbEUsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRO29CQUM1QixDQUFDLENBQUMsR0FBRztvQkFDTCxDQUFDLENBQUUsR0FBMEIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDOUMsQ0FBQyxDQUFDLENBQ0g7U0FDRixDQUFD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QUM7QUFDSixDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCO0lBQ2hDLE9BQU8sSUFBQSxrQkFBSyxFQUNWLElBQUEsd0JBQVEsRUFBQyw0QkFBbUMsRUFBRSxFQUFFLENBQUMsRUFDakQsSUFBQSwyQkFBVyxFQUFDLDRCQUFtQyxFQUFFLEVBQUUsQ0FBQyxDQUNyRCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEdBQTBCO0lBQy9DLE9BQU8sSUFBSyxHQUFHLENBQUMsV0FBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDbEQsZUFBZSxFQUFFLEtBQUs7UUFDdEIsVUFBVSxFQUFFLFNBQVM7UUFDckIsY0FBYyxFQUFFLFNBQVM7UUFDekIsYUFBYSxFQUFFLFNBQVM7UUFDeEIsY0FBYyxFQUFFLFNBQVM7UUFDekIsa0JBQWtCLEVBQUUsU0FBUztLQUM5QixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSwgYXBwbHksIENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBhZnRlckNyZWF0ZSxcbiAgYWZ0ZXJEZWxldGUsXG4gIGFmdGVyVXBkYXRlLFxuICBJbnRlcm5hbEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBBdWRpdCB9IGZyb20gXCIuL0F1ZGl0XCI7XG5pbXBvcnQge1xuICBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi4vLi4vY29udHJhY3RzL0NvbnRyYWN0Q29udGV4dFwiO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc29sdmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBHdGluT3duZXIgfSBmcm9tIFwiLi9HdGluT3duZXJcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYnVpbGRGb3JNYXRjaGluZ0NvbGxlY3Rpb248TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIGNvbnRleHQ6IGFueSxcbiAgY29sbGVjdGlvbnM6IHtcbiAgICBwcml2YXRlQ29sczogKHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcilbXTtcbiAgICBzaGFyZWRDb2xzOiAoc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKVtdO1xuICB9XG4pIHtcbiAgY29uc3QgbWFwVG9Db2xsZWN0aW9ucyA9XG4gICAgY29sbGVjdGlvbnMgJiYgKGNvbGxlY3Rpb25zLnByaXZhdGVDb2xzIHx8IGNvbGxlY3Rpb25zLnNoYXJlZENvbHMpO1xuICBsZXQgY29sczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGlmIChtYXBUb0NvbGxlY3Rpb25zKSB7XG4gICAgY29uc3QgbXNwID0gTW9kZWwub3duZXJPZihtb2RlbCkgfHwgKGF3YWl0IGNvbnRleHQuc3R1Yi5nZXRDcmVhdG9yKCkpLm1zcGlkO1xuICAgIGNvbHMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICBbLi4uY29sbGVjdGlvbnMucHJpdmF0ZUNvbHMsIC4uLmNvbGxlY3Rpb25zLnNoYXJlZENvbHNdLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBjb2wgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gY29sXG4gICAgICAgICAgICA6IChjb2wgYXMgQ29sbGVjdGlvblJlc29sdmVyKShtb2RlbCwgbXNwKTtcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgXTtcblxuICAgIGNvbnN0IHBrID0gTW9kZWwucGsobW9kZWwpO1xuXG4gICAgY29scy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGxldCBzZWdEYXRhOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICBzZWdEYXRhID0gY29udGV4dC5nZXQoXCJzZWdyZWdhdGVkRGF0YVwiKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm47IC8vIHNlZ3JlZ2F0ZWREYXRhIG5vdCBwcmVzZW50IGluIHRoaXMgY29udGV4dCAoZS5nLiBjYXNjYWRlIGNoaWxkKVxuICAgICAgfVxuICAgICAgaWYgKCFzZWdEYXRhIHx8ICFzZWdEYXRhW2NvbF0gfHwgISgobW9kZWxbcGtdIGFzIGFueSkgaW4gc2VnRGF0YVtjb2xdKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgT2JqZWN0LmFzc2lnbihtb2RlbCwgc2VnRGF0YVtjb2xdW21vZGVsW3BrXV0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBtb2RlbDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2hhbGxvdy1jbG9uZWQgY29weSBvZiB0aGUgbW9kZWwgd2l0aCByZWxhdGlvbiBwcm9wZXJ0aWVzIHJlc29sdmVkXG4gKiB0byB0aGVpciBmdWxsIGluc3RhbmNlcy4gVGhlIG9yaWdpbmFsIG1vZGVsIGlzIE5PVCBtdXRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVSZWxhdGlvbnM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgb3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgYW55PlxuKTogUHJvbWlzZTxNPiB7XG4gIC8vIENyZWF0ZSBhIHNoYWxsb3cgY29weSBwcmVzZXJ2aW5nIHRoZSBwcm90b3R5cGUgc28gY29tcGFyZSgpIGV0Yy4gc3RpbGwgd29ya1xuICBjb25zdCBjb3B5ID0gT2JqZWN0LmFzc2lnbihcbiAgICBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbCkpLFxuICAgIG1vZGVsXG4gICkgYXMgTTtcbiAgY29uc3QgcmVsUHJvcHMgPSBNb2RlbC5yZWxhdGlvbnMobW9kZWwpIGFzIHN0cmluZ1tdO1xuICBpZiAoIXJlbFByb3BzIHx8ICFyZWxQcm9wcy5sZW5ndGgpIHJldHVybiBjb3B5O1xuICBmb3IgKGNvbnN0IHByb3BLZXkgb2YgcmVsUHJvcHMpIHtcbiAgICBjb25zdCBtZXRhID0gTW9kZWwucmVsYXRpb25zKFxuICAgICAgbW9kZWwsXG4gICAgICBwcm9wS2V5IGFzIGtleW9mIE1cbiAgICApIGFzIFJlbGF0aW9uc01ldGFkYXRhO1xuICAgIGNvbnN0IGNsYXp6T3JGbiA9IG1ldGEuY2xhc3M7XG4gICAgY29uc3QgY2xheno6IENvbnN0cnVjdG9yPE1vZGVsPiA9XG4gICAgICB0eXBlb2YgY2xhenpPckZuID09PSBcImZ1bmN0aW9uXCIgJiYgKGNsYXp6T3JGbiBhcyBhbnkpLm5hbWVcbiAgICAgICAgPyAoY2xhenpPckZuIGFzIENvbnN0cnVjdG9yPE1vZGVsPilcbiAgICAgICAgOiAoY2xhenpPckZuIGFzICgpID0+IENvbnN0cnVjdG9yPE1vZGVsPikoKTtcbiAgICBjb25zdCB2YWx1ZSA9IChjb3B5IGFzIGFueSlbcHJvcEtleV07XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNsYXp6KS5vdmVycmlkZShvdmVycmlkZXMgfHwge30pO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmVkLnB1c2goYXdhaXQgcmVwby5yZWFkKFN0cmluZyhpdGVtKSwgY29udGV4dCkpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmVzb2x2ZWQucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZWQucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKGNvcHkgYXMgYW55KVtwcm9wS2V5XSA9IHJlc29sdmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKGNvcHkgYXMgYW55KVtwcm9wS2V5XSA9IGF3YWl0IHJlcG8ucmVhZChTdHJpbmcodmFsdWUpLCBjb250ZXh0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBrZWVwIG9yaWdpbmFsIHZhbHVlIGlmIHJlYWQgZmFpbHNcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBdWRpdEhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgZGF0YTogQXVkaXRNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKEF1ZGl0KTtcblxuICBpZiAoIWNvbnRleHQuaWRlbnRpdHkgfHwgIWNvbnRleHQuaWRlbnRpdHkuZ2V0SUQpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYExvc3QgY29udGV4dCBhcHBhcmVudGx5IGZvciBhdWRpdGApO1xuXG4gIG1vZGVsID0gYXdhaXQgcG9wdWxhdGVSZWxhdGlvbnMobW9kZWwsIGNvbnRleHQsIHRoaXMuX292ZXJyaWRlcyk7XG5cbiAgY29uc3QgdG9DcmVhdGUgPSBuZXcgQXVkaXQoe1xuICAgIHVzZXJHcm91cDogY29udGV4dC5pZGVudGl0eS5nZXRJRCgpLFxuICAgIHVzZXJJZDogY29udGV4dC5pZGVudGl0eS5nZXRJRCgpLFxuICAgIG1vZGVsOiBNb2RlbC50YWJsZU5hbWUoZGF0YS5jbGFzcyksXG4gICAgdHJhbnNhY3Rpb246IGNvbnRleHQuc3R1Yi5nZXRUeElEKCksXG4gICAgYWN0aW9uOiBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICBkaWZmczogbmV3IHRoaXMuY2xhc3MoKS5jb21wYXJlKG1vZGVsKSxcbiAgfSk7XG5cbiAgY29uc3QgYXVkaXQgPSBhd2FpdCByZXBvLm92ZXJyaWRlKHRoaXMuX292ZXJyaWRlcykuY3JlYXRlKHRvQ3JlYXRlLCBjb250ZXh0KTtcbiAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICBgQXVkaXQgbG9nIGZvciAke09wZXJhdGlvbktleXMuQ1JFQVRFfSBvZiAke01vZGVsLnRhYmxlTmFtZSh0aGlzLmNsYXNzKX0gY3JlYXRlZDogJHthdWRpdC5pZH06ICR7SlNPTi5zdHJpbmdpZnkoYXVkaXQsIHVuZGVmaW5lZCwgMil9YFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQXVkaXRIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gIGRhdGE6IEF1ZGl0TWV0YWRhdGEsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoQXVkaXQpO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb25zID0gTW9kZWwuY29sbGVjdGlvbnNGb3IoQXVkaXQpO1xuICAvL1xuICAvLyBtb2RlbCA9IGF3YWl0IHJlYnVpbGRGb3JNYXRjaGluZ0NvbGxlY3Rpb24obW9kZWwsIGNvbnRleHQsIGNvbGxlY3Rpb25zKTtcblxuICBpZiAoIWNvbnRleHQuaWRlbnRpdHkgfHwgIWNvbnRleHQuaWRlbnRpdHkuZ2V0SUQpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYExvc3QgY29udGV4dCBhcHBhcmVudGx5IGZvciBhdWRpdGApO1xuXG4gIGNvbnN0IHBvcHVsYXRlZE1vZGVsID0gYXdhaXQgcG9wdWxhdGVSZWxhdGlvbnMoXG4gICAgbW9kZWwsXG4gICAgY29udGV4dCxcbiAgICB0aGlzLl9vdmVycmlkZXNcbiAgKTtcbiAgY29uc3QgcG9wdWxhdGVkT2xkTW9kZWwgPSBhd2FpdCBwb3B1bGF0ZVJlbGF0aW9ucyhcbiAgICBvbGRNb2RlbCxcbiAgICBjb250ZXh0LFxuICAgIHRoaXMuX292ZXJyaWRlc1xuICApO1xuXG4gIGNvbnN0IHRvQ3JlYXRlID0gbmV3IEF1ZGl0KHtcbiAgICB1c2VyR3JvdXA6IGNvbnRleHQuaWRlbnRpdHkuZ2V0SUQoKSxcbiAgICB1c2VySWQ6IGNvbnRleHQuaWRlbnRpdHkuZ2V0SUQoKSxcbiAgICBtb2RlbDogTW9kZWwudGFibGVOYW1lKGRhdGEuY2xhc3MpLFxuICAgIHRyYW5zYWN0aW9uOiBjb250ZXh0LnN0dWIuZ2V0VHhJRCgpLFxuICAgIGFjdGlvbjogT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgZGlmZnM6IHBvcHVsYXRlZE1vZGVsLmNvbXBhcmUocG9wdWxhdGVkT2xkTW9kZWwpLFxuICB9KTtcblxuICBjb25zdCBhdWRpdCA9IGF3YWl0IHJlcG8ub3ZlcnJpZGUodGhpcy5fb3ZlcnJpZGVzKS5jcmVhdGUodG9DcmVhdGUsIGNvbnRleHQpO1xuICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgIGBBdWRpdCBsb2cgZm9yICR7T3BlcmF0aW9uS2V5cy5VUERBVEV9IG9mICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkOiAke0pTT04uc3RyaW5naWZ5KGF1ZGl0LCB1bmRlZmluZWQsIDIpfWBcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUF1ZGl0SGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0LFxuICBkYXRhOiBBdWRpdE1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb250ZXh0LmlkZW50aXR5IHx8ICFjb250ZXh0LmlkZW50aXR5LmdldElEKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBMb3N0IGNvbnRleHQgYXBwcmVudGx5LiBubyBnZXRJZCBpbiBpZGVudGl0eWApO1xuXG4gIG1vZGVsID0gYXdhaXQgcG9wdWxhdGVSZWxhdGlvbnMobW9kZWwsIGNvbnRleHQsIHRoaXMuX292ZXJyaWRlcyk7XG5cbiAgY29uc3QgdG9DcmVhdGUgPSBuZXcgQXVkaXQoe1xuICAgIHVzZXJHcm91cDogY29udGV4dC5pZGVudGl0eS5nZXRJRCgpLFxuICAgIHVzZXJJZDogY29udGV4dC5pZGVudGl0eS5nZXRJRCgpLFxuICAgIG1vZGVsOiBNb2RlbC50YWJsZU5hbWUoZGF0YS5jbGFzcyksXG4gICAgdHJhbnNhY3Rpb246IGNvbnRleHQuc3R1Yi5nZXRUeElEKCksXG4gICAgYWN0aW9uOiBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICBkaWZmczogbW9kZWwuY29tcGFyZShuZXcgdGhpcy5jbGFzcygpKSxcbiAgfSk7XG5cbiAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoQXVkaXQpO1xuICBjb25zdCBhdWRpdCA9IGF3YWl0IHJlcG8ub3ZlcnJpZGUodGhpcy5fb3ZlcnJpZGVzKS5jcmVhdGUodG9DcmVhdGUsIGNvbnRleHQpO1xuICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgIGBBdWRpdCBsb2cgZm9yICR7T3BlcmF0aW9uS2V5cy5ERUxFVEV9IG9mICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBjcmVhdGVkOiAke0pTT04uc3RyaW5naWZ5KGF1ZGl0LCB1bmRlZmluZWQsIDIpfWBcbiAgKTtcbn1cblxuZXhwb3J0IHR5cGUgQXVkaXRNZXRhZGF0YSA9IHtcbiAgY2xhc3M6IENvbnN0cnVjdG9yPE1vZGVsPjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBhdWRpdChtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw8Ym9vbGVhbj4+KSB7XG4gIGNvbnN0IG1ldGE6IEF1ZGl0TWV0YWRhdGEgPSB7XG4gICAgY2xhc3M6IG1vZGVsLFxuICB9O1xuICByZXR1cm4gYXBwbHkoXG4gICAgYWZ0ZXJDcmVhdGUoY3JlYXRlQXVkaXRIYW5kbGVyIGFzIGFueSwgbWV0YSksXG4gICAgYWZ0ZXJVcGRhdGUodXBkYXRlQXVkaXRIYW5kbGVyIGFzIGFueSwgbWV0YSksXG4gICAgYWZ0ZXJEZWxldGUoZGVsZXRlQXVkaXRIYW5kbGVyIGFzIGFueSwgbWV0YSksXG4gICAgbWV0YWRhdGEoXCJhdWRpdFwiLCB0cnVlKVxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXNzaWduR3Rpbk93bmVySGFuZGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNPixcbiAgVixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogeyBwcm9kdWN0Q29kZTogc3RyaW5nIH1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsLnByb2R1Y3RDb2RlKVxuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKGBHdGluIG93bmVyIGNhbiBvbmx5IGJlIGFzc2lnbmVkIHRvIHByb2R1Y3RzYCk7XG4gIGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKEd0aW5Pd25lcik7XG4gIGNvbnN0IHRvQ3JlYXRlID0gbmV3IEd0aW5Pd25lcih7XG4gICAgcHJvZHVjdENvZGU6IG1vZGVsLnByb2R1Y3RDb2RlLFxuICB9KTtcbiAgY29uc3Qgb3duZXIgPSBhd2FpdCByZXBvLmNyZWF0ZSh0b0NyZWF0ZSwgcHVibGljQ29udGV4dChjb250ZXh0KSk7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEdUSU4gb3duZXIgYXNzaWduZWQgZm9yIHByb2R1Y3QgJHttb2RlbC5wcm9kdWN0Q29kZX06ICR7b3duZXIub3duZWRCeX1gXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVBc3NpZ25HdGluT3duZXJIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiB7IHByb2R1Y3RDb2RlOiBzdHJpbmcgfVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghbW9kZWwucHJvZHVjdENvZGUpXG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoYEd0aW4gb3duZXIgY2FuIG9ubHkgYmUgYXNzaWduZWQgdG8gcHJvZHVjdHNgKTtcbiAgY29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoR3Rpbk93bmVyKTtcbiAgY29uc3Qgb3duZXIgPSBhd2FpdCByZXBvLmRlbGV0ZShtb2RlbC5wcm9kdWN0Q29kZSwgcHVibGljQ29udGV4dChjb250ZXh0KSk7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oXG4gICAgYEdUSU4gb3duZXIgYXNzaWduZWQgZm9yIHByb2R1Y3QgJHttb2RlbC5wcm9kdWN0Q29kZX06ICR7b3duZXIub3duZWRCeX1gXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25Qcm9kdWN0T3duZXIoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZShjcmVhdGVBc3NpZ25HdGluT3duZXJIYW5kbGVyIGFzIGFueSwge30pLFxuICAgIGFmdGVyRGVsZXRlKGRlbGV0ZUFzc2lnbkd0aW5Pd25lckhhbmRsZXIgYXMgYW55LCB7fSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHVibGljQ29udGV4dChjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCkge1xuICByZXR1cm4gbmV3IChjdHguY29uc3RydWN0b3IgYXMgYW55KShjdHgpLmFjY3VtdWxhdGUoe1xuICAgIGZ1bGx5U2VncmVnYXRlZDogZmFsc2UsXG4gICAgc2VncmVnYXRlZDogdW5kZWZpbmVkLFxuICAgIHNlZ3JlZ2F0ZWREYXRhOiB1bmRlZmluZWQsXG4gICAgc2VncmVnYXRlUmVhZDogdW5kZWZpbmVkLFxuICAgIHNlZ3JlZ2F0ZVdyaXRlOiB1bmRlZmluZWQsXG4gICAgc2VncmVnYXRlUmVhZFN0YWNrOiB1bmRlZmluZWQsXG4gIH0pO1xufVxuIl19
@@ -85,4 +85,4 @@ function generateGtin() {
85
85
  function getBatch() {
86
86
  return Math.random().toString(36).replace(".", "").toUpperCase().slice(5);
87
87
  }
88
- //# sourceMappingURL=gtin.js.map
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Rpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250cmFjdC9tb2RlbHMvZ3Rpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUF1RUEsb0NBV0M7QUFFRCw0QkFFQztBQXRGRCx5RUFNd0M7QUFDeEMsMkRBQW1EO0FBQ25ELHFEQUE2QztBQUU3QyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztBQUNuQyxNQUFNLDZCQUE2QixHQUFHLGtCQUFrQixDQUFDO0FBR2xELElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWMsU0FBUSxnQ0FBUztJQUMxQyxZQUFZLFVBQWtCLDZCQUE2QjtRQUN6RCxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsU0FBUyxDQUNQLEtBQXNCLEVBQ3RCLE9BQTBCO1FBRTFCLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBRWhDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsSUFBSSxD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RSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgaW5uZXJWYWxpZGF0aW9uRGVjb3JhdG9yLFxuICByZXF1aXJlZCxcbiAgVmFsaWRhdG9yLFxuICB2YWxpZGF0b3IsXG4gIFZhbGlkYXRvck9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHJlYWRvbmx5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBhcHBseSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5jb25zdCBHVElOX1ZBTElEQVRJT05fS0VZID0gXCJndGluXCI7XG5jb25zdCBHVElOX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSA9IFwiTm90IGEgdmFsaWQgR3RpblwiO1xuXG5AdmFsaWRhdG9yKEdUSU5fVkFMSURBVElPTl9LRVkpXG5leHBvcnQgY2xhc3MgR3RpblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IEdUSU5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgXCJzdHJpbmdcIiwgXCJudW1iZXJcIik7XG4gIH1cblxuICBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IG51bWJlciB8IHN0cmluZyxcbiAgICBvcHRpb25zPzogVmFsaWRhdG9yT3B0aW9uc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBjb25zdCB7IG1lc3NhZ2UgfSA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZ3RpbiA9IHZhbHVlICsgXCJcIjtcbiAgICBpZiAoIWd0aW4ubWF0Y2goL1xcZHsxNH0vZykpIHJldHVybiB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuXG4gICAgY29uc3QgZGlnaXRzID0gZ3Rpbi5zbGljZSgwLCAxMyk7XG4gICAgY29uc3QgY2hlY2tzdW0gPSBjYWxjdWxhdGVHdGluQ2hlY2tTdW0oZGlnaXRzKTtcbiAgICByZXR1cm4gcGFyc2VJbnQoY2hlY2tzdW0pID09PSBwYXJzZUludChndGluLmNoYXJBdCgxMykpXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBndGluID0gKG1lc3NhZ2U6IHN0cmluZyA9IEdUSU5fVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKSA9PiB7XG4gIHJldHVybiBhcHBseShcbiAgICByZXF1aXJlZCgpLFxuICAgIHJlYWRvbmx5KCksXG4gICAgaW5uZXJWYWxpZGF0aW9uRGVjb3JhdG9yKGd0aW4sIEdUSU5fVkFMSURBVElPTl9LRVksIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBhc3luYzogZmFsc2UsXG4gICAgfSlcbiAgKTtcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmdzMS5vcmcvc2VydmljZXMvaG93LWNhbGN1bGF0ZS1jaGVjay1kaWdpdC1tYW51YWxseVxuZnVuY3Rpb24gY2FsY3VsYXRlR3RpbkNoZWNrU3VtKGRpZ2l0czogc3RyaW5nKTogc3RyaW5nIHtcbiAgZGlnaXRzID0gXCJcIiArIGRpZ2l0cztcbiAgaWYgKGRpZ2l0cy5sZW5ndGggIT09IDEzKSB0aHJvdyBuZXcgRXJyb3IoXCJuZWVkcyB0byByZWNlaXZlZCAxMyBkaWdpdHNcIik7XG4gIGNvbnN0IG11bHRpcGxpZXIgPSBbMywgMSwgMywgMSwgMywgMSwgMywgMSwgMywgMSwgMywgMSwgM107XG4gIGxldCBzdW0gPSAwO1xuICB0cnkge1xuICAgIC8vIG11bHRpcGx5IGVhY2ggZGlnaXQgZm9yIGl0cyBtdWx0aXBsaWVyIGFjY29yZGluZyB0byB0aGUgdGFibGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEzOyBpKyspXG4gICAgICBzdW0gKz0gcGFyc2VJbnQoZGlnaXRzLmNoYXJBdChpKSkgKiBtdWx0aXBsaWVyW2ldO1xuXG4gICAgLy8gRmluZCB0aGUgbmVhcmVzdCBlcXVhbCBvciBoaWdoZXIgbXVsdGlwbGUgb2YgdGVuXG4gICAgY29uc3QgcmVtYWluZGVyID0gc3VtICUgMTA7XG4gICAgbGV0IG5lYXJlc3Q7XG4gICAgaWYgKHJlbWFpbmRlciA9PT0gMCkgbmVhcmVzdCA9IHN1bTtcbiAgICBlbHNlIG5lYXJlc3QgPSBzdW0gLSByZW1haW5kZXIgKyAxMDtcblxuICAgIHJldHVybiBuZWFyZXN0IC0gc3VtICsgXCJcIjtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGlkIHRoaXMgcmVjZWl2ZWQgbnVtYmVycz8gJHtlfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUd0aW4oKTogc3RyaW5nIHtcbiAgZnVuY3Rpb24gcGFkKG51bTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBwYWRkaW5nOiBzdHJpbmcgPSBcIjBcIikge1xuICAgIGNvbnN0IG4gPSBudW0gKyBcIlwiO1xuICAgIHJldHVybiBuLmxlbmd0aCA+PSB3aWR0aFxuICAgICAgPyBuXG4gICAgICA6IG5ldyBBcnJheSh3aWR0aCAtIG4ubGVuZ3RoICsgMSkuam9pbihwYWRkaW5nKSArIG47XG4gIH1cblxuICBjb25zdCBiZWZvcmVDaGVja3N1bSA9IHBhZChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5OTk5OTk5OTk5OTk5KSwgMTMpOyAvLyBoYXMgdG8gYmUgMTMuIHRoZSBjaGVja3N1bSBpcyB0aGUgNHRoIGRpZ2l0XG4gIGNvbnN0IGNoZWNrc3VtID0gY2FsY3VsYXRlR3RpbkNoZWNrU3VtKGJlZm9yZUNoZWNrc3VtKTtcbiAgcmV0dXJuIGAke2JlZm9yZUNoZWNrc3VtfSR7Y2hlY2tzdW19YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhdGNoKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZShcIi5cIiwgXCJcIikudG9VcHBlckNhc2UoKS5zbGljZSg1KTtcbn1cbiJdfQ==
@@ -94,4 +94,4 @@ async function deleteHistoryHandler(context, data, key, model) {
94
94
  function historyDec() {
95
95
  return (0, decoration_1.apply)((0, db_decorators_1.onUpdate)(updateHistoryHandler, {}, { priority: 99 }), (0, db_decorators_1.afterDelete)(deleteHistoryHandler, {}, { priority: 99 }), (0, decoration_1.metadata)("history", true));
96
96
  }
97
- //# sourceMappingURL=history-dec.js.map
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS1kZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udHJhY3QvbW9kZWxzL2hpc3RvcnktZGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0NBLG9EQWdEQztBQUVELG9EQThDQztBQUVELGdDQU1DO0FBaEpELHlFQUF1RDtBQUN2RCx5Q0FBNEM7QUFDNUMscURBQThFO0FBQzlFLDJEQU9pQztBQUNqQyxpREFBaUQ7QUFLakQsMkNBQW9DO0FBRXBDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFZO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLHFCQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFpQyxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixNQUFNLFdBQVcsR0FBSSxJQUE0QixDQUFDLHNCQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdEUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFJLEtBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMxQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNyRSxDQUFDO0FBRU0sS0FBSyxVQUFVLG9CQUFvQixDQUt4QyxPQUE4QixFQUM5QixJQUFTLEVBQ1QsR0FBWSxFQUNaLEtBQVEsRUFDUixRQUFXO0lBRVgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUs7UUFDOUMsTUFBTSxJQUFJLDZCQUFhLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUVqRSxNQUFNLEtBQUssR0FBRyw0QkFBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QyxNQUFNLEVBQUUsR0FBbUIsNEJBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBUSxDQUFDO0lBQzNELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxJQUFJLE9BQU8sS0FBSyxTQUFTO1FBQUUsT0FBTyxDQUFDLDZDQUE2QztJQUVoRiwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSw4QkFBaUIsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RSxNQUFNLE1BQU0sR0FBd0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFMUUsTUFBTSxJQUFJLEdBQUcsaUJBQVUsQ0FBQyxRQUFRLENBQUMsaUJBQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1FBQzNCLEtBQUs7UUFDTCxHQUFHLEVBQUUsRUFBRTtRQUNQLE9BQU87UUFDUCxNQUFNO0tBQ1AsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLEdBQUc7UUFDaEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsZUFBZSxFQUFFLElBQUk7S0FDVSxDQUFDO0lBRWxDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQzNDLDZCQUFhLENBQUMsTUFBTSxFQUNwQixTQUFTLEVBQ1QsaUJBQU8sQ0FDUixDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDakIsZUFBZSxLQUFLLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxZQUFZLE9BQU8sbUJBQW1CLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FDMUYsQ0FBQztBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsb0JBQW9CLENBS3hDLE9BQThCLEVBQzlCLElBQVMsRUFDVCxHQUFZLEVBQ1osS0FBUTtJQUVSLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLO1FBQzlDLE1BQU0sSUFBSSw2QkFBYSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFFakUsTUFBTSxLQUFLLEdBQUcsNEJBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsTUFBTSxFQUFFLEdBQW1CLDRCQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQVEsQ0FBQztJQUN4RCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsSUFBSSxPQUFPLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyw2Q0FBNkM7SUFFaEYsd0VBQXdFO0lBQ3hFLDRFQUE0RTtJQUM1RSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsOEJBQWlCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0UsTUFBTSxNQUFNLEdBQXdCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sSUFBSSxHQUFHLGlCQUFVLENBQUMsUUFBUSxDQUFDLGlCQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLElBQUksaUJBQU8sQ0FBQztRQUMzQixLQUFLO1FBQ0wsR0FBRyxFQUFFLEVBQUU7UUFDUCxPQUFPO1FBQ1AsTUFBTTtLQUNQLENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxHQUFHO1FBQ2hCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLGVBQWUsRUFBRSxJQUFJO0tBQ1UsQ0FBQztJQUVsQyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUMzQyw2QkFBYSxDQUFDLE1BQU0sRUFDcEIsU0FBUyxFQUNULGlCQUFPLENBQ1IsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2pCLGVBQWUsS0FBSyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxPQUFPLG1CQUFtQixPQUFPLENBQUMsRUFBRSxFQUFFLENBQzFGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsVUFBVTtJQUN4QixPQUFPLElBQUEsa0JBQUssRUFDVixJQUFBLHdCQUFRLEVBQUMsb0JBQTJCLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQzNELElBQUEsMkJBQVcsRUFBQyxvQkFBMkIsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFDOUQsSUFBQSxxQkFBUSxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FDMUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGFwcGx5LCBDb25zdHJ1Y3RvciwgTWV0YWRhdGEsIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBhZnRlckRlbGV0ZSxcbiAgREJLZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBvblVwZGF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUHJpbWFyeUtleVR5cGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgcG9wdWxhdGVSZWxhdGlvbnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgRmFicmljQ29udHJhY3RGbGFncyxcbn0gZnJvbSBcIi4uLy4uL2NvbnRyYWN0cy9pbmRleFwiO1xuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gXCIuL0hpc3RvcnlcIjtcblxuLyoqXG4gKiBDb3JyZWN0bHkgZXh0cmFjdHMgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gYSBtb2RlbCBieSBpbnNwZWN0aW5nXG4gKiB0aGUgcHJvcGVydHkgZGVjb3JhdGVkIHdpdGggYEB2ZXJzaW9uKClgLlxuICpcbiAqIGBNb2RlbC52ZXJzaW9uUHJvcCgpYCBoYXMgYSBidWcgd2hlcmUgaXQgcmV0dXJucyBgT2JqZWN0LmtleXMobWV0YSlbMF1gXG4gKiAodGhlIGZpcnN0IG1ldGFkYXRhIGtleSBvdmVyYWxsKSBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgdmVyc2lvbiBwcm9wZXJ0eSBuYW1lLlxuICogVGhpcyBoZWxwZXIgdXNlcyBgTWV0YWRhdGEuZ2V0KClgIGNvcnJlY3RseSB0byBmaW5kIHRoZSBgREJLZXlzLlZFUlNJT05gXG4gKiBlbnRyeSBhbmQgdGhlbiByZWFkcyB0aGUgZmlyc3QgcHJvcGVydHkgbmFtZSBmcm9tIGl0LlxuICpcbiAqIEByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciAoPj0gMSksIG9yIHVuZGVmaW5lZCBpZiBub25lIGZvdW5kLlxuICovXG5mdW5jdGlvbiBnZXRWZXJzaW9uT2YobW9kZWw6IE1vZGVsKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNb2RlbD4pO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHZlcnNpb25NZXRhID0gKG1ldGEgYXMgUmVjb3JkPHN0cmluZywgYW55PilbREJLZXlzLlZFUlNJT05dO1xuICBpZiAoIXZlcnNpb25NZXRhIHx8IHR5cGVvZiB2ZXJzaW9uTWV0YSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdmVyc2lvblByb3AgPSBPYmplY3Qua2V5cyh2ZXJzaW9uTWV0YSlbMF07XG4gIGlmICghdmVyc2lvblByb3ApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhbHVlID0gKG1vZGVsIGFzIGFueSlbdmVyc2lvblByb3BdO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIHZhbHVlID49IDEgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhpc3RvcnlIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gIGRhdGE6IGFueSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTSxcbiAgb2xkTW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbnRleHQuaWRlbnRpdHkgfHwgIWNvbnRleHQuaWRlbnRpdHkuZ2V0SUQpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYExvc3QgY29udGV4dCBhcHBhcmVudGx5IGZvciBoaXN0b3J5YCk7XG5cbiAgY29uc3QgdGFibGUgPSBNb2RlbC50YWJsZU5hbWUob2xkTW9kZWwpO1xuICBjb25zdCBwazogUHJpbWFyeUtleVR5cGUgPSBNb2RlbC5wayhvbGRNb2RlbCwgdHJ1ZSkgYXMgYW55O1xuICBjb25zdCB2ZXJzaW9uID0gZ2V0VmVyc2lvbk9mKG9sZE1vZGVsKTtcbiAgaWYgKHZlcnNpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBtb2RlbCBoYXMgbm8gQHZlcnNpb24gZmllbGQg4oCUIHNraXAgaGlzdG9yeVxuXG4gIC8vIFBvcHVsYXRlIHJlbGF0aW9ucyBvbiBhIG5vbi1tdXRhdGluZyBjb3B5IG9mIG9sZE1vZGVsLCB0aGVuIGNvbnZlcnQgdG8gYVxuICAvLyBwbGFpbiBvYmplY3Qgc28gbm8gbW9kZWwtYW5jaG9yIChfX21vZGVsKSBrZXlzIGFwcGVhciBpbiB0aGUgc3RvcmVkIEpTT04uXG4gIGNvbnN0IHBvcHVsYXRlZCA9IGF3YWl0IHBvcHVsYXRlUmVsYXRpb25zKG9sZE1vZGVsLCBjb250ZXh0LCB0aGlzLl9vdmVycmlkZXMpO1xuICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBvcHVsYXRlZCkpO1xuXG4gIGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKEhpc3RvcnkpLm92ZXJyaWRlKHRoaXMuX292ZXJyaWRlcyk7XG4gIGNvbnN0IHRvQ3JlYXRlID0gbmV3IEhpc3Rvcnkoe1xuICAgIHRhYmxlLFxuICAgIGtleTogcGssXG4gICAgdmVyc2lvbixcbiAgICByZWNvcmQsXG4gIH0pO1xuICBjb25zdCBvdmVycmlkZXMgPSB7XG4gICAgc3R1YjogY29udGV4dC5zdHViLFxuICAgIGlkZW50aXR5OiBjb250ZXh0LmlkZW50aXR5LFxuICAgIGxvZ2dlcjogY29udGV4dC5sb2dnZXIsXG4gICAgZnVsbHlTZWdyZWdhdGVkOiB0cnVlLFxuICB9IGFzIFBhcnRpYWw8RmFicmljQ29udHJhY3RGbGFncz47XG5cbiAgY29uc3QgaGlzdG9yeUN0eCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jb250ZXh0KFxuICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgIG92ZXJyaWRlcyxcbiAgICBIaXN0b3J5XG4gICk7XG5cbiAgY29uc3QgaGlzdG9yeSA9IGF3YWl0IHJlcG8uY3JlYXRlKHRvQ3JlYXRlLCBoaXN0b3J5Q3R4KTtcbiAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICBgSGlzdG9yeSBmb3IgJHt0YWJsZX0ncyAke3BrLnRvU3RyaW5nKCl9IHZlcnNpb24gJHt2ZXJzaW9ufSBzdG9yZWQgd2l0aCBpZCAke2hpc3RvcnkuaWR9YFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlSGlzdG9yeUhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgZGF0YTogYW55LFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb250ZXh0LmlkZW50aXR5IHx8ICFjb250ZXh0LmlkZW50aXR5LmdldElEKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBMb3N0IGNvbnRleHQgYXBwYXJlbnRseSBmb3IgaGlzdG9yeWApO1xuXG4gIGNvbnN0IHRhYmxlID0gTW9kZWwudGFibGVOYW1lKG1vZGVsKTtcbiAgY29uc3QgcGs6IFByaW1hcnlLZXlUeXBlID0gTW9kZWwucGsobW9kZWwsIHRydWUpIGFzIGFueTtcbiAgY29uc3QgdmVyc2lvbiA9IGdldFZlcnNpb25PZihtb2RlbCk7XG4gIGlmICh2ZXJzaW9uID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gbW9kZWwgaGFzIG5vIEB2ZXJzaW9uIGZpZWxkIOKAlCBza2lwIGhpc3RvcnlcblxuICAvLyBQb3B1bGF0ZSByZWxhdGlvbnMgb24gYSBub24tbXV0YXRpbmcgY29weSBvZiBtb2RlbCwgdGhlbiBjb252ZXJ0IHRvIGFcbiAgLy8gcGxhaW4gb2JqZWN0IHNvIG5vIG1vZGVsLWFuY2hvciAoX19tb2RlbCkga2V5cyBhcHBlYXIgaW4gdGhlIHN0b3JlZCBKU09OLlxuICBjb25zdCBwb3B1bGF0ZWQgPSBhd2FpdCBwb3B1bGF0ZVJlbGF0aW9ucyhtb2RlbCwgY29udGV4dCwgdGhpcy5fb3ZlcnJpZGVzKTtcbiAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3B1bGF0ZWQpKTtcblxuICBjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChIaXN0b3J5KS5vdmVycmlkZSh0aGlzLl9vdmVycmlkZXMpO1xuICBjb25zdCB0b0NyZWF0ZSA9IG5ldyBIaXN0b3J5KHtcbiAgICB0YWJsZSxcbiAgICBrZXk6IHBrLFxuICAgIHZlcnNpb24sXG4gICAgcmVjb3JkLFxuICB9KTtcbiAgY29uc3Qgb3ZlcnJpZGVzID0ge1xuICAgIHN0dWI6IGNvbnRleHQuc3R1YixcbiAgICBpZGVudGl0eTogY29udGV4dC5pZGVudGl0eSxcbiAgICBsb2dnZXI6IGNvbnRleHQubG9nZ2VyLFxuICAgIGZ1bGx5U2VncmVnYXRlZDogdHJ1ZSxcbiAgfSBhcyBQYXJ0aWFsPEZhYnJpY0NvbnRyYWN0RmxhZ3M+O1xuXG4gIGNvbnN0IGhpc3RvcnlDdHggPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY29udGV4dChcbiAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICBvdmVycmlkZXMsXG4gICAgSGlzdG9yeVxuICApO1xuICBjb25zdCBoaXN0b3J5ID0gYXdhaXQgcmVwby5jcmVhdGUodG9DcmVhdGUsIGhpc3RvcnlDdHgpO1xuICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgIGBIaXN0b3J5IGZvciAke3RhYmxlfSdzICR7cGsudG9TdHJpbmcoKX0gdmVyc2lvbiAke3ZlcnNpb259IHN0b3JlZCB3aXRoIGlkICR7aGlzdG9yeS5pZH1gXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoaXN0b3J5RGVjKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgb25VcGRhdGUodXBkYXRlSGlzdG9yeUhhbmRsZXIgYXMgYW55LCB7fSwgeyBwcmlvcml0eTogOTkgfSksXG4gICAgYWZ0ZXJEZWxldGUoZGVsZXRlSGlzdG9yeUhhbmRsZXIgYXMgYW55LCB7fSwgeyBwcmlvcml0eTogOTkgfSksXG4gICAgbWV0YWRhdGEoXCJoaXN0b3J5XCIsIHRydWUpXG4gICk7XG59XG4iXX0=
@@ -261,84 +261,55 @@ class FabricContractAdapter extends for_couchdb_1.CouchDBAdapter {
261
261
  Object.assign(model, await this.forPrivate(col).readState(composedKey, ctx));
262
262
  return model;
263
263
  }
264
- // /**
265
- // * @description Retrieves multiple records from the database
266
- // * @summary Fetches multiple records with the given IDs from the specified table
267
- // * @param {string} tableName - The name of the table to read from
268
- // * @param id - The identifiers of the records to retrieve
269
- // * @param {...any[]} args - Additional arguments specific to the adapter implementation
270
- // * @return A promise that resolves to an array of retrieved records
271
- // */
272
- // override async readAll<M extends Model>(
273
- // clazz: Constructor<M>,
274
- // id: PrimaryKeyType[],
275
- // ...args: ContextualArgs<Context<FabricContractFlags>>
276
- // ): Promise<Record<string, any>[]> {
277
- // const { log, ctx } = this.logCtx(args, this.readAll);
278
- // const tableName = Model.tableName(clazz);
279
- // log.debug(`Reading ${id.length} entries ${tableName} table`);
280
- // const breakOnSingleFailure = ctx.get("breakOnSingleFailureInBulk") ?? true;
281
- // const continueOnError = !breakOnSingleFailure;
282
- //
283
- // const mirrorCollection = ctx.getOrUndefined("mirrorCollection") as
284
- // | string
285
- // | undefined;
286
- // const isMirror = ctx.getOrUndefined("mirror") as boolean | undefined;
287
- //
288
- // const readMirror = async <M extends Model>(
289
- // clazz: Constructor<M>,
290
- // id: PrimaryKeyType,
291
- // ...args: ContextualArgs<Context<FabricContractFlags>>
292
- // ) => {
293
- // if (!mirrorCollection)
294
- // throw new BadRequestError("Missing mirror collection for mirror read");
295
- // try {
296
- // const { ctx, log } = this.logCtx(args, readMirror);
297
- // log.info(`in ADAPTER read with args ${args}`);
298
- // const tableName = Model.tableName(clazz);
299
- //
300
- // const composedKey = ctx.stub.createCompositeKey(tableName, [
301
- // String(id),
302
- // ]);
303
- //
304
- // return await this.forPrivate(mirrorCollection).readState(
305
- // composedKey,
306
- // ctx
307
- // );
308
- // } catch (e: unknown) {
309
- // throw this.parseError(e as Error);
310
- // }
311
- // };
312
- //
313
- // try {
314
- // const tasks = id.map(
315
- // (i) => () =>
316
- // isMirror && mirrorCollection
317
- // ? readMirror(
318
- // clazz,
319
- // i,
320
- // ...args,
321
- // ctx.override({ noEmitSingle: true })
322
- // )
323
- // : this.read(clazz, i, ...args, ctx.override({ noEmitSingle: true }))
324
- // );
325
- //
326
- // const rawResult = continueOnError
327
- // ? await promiseSequence(tasks, true)
328
- // : await promiseSequence(tasks);
329
- // return resolveBulkSequenceResult(
330
- // rawResult,
331
- // continueOnError,
332
- // log,
333
- // BulkCrudOperationKeys.READ_ALL
334
- // );
335
- // } catch (e) {
336
- // throw this.parseError(e as Error);
337
- // } finally {
338
- // ctx.put("mirror" as any, undefined);
339
- // ctx.put("mirrorCollection" as any, undefined);
340
- // }
341
- // }
264
+ /**
265
+ * @description Retrieves multiple records from the database
266
+ * @summary Fetches multiple records with the given IDs from the specified table
267
+ * @param {string} tableName - The name of the table to read from
268
+ * @param id - The identifiers of the records to retrieve
269
+ * @param {...any[]} args - Additional arguments specific to the adapter implementation
270
+ * @return A promise that resolves to an array of retrieved records
271
+ */
272
+ async readAll(clazz, id, ...args) {
273
+ const { log, ctx } = this.logCtx(args, this.readAll);
274
+ const tableName = decorator_validation_1.Model.tableName(clazz);
275
+ log.debug(`Reading ${id.length} entries ${tableName} table`);
276
+ const breakOnSingleFailure = ctx.get("breakOnSingleFailureInBulk") ?? true;
277
+ const continueOnError = !breakOnSingleFailure;
278
+ const mirrorCollection = ctx.getOrUndefined("mirrorCollection");
279
+ const isMirror = ctx.getOrUndefined("mirror");
280
+ const readMirror = async (clazz, id, ...args) => {
281
+ if (!mirrorCollection)
282
+ throw new db_decorators_1.BadRequestError("Missing mirror collection for mirror read");
283
+ try {
284
+ const { ctx, log } = this.logCtx(args, readMirror);
285
+ log.info(`in ADAPTER read with args ${args}`);
286
+ const tableName = decorator_validation_1.Model.tableName(clazz);
287
+ const composedKey = ctx.stub.createCompositeKey(tableName, [
288
+ String(id),
289
+ ]);
290
+ return await this.forPrivate(mirrorCollection).readState(composedKey, ctx);
291
+ }
292
+ catch (e) {
293
+ throw this.parseError(e);
294
+ }
295
+ };
296
+ try {
297
+ const tasks = id.map((i) => () => isMirror && mirrorCollection
298
+ ? readMirror(clazz, i, ...args, ctx.override({ noEmitSingle: true }))
299
+ : this.read(clazz, i, ...args, ctx.override({ noEmitSingle: true })));
300
+ const rawResult = continueOnError
301
+ ? await (0, core_1.promiseSequence)(tasks, true)
302
+ : await (0, core_1.promiseSequence)(tasks);
303
+ return (0, core_1.resolveBulkSequenceResult)(rawResult, continueOnError, log, db_decorators_1.BulkCrudOperationKeys.READ_ALL);
304
+ }
305
+ catch (e) {
306
+ throw this.parseError(e);
307
+ }
308
+ finally {
309
+ ctx.put("mirror", undefined);
310
+ ctx.put("mirrorCollection", undefined);
311
+ }
312
+ }
342
313
  /**
343
314
  * @description Updates a record in the state database
344
315
  * @summary Serializes a model and updates it in the Fabric state database
@@ -1142,4 +1113,4 @@ class FabricContractAdapter extends for_couchdb_1.CouchDBAdapter {
1142
1113
  exports.FabricContractAdapter = FabricContractAdapter;
1143
1114
  FabricContractAdapter.decoration();
1144
1115
  core_1.Adapter.setCurrent(constants_1.FabricFlavour);
1145
- //# sourceMappingURL=ContractAdapter.js.map
1116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJhY3RBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyYWN0cy9Db250cmFjdEFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0hBLHNFQW9CQztBQTFJRCx1REFLK0I7QUFDL0IseUVBQXVFO0FBRXZFLDJEQUEwRDtBQUMxRCwyREFZaUM7QUFDakMsNkRBSzZCO0FBQzdCLCtDQUFvRDtBQUNwRCx5Q0ErQndCO0FBQ3hCLDZFQUFzRTtBQU90RSwyRUFBNEQ7QUFDNUQseUVBQWtFO0FBQ2xFLHlEQUFvRDtBQUNwRCxpR0FBd0Y7QUFDeEYscURBTThCO0FBQzlCLDJFQUFvRTtBQUNwRSxtREFBdUQ7QUFFdkQseUVBQWtFO0FBVWxFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0ksS0FBSyxVQUFVLDZCQUE2QixDQU1qRCxPQUFxQixFQUNyQixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVE7SUFFUixJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBbUIsQ0FBQztRQUN2RCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBbUIsQ0FBQztRQUMzQyw2REFBNkQ7SUFDL0QsQ0FBQztJQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLHVCQUFnQixDQUN4QixnRUFBZ0UsQ0FDakUsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUNILE1BQWEscUJBQXNCLFNBQVEsNEJBSTFDO0lBQ29CLFNBQVM7UUFDMUIsTUFBTSxJQUFJLHVCQUFnQixDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNEOztPQUVHO2FBQ1ksZ0JBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FB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QUFDLENBQUMscUJBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXZDLE9BQU8sT0FBTyxJQUFJLE9BQU8sS0FBSyxNQUFNLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMxRCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwQixPQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0Msd0RBQXdEO1lBQ3hELE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzlDLElBQUEsNEJBQVksR0FBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFFRCxPQUFPLElBQUEsNEJBQVksR0FBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQzthQUNELEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQzs7QUFuNkNILHNEQW82Q0M7QUFFRCxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNuQyxjQUFPLENBQUMsVUFBVSxDQUFDLHlCQUFhLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvdWNoREJBZGFwdGVyLFxuICBDb3VjaERCS2V5cyxcbiAgTWFuZ29RdWVyeSxcbiAgVmlld1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBNb2RlbCwgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuL0NvbnRyYWN0Q29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQmFkUmVxdWVzdEVycm9yLFxuICBCYXNlRXJyb3IsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgQ29uZmxpY3RFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBPcGVyYXRpb25LZXlzLFxuICBQcmltYXJ5S2V5VHlwZSxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQgYXMgQ3R4LFxuICBPYmplY3QgYXMgRmFicmljT2JqZWN0LFxuICBQcm9wZXJ0eSxcbiAgUHJvcGVydHkgYXMgRmFicmljUHJvcGVydHksXG59IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFNlcXVlbmNlLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIEFkYXB0ZXIsXG4gIFByZXBhcmVkTW9kZWwsXG4gIFJlcG9zaXRvcnksXG4gIFF1ZXJ5RXJyb3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBNaWdyYXRpb25FcnJvcixcbiAgT2JzZXJ2ZXJFcnJvcixcbiAgQXV0aG9yaXphdGlvbkVycm9yLFxuICBGb3JiaWRkZW5FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBDb250ZXh0dWFsaXplZEFyZ3MsXG4gIENvbnRleHQsXG4gIFJhd1Jlc3VsdCxcbiAgUGFnaW5hdG9yLFxuICBDb250ZXh0dWFsQXJncyxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxuICBNZXRob2RPck9wZXJhdGlvbixcbiAgQWxsT3BlcmF0aW9uS2V5cyxcbiAgRmxhZ3NPZixcbiAgQ29udGV4dE9mLFxuICBUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMsXG4gIEV2ZW50SWRzLFxuICBEaXNwYXRjaCxcbiAgcHJvbWlzZVNlcXVlbmNlLFxuICByZXNvbHZlQnVsa1NlcXVlbmNlUmVzdWx0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeSB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgQ2hhaW5jb2RlU3R1YixcbiAgQ2xpZW50SWRlbnRpdHksXG4gIEl0ZXJhdG9ycyxcbiAgU3RhdGVRdWVyeVJlc3BvbnNlLFxufSBmcm9tIFwiZmFicmljLXNoaW0tYXBpXCI7XG5pbXBvcnQgeyBGYWJyaWNTdGF0ZW1lbnQgfSBmcm9tIFwiLi9GYWJyaWNDb250cmFjdFN0YXRlbWVudFwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RTZXF1ZW5jZSB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0U2VxdWVuY2VcIjtcbmltcG9ydCB7IEZhYnJpY0ZsYXZvdXIgfSBmcm9tIFwiLi4vc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vc2hhcmVkL1NpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyXCI7XG5pbXBvcnQge1xuICBhcHBseSxcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1ldGFkYXRhLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RQYWdpbmF0b3IgfSBmcm9tIFwiLi9GYWJyaWNDb250cmFjdFBhZ2luYXRvclwiO1xuaW1wb3J0IHsgTWlzc2luZ0NvbnRleHRFcnJvciB9IGZyb20gXCIuLi9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBTZWdyZWdhdGVkTW9kZWwgfSBmcm9tIFwiLi4vc2hhcmVkL2luZGV4XCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdERpc3BhdGNoIH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3REaXNwYXRjaFwiO1xuXG5leHBvcnQgdHlwZSBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8XG4gIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICBFWFRFTkQgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+ID0gQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUywgRVhURU5EPiAmIHtcbiAgc3R1YjogQ2hhaW5jb2RlU3R1YjtcbiAgaWRlbnRpdHk6IENsaWVudElkZW50aXR5O1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3JlYXRvciBvciB1cGRhdGVyIGZpZWxkIGluIGEgbW9kZWwgYmFzZWQgb24gdGhlIHVzZXIgaW4gdGhlIGNvbnRleHRcbiAqIEBzdW1tYXJ5IENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgaW4gZGVjb3JhdG9ycyB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRlZF9ieSBvciB1cGRhdGVkX2J5IGZpZWxkc1xuICogd2l0aCB0aGUgdXNlcm5hbWUgZnJvbSB0aGUgY29udGV4dCB3aGVuIGEgZG9jdW1lbnQgaXMgY3JlYXRlZCBvciB1cGRhdGVkXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZXh0ZW5kaW5nIE5hbm9SZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtGYWJyaWNDb250cmFjdENvbnRleHR9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyB1c2VyIGluZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb24gbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCB3aXRoIHRoZSB1c2VybmFtZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZhYnJpYy5jb250cmFjdHNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgRiBhcyBjcmVhdGVkQnlPbk5hbm9DcmVhdGVVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgQyBhcyBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgRi0+PkM6IGdldChcInVzZXJcIilcbiAqICAgQy0tPj5GOiB1c2VyIG9iamVjdFxuICogICBGLT4+TTogc2V0IGtleSB0byB1c2VyLm5hbWVcbiAqICAgTm90ZSBvdmVyIEY6IElmIG5vIHVzZXIgaW4gY29udGV4dFxuICogICBGLS0+PkY6IHRocm93IFVuc3VwcG9ydGVkRXJyb3JcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgQ2xpZW50SWRlbnRpdHk7XG4gICAgbW9kZWxba2V5XSA9IHVzZXIuZ2V0SUQoKSBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIHN0YXRlIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgQ291Y2hEQi1saWtlIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlIGZyb20gd2l0aGluIGEgY2hhaW5jb2RlIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUgdm9pZCAtIE5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGZvciBjb250cmFjdCBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RDb250ZXh0IC0gQ29udGV4dCB0eXBlIGZvciBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICogQGNsYXNzIEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGEgRmFicmljIGNoYWluY29kZSBjb250cmFjdCBjbGFzc1xuICogaW1wb3J0IHsgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBwcml2YXRlIGFkYXB0ZXIgPSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKCk7XG4gKlxuICogICBAVHJhbnNhY3Rpb24oKVxuICogICBhc3luYyBjcmVhdGVBc3NldChjdHg6IENvbnRleHQsIGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICogICAgIGNvbnN0IG1vZGVsID0geyBpZCwgZGF0YSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07XG4gKiAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSgnYXNzZXRzJywgaWQsIG1vZGVsLCB7fSwgeyBzdHViOiBjdHguc3R1YiB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTdHViXG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlREJcbiAqXG4gKiAgIENvbnRyYWN0LT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgY3R4KVxuICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IFNlcmlhbGl6ZSBtb2RlbCB0byBKU09OXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PlN0dWI6IHB1dFN0YXRlKGlkLCBzZXJpYWxpemVkRGF0YSlcbiAqICAgU3R1Yi0+PlN0YXRlREI6IFdyaXRlIGRhdGFcbiAqICAgU3RhdGVEQi0tPj5TdHViOiBTdWNjZXNzXG4gKiAgIFN0dWItLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBTdWNjZXNzXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0tPj5Db250cmFjdDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NvbnRyYWN0QWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyPFxuICBhbnksXG4gIHZvaWQsXG4gIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRDbGllbnQoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJDbGllbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBGYWJyaWMgY29udHJhY3RzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIGJpbmFyeSBkYXRhIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IHNlcmlhbGl6ZXIgPSBuZXcgU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIoKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRleHQgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgQ29udGV4dCBjb25zdHJ1Y3RvciB3aXRoIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBDb250ZXh0KCk6IENvbnN0cnVjdG9yPEZhYnJpY0NvbnRyYWN0Q29udGV4dD4ge1xuICAgIHJldHVybiBGYWJyaWNDb250cmFjdENvbnRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE0sIE1hbmdvUXVlcnksIEZhYnJpY0NvbnRyYWN0QWRhcHRlciwgRmFicmljQ29udHJhY3RGbGFncywgRmFicmljQ29udHJhY3RDb250ZXh0Pj59IFRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yXG4gICAqL1xuICBvdmVycmlkZSByZXBvc2l0b3J5PFxuICAgIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICAgICAgYW55LFxuICAgICAgQWRhcHRlcjxhbnksIHZvaWQsIE1hbmdvUXVlcnksIENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4+XG4gICAgPixcbiAgPigpOiBDb25zdHJ1Y3RvcjxSPiB7XG4gICAgcmV0dXJuIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFI+O1xuICB9XG5cbiAgb3ZlcnJpZGUgUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgcXVlcnk6IE1hbmdvUXVlcnksXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApOiBQYWdpbmF0b3I8TSwgYW55LCBNYW5nb1F1ZXJ5PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDb250cmFjdFBhZ2luYXRvcih0aGlzLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ29udHJhY3RTZXF1ZW5jZShvcHRpb25zLCB0aGlzIGFzIGFueSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgRGlzcGF0Y2goKTogRGlzcGF0Y2g8RmFicmljQ29udHJhY3RBZGFwdGVyPiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDb250cmFjdERpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGFuIGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3ZvaWR9IHNjb3BlIC0gTm90IHVzZWQgaW4gdGhpcyBhZGFwdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogdm9pZCwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgRmFicmljRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZm9yKGNvbmZpZzogUGFydGlhbDxhbnk+LCAuLi5hcmdzOiBhbnkpOiB0eXBlb2YgdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLmZvcihjb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1vZGVsRGVmYXVsdHM8TSBleHRlbmRzIE1vZGVsPihjbGF6ejogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBjb25zdCBtID0gbmV3IGNsYXp6KCk7XG4gICAgcmV0dXJuIChNZXRhZGF0YS5wcm9wZXJ0aWVzKGNsYXp6KSB8fCBbXSkucmVkdWNlKFxuICAgICAgKGFjYywgcCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1bcCBhcyBrZXlvZiBNXSAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICBhY2NbcCBhcyBrZXlvZiBNXSA9IG1bcCBhcyBrZXlvZiBNXTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSByZWNvcmQgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbCBhbmQgc3RvcmVzIGl0IGluIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgKG5vdCB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZSk7XG4gICAgdGhpcy5lbmZvcmNlTWlycm9yQXV0aG9yaXphdGlvbihjbGF6eiwgY3R4KTtcbiAgICBsb2cuaW5mbyhgaW4gQURBUFRFUiBjcmVhdGUgd2l0aCBhcmdzICR7YXJnc31gKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1N0cmluZyhpZCldKTtcbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZ1bGx5U2VncmVnYXRlZCA9IGN0eC5pc0Z1bGx5U2VncmVnYXRlZCAmJiAhbWlycm9yQ29sbGVjdGlvbjtcblxuICAgIGlmICghbWlycm9yQ29sbGVjdGlvbikge1xuICAgICAgbGV0IGV4aXN0aW5nOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICBleGlzdGluZyA9IGF3YWl0IHRoaXMucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXgtYXNzaWduXG4gICAgICAgIGUgPSB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmIChleGlzdGluZylcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgYHJlY29yZCB3aXRoIGlkICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfSBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmluZm8oYGFkZGluZyBlbnRyeSB0byAke3RhYmxlTmFtZX0gdGFibGUgd2l0aCBwayAke2lkfWApO1xuXG4gICAgICBpZiAobWlycm9yQ29sbGVjdGlvbikge1xuICAgICAgICBtb2RlbCA9IGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShtaXJyb3JDb2xsZWN0aW9uKS5wdXRTdGF0ZShcbiAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5nZXRNb2RlbERlZmF1bHRzKGNsYXp6KTtcbiAgICAgICAgLy8gaGFuZGxlIHB1YmxpYyBkYXRhIGlmIG5vdCBmdWxseSBzZWdyZWdhdGVkXG4gICAgICAgIGlmICghZnVsbHlTZWdyZWdhdGVkKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LmtleXMobW9kZWwpLmZpbHRlcigoaykgPT4ge1xuICAgICAgICAgICAgICBpZiAoayA9PT0gQ291Y2hEQktleXMuVEFCTEUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgZGVmYXVsdHMgJiZcbiAgICAgICAgICAgICAgICBrIGluIGRlZmF1bHRzICYmXG4gICAgICAgICAgICAgICAgZGVmYXVsdHNbayBhcyBrZXlvZiBNXSA9PT0gbW9kZWxba11cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5wdXRTdGF0ZShjb21wb3NlZEtleSwgbW9kZWwsIGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgc2VncmVnYXRlZCB3cml0ZXNcbiAgICAgICAgY29uc3QgZGF0YSA9IGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJzZWdyZWdhdGVkRGF0YVwiKTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb24gaW4gZGF0YSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShjb2xsZWN0aW9uKS5wdXRTdGF0ZShcbiAgICAgICAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICAgICAgICBkYXRhW2NvbGxlY3Rpb25dW2lkIGFzIGFueV0sXG4gICAgICAgICAgICAgICAgY3R4XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVMYWJlbCA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZUxhYmVsfSB0YWJsZWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMuY3JlYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5jdHhBcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGRlc2VyaWFsaXplcyBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBsb2cuaW5mbyhgaW4gQURBUFRFUiByZWFkIHdpdGggYXJncyAke2FyZ3N9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1N0cmluZyhpZCldKTtcbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWlycm9yID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yXCIpIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzTWlycm9yICYmIG1pcnJvckNvbGxlY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZvclByaXZhdGUobWlycm9yQ29sbGVjdGlvbikucmVhZFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgICAgICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICB0cnkge1xuICAgICAgbW9kZWwgPSBjdHguaXNGdWxseVNlZ3JlZ2F0ZWRcbiAgICAgICAgPyB7fVxuICAgICAgICA6IGF3YWl0IHRoaXMucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkQ29sbGVjdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgLi4uKGN0eC5nZXRSZWFkQ29sbGVjdGlvbnMoKSB8fCBbXSksXG4gICAgICAuLi4oY3R4LmNvbnN1bWVSZWFkQ29sbGVjdGlvbnMoKSB8fCBbXSksXG4gICAgXSk7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgcmVhZENvbGxlY3Rpb25zKVxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShjb2wpLnJlYWRTdGF0ZShjb21wb3NlZEtleSwgY3R4KVxuICAgICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGVbXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZEFsbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBsb2cuZGVidWcoYFJlYWRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgY29uc3QgYnJlYWtPblNpbmdsZUZhaWx1cmUgPSBjdHguZ2V0KFwiYnJlYWtPblNpbmdsZUZhaWx1cmVJbkJ1bGtcIikgPz8gdHJ1ZTtcbiAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSAhYnJlYWtPblNpbmdsZUZhaWx1cmU7XG5cbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWlycm9yID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yXCIpIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZWFkTWlycm9yID0gYXN5bmMgPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICAgICkgPT4ge1xuICAgICAgaWYgKCFtaXJyb3JDb2xsZWN0aW9uKVxuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEVycm9yKFwiTWlzc2luZyBtaXJyb3IgY29sbGVjdGlvbiBmb3IgbWlycm9yIHJlYWRcIik7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCByZWFkTWlycm9yKTtcbiAgICAgICAgbG9nLmluZm8oYGluIEFEQVBURVIgcmVhZCB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1xuICAgICAgICAgIFN0cmluZyhpZCksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZvclByaXZhdGUobWlycm9yQ29sbGVjdGlvbikucmVhZFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXNrcyA9IGlkLm1hcChcbiAgICAgICAgKGkpID0+ICgpID0+XG4gICAgICAgICAgaXNNaXJyb3IgJiYgbWlycm9yQ29sbGVjdGlvblxuICAgICAgICAgICAgPyByZWFkTWlycm9yKFxuICAgICAgICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgICAgICBjdHgub3ZlcnJpZGUoeyBub0VtaXRTaW5nbGU6IHRydWUgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLnJlYWQoY2xhenosIGksIC4uLmFyZ3MsIGN0eC5vdmVycmlkZSh7IG5vRW1pdFNpbmdsZTogdHJ1ZSB9KSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJhd1Jlc3VsdCA9IGNvbnRpbnVlT25FcnJvclxuICAgICAgICA/IGF3YWl0IHByb21pc2VTZXF1ZW5jZSh0YXNrcywgdHJ1ZSlcbiAgICAgICAgOiBhd2FpdCBwcm9taXNlU2VxdWVuY2UodGFza3MpO1xuICAgICAgcmV0dXJuIHJlc29sdmVCdWxrU2VxdWVuY2VSZXN1bHQoXG4gICAgICAgIHJhd1Jlc3VsdCxcbiAgICAgICAgY29udGludWVPbkVycm9yLFxuICAgICAgICBsb2csXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbCBhbmQgdXBkYXRlcyBpdCBpbiB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgKG5vdCB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZSk7XG5cbiAgICB0aGlzLmVuZm9yY2VNaXJyb3JBdXRob3JpemF0aW9uKGNsYXp6LCBjdHgpO1xuICAgIGxvZy5pbmZvKGBpbiBBREFQVEVSIHVwZGF0ZSB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgY29uc3QgY29tcG9zZWRLZXkgPSBjdHguc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgIGNvbnN0IG1pcnJvckNvbGxlY3Rpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JDb2xsZWN0aW9uXCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmluZm8oYHVwZGF0aW5nIGVudHJ5IGluICR7dGFibGVOYW1lfSB0YWJsZSB3aXRoIHBrICR7aWR9YCk7XG5cbiAgICAgIGlmIChtaXJyb3JDb2xsZWN0aW9uKSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnB1dFN0YXRlKFxuICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmdldE1vZGVsRGVmYXVsdHMoY2xhenopO1xuICAgICAgICAvLyBoYW5kbGUgcHVibGljIGRhdGFcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC5rZXlzKG1vZGVsKS5maWx0ZXIoKGspID0+IHtcbiAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCS2V5cy5UQUJMRSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgIGRlZmF1bHRzICYmXG4gICAgICAgICAgICAgIGsgaW4gZGVmYXVsdHMgJiZcbiAgICAgICAgICAgICAgZGVmYXVsdHNbayBhcyBrZXlvZiBNXSA9PT0gbW9kZWxba11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkubGVuZ3RoXG4gICAgICAgIClcbiAgICAgICAgICBtb2RlbCA9IGF3YWl0IHRoaXMucHV0U3RhdGUoY29tcG9zZWRLZXksIG1vZGVsLCBjdHgpO1xuXG4gICAgICAgIC8vIGhhbmRsZSBzZWdyZWdhdGVkIHdyaXRlc1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LmdldEZyb21DaGlsZHJlbihcInNlZ3JlZ2F0ZWREYXRhXCIpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sbGVjdGlvbiBpbiBkYXRhKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbGxlY3Rpb24pLnB1dFN0YXRlKFxuICAgICAgICAgICAgICAgIGNvbXBvc2VkS2V5LFxuICAgICAgICAgICAgICAgIGRhdGFbY29sbGVjdGlvbl1baWQgYXMgYW55XSxcbiAgICAgICAgICAgICAgICBjdHhcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHJlY29yZCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuXG4gICAgdGhpcy5lbmZvcmNlTWlycm9yQXV0aG9yaXphdGlvbihjbGF6eiwgY3R4KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuXG4gICAgY29uc3QgY29tcG9zZWRLZXkgPSBjdHguc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgIGNvbnN0IG1pcnJvckNvbGxlY3Rpb24gPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JDb2xsZWN0aW9uXCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgaWYgKG1pcnJvckNvbGxlY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnJlYWRTdGF0ZShcbiAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLmRlbGV0ZVN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1vZGVsID0gY3R4LmlzRnVsbHlTZWdyZWdhdGVkXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5yZWFkU3RhdGUoY29tcG9zZWRLZXksIGN0eCk7XG4gICAgICAgIGlmICghY3R4LmlzRnVsbHlTZWdyZWdhdGVkKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBEZWxldGluZyBlbnRyeSAke2NvbXBvc2VkS2V5fSBmcm9tIHB1YmxpYyBsZWRnZXJgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sbGVjdGlvbnMgPSBjdHguZ2V0UmVhZENvbGxlY3Rpb25zKCk7XG4gICAgICBpZiAoY29sbGVjdGlvbnMgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbGxlY3Rpb25zKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgYGVuc3VyaW5nIGNvbGxlY3Rpb24gJHtjb2x9IGhhcyBlbnRyeSBmb3IgaWQgJHtjb21wb3NlZEtleX0gYmVmb3JlIGRlbGV0aW5nYFxuICAgICAgICAgICk7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbCkucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICBgRGVsZXRpbmcgcHJpdmF0ZSBjb2xsZWN0aW9uICR7Y29sfSBlbnRyeSBmb3IgaWQgJHtjb21wb3NlZEtleX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZvclByaXZhdGUoY29sKS5kZWxldGVTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlU3RhdGUoaWQ6IHN0cmluZywgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0KSB7XG4gICAgYXdhaXQgY29udGV4dC5zdHViLmRlbGV0ZVN0YXRlKGlkKTtcbiAgfVxuXG4gIGZvclByaXZhdGUoY29sbGVjdGlvbjogc3RyaW5nKTogRmFicmljQ29udHJhY3RBZGFwdGVyIHtcbiAgICBjb25zdCB0b092ZXJyaWRlID0gW1xuICAgICAgdGhpcy5wdXRTdGF0ZSxcbiAgICAgIHRoaXMucmVhZFN0YXRlLFxuICAgICAgdGhpcy5kZWxldGVTdGF0ZSxcbiAgICAgIHRoaXMucXVlcnlSZXN1bHQsXG4gICAgICB0aGlzLnF1ZXJ5UmVzdWx0UGFnaW5hdGVkLFxuICAgIF0ubWFwKChmbikgPT4gZm4ubmFtZSk7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAoIXRvT3ZlcnJpZGUuaW5jbHVkZXMocHJvcCBhcyBzdHJpbmcpKVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSgodGFyZ2V0IGFzIGFueSlbcHJvcF0sIHtcbiAgICAgICAgICBhc3luYyBhcHBseShmbiwgdGhpc0FyZywgYXJnc0xpc3QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocHJvcCkge1xuICAgICAgICAgICAgICBjYXNlIFwicHV0U3RhdGVcIjoge1xuICAgICAgICAgICAgICAgIC8vIHB1dFN0YXRlIHNpZ25hdHVyZTogKGlkOiBzdHJpbmcsIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dClcbiAgICAgICAgICAgICAgICBjb25zdCBbaWQsIG1vZGVsLCBjdHhdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IocHJvcCk7XG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYFByaXZhdGUgd3JpdGUgdG8gJHtjb2xsZWN0aW9ufSBmb3IgJHtpZC50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLnNlcmlhbGl6ZShcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwgYXMgTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHguc3R1Yi5wdXRQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZC50b1N0cmluZygpLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVN0YXRlXCI6IHtcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVTdGF0ZSBzaWduYXR1cmU6IChpZDogc3RyaW5nLCBjb250ZXh0OiBGYWJyaWNDb250cmFjdENvbnRleHQpXG4gICAgICAgICAgICAgICAgY29uc3QgW2lkLCBjdHhdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nID0gY3R4LmxvZ2dlci5mb3IocHJvcCk7XG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYFByaXZhdGUgZGVsZXRlIG9uICR7Y29sbGVjdGlvbn0gZm9yICR7aWQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBjdHguc3R1Yi5kZWxldGVQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcInJlYWRTdGF0ZVwiOiB7XG4gICAgICAgICAgICAgICAgLy8gcmVhZFN0YXRlIHNpZ25hdHVyZTogKGlkOiBzdHJpbmcsIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KVxuICAgICAgICAgICAgICAgIGNvbnN0IFtpZCwgY3R4XSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHByb3ApO1xuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgIGBQcml2YXRlIHJlYWQgZnJvbSAke2NvbGxlY3Rpb259IGZvciAke2lkLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGN0eC5zdHViLmdldFByaXZhdGVEYXRhKGNvbGxlY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEudG9TdHJpbmcoKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBGYWJyaWNDb250cmFjdEFkYXB0ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJxdWVyeVJlc3VsdFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0dWIsIHJhd0lucHV0LCAuLi5hcmdzXSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKGFyZ3MsIHByb3ApO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBRdWVyeWluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn0gZm9yICR7SlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpfWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzdHViLmdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQoXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICAgICAgICAgICAgICBgaXRlcmF0b3IgZnJvbSBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn0gcmVjZWl2ZWRgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5pdGVyYXRvciB8fCByZXM7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJxdWVyeVJlc3VsdFBhZ2luYXRlZFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0dWIsIHJhd0lucHV0LCBsaW1pdCwgLCBib29rbWFyaywgLi4uYXJnc10gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGxvZyB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShhcmdzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAvLyBGYWJyaWMgaGFzIG5vIG5hdGl2ZSBwYWdpbmF0aW9uIEFQSSBmb3IgcHJpdmF0ZSBkYXRhLlxuICAgICAgICAgICAgICAgIC8vIEVtdWxhdGUgaXQ6IHF1ZXJ5IGFsbCBtYXRjaGluZyByZWNvcmRzICh3aXRoIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgLy8gYW5kIHNvcnQgcHJlc2VydmVkKSwgbG9jYXRlIHRoZSBib29rbWFyayBwb3NpdGlvbiBpblxuICAgICAgICAgICAgICAgIC8vIHRoZSBzb3J0ZWQgcmVzdWx0cywgdGhlbiBzbGljZSB0byB0aGUgcGFnZSBzaXplLlxuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0geyAuLi5yYXdJbnB1dCB9O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBxdWVyeS5saW1pdDtcbiAgICAgICAgICAgICAgICBkZWxldGUgcXVlcnkuc2tpcDtcbiAgICAgICAgICAgICAgICBkZWxldGUgcXVlcnkuYm9va21hcms7XG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYFF1ZXJ5aW5nIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufSBmb3IgJHtKU09OLnN0cmluZ2lmeShxdWVyeSl9YFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0b3IgPSBhd2FpdCAoXG4gICAgICAgICAgICAgICAgICBzdHViIGFzIENoYWluY29kZVN0dWJcbiAgICAgICAgICAgICAgICApLmdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQoY29sbGVjdGlvbiwgSlNPTi5zdHJpbmdpZnkocXVlcnkpKTtcbiAgICAgICAgICAgICAgICBpdGVyYXRvciA9IChpdGVyYXRvciBhcyBhbnkpLml0ZXJhdG9yIHx8IGl0ZXJhdG9yO1xuXG4gICAgICAgICAgICAgICAgbG9nLnZlcmJvc2UoYGl0ZXJhdG9yIGZyb20gY29sbGVjdGlvbiAke2NvbGxlY3Rpb259IHJlY2VpdmVkYCk7XG4gICAgICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbWF0Y2hpbmcgcmVjb3JkcyBmcm9tIHRoZSBpdGVyYXRvclxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlc3VsdHM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBCdWZmZXIgfT4gPSBbXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHJlcy52YWx1ZSAmJiByZXMudmFsdWUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHJlcy52YWx1ZS5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEJ1ZmZlci5pc0J1ZmZlcihyZXMudmFsdWUudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlcy52YWx1ZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXIuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzLnZhbHVlLnZhbHVlIGFzIGFueSkudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGJvb2ttYXJrIHBvc2l0aW9uIGFuZCBzbGljZSB0aGUgcGFnZVxuICAgICAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoYm9va21hcmspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gYWxsUmVzdWx0cy5maW5kSW5kZXgoKHIpID0+IHIua2V5ID09PSBib29rbWFyayk7XG4gICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gZm91bmQgPj0gMCA/IGZvdW5kICsgMSA6IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VkID0gYWxsUmVzdWx0cy5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgbGltaXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RLZXkgPVxuICAgICAgICAgICAgICAgICAgcGFnZWQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IHBhZ2VkW3BhZ2VkLmxlbmd0aCAtIDFdLmtleVxuICAgICAgICAgICAgICAgICAgICA6IGJvb2ttYXJrIHx8IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBwYWdlIGluIGFuIGFzeW5jIGl0ZXJhdG9yIGZvciByZXN1bHRJdGVyYXRvcigpXG4gICAgICAgICAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlJdGVyYXRvciA9IHtcbiAgICAgICAgICAgICAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCBwYWdlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcGFnZWRbaWR4KytdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQgYXMgYW55LCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYXN5bmMgY2xvc2UoKSB7fSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOlxuICAgICAgICAgICAgICAgICAgICBhcnJheUl0ZXJhdG9yIGFzIHVua25vd24gYXMgSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcixcbiAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoZWRSZWNvcmRzQ291bnQ6IHBhZ2VkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgYm9va21hcms6IHBhZ2VkLmxlbmd0aCA+PSBsaW1pdCA/IGxhc3RLZXkgOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgVW5zdXBwb3J0ZWQgbWV0aG9kIG92ZXJyaWRlICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBwdXRTdGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4gICkge1xuICAgIGxldCBkYXRhOiBCdWZmZXI7XG5cbiAgICB0cnkge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICBGYWJyaWNDb250cmFjdEFkYXB0ZXIuc2VyaWFsaXplci5zZXJpYWxpemUobW9kZWwgYXMgTW9kZWwsIGZhbHNlKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHNlcmlhbGl6ZSByZWNvcmQgd2l0aCBpZCAke2lkfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGN0eC5zdHViLnB1dFN0YXRlKGlkLnRvU3RyaW5nKCksIGRhdGEpO1xuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRTdGF0ZShpZDogc3RyaW5nLCBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCkge1xuICAgIGxldCByZXN1bHQ6IGFueTtcblxuICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzLmxvZ0N0eChbY3R4XSwgdGhpcy5yZWFkU3RhdGUpO1xuICAgIGNvbnN0IHJlcyA9IChhd2FpdCBjdHguc3R1Yi5nZXRTdGF0ZShpZC50b1N0cmluZygpKSkudG9TdHJpbmcoKTtcbiAgICBpZiAoIXJlcykgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgIGxvZy5zaWxseShgc3RhdGUgcmV0cmlldmVkIHVuZGVyIGlkICR7aWR9YCk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlcy50b1N0cmluZygpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcmVjb3JkOiAke2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBxdWVyeVJlc3VsdChcbiAgICBzdHViOiBDaGFpbmNvZGVTdHViLFxuICAgIHJhd0lucHV0OiBhbnksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPiB7XG4gICAgcmV0dXJuIHN0dWIuZ2V0UXVlcnlSZXN1bHQoSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBxdWVyeVJlc3VsdFBhZ2luYXRlZChcbiAgICBzdHViOiBDaGFpbmNvZGVTdHViLFxuICAgIHJhd0lucHV0OiBhbnksXG4gICAgbGltaXQ6IG51bWJlciA9IDI1MCxcbiAgICBwYWdlPzogbnVtYmVyLFxuICAgIGJvb2ttYXJrPzogc3RyaW5nIHwgbnVtYmVyLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPj4ge1xuICAgIHJldHVybiBzdHViLmdldFF1ZXJ5UmVzdWx0V2l0aFBhZ2luYXRpb24oXG4gICAgICBKU09OLnN0cmluZ2lmeShyYXdJbnB1dCksXG4gICAgICBsaW1pdCxcbiAgICAgIGJvb2ttYXJrPy50b1N0cmluZygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVjb2RlcyBiaW5hcnkgZGF0YSB0byBzdHJpbmdcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBVaW50OEFycmF5IHRvIGEgc3RyaW5nIHVzaW5nIFVURi04IGVuY29kaW5nXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gYnVmZmVyIC0gVGhlIGJpbmFyeSBkYXRhIHRvIGRlY29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHN0cmluZ1xuICAgKi9cbiAgcHJvdGVjdGVkIGRlY29kZShidWZmZXI6IFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RBZGFwdGVyLnRleHREZWNvZGVyLmRlY29kZShidWZmZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9wZXJhdGlvbiBmbGFncyBmb3IgRmFicmljIGNvbnRyYWN0IG9wZXJhdGlvbnNcbiAgICogQHN1bW1hcnkgTWVyZ2VzIGRlZmF1bHQgZmxhZ3Mgd2l0aCBGYWJyaWMtc3BlY2lmaWMgY29udGV4dCBpbmZvcm1hdGlvblxuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEZhYnJpY0NvbnRyYWN0RmxhZ3M+fSBmbGFncyAtIFBhcnRpYWwgZmxhZ3MgdG8gbWVyZ2Ugd2l0aCBkZWZhdWx0c1xuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcmV0dXJuIHtGYWJyaWNDb250cmFjdEZsYWdzfSBUaGUgbWVyZ2VkIGZsYWdzXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IEFsbE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZhYnJpY0NvbnRyYWN0RmxhZ3M+IHwgRmFicmljQ29udHJhY3RDb250ZXh0IHwgQ3R4IHwgYW55XG4gICk6IFByb21pc2U8RmFicmljQ29udHJhY3RGbGFncz4ge1xuICAgIGxldCBiYXNlRmxhZ3MgPSB7XG4gICAgICBzZWdyZWdhdGVkOiBmYWxzZSxcbiAgICAgIHJlYnVpbGRXaXRoVHJhbnNpZW50OiBmYWxzZSxcbiAgICAgIGZ1bGx5U2VncmVnYXRlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGJhc2VGbGFncyA9IE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCBmbGFncyk7XG4gICAgY29uc3Qgc3R1YkZyb21GbGFncyA9XG4gICAgICAoZmxhZ3MgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS5zdHViIHx8IChmbGFncyBhcyBDdHgpLnN0dWI7XG4gICAgY29uc3QgaWRlbnRpdHlGcm9tRmxhZ3MgPVxuICAgICAgKGZsYWdzIGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkuaWRlbnRpdHkgfHxcbiAgICAgIChmbGFncyBhcyBDdHgpLmNsaWVudElkZW50aXR5O1xuICAgIGlmIChzdHViRnJvbUZsYWdzICYmIGlkZW50aXR5RnJvbUZsYWdzKSB7XG4gICAgICBjb25zdCB0eElkID0gc3R1YkZyb21GbGFncy5nZXRUeElEKCk7XG4gICAgICBPYmplY3QuYXNzaWduKGJhc2VGbGFncywge1xuICAgICAgICBzdHViOiBzdHViRnJvbUZsYWdzLFxuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHlGcm9tRmxhZ3MsXG4gICAgICAgIGNlcnQ6IGlkZW50aXR5RnJvbUZsYWdzLmdldElEQnl0ZXMoKS50b1N0cmluZygpLFxuICAgICAgICByb2xlczogaWRlbnRpdHlGcm9tRmxhZ3MuZ2V0QXR0cmlidXRlVmFsdWUoXCJyb2xlc1wiKSxcbiAgICAgICAgbG9nZ2VyOiBMb2dnaW5nLmZvcihcbiAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbG9nTGV2ZWw6IGZhbHNlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBmYWxzZSxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHR4SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmbGFnc1xuICAgICAgICApLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiB0eElkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2VGbGFncyA9IE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCBmbGFncyB8fCB7fSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCBzdXBlci5mbGFncyhcbiAgICAgIG9wZXJhdGlvbixcbiAgICAgIG1vZGVsLFxuICAgICAgYmFzZUZsYWdzIGFzIGFueVxuICAgICkpIGFzIEZhYnJpY0NvbnRyYWN0RmxhZ3M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggZm9yIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIGZvciBGYWJyaWMgY29udHJhY3RzIGFuZCByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZVxuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVscyAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHlcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIGluZGV4PE0+KG1vZGVsczogQ29uc3RydWN0b3I8TT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyByZXN1bHRzIGZyb20gYSBzdGF0ZSBxdWVyeSBpdGVyYXRvclxuICAgKiBAc3VtbWFyeSBJdGVyYXRlcyB0aHJvdWdoIHF1ZXJ5IHJlc3VsdHMgYW5kIGNvbnZlcnRzIHRoZW0gdG8gYSBzdHJ1Y3R1cmVkIGZvcm1hdFxuICAgKiBAcGFyYW0ge0xvZ2dlcn0gbG9nIC0gTG9nZ2VyIGluc3RhbmNlIGZvciBkZWJ1Z2dpbmdcbiAgICogQHBhcmFtIHtJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yfSBpdGVyYXRvciAtIFRoZSBzdGF0ZSBxdWVyeSBpdGVyYXRvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0hpc3Rvcnk9ZmFsc2VdIC0gV2hldGhlciB0aGlzIGlzIGEgaGlzdG9yeSBxdWVyeVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gYW4gYXJyYXkgb2YgcHJvY2Vzc2VkIHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmVzdWx0SXRlcmF0b3JcbiAgICogICBwYXJ0aWNpcGFudCBJdGVyYXRvclxuICAgKlxuICAgKiAgIENhbGxlci0+PlJlc3VsdEl0ZXJhdG9yOiByZXN1bHRJdGVyYXRvcihsb2csIGl0ZXJhdG9yLCBpc0hpc3RvcnkpXG4gICAqICAgbG9vcCBVbnRpbCBkb25lXG4gICAqICAgICBSZXN1bHRJdGVyYXRvci0+Pkl0ZXJhdG9yOiBuZXh0KClcbiAgICogICAgIEl0ZXJhdG9yLS0+PlJlc3VsdEl0ZXJhdG9yOiB7IHZhbHVlLCBkb25lIH1cbiAgICogICAgIGFsdCBIYXMgdmFsdWVcbiAgICogICAgICAgUmVzdWx0SXRlcmF0b3ItPj5SZXN1bHRJdGVyYXRvcjogUHJvY2VzcyB2YWx1ZSBiYXNlZCBvbiBpc0hpc3RvcnlcbiAgICogICAgICAgUmVzdWx0SXRlcmF0b3ItPj5SZXN1bHRJdGVyYXRvcjogQWRkIHRvIHJlc3VsdHMgYXJyYXlcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIFJlc3VsdEl0ZXJhdG9yLT4+SXRlcmF0b3I6IGNsb3NlKClcbiAgICogICBSZXN1bHRJdGVyYXRvci0tPj5DYWxsZXI6IGFsbFJlc3VsdHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZXN1bHRJdGVyYXRvcihcbiAgICBsb2c6IExvZ2dlcixcbiAgICBpdGVyYXRvcjogSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcixcbiAgICBpc0hpc3RvcnkgPSBmYWxzZVxuICApIHtcbiAgICBjb25zdCBhbGxSZXN1bHRzID0gW107XG4gICAgbGV0IHJlczogeyB2YWx1ZTogYW55OyBkb25lOiBib29sZWFuIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgd2hpbGUgKCFyZXMuZG9uZSkge1xuICAgICAgaWYgKHJlcy52YWx1ZSAmJiByZXMudmFsdWUudmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICBsZXQganNvblJlczogYW55ID0ge307XG4gICAgICAgIGxvZy5kZWJ1ZyhyZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgaWYgKGlzSGlzdG9yeSAvKiAmJiBpc0hpc3RvcnkgPT09IHRydWUqLykge1xuICAgICAgICAgIGpzb25SZXMuVHhJZCA9IHJlcy52YWx1ZS50eElkO1xuICAgICAgICAgIGpzb25SZXMuVGltZXN0YW1wID0gcmVzLnZhbHVlLnRpbWVzdGFtcDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAganNvblJlcy5WYWx1ZSA9IEpTT04ucGFyc2UocmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAganNvblJlcy5WYWx1ZSA9IHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uUmVzID0gSlNPTi5wYXJzZShyZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICBqc29uUmVzID0gcmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWxsUmVzdWx0cy5wdXNoKGpzb25SZXMpO1xuICAgICAgfVxuICAgICAgcmVzID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYENsb3NpbmcgaXRlcmF0b3IgYWZ0ZXIgJHthbGxSZXN1bHRzLmxlbmd0aH0gcmVzdWx0c2ApO1xuICAgIGF3YWl0IGl0ZXJhdG9yLmNsb3NlKCk7XG4gICAgcmV0dXJuIGFsbFJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgcmljaCBxdWVyeSB1c2luZyBDb3VjaERCIHN5bnRheCBhZ2FpbnN0IHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBRdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9jc09ubHkgLSBXaGV0aGVyIHRvIHJldHVybiBvbmx5IGRvY3VtZW50cyAobm90IHVzZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbilcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLCBpbmNsdWRpbmcgdGhlIGNoYWluY29kZSBzdHViIGFuZCBsb2dnZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgRmFicmljQ29udHJhY3RBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3R1YlxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlREJcbiAgICpcbiAgICogICBDYWxsZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IHJhdyhyYXdJbnB1dCwgZG9jc09ubHksIGN0eClcbiAgICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IEV4dHJhY3QgbGltaXQgYW5kIHNraXBcbiAgICogICBhbHQgV2l0aCBwYWdpbmF0aW9uXG4gICAqICAgICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5TdHViOiBnZXRRdWVyeVJlc3VsdFdpdGhQYWdpbmF0aW9uKHF1ZXJ5LCBsaW1pdCwgc2tpcClcbiAgICogICBlbHNlIFdpdGhvdXQgcGFnaW5hdGlvblxuICAgKiAgICAgRmFicmljQ29udHJhY3RBZGFwdGVyLT4+U3R1YjogZ2V0UXVlcnlSZXN1bHQocXVlcnkpXG4gICAqICAgZW5kXG4gICAqICAgU3R1Yi0+PlN0YXRlREI6IEV4ZWN1dGUgcXVlcnlcbiAgICogICBTdGF0ZURCLS0+PlN0dWI6IEl0ZXJhdG9yXG4gICAqICAgU3R1Yi0tPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IEl0ZXJhdG9yXG4gICAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiByZXN1bHRJdGVyYXRvcihsb2csIGl0ZXJhdG9yKVxuICAgKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0tPj5DYWxsZXI6IHJlc3VsdHNcbiAgICovXG4gIGFzeW5jIHJhdzxSLCBEIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnksXG4gICAgZG9jc09ubHk6IEQgPSB0cnVlIGFzIEQsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFJhd1Jlc3VsdDxSLCBEPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHgsIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmF3KTtcblxuICAgIGNvbnN0IGVuYWJsZVNlZ3JlZ2F0ZXMgPSAhYXJncy5sZW5ndGggfHwgYXJnc1swXSAhPT0gdHJ1ZTtcbiAgICBjb25zdCBmdWxseVNlZ3JlZ2F0ZWQgPSBlbmFibGVTZWdyZWdhdGVzICYmIGN0eC5pc0Z1bGx5U2VncmVnYXRlZDtcblxuICAgIGNvbnN0IHsgc2tpcCwgbGltaXQgfSA9IHJhd0lucHV0O1xuICAgIGNvbnN0IGJvb2ttYXJrID0gcmF3SW5wdXRbXCJib29rbWFya1wiXTtcbiAgICBsZXQgcmVzcCA9IHsgZG9jczogW10sIGJvb2ttYXJrOiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgICAvLyBRdWVyeSBwdWJsaWMgc3RhdGUgb25seSB3aGVuIHRoZSBtb2RlbCBpcyBOT1QgZnVsbHkgc2VncmVnYXRlZFxuICAgIGlmICghZnVsbHlTZWdyZWdhdGVkKSB7XG4gICAgICBsZXQgaXRlcmF0b3I6IEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I7XG4gICAgICBpZiAobGltaXQgfHwgc2tpcCkge1xuICAgICAgICBkZWxldGUgcmF3SW5wdXRbXCJsaW1pdFwiXTtcbiAgICAgICAgZGVsZXRlIHJhd0lucHV0W1wic2tpcFwiXTtcbiAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgIGBSZXRyaWV2aW5nIHB1YmxpYyBwYWdpbmF0ZWQgaXRlcmF0b3I6IGxpbWl0OiAke2xpbWl0fS8gc2tpcDogJHtza2lwfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPiA9XG4gICAgICAgICAgKGF3YWl0IHRoaXMucXVlcnlSZXN1bHRQYWdpbmF0ZWQoXG4gICAgICAgICAgICBjdHguc3R1YixcbiAgICAgICAgICAgIHJhd0lucHV0LFxuICAgICAgICAgICAgbGltaXQgfHwgTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIChza2lwIGFzIGFueSk/LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBib29rbWFyayxcbiAgICAgICAgICAgIC4uLltjdHggYXMgRmFicmljQ29udHJhY3RDb250ZXh0XVxuICAgICAgICAgICkpIGFzIFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPjtcbiAgICAgICAgcmVzcC5ib29rbWFyayA9IHJlc3BvbnNlLm1ldGFkYXRhLmJvb2ttYXJrO1xuICAgICAgICBpdGVyYXRvciA9IHJlc3BvbnNlLml0ZXJhdG9yO1xuICAgICAgICBsb2cuZGVidWcoYFJldHJpZXZlZCBwdWJsaWMgcGFnaW5nIGl0ZXJhdG9yYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoXCJSZXRyaWV2aW5nIGxpc3RpbmcgcHVibGljIGl0ZXJhdG9yXCIpO1xuICAgICAgICBpdGVyYXRvciA9IChhd2FpdCB0aGlzLnF1ZXJ5UmVzdWx0KFxuICAgICAgICAgIGN0eC5zdHViLFxuICAgICAgICAgIHJhd0lucHV0LFxuICAgICAgICAgIGN0eFxuICAgICAgICApKSBhcyBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2ZWQgcHVibGljIGxpc3RpbmcgaXRlcmF0b3JgKTtcblxuICAgICAgcmVzcC5kb2NzID0gKGF3YWl0IHRoaXMucmVzdWx0SXRlcmF0b3IobG9nLCBpdGVyYXRvcikpIGFzIGFueTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHJldHVybmluZyAke0FycmF5LmlzQXJyYXkocmVzcC5kb2NzKSA/IHJlc3AuZG9jcy5sZW5ndGggOiAxfSByZXN1bHRzYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGZ1bGx5IHNlZ3JlZ2F0ZWQgbW9kZWxzLCBzdHJpcCBwYWdpbmF0aW9uIGZpZWxkcyBmcm9tIHJhd0lucHV0XG4gICAgICAvLyBzbyB0aGUgc2VncmVnYXRlZCBxdWVyeSBiZWxvdyBjYW4gcmUtYXBwbHkgdGhlbSBjbGVhbmx5XG4gICAgICBpZiAobGltaXQgfHwgc2tpcCkge1xuICAgICAgICBkZWxldGUgcmF3SW5wdXRbXCJsaW1pdFwiXTtcbiAgICAgICAgZGVsZXRlIHJhd0lucHV0W1wic2tpcFwiXTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhcIlNraXBwaW5nIHB1YmxpYyBzdGF0ZSBxdWVyeSAoZnVsbHkgc2VncmVnYXRlZCBtb2RlbClcIik7XG4gICAgfVxuXG4gICAgY29uc3QgY29sbGVjdGlvbnMgPSBlbmFibGVTZWdyZWdhdGVzID8gY3R4LmdldFJlYWRDb2xsZWN0aW9ucygpIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGNvbGxlY3Rpb25zICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgLy8gQnVpbGQgYSBmcmVzaCBpbnB1dCB3aXRoIGxpbWl0L3NraXAvYm9va21hcmsgcmVzdG9yZWRcbiAgICAgIGNvbnN0IHNlZ3JlZ2F0ZWRJbnB1dCA9IHsgLi4ucmF3SW5wdXQgfTtcbiAgICAgIGlmIChsaW1pdCkgc2VncmVnYXRlZElucHV0LmxpbWl0ID0gbGltaXQ7XG4gICAgICBpZiAoc2tpcCkgc2VncmVnYXRlZElucHV0LnNraXAgPSBza2lwO1xuICAgICAgaWYgKGJvb2ttYXJrKSBzZWdyZWdhdGVkSW5wdXRbXCJib29rbWFya1wiXSA9IGJvb2ttYXJrO1xuXG4gICAgICBjb25zdCBzZWdyZWdhdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIGNvbGxlY3Rpb25zKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUXVlcnlpbmcgZnJvbSAke2NvbGxlY3Rpb259YCk7XG4gICAgICAgIGNvbnN0IGZyb21Db2xzID0gYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbGxlY3Rpb24pLnJhdyhcbiAgICAgICAgICB7IC4uLnNlZ3JlZ2F0ZWRJbnB1dCB9LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgLi4uY3R4QXJnc1xuICAgICAgICApO1xuICAgICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgICBgcmVjZWl2ZWQgJHsoZnJvbUNvbHMgYXMgdW5rbm93biBhcyBhbnlbXSkubGVuZ3RofSBmcm9tICR7Y29sbGVjdGlvbn1gXG4gICAgICAgICk7XG4gICAgICAgIHNlZ3JlZ2F0ZWQucHVzaChmcm9tQ29scyk7XG4gICAgICB9XG4gICAgICAvLyBjaG9vc2UgdGhlIHJlc3BvbnNlIHdpdGggdGhlIG1vc3QgcmVzdWx0c1xuICAgICAgcmVzcCA9IHNlZ3JlZ2F0ZWQucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgaWYgKCFhY2MpIHJldHVybiBjdXJyO1xuICAgICAgICBpZiAoY3Vyci5kb2NzICYmIGN1cnIuZG9jcy5sZW5ndGggPj0gYWNjPy5kb2NzLmxlbmd0aCkgcmV0dXJuIGN1cnI7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCByZXNwKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jc09ubHkpIHtcbiAgICAgIHJldHVybiByZXNwLmRvY3MgYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcCBhcyBhbnk7XG4gIH1cblxuICBhc3luYyB2aWV3PFI+KFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZG9jOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHZpZXdOYW1lOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLl9hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8Vmlld1Jlc3BvbnNlPFI+PiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkZhYnJpYyBjb250cmFjdHMgZG8gbm90IHN1cHBvcnQgQ291Y2hEQiB2aWV3cy5cIlxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBGYWJyaWNTdGF0ZW1lbnQ8TSwgYW55PiB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNTdGF0ZW1lbnQodGhpcyBhcyBhbnkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgeyBsb2csIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBjb25zdCB0YWJsZUxhYmVsID0gTW9kZWwudGFibGVOYW1lKHRhYmxlTmFtZSk7XG4gICAgbG9nLmRlYnVnKGBVcGRhdGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTGFiZWx9IHRhYmxlYCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy51cGRhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmN0eEFyZ3MpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa1xuICAgKiBAcGFyYW0gYXJnc1xuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJlcGFyZWRNb2RlbCAmIHtcbiAgICBzZWdyZWdhdGVkPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj47XG4gIH0ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucHJlcGFyZSk7XG4gICAgY29uc3Qgc3BsaXQ6IFNlZ3JlZ2F0ZWRNb2RlbDxNPiA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbcGsgYXMga2V5b2YgTV07XG5cbiAgICBjb25zdCBpc01pcnJvciA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm1pcnJvclwiKSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbWFwVG9SZWNvcmQgPSBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBGYWJyaWNDb250cmFjdEFkYXB0ZXIsXG4gICAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBrZXlzT3ZlcnJpZGU/OiBzdHJpbmdbXVxuICAgICkge1xuICAgICAgaWYgKGtleXNPdmVycmlkZSlcbiAgICAgICAga2V5c092ZXJyaWRlID0gWy4uLm5ldyBTZXQoWy4uLmtleXNPdmVycmlkZSwgcGsgYXMgc3RyaW5nXSldO1xuICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoXG4gICAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gYWNjdW07XG4gICAgICAgICAgaWYgKGtleXNPdmVycmlkZSAmJiAha2V5c092ZXJyaWRlLmluY2x1ZGVzKGtleSkpIHJldHVybiBhY2N1bTtcbiAgICAgICAgICBjb25zdCBtYXBwZWRQcm9wID0gTW9kZWwuY29sdW1uTmFtZShtb2RlbCwga2V5IGFzIGFueSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBQcm9wZXJ0eSBuYW1lICR7bWFwcGVkUHJvcH0gaXMgcmVzZXJ2ZWRgKTtcbiAgICAgICAgICB2YWwgPSB2YWwgaW5zdGFuY2VvZiBEYXRlID8gbmV3IERhdGUodmFsKSA6IHZhbDtcbiAgICAgICAgICBhY2N1bVttYXBwZWRQcm9wXSA9IHZhbDtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkuZmlsdGVyKChrKSA9PiBCb29sZWFuKHJlc3VsdFtrXSkpLmxlbmd0aCkge1xuICAgICAgICAvLyBBZGQgdGFibGUgaWRlbnRpZmllclxuICAgICAgICByZXN1bHRbQ291Y2hEQktleXMuVEFCTEVdID0gdGFibGVOYW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LmJpbmQodGhpcyk7XG5cbiAgICBsb2cuc2lsbHkoXG4gICAgICBgUHJlcGFyaW5nIHJlY29yZCBmb3IgJHt0YWJsZU5hbWV9IHRhYmxlIHdpdGggcGsgJHsobW9kZWwgYXMgYW55KVtwa119YFxuICAgICk7XG5cbiAgICBjb25zdCBzZWdyZWdhdGVkV3JpdGVLZXlzID0gY3R4LmdldFNlZ3JlZ2F0ZWRXcml0ZXMoKTtcbiAgICBjb25zdCBzZWdyZWdhdGVkV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgaWYgKHNlZ3JlZ2F0ZWRXcml0ZUtleXMpIHtcbiAgICAgIGZvciAoY29uc3QgY29sbGVjdGlvbiBpbiBzZWdyZWdhdGVkV3JpdGVLZXlzKSB7XG4gICAgICAgIHNlZ3JlZ2F0ZWRXcml0ZXNbY29sbGVjdGlvbl0gPSBzZWdyZWdhdGVkV3JpdGVzW2NvbGxlY3Rpb25dIHx8IHt9O1xuICAgICAgICBzZWdyZWdhdGVkV3JpdGVzW2NvbGxlY3Rpb25dW2lkIGFzIGFueV0gPSBtYXBUb1JlY29yZChcbiAgICAgICAgICBjdHguZ2V0T3JVbmRlZmluZWQoXCJmb3JjZVNlZ3JlZ2F0ZVdyaXRlXCIpXG4gICAgICAgICAgICA/IHNwbGl0Lm1vZGVsXG4gICAgICAgICAgICA6IChzcGxpdC50cmFuc2llbnQgYXMgYW55KSxcbiAgICAgICAgICBzZWdyZWdhdGVkV3JpdGVLZXlzW2NvbGxlY3Rpb25dXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gbWlycm9yIG1vZGUsIHRoZSByZWNvcmQgc2hvdWxkIGNvbnRhaW4gQUxMIG1vZGVsIHByb3BlcnRpZXMgKGZ1bGwgY29weSlcbiAgICBjb25zdCByZWNvcmQgPSBpc01pcnJvciA/IG1hcFRvUmVjb3JkKG1vZGVsKSA6IG1hcFRvUmVjb3JkKHNwbGl0Lm1vZGVsKTtcblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQsXG4gICAgICBpZDogKG1vZGVsIGFzIGFueSlbcGtdIGFzIHN0cmluZyxcbiAgICAgIHRyYW5zaWVudDpcbiAgICAgICAgIWlzTWlycm9yICYmIHNwbGl0LnRyYW5zaWVudCAmJiBPYmplY3Qua2V5cyhzcGxpdC50cmFuc2llbnQpLmxlbmd0aFxuICAgICAgICAgID8gbWFwVG9SZWNvcmQoc3BsaXQudHJhbnNpZW50KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc2VncmVnYXRlZDogaXNNaXJyb3IgPyB1bmRlZmluZWQgOiBzZWdyZWdhdGVkV3JpdGVzLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogTSB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZXZlcnQpO1xuICAgIGNvbnN0IG9iOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgcGtQcm9wcyA9IE1vZGVsLnBrUHJvcHMoY2xhenopO1xuICAgIGlmIChwa1Byb3BzPy50eXBlID09PSBOdW1iZXIgJiYgdHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZCA9IE51bWJlcihpZCk7XG4gICAgfVxuICAgIG9iW3BrIGFzIHN0cmluZ10gPSBpZDtcbiAgICBsb2cuc2lsbHkoYFJlYnVpbGRpbmcgbW9kZWwgJHtjbGF6ei5uYW1lfSBpZCAke2lkfWApO1xuXG4gICAgZnVuY3Rpb24gbWFwVG9Nb2RlbChyOiBSZWNvcmQ8YW55LCBhbnk+KSB7XG4gICAgICBjb25zdCBtID0gKFxuICAgICAgICB0eXBlb2YgY2xhenogPT09IFwic3RyaW5nXCIgPyBNb2RlbC5idWlsZChvYiwgY2xhenopIDogbmV3IGNsYXp6KG9iKVxuICAgICAgKSBhcyBNO1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE1vZGVsLmdldEF0dHJpYnV0ZXMoY2xhenopO1xuICAgICAgY29uc3Qga2V5cyA9IGF0dHJpYnV0ZXMubGVuZ3RoID8gYXR0cmlidXRlcyA6IE9iamVjdC5rZXlzKG0pO1xuICAgICAgcmV0dXJuIGtleXNcbiAgICAgICAgLmZpbHRlcigoaykgPT4gayAhPT0gKHBrIGFzIHN0cmluZykpXG4gICAgICAgIC5yZWR1Y2UoKGFjY3VtOiBNLCBrZXkpID0+IHtcbiAgICAgICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9XG4gICAgICAgICAgICByW01vZGVsLmNvbHVtbk5hbWUoYWNjdW0sIGtleSBhcyBhbnkpXTtcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIH0sIG0pO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBtYXBUb01vZGVsKG9iaik7XG5cbiAgICBpZiAodHJhbnNpZW50ICYmICF0aGlzLnNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KGN0eCkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYGZpbHRlcmluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKGFjYywgW2tleSwgdl0pID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gcGsgfHwgIShrZXkgaW4gdHJhbnNpZW50KSkge1xuICAgICAgICAgIGFjY1trZXkgYXMga2V5b2YgTV0gPSB2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgY2xhenooKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVidWlsZFdpdGhUcmFuc2llbnQoY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHQpOiBib29sZWFuIHtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjdHguZ2V0T3JVbmRlZmluZWQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwib3BlcmF0aW9uXCIpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIW9wZXJhdGlvbikgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAhVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzLm1hcCgoaykgPT4gay50b0xvd2VyQ2FzZSgpKS5pbmNsdWRlcyhvcCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRleHRNc3AoY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXNcbiAgICAgIHwgc3RyaW5nXG4gICAgICB8IENsaWVudElkZW50aXR5XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWlkZW50aXR5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgaWRlbnRpdHkgPT09IFwic3RyaW5nXCIpIHJldHVybiBpZGVudGl0eTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGlkZW50aXR5LmdldE1TUElEKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5mb3JjZU1pcnJvckF1dGhvcml6YXRpb248TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHRcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuICAgIGlmICghbWlycm9yTWV0YSkgcmV0dXJuO1xuICAgIGNvbnN0IG1zcCA9IHRoaXMuZ2V0Q29udGV4dE1zcChjdHgpO1xuICAgIGlmICghbXNwKSByZXR1cm47XG4gICAgaWYgKFxuICAgICAgbXNwID09PSBtaXJyb3JNZXRhLm1zcElkIHx8XG4gICAgICAobWlycm9yTWV0YS5jb25kaXRpb24gJiYgbWlycm9yTWV0YS5jb25kaXRpb24obXNwKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgIGBPcmdhbml6YXRpb24gJHttc3B9IGlzIG5vdCBhdXRob3JpemVkIHRvIG1vZGlmeSBtaXJyb3JlZCBkYXRhYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjcmVhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApIHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuY3JlYXRlUHJlZml4KTtcbiAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRhYmxlTmFtZSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsKTtcblxuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5jdHhBcmdzXSBhcyBbXG4gICAgICBDb25zdHJ1Y3RvcjxNPixcbiAgICAgIFByaW1hcnlLZXlUeXBlLFxuICAgICAgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIC4uLmFueVtdLFxuICAgICAgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSB1cGRhdGVQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBhbnlbXSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG5cbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc10gYXMgW1xuICAgICAgQ29uc3RydWN0b3I8TT4sXG4gICAgICBQcmltYXJ5S2V5VHlwZSxcbiAgICAgIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICAuLi5hbnlbXSxcbiAgICAgIEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IFsuLi5hbnksIEZhYnJpY0NvbnRyYWN0Q29udGV4dF1cbiAgKTogKHN0cmluZyB8IHN0cmluZ1tdIHwgbnVtYmVyW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pW10ge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuXG4gICAgY29uc3QgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHQgPSBhcmdzLnBvcCgpO1xuXG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKGlkLCBjb3VudCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRhYmxlTmFtZSk7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZHMsIHJlY29yZHMsIGN0eCBhcyBhbnldO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZUFsbFByZWZpeDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWRzOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IFsuLi5hbnksIEZhYnJpY0NvbnRyYWN0Q29udGV4dF1cbiAgKSB7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IG1vZGVscy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG5cbiAgICBjb25zdCBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCA9IGFyZ3MucG9wKCk7XG5cbiAgICBjb25zdCByZWNvcmRzID0gaWRzLm1hcCgoaWQsIGNvdW50KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkcywgcmVjb3JkcywgY3R4IGFzIGFueV07XG4gIH1cblxuICBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KFxuICAgIGVycjogRXJyb3IgfCBzdHJpbmcsXG4gICAgcmVhc29uPzogc3RyaW5nXG4gICk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDb250cmFjdEFkYXB0ZXIucGFyc2VFcnJvcihyZWFzb24gfHwgZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2dDdHg8XG4gICAgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10sXG4gICAgTUVUSE9EIGV4dGVuZHMgTWV0aG9kT3JPcGVyYXRpb24gPSBNZXRob2RPck9wZXJhdGlvbixcbiAgPihcbiAgICBhcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPixcbiAgICBvcGVyYXRpb246IE1FVEhPRFxuICApOiBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8QVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGxvZ0N0eDxcbiAgICBBUkdTIGV4dGVuZHMgYW55W10gPSBhbnlbXSxcbiAgICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RPck9wZXJhdGlvbiA9IE1ldGhvZE9yT3BlcmF0aW9uLFxuICA+KFxuICAgIGFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1M+LFxuICAgIG9wZXJhdGlvbjogTUVUSE9ELFxuICAgIGFsbG93Q3JlYXRlOiBmYWxzZVxuICApOiBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8QVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGxvZ0N0eDxcbiAgICBBUkdTIGV4dGVuZHMgYW55W10gPSBhbnlbXSxcbiAgICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RPck9wZXJhdGlvbiA9IE1ldGhvZE9yT3BlcmF0aW9uLFxuICA+KFxuICAgIGFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1M+LFxuICAgIG9wZXJhdGlvbjogTUVUSE9ELFxuICAgIGFsbG93Q3JlYXRlOiB0cnVlLFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8RmxhZ3NPZjxGYWJyaWNDb250cmFjdENvbnRleHQ+PlxuICApOiBQcm9taXNlPFxuICAgIEZhYnJpY0NvbnRleHR1YWxpemVkQXJnczxBUkdTLCBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2U+XG4gID47XG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2dDdHg8XG4gICAgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10sXG4gICAgTUVUSE9EIGV4dGVuZHMgTWV0aG9kT3JPcGVyYXRpb24gPSBNZXRob2RPck9wZXJhdGlvbixcbiAgPihcbiAgICBhcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPixcbiAgICBvcGVyYXRpb246IE1FVEhPRCxcbiAgICBhbGxvd0NyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8RmxhZ3NPZjxGYWJyaWNDb250cmFjdENvbnRleHQ+PiB8IEN0eFxuICApOlxuICAgIHwgUHJvbWlzZTxcbiAgICAgICAgRmFicmljQ29udGV4dHVhbGl6ZWRBcmdzPEFSR1MsIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZT5cbiAgICAgID5cbiAgICB8IEZhYnJpY0NvbnRleHR1YWxpemVkQXJnczxBUkdTLCBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2U+IHtcbiAgICBpZiAoIWFsbG93Q3JlYXRlKVxuICAgICAgcmV0dXJuIHN1cGVyLmxvZ0N0eDxBUkdTLCBNRVRIT0Q+KFxuICAgICAgICBhcmdzLFxuICAgICAgICBvcGVyYXRpb24gYXMgYW55LFxuICAgICAgICBhbGxvd0NyZWF0ZSBhcyBhbnksXG4gICAgICAgIG92ZXJyaWRlcyBhcyBhbnlcbiAgICAgICkgYXMgYW55O1xuXG4gICAgcmV0dXJuIHN1cGVyLmxvZ0N0eFxuICAgICAgLmNhbGwodGhpcywgYXJncywgb3BlcmF0aW9uIGFzIGFueSwgYWxsb3dDcmVhdGUsIG92ZXJyaWRlcyBhcyBhbnkpXG4gICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGlmICghKHJlcy5jdHggaW5zdGFuY2VvZiBGYWJyaWNDb250cmFjdENvbnRleHQpKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBJbnZhbGlkIGNvbnRleHQgYmluZGluZ2ApO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihyZXMsIHtcbiAgICAgICAgICBzdHViOiByZXMuY3R4LnN0dWIsXG4gICAgICAgICAgaWRlbnRpdHk6IHJlcy5jdHguaWRlbnRpdHksXG4gICAgICAgIH0pO1xuICAgICAgfSkgYXMgYW55O1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKFxuICAgIHRhYmxlOiBDb25zdHJ1Y3Rvcjxhbnk+IHwgc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICBjb25zdCB7IGN0eCwgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVPYnNlcnZlcnMpO1xuICAgIGlmIChjdHguaXNGdWxseVNlZ3JlZ2F0ZWQpIHJldHVybjtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwibm9FbWl0XCIpKSByZXR1cm47XG4gICAgaWYgKCFjdHguc3R1YikgcmV0dXJuO1xuICAgIGNvbnN0IGlzQnVsayA9IEFycmF5LmlzQXJyYXkoaWQpO1xuICAgIGNvbnN0IGVtaXRTaW5nbGUgPSAhY3R4LmdldE9yVW5kZWZpbmVkKFwibm9FbWl0U2luZ2xlXCIpO1xuICAgIGNvbnN0IGVtaXRCdWxrID0gIWN0eC5nZXRPclVuZGVmaW5lZChcIm5vRW1pdEJ1bGtcIik7XG4gICAgaWYgKChpc0J1bGsgJiYgZW1pdEJ1bGspIHx8ICghaXNCdWxrICYmIGVtaXRTaW5nbGUpKSB7XG4gICAgICAvLyBQYXNzIHRoZSBNU1Agb3duZXIgZnJvbSBzdHViIGFuZCB0aGUgcmVzdWx0IHBheWxvYWQgKGlmIGFueSkgaW4gdGhlXG4gICAgICAvLyBwb3NpdGlvbnMgdGhlIGhhbmRsZXIgZXhwZWN0czogKHRhYmxlLCBldmVudCwgaWQsIG93bmVyPywgcGF5bG9hZD8sIGN0eClcbiAgICAgIGNvbnN0IG1zcElkID0gY3R4LnN0dWIuZ2V0TXNwSUQgPyBjdHguc3R1Yi5nZXRNc3BJRCgpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgbm9uQ3R4QXJncyA9IGN0eEFyZ3Muc2xpY2UoMCwgLTEpOyAvLyBldmVyeXRoaW5nIGJlZm9yZSBjdHhcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBub25DdHhBcmdzLmxlbmd0aCA+IDAgPyBub25DdHhBcmdzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgdGhpcy5vYnNlcnZlckhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgICB0YWJsZSxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGlkLFxuICAgICAgICBtc3BJZCxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgY3R4XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IgfCBzdHJpbmcpOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcbiAgICBjb25zdCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhcIm5vIGxlZGdlciBjb250ZXh0XCIpKVxuICAgICAgcmV0dXJuIG5ldyBNaXNzaW5nQ29udGV4dEVycm9yKFxuICAgICAgICBgTm8gY29udGV4dCBmb3VuZC4gdGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGRlYnVnZ2luZzogJHttc2d9YFxuICAgICAgKSBhcyBFO1xuXG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1ldGhvZCBmb3IgZGVjb3JhdGlvbiBvdmVycmlkZXNcbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzL2V4dGVuZHMgZGVjYWYgZGVjb3JhdGlvbiB3aXRoIEZhYnJpYy1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5XG4gICAqIEBzdGF0aWNcbiAgICogQG92ZXJyaWRlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGUgZGVjb3JhdGlvbigpOiB2b2lkIHtcbiAgICBzdXBlci5kZWNvcmF0aW9uKCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPbkZhYnJpY0NyZWF0ZVVwZGF0ZSksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlksIHt9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPbkZhYnJpY0NyZWF0ZVVwZGF0ZSksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlksIHt9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKVxuICAgICAgLmV4dGVuZChGYWJyaWNQcm9wZXJ0eSgpKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG4gICAgICAuZXh0ZW5kKGZ1bmN0aW9uIGZhYnJpY1Byb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wPzogYW55KSA9PiB7XG4gICAgICAgICAgUHJvcGVydHkocHJvcCwgXCJzdHJpbmc6ZGF0ZVwiKSh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5UQUJMRSlcbiAgICAgIC5leHRlbmQoZnVuY3Rpb24gdGFibGUob2JqOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY2hhaW46IGFueVtdID0gW107XG4gICAgICAgIGxldCBjdXJyZW50ID1cbiAgICAgICAgICB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gTWV0YWRhdGEuY29uc3RyKG9iailcbiAgICAgICAgICAgIDogTWV0YWRhdGEuY29uc3RyKG9iai5jb25zdHJ1Y3Rvcik7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQucHJvdG90eXBlKSB7XG4gICAgICAgICAgY2hhaW4ucHVzaChjdXJyZW50KTtcbiAgICAgICAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coY2hhaW4ubWFwKChjKSA9PiBjLm5hbWUgfHwgYykpO1xuXG4gICAgICAgIC8vIEFwcGx5IGZyb20gdGhlIGJhc2UgY2xhc3MgZG93biB0byB0aGUgZGVjb3JhdGVkIGNsYXNzXG4gICAgICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSBjaGFpbi5wb3AoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgQ2FsbGluZyBvbiAke2NvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgICAgICAgRmFicmljT2JqZWN0KCkoY29uc3RydWN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEZhYnJpY09iamVjdCgpKG9iaik7XG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cblxuRmFicmljQ29udHJhY3RBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiJdfQ==
@@ -131,6 +131,15 @@ export declare class FabricContractAdapter extends CouchDBAdapter<any, void, Fab
131
131
  * @return {Promise<Record<string, any>>} Promise resolving to the retrieved record
132
132
  */
133
133
  read<M extends Model>(clazz: Constructor<M>, id: PrimaryKeyType, ...args: ContextualArgs<Context<FabricContractFlags>>): Promise<Record<string, any>>;
134
+ /**
135
+ * @description Retrieves multiple records from the database
136
+ * @summary Fetches multiple records with the given IDs from the specified table
137
+ * @param {string} tableName - The name of the table to read from
138
+ * @param id - The identifiers of the records to retrieve
139
+ * @param {...any[]} args - Additional arguments specific to the adapter implementation
140
+ * @return A promise that resolves to an array of retrieved records
141
+ */
142
+ readAll<M extends Model>(clazz: Constructor<M>, id: PrimaryKeyType[], ...args: ContextualArgs<Context<FabricContractFlags>>): Promise<Record<string, any>[]>;
134
143
  /**
135
144
  * @description Updates a record in the state database
136
145
  * @summary Serializes a model and updates it in the Fabric state database
@@ -147,4 +147,4 @@ class FabricContractContext extends core_1.Context {
147
147
  }
148
148
  }
149
149
  exports.FabricContractContext = FabricContractContext;
150
- //# sourceMappingURL=ContractContext.js.map
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJhY3RDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyYWN0cy9Db250cmFjdENvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXlDO0FBSXpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQWEscUJBQXNCLFNBQVEsY0FBNEI7SUFDckU7OztPQUdHO0lBQ0gsWUFBWSxHQUEyQjtRQUNyQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQWEsU0FBUztRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsRUFBRTtJQUNGLHdFQUF3RTtJQUN4RSx5Q0FBeUM7SUFDekMsNkNBQTZDO0lBQzdDLEVBQUU7SUFDRixxQ0FBcUM7SUFDckMsWUFBWTtJQUNaLHdEQUF3RDtJQUN4RCxpQkFBaUI7SUFFakI7Ozs7O09BS0c7SUFDSCxzQkFBc0IsQ0FDcEIsT0FBZSxFQUNmLGVBQXdCLEVBQ3hCLFdBQXFCO1FBRXJCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN0RCxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3pELEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsc0JBQXNCLENBQ3BCLE9BQWU7UUFFZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBZTtRQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxjQUFjLENBQUM7WUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZELGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBVTtRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBdUI7UUFDOUIsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRztZQUNwQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUN2RSxDQUFDO1FBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEUsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0I7UUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVRLFFBQVE7UUFDZixPQUFPLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0NBQ0Y7QUF0SUQsc0RBc0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDaGFpbmNvZGVTdHViLCBDbGllbnRJZGVudGl0eSB9IGZyb20gXCJmYWJyaWMtc2hpbS1hcGlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udGV4dCBjbGFzcyBmb3IgRmFicmljIGNoYWluY29kZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gRmFicmljLXNwZWNpZmljIGNvbnRleHQgZWxlbWVudHMgbGlrZSBzdHViLCBpZGVudGl0eSwgYW5kIGxvZ2dlciB0byBiZSB1c2VkIGJ5IHJlcG9zaXRvcmllcyBhbmQgYWRhcHRlcnMgZHVyaW5nIGNvbnRyYWN0IGV4ZWN1dGlvbi5cbiAqIEB0ZW1wbGF0ZSBGIC0gRmxhZ3Mgc3BlY2lmaWMgdG8gRmFicmljIGNvbnRyYWN0IG9wZXJhdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25hbCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBiYXNlIENvbnRleHRcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRmFicmljQ29udHJhY3RDb250ZXh0XG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSW4gYSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRyYWN0IG1ldGhvZFxuICogY29uc3QgY29udGV4dCA9IG5ldyBGYWJyaWNDb250cmFjdENvbnRleHQoKTtcbiAqIC8vIE9wdGlvbmFsbHkgc2V0IHZhbHVlcyB2aWEgdGhlIGJhc2UgQ29udGV4dCBBUElcbiAqIGNvbnRleHQuc2V0KCdzdHViJywgY3R4LnN0dWIpO1xuICogY29udGV4dC5zZXQoJ2NsaWVudElkZW50aXR5JywgY3R4LmNsaWVudElkZW50aXR5KTtcbiAqIGNvbnRleHQuc2V0KCdsb2dnZXInLCBjb250cmFjdExvZ2dlcik7XG4gKlxuICogLy8gQWNjZXNzIGNvbnRleHQgcHJvcGVydGllc1xuICogY29uc3QgdGltZXN0YW1wID0gY29udGV4dC50aW1lc3RhbXA7XG4gKiBjb25zdCBjcmVhdG9yID0gY29udGV4dC5pZGVudGl0eS5nZXRJRCgpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgTGVkZ2VyXG4gKiAgIENvbnRyYWN0LT4+Q29udGV4dDogbmV3IEZhYnJpY0NvbnRyYWN0Q29udGV4dCgpXG4gKiAgIENvbnRyYWN0LT4+Q29udGV4dDogc2V0KCdzdHViJ3wnY2xpZW50SWRlbnRpdHknfCdsb2dnZXInLCAuLi4pXG4gKiAgIENvbnRleHQtLT4+Q29udHJhY3Q6IHRpbWVzdGFtcCwgaWRlbnRpdHksIGxvZ2dlclxuICogICBDb250cmFjdC0+PkxlZGdlcjogSW50ZXJhY3QgdmlhIHN0dWJcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCBleHRlbmRzIENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQ29udHJhY3RDb250ZXh0IGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBjb250ZXh0IHdpdGggRmFicmljLXNwZWNpZmljIGZsYWdzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjdHg/OiBGYWJyaWNDb250cmFjdENvbnRleHQpIHtcbiAgICBzdXBlcihjdHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjaGFpbmNvZGUgc3R1YlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBDaGFpbmNvZGVTdHViIGluc3RhbmNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBsZWRnZXJcbiAgICogQHJldHVybiB7Q2hhaW5jb2RlU3R1Yn0gVGhlIGNoYWluY29kZSBzdHViXG4gICAqL1xuICBnZXQgc3R1YigpOiBDaGFpbmNvZGVTdHViIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXCJzdHViXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0cmFuc2FjdGlvbiB0aW1lc3RhbXBcbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIHRpbWVzdGFtcCBnZXR0ZXIgdG8gdXNlIHRoZSBzdHViJ3MgdGltZXN0YW1wXG4gICAqIEByZXR1cm4ge0RhdGV9IFRoZSB0cmFuc2FjdGlvbiB0aW1lc3RhbXBcbiAgICovXG4gIG92ZXJyaWRlIGdldCB0aW1lc3RhbXAoKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3R1Yi5nZXREYXRlVGltZXN0YW1wKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNsaWVudCBpZGVudGl0eVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBDbGllbnRJZGVudGl0eSBpbnN0YW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uIHN1Ym1pdHRlclxuICAgKiBAcmV0dXJuIHtDbGllbnRJZGVudGl0eX0gVGhlIGNsaWVudCBpZGVudGl0eVxuICAgKi9cbiAgZ2V0IGlkZW50aXR5KCk6IENsaWVudElkZW50aXR5IHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXCJpZGVudGl0eVwiKTtcbiAgfVxuICAvL1xuICAvLyBwcml2YXRlIF9zZWdyZWdhdGVXcml0ZTogUmVjb3JkPHN0cmluZywgU2VncmVnYXRlZFdyaXRlRW50cnlbXT4gPSB7fTtcbiAgLy8gcHJpdmF0ZSBfc2VncmVnYXRlUmVhZDogc3RyaW5nW10gPSBbXTtcbiAgLy8gcHJpdmF0ZSBfZnVsbHlTZWdyZWdhdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vXG4gIC8vIHByaXZhdGUgX3NlcXVlbmNlU2VncmVnYXRpb246IE1hcDxcbiAgLy8gICBzdHJpbmcsXG4gIC8vICAgeyBmdWxseVNlZ3JlZ2F0ZWQ6IGJvb2xlYW47IGNvbGxlY3Rpb25zOiBzdHJpbmdbXSB9XG4gIC8vID4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgc2VncmVnYXRpb24gbWV0YWRhdGEgcGVyIHNlcXVlbmNlIG5hbWVcbiAgICogQHN1bW1hcnkgTmVlZGVkIGJlY2F1c2UgdGhlIFNlcXVlbmNlIGNyZWF0ZXMgaXRzIG93biBjb250ZXh0ICh2aWEgbG9nQ3R4KSxcbiAgICogbG9zaW5nIGZsYWdzIHNldCBieSBleHRyYWN0U2VncmVnYXRlZENvbGxlY3Rpb25zIG9uIHRoZSBoYW5kbGVyIGNvbnRleHQuXG4gICAqIFRoZSBhZGFwdGVyIHBlcnNpc3RzIGFjcm9zcyBvcGVyYXRpb25zLCBtYWtpbmcgaXQgYSByZWxpYWJsZSBzdG9yZS5cbiAgICovXG4gIHNldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgc2VxTmFtZTogc3RyaW5nLFxuICAgIGZ1bGx5U2VncmVnYXRlZDogYm9vbGVhbixcbiAgICBjb2xsZWN0aW9uczogc3RyaW5nW11cbiAgKTogdm9pZCB7XG4gICAgbGV0IG1hcCA9IHRoaXMuZ2V0RnJvbUNoaWxkcmVuKFwic2VxdWVuY2VTZWdyZWdhdGlvblwiKTtcbiAgICBtYXAgPSAhbWFwIHx8ICFPYmplY3Qua2V5cyhtYXApLmxlbmd0aCA/IG5ldyBNYXAoKSA6IG1hcDtcbiAgICBtYXAuc2V0KHNlcU5hbWUsIHsgZnVsbHlTZWdyZWdhdGVkLCBjb2xsZWN0aW9ucyB9KTtcbiAgICB0aGlzLnB1dChcInNlcXVlbmNlU2VncmVnYXRpb25cIiwgbWFwKTtcbiAgfVxuXG4gIGdldFNlcXVlbmNlU2VncmVnYXRpb24oXG4gICAgc2VxTmFtZTogc3RyaW5nXG4gICk6IHsgZnVsbHlTZWdyZWdhdGVkOiBib29sZWFuOyBjb2xsZWN0aW9uczogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RnJvbUNoaWxkcmVuKFwic2VxdWVuY2VTZWdyZWdhdGlvblwiKT8uZ2V0KHNlcU5hbWUpO1xuICB9XG5cbiAgbWFya0Z1bGx5U2VncmVnYXRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnB1dChcImZ1bGx5U2VncmVnYXRlZFwiLCB0cnVlKTtcbiAgfVxuXG4gIGdldCBpc0Z1bGx5U2VncmVnYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldEZyb21DaGlsZHJlbihcImZ1bGx5U2VncmVnYXRlZFwiKTtcbiAgfVxuXG4gIHdyaXRlVG8oY29sOiBzdHJpbmcsIGVudHJ5OiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHNlZ3JlZ2F0ZVdyaXRlID0gdGhpcy5nZXRGcm9tQ2hpbGRyZW4oXCJzZWdyZWdhdGVXcml0ZVwiKSB8fCB7fTtcbiAgICBpZiAoIShjb2wgaW4gc2VncmVnYXRlV3JpdGUpKSBzZWdyZWdhdGVXcml0ZVtjb2xdID0gW107XG4gICAgc2VncmVnYXRlV3JpdGVbY29sXS5wdXNoKC4uLmVudHJ5KTtcbiAgICB0aGlzLnB1dChcInNlZ3JlZ2F0ZVdyaXRlXCIsIHNlZ3JlZ2F0ZVdyaXRlKTtcbiAgfVxuXG4gIGdldFNlZ3JlZ2F0ZWRXcml0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RnJvbUNoaWxkcmVuKFwic2VncmVnYXRlV3JpdGVcIik7XG4gIH1cblxuICBwdXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmFjY3VtdWxhdGUoeyBba2V5XTogdmFsdWUgfSk7XG4gIH1cblxuICByZWFkRnJvbShjb2xzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbHMgPSBBcnJheS5pc0FycmF5KGNvbHMpID8gY29scyA6IFtjb2xzXTtcbiAgICBjb25zdCBzZWdyZWdhdGVSZWFkID0gW1xuICAgICAgLi4ubmV3IFNldChbLi4uKHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJzZWdyZWdhdGVSZWFkXCIpIHx8IFtdKSwgLi4uY29sc10pLFxuICAgIF07XG4gICAgdGhpcy5wdXQoXCJzZWdyZWdhdGVSZWFkXCIsIHNlZ3JlZ2F0ZVJlYWQpO1xuXG4gICAgY29uc3QgcmVhZFN0YWNrID0gdGhpcy5nZXRPclVuZGVmaW5lZChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiKSB8fCBbXTtcbiAgICB0aGlzLnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCBbLi4ucmVhZFN0YWNrLCBjb2xzXSk7XG4gIH1cblxuICBjb25zdW1lUmVhZENvbGxlY3Rpb25zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZWFkU3RhY2sgPSB0aGlzLmdldE9yVW5kZWZpbmVkKFwic2VncmVnYXRlUmVhZFN0YWNrXCIpIHx8IFtdO1xuICAgIGlmIChyZWFkU3RhY2subGVuZ3RoKSB7XG4gICAgICBjb25zdCBbY3VycmVudCwgLi4ucmVzdF0gPSByZWFkU3RhY2s7XG4gICAgICB0aGlzLnB1dChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiLCByZXN0KTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRSZWFkQ29sbGVjdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sbGVjdGlvbnMgcmVnaXN0ZXJlZCBmb3Igd3JpdGluZ1xuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGNvbGxlY3Rpb24gbmFtZXMgZnJvbSBzZWdyZWdhdGVXcml0ZSwgdXNlZCBieSBzZXF1ZW5jZXMgdG8ga25vdyB3aGVyZSB0byByZXBsaWNhdGUuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiBjb2xsZWN0aW9uIG5hbWVzLCBlbXB0eSBpZiBub25lIHJlZ2lzdGVyZWRcbiAgICovXG4gIGdldFdyaXRlQ29sbGVjdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdldE9yVW5kZWZpbmVkKFwic2VncmVnYXRlV3JpdGVcIikgfHwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjb2xsZWN0aW9ucyByZWdpc3RlcmVkIGZvciByZWFkaW5nXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgY29sbGVjdGlvbiBuYW1lcyBmcm9tIHNlZ3JlZ2F0ZVJlYWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiBjb2xsZWN0aW9uIG5hbWVzLCBlbXB0eSBpZiBub25lIHJlZ2lzdGVyZWRcbiAgICovXG4gIGdldFJlYWRDb2xsZWN0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29scyA9IHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJzZWdyZWdhdGVSZWFkXCIpIHx8IFtdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbHMpID8gY29scyA6IFtjb2xzXTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgZmFicmljIGN0eCR7dGhpcy5zdHViID8gXCIgd2l0aCBzdHViXCIgOiBcIndpdGhvdXQgc3R1YlwifWA7XG4gIH1cbn1cbiJdfQ==