@decaf-ts/ui-decorators 0.20.4 → 0.20.7

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 (469) hide show
  1. package/dist/ui-decorators.cjs +1059 -2
  2. package/dist/ui-decorators.js +1090 -2
  3. package/lib/cjs/dashboard/constants.cjs +11 -0
  4. package/lib/cjs/dashboard/decorators.cjs +61 -0
  5. package/lib/cjs/dashboard/index.cjs +23 -0
  6. package/lib/cjs/dashboard/reader.cjs +67 -0
  7. package/lib/cjs/dashboard/registry.cjs +45 -0
  8. package/lib/cjs/dashboard/types.cjs +4 -0
  9. package/lib/cjs/graph/GraphExecutionStateMapper.cjs +97 -0
  10. package/lib/cjs/graph/GraphResolution.cjs +17 -0
  11. package/lib/cjs/graph/catalog/GraphConnectionPolicy.cjs +2 -2
  12. package/lib/cjs/graph/catalog/GraphCredentialReference.cjs +2 -2
  13. package/lib/cjs/graph/catalog/GraphCredentialRequirement.cjs +2 -2
  14. package/lib/cjs/graph/catalog/GraphDynamicPortRule.cjs +2 -2
  15. package/lib/cjs/graph/catalog/GraphIconReference.cjs +2 -2
  16. package/lib/cjs/graph/catalog/GraphManifestCompiler.cjs +2 -2
  17. package/lib/cjs/graph/catalog/GraphNodeCapability.cjs +2 -2
  18. package/lib/cjs/graph/catalog/GraphNodeDisplayManifest.cjs +2 -2
  19. package/lib/cjs/graph/catalog/GraphNodeManifest.cjs +2 -2
  20. package/lib/cjs/graph/catalog/GraphNodeManifestSerialization.cjs +2 -2
  21. package/lib/cjs/graph/catalog/GraphNodeMethodManifest.cjs +2 -2
  22. package/lib/cjs/graph/catalog/GraphNodePolicyManifest.cjs +2 -2
  23. package/lib/cjs/graph/catalog/GraphParameterBase.cjs +2 -2
  24. package/lib/cjs/graph/catalog/GraphParameterDefinition.cjs +2 -2
  25. package/lib/cjs/graph/catalog/GraphParameterOption.cjs +2 -2
  26. package/lib/cjs/graph/catalog/GraphParameterValidation.cjs +2 -2
  27. package/lib/cjs/graph/catalog/GraphPortManifest.cjs +2 -2
  28. package/lib/cjs/graph/catalog/GraphResourceLocatorMode.cjs +2 -2
  29. package/lib/cjs/graph/catalog/GraphValueSchema.cjs +2 -2
  30. package/lib/cjs/graph/catalog/GraphValueSchemaDerivation.cjs +2 -2
  31. package/lib/cjs/graph/catalog/GraphVisibilityExpression.cjs +2 -2
  32. package/lib/cjs/graph/catalog/index.cjs +2 -2
  33. package/lib/cjs/graph/constants.cjs +159 -3
  34. package/lib/cjs/graph/decorators.cjs +2 -2
  35. package/lib/cjs/graph/document/GraphDecoratedWorkflowCompiler.cjs +2 -2
  36. package/lib/cjs/graph/document/GraphEdgeInstance.cjs +2 -2
  37. package/lib/cjs/graph/document/GraphEndpoint.cjs +2 -2
  38. package/lib/cjs/graph/document/GraphJsonValue.cjs +2 -2
  39. package/lib/cjs/graph/document/GraphLoopConfiguration.cjs +2 -2
  40. package/lib/cjs/graph/document/GraphNodeBinding.cjs +2 -2
  41. package/lib/cjs/graph/document/GraphNodeInstance.cjs +2 -2
  42. package/lib/cjs/graph/document/GraphWorkflowDocument.cjs +2 -2
  43. package/lib/cjs/graph/document/GraphWorkflowDocumentBuilder.cjs +2 -2
  44. package/lib/cjs/graph/document/GraphWorkflowDocumentReader.cjs +2 -2
  45. package/lib/cjs/graph/document/GraphWorkflowDocumentSerializer.cjs +2 -2
  46. package/lib/cjs/graph/document/GraphWorkflowUiState.cjs +2 -2
  47. package/lib/cjs/graph/document/index.cjs +2 -2
  48. package/lib/cjs/graph/index.cjs +5 -2
  49. package/lib/cjs/graph/nodes/agents/agent.cjs +110 -0
  50. package/lib/cjs/graph/nodes/base.cjs +36 -0
  51. package/lib/cjs/graph/nodes/boundary/input-value.cjs +57 -0
  52. package/lib/cjs/graph/nodes/category-styles.cjs +38 -0
  53. package/lib/cjs/graph/nodes/flow-control/break.cjs +63 -0
  54. package/lib/cjs/graph/nodes/flow-control/error-boundary.cjs +67 -0
  55. package/lib/cjs/graph/nodes/flow-control/human-approval.cjs +69 -0
  56. package/lib/cjs/graph/nodes/flow-control/if.cjs +71 -0
  57. package/lib/cjs/graph/nodes/flow-control/parallel.cjs +61 -0
  58. package/lib/cjs/graph/nodes/flow-control/switch.cjs +121 -0
  59. package/lib/cjs/graph/nodes/index.cjs +123 -0
  60. package/lib/cjs/graph/nodes/loops/foreach.cjs +86 -0
  61. package/lib/cjs/graph/nodes/loops/until.cjs +74 -0
  62. package/lib/cjs/graph/nodes/loops/while.cjs +74 -0
  63. package/lib/cjs/graph/nodes/manifests.cjs +338 -0
  64. package/lib/cjs/graph/nodes/triggers/chat.cjs +70 -0
  65. package/lib/cjs/graph/nodes/triggers/event.cjs +58 -0
  66. package/lib/cjs/graph/nodes/triggers/form.cjs +59 -0
  67. package/lib/cjs/graph/nodes/triggers/manual.cjs +60 -0
  68. package/lib/cjs/graph/nodes/triggers/schedule.cjs +60 -0
  69. package/lib/cjs/graph/nodes/triggers/webhook.cjs +62 -0
  70. package/lib/cjs/graph/nodes/utility/code.cjs +99 -0
  71. package/lib/cjs/graph/nodes/utility/delay.cjs +61 -0
  72. package/lib/cjs/graph/nodes/utility/log.cjs +62 -0
  73. package/lib/cjs/graph/nodes/utility/map.cjs +61 -0
  74. package/lib/cjs/graph/nodes/utility/merge.cjs +62 -0
  75. package/lib/cjs/graph/nodes/utility/return.cjs +61 -0
  76. package/lib/cjs/graph/nodes/utility/utility-log.cjs +66 -0
  77. package/lib/cjs/graph/overrides/Metadata.cjs +2 -2
  78. package/lib/cjs/graph/overrides/Rendering.cjs +2 -2
  79. package/lib/cjs/graph/overrides/index.cjs +2 -2
  80. package/lib/cjs/graph/overrides/overrides.cjs +2 -2
  81. package/lib/cjs/graph/reader.cjs +2 -2
  82. package/lib/cjs/graph/registry.cjs +2 -2
  83. package/lib/cjs/graph/snapshot.cjs +2 -2
  84. package/lib/cjs/graph/types.cjs +2 -2
  85. package/lib/cjs/index.cjs +6 -5
  86. package/lib/cjs/model/Renderable.cjs +2 -2
  87. package/lib/cjs/model/decorators.cjs +2 -2
  88. package/lib/cjs/model/index.cjs +2 -2
  89. package/lib/cjs/model/model.cjs +2 -2
  90. package/lib/cjs/model/overrides.cjs +2 -2
  91. package/lib/cjs/overrides/ModelBuilderExtensions.cjs +2 -2
  92. package/lib/cjs/overrides/index.cjs +2 -2
  93. package/lib/cjs/ui/DecafComponent.cjs +2 -2
  94. package/lib/cjs/ui/DecafEventHandler.cjs +2 -2
  95. package/lib/cjs/ui/DecafTranslateService.cjs +2 -2
  96. package/lib/cjs/ui/Rendering.cjs +2 -2
  97. package/lib/cjs/ui/UIValidator.cjs +2 -2
  98. package/lib/cjs/ui/constants.cjs +2 -2
  99. package/lib/cjs/ui/decorators.cjs +2 -2
  100. package/lib/cjs/ui/errors.cjs +2 -2
  101. package/lib/cjs/ui/index.cjs +2 -2
  102. package/lib/cjs/ui/interfaces/IDecafModal.cjs +2 -2
  103. package/lib/cjs/ui/interfaces/IDecafRouter.cjs +2 -2
  104. package/lib/cjs/ui/interfaces/IDecafSpinner.cjs +2 -2
  105. package/lib/cjs/ui/interfaces/IDecafToast.cjs +2 -2
  106. package/lib/cjs/ui/interfaces/index.cjs +2 -2
  107. package/lib/cjs/ui/overrides.cjs +2 -2
  108. package/lib/cjs/ui/types.cjs +2 -2
  109. package/lib/cjs/ui/utils.cjs +2 -2
  110. package/lib/cjs/ui/validator.cjs +2 -2
  111. package/lib/cjs/user-requests/UserRequestHandler.cjs +2 -2
  112. package/lib/cjs/user-requests/constants.cjs +2 -2
  113. package/lib/cjs/user-requests/decorators.cjs +2 -2
  114. package/lib/cjs/user-requests/errors.cjs +2 -2
  115. package/lib/cjs/user-requests/index.cjs +2 -2
  116. package/lib/cjs/user-requests/types.cjs +2 -2
  117. package/lib/esm/dashboard/constants.js +24 -0
  118. package/lib/esm/dashboard/decorators.js +57 -0
  119. package/lib/esm/dashboard/index.js +6 -0
  120. package/lib/esm/dashboard/reader.js +62 -0
  121. package/lib/esm/dashboard/registry.js +39 -0
  122. package/lib/esm/dashboard/types.js +9 -0
  123. package/lib/esm/graph/GraphExecutionStateMapper.js +91 -0
  124. package/lib/esm/graph/GraphResolution.js +13 -0
  125. package/lib/esm/graph/catalog/GraphConnectionPolicy.js +1 -1
  126. package/lib/esm/graph/catalog/GraphCredentialReference.js +1 -1
  127. package/lib/esm/graph/catalog/GraphCredentialRequirement.js +1 -1
  128. package/lib/esm/graph/catalog/GraphDynamicPortRule.js +1 -1
  129. package/lib/esm/graph/catalog/GraphIconReference.js +1 -1
  130. package/lib/esm/graph/catalog/GraphManifestCompiler.js +1 -1
  131. package/lib/esm/graph/catalog/GraphNodeCapability.js +1 -1
  132. package/lib/esm/graph/catalog/GraphNodeDisplayManifest.js +1 -1
  133. package/lib/esm/graph/catalog/GraphNodeManifest.js +1 -1
  134. package/lib/esm/graph/catalog/GraphNodeManifestSerialization.js +1 -1
  135. package/lib/esm/graph/catalog/GraphNodeMethodManifest.js +1 -1
  136. package/lib/esm/graph/catalog/GraphNodePolicyManifest.js +1 -1
  137. package/lib/esm/graph/catalog/GraphParameterBase.js +1 -1
  138. package/lib/esm/graph/catalog/GraphParameterDefinition.js +1 -1
  139. package/lib/esm/graph/catalog/GraphParameterOption.js +1 -1
  140. package/lib/esm/graph/catalog/GraphParameterValidation.js +1 -1
  141. package/lib/esm/graph/catalog/GraphPortManifest.js +1 -1
  142. package/lib/esm/graph/catalog/GraphResourceLocatorMode.js +1 -1
  143. package/lib/esm/graph/catalog/GraphValueSchema.js +1 -1
  144. package/lib/esm/graph/catalog/GraphValueSchemaDerivation.js +1 -1
  145. package/lib/esm/graph/catalog/GraphVisibilityExpression.js +1 -1
  146. package/lib/esm/graph/catalog/index.js +1 -1
  147. package/lib/esm/graph/constants.js +180 -1
  148. package/lib/esm/graph/decorators.js +1 -1
  149. package/lib/esm/graph/document/GraphDecoratedWorkflowCompiler.js +1 -1
  150. package/lib/esm/graph/document/GraphEdgeInstance.js +1 -1
  151. package/lib/esm/graph/document/GraphEndpoint.js +1 -1
  152. package/lib/esm/graph/document/GraphJsonValue.js +1 -1
  153. package/lib/esm/graph/document/GraphLoopConfiguration.js +1 -1
  154. package/lib/esm/graph/document/GraphNodeBinding.js +1 -1
  155. package/lib/esm/graph/document/GraphNodeInstance.js +1 -1
  156. package/lib/esm/graph/document/GraphWorkflowDocument.js +1 -1
  157. package/lib/esm/graph/document/GraphWorkflowDocumentBuilder.js +1 -1
  158. package/lib/esm/graph/document/GraphWorkflowDocumentReader.js +1 -1
  159. package/lib/esm/graph/document/GraphWorkflowDocumentSerializer.js +1 -1
  160. package/lib/esm/graph/document/GraphWorkflowUiState.js +1 -1
  161. package/lib/esm/graph/document/index.js +1 -1
  162. package/lib/esm/graph/index.js +4 -1
  163. package/lib/esm/graph/nodes/agents/agent.js +101 -0
  164. package/lib/esm/graph/nodes/base.js +31 -0
  165. package/lib/esm/graph/nodes/boundary/input-value.js +48 -0
  166. package/lib/esm/graph/nodes/category-styles.js +34 -0
  167. package/lib/esm/graph/nodes/flow-control/break.js +54 -0
  168. package/lib/esm/graph/nodes/flow-control/error-boundary.js +58 -0
  169. package/lib/esm/graph/nodes/flow-control/human-approval.js +60 -0
  170. package/lib/esm/graph/nodes/flow-control/if.js +62 -0
  171. package/lib/esm/graph/nodes/flow-control/parallel.js +52 -0
  172. package/lib/esm/graph/nodes/flow-control/switch.js +112 -0
  173. package/lib/esm/graph/nodes/index.js +105 -0
  174. package/lib/esm/graph/nodes/loops/foreach.js +77 -0
  175. package/lib/esm/graph/nodes/loops/until.js +65 -0
  176. package/lib/esm/graph/nodes/loops/while.js +65 -0
  177. package/lib/esm/graph/nodes/manifests.js +334 -0
  178. package/lib/esm/graph/nodes/triggers/chat.js +61 -0
  179. package/lib/esm/graph/nodes/triggers/event.js +49 -0
  180. package/lib/esm/graph/nodes/triggers/form.js +50 -0
  181. package/lib/esm/graph/nodes/triggers/manual.js +51 -0
  182. package/lib/esm/graph/nodes/triggers/schedule.js +51 -0
  183. package/lib/esm/graph/nodes/triggers/webhook.js +53 -0
  184. package/lib/esm/graph/nodes/utility/code.js +90 -0
  185. package/lib/esm/graph/nodes/utility/delay.js +52 -0
  186. package/lib/esm/graph/nodes/utility/log.js +53 -0
  187. package/lib/esm/graph/nodes/utility/map.js +52 -0
  188. package/lib/esm/graph/nodes/utility/merge.js +53 -0
  189. package/lib/esm/graph/nodes/utility/return.js +52 -0
  190. package/lib/esm/graph/nodes/utility/utility-log.js +57 -0
  191. package/lib/esm/graph/overrides/Metadata.js +1 -1
  192. package/lib/esm/graph/overrides/Rendering.js +1 -1
  193. package/lib/esm/graph/overrides/index.js +1 -1
  194. package/lib/esm/graph/overrides/overrides.js +1 -1
  195. package/lib/esm/graph/reader.js +1 -1
  196. package/lib/esm/graph/registry.js +1 -1
  197. package/lib/esm/graph/snapshot.js +1 -1
  198. package/lib/esm/graph/types.js +1 -1
  199. package/lib/esm/index.js +5 -4
  200. package/lib/esm/model/Renderable.js +1 -1
  201. package/lib/esm/model/decorators.js +1 -1
  202. package/lib/esm/model/index.js +1 -1
  203. package/lib/esm/model/model.js +1 -1
  204. package/lib/esm/model/overrides.js +1 -1
  205. package/lib/esm/overrides/ModelBuilderExtensions.js +1 -1
  206. package/lib/esm/overrides/index.js +1 -1
  207. package/lib/esm/ui/DecafComponent.js +1 -1
  208. package/lib/esm/ui/DecafEventHandler.js +1 -1
  209. package/lib/esm/ui/DecafTranslateService.js +1 -1
  210. package/lib/esm/ui/Rendering.js +1 -1
  211. package/lib/esm/ui/UIValidator.js +1 -1
  212. package/lib/esm/ui/constants.js +1 -1
  213. package/lib/esm/ui/decorators.js +1 -1
  214. package/lib/esm/ui/errors.js +1 -1
  215. package/lib/esm/ui/index.js +1 -1
  216. package/lib/esm/ui/interfaces/IDecafModal.js +1 -1
  217. package/lib/esm/ui/interfaces/IDecafRouter.js +1 -1
  218. package/lib/esm/ui/interfaces/IDecafSpinner.js +1 -1
  219. package/lib/esm/ui/interfaces/IDecafToast.js +1 -1
  220. package/lib/esm/ui/interfaces/index.js +1 -1
  221. package/lib/esm/ui/overrides.js +1 -1
  222. package/lib/esm/ui/types.js +1 -1
  223. package/lib/esm/ui/utils.js +1 -1
  224. package/lib/esm/ui/validator.js +1 -1
  225. package/lib/esm/user-requests/UserRequestHandler.js +1 -1
  226. package/lib/esm/user-requests/constants.js +1 -1
  227. package/lib/esm/user-requests/decorators.js +1 -1
  228. package/lib/esm/user-requests/errors.js +1 -1
  229. package/lib/esm/user-requests/index.js +1 -1
  230. package/lib/esm/user-requests/types.js +1 -1
  231. package/lib/types/dashboard/constants.d.cts +22 -0
  232. package/lib/types/dashboard/constants.d.mts +22 -0
  233. package/lib/types/dashboard/decorators.d.cts +34 -0
  234. package/lib/types/dashboard/decorators.d.mts +34 -0
  235. package/lib/types/dashboard/index.d.cts +5 -0
  236. package/lib/types/dashboard/index.d.mts +5 -0
  237. package/lib/types/dashboard/reader.d.cts +30 -0
  238. package/lib/types/dashboard/reader.d.mts +30 -0
  239. package/lib/types/dashboard/registry.d.cts +29 -0
  240. package/lib/types/dashboard/registry.d.mts +29 -0
  241. package/lib/types/dashboard/types.d.cts +67 -0
  242. package/lib/types/dashboard/types.d.mts +67 -0
  243. package/lib/types/graph/GraphExecutionStateMapper.d.cts +66 -0
  244. package/lib/types/graph/GraphExecutionStateMapper.d.mts +66 -0
  245. package/lib/types/graph/GraphResolution.d.cts +53 -0
  246. package/lib/types/graph/GraphResolution.d.mts +53 -0
  247. package/lib/types/graph/constants.d.cts +165 -0
  248. package/lib/types/graph/constants.d.mts +165 -0
  249. package/lib/types/graph/index.d.cts +3 -0
  250. package/lib/types/graph/index.d.mts +3 -0
  251. package/lib/types/graph/nodes/agents/agent.d.cts +44 -0
  252. package/lib/types/graph/nodes/agents/agent.d.mts +44 -0
  253. package/lib/types/graph/nodes/base.d.cts +28 -0
  254. package/lib/types/graph/nodes/base.d.mts +28 -0
  255. package/lib/types/graph/nodes/boundary/input-value.d.cts +13 -0
  256. package/lib/types/graph/nodes/boundary/input-value.d.mts +13 -0
  257. package/lib/types/graph/nodes/category-styles.d.cts +8 -0
  258. package/lib/types/graph/nodes/category-styles.d.mts +8 -0
  259. package/lib/types/graph/nodes/flow-control/break.d.cts +15 -0
  260. package/lib/types/graph/nodes/flow-control/break.d.mts +15 -0
  261. package/lib/types/graph/nodes/flow-control/error-boundary.d.cts +12 -0
  262. package/lib/types/graph/nodes/flow-control/error-boundary.d.mts +12 -0
  263. package/lib/types/graph/nodes/flow-control/human-approval.d.cts +13 -0
  264. package/lib/types/graph/nodes/flow-control/human-approval.d.mts +13 -0
  265. package/lib/types/graph/nodes/flow-control/if.d.cts +16 -0
  266. package/lib/types/graph/nodes/flow-control/if.d.mts +16 -0
  267. package/lib/types/graph/nodes/flow-control/parallel.d.cts +11 -0
  268. package/lib/types/graph/nodes/flow-control/parallel.d.mts +11 -0
  269. package/lib/types/graph/nodes/flow-control/switch.d.cts +21 -0
  270. package/lib/types/graph/nodes/flow-control/switch.d.mts +21 -0
  271. package/lib/types/graph/nodes/index.d.cts +79 -0
  272. package/lib/types/graph/nodes/index.d.mts +79 -0
  273. package/lib/types/graph/nodes/loops/foreach.d.cts +19 -0
  274. package/lib/types/graph/nodes/loops/foreach.d.mts +19 -0
  275. package/lib/types/graph/nodes/loops/until.d.cts +16 -0
  276. package/lib/types/graph/nodes/loops/until.d.mts +16 -0
  277. package/lib/types/graph/nodes/loops/while.d.cts +16 -0
  278. package/lib/types/graph/nodes/loops/while.d.mts +16 -0
  279. package/lib/types/graph/nodes/manifests.d.cts +62 -0
  280. package/lib/types/graph/nodes/manifests.d.mts +62 -0
  281. package/lib/types/graph/nodes/triggers/chat.d.cts +13 -0
  282. package/lib/types/graph/nodes/triggers/chat.d.mts +13 -0
  283. package/lib/types/graph/nodes/triggers/event.d.cts +10 -0
  284. package/lib/types/graph/nodes/triggers/event.d.mts +10 -0
  285. package/lib/types/graph/nodes/triggers/form.d.cts +11 -0
  286. package/lib/types/graph/nodes/triggers/form.d.mts +11 -0
  287. package/lib/types/graph/nodes/triggers/manual.d.cts +12 -0
  288. package/lib/types/graph/nodes/triggers/manual.d.mts +12 -0
  289. package/lib/types/graph/nodes/triggers/schedule.d.cts +11 -0
  290. package/lib/types/graph/nodes/triggers/schedule.d.mts +11 -0
  291. package/lib/types/graph/nodes/triggers/webhook.d.cts +11 -0
  292. package/lib/types/graph/nodes/triggers/webhook.d.mts +11 -0
  293. package/lib/types/graph/nodes/utility/code.d.cts +31 -0
  294. package/lib/types/graph/nodes/utility/code.d.mts +31 -0
  295. package/lib/types/graph/nodes/utility/delay.d.cts +11 -0
  296. package/lib/types/graph/nodes/utility/delay.d.mts +11 -0
  297. package/lib/types/graph/nodes/utility/log.d.cts +13 -0
  298. package/lib/types/graph/nodes/utility/log.d.mts +13 -0
  299. package/lib/types/graph/nodes/utility/map.d.cts +11 -0
  300. package/lib/types/graph/nodes/utility/map.d.mts +11 -0
  301. package/lib/types/graph/nodes/utility/merge.d.cts +12 -0
  302. package/lib/types/graph/nodes/utility/merge.d.mts +12 -0
  303. package/lib/types/graph/nodes/utility/return.d.cts +11 -0
  304. package/lib/types/graph/nodes/utility/return.d.mts +11 -0
  305. package/lib/types/graph/nodes/utility/utility-log.d.cts +15 -0
  306. package/lib/types/graph/nodes/utility/utility-log.d.mts +15 -0
  307. package/lib/types/graph/types.d.cts +286 -0
  308. package/lib/types/graph/types.d.mts +286 -0
  309. package/lib/types/index.d.cts +4 -3
  310. package/lib/types/index.d.mts +4 -3
  311. package/package.json +1 -1
  312. package/dist/ui-decorators.cjs.map +0 -1
  313. package/dist/ui-decorators.js.map +0 -1
  314. package/lib/cjs/graph/catalog/GraphConnectionPolicy.cjs.map +0 -1
  315. package/lib/cjs/graph/catalog/GraphCredentialReference.cjs.map +0 -1
  316. package/lib/cjs/graph/catalog/GraphCredentialRequirement.cjs.map +0 -1
  317. package/lib/cjs/graph/catalog/GraphDynamicPortRule.cjs.map +0 -1
  318. package/lib/cjs/graph/catalog/GraphIconReference.cjs.map +0 -1
  319. package/lib/cjs/graph/catalog/GraphManifestCompiler.cjs.map +0 -1
  320. package/lib/cjs/graph/catalog/GraphNodeCapability.cjs.map +0 -1
  321. package/lib/cjs/graph/catalog/GraphNodeDisplayManifest.cjs.map +0 -1
  322. package/lib/cjs/graph/catalog/GraphNodeManifest.cjs.map +0 -1
  323. package/lib/cjs/graph/catalog/GraphNodeManifestSerialization.cjs.map +0 -1
  324. package/lib/cjs/graph/catalog/GraphNodeMethodManifest.cjs.map +0 -1
  325. package/lib/cjs/graph/catalog/GraphNodePolicyManifest.cjs.map +0 -1
  326. package/lib/cjs/graph/catalog/GraphParameterBase.cjs.map +0 -1
  327. package/lib/cjs/graph/catalog/GraphParameterDefinition.cjs.map +0 -1
  328. package/lib/cjs/graph/catalog/GraphParameterOption.cjs.map +0 -1
  329. package/lib/cjs/graph/catalog/GraphParameterValidation.cjs.map +0 -1
  330. package/lib/cjs/graph/catalog/GraphPortManifest.cjs.map +0 -1
  331. package/lib/cjs/graph/catalog/GraphResourceLocatorMode.cjs.map +0 -1
  332. package/lib/cjs/graph/catalog/GraphValueSchema.cjs.map +0 -1
  333. package/lib/cjs/graph/catalog/GraphValueSchemaDerivation.cjs.map +0 -1
  334. package/lib/cjs/graph/catalog/GraphVisibilityExpression.cjs.map +0 -1
  335. package/lib/cjs/graph/catalog/index.cjs.map +0 -1
  336. package/lib/cjs/graph/constants.cjs.map +0 -1
  337. package/lib/cjs/graph/decorators.cjs.map +0 -1
  338. package/lib/cjs/graph/document/GraphDecoratedWorkflowCompiler.cjs.map +0 -1
  339. package/lib/cjs/graph/document/GraphEdgeInstance.cjs.map +0 -1
  340. package/lib/cjs/graph/document/GraphEndpoint.cjs.map +0 -1
  341. package/lib/cjs/graph/document/GraphJsonValue.cjs.map +0 -1
  342. package/lib/cjs/graph/document/GraphLoopConfiguration.cjs.map +0 -1
  343. package/lib/cjs/graph/document/GraphNodeBinding.cjs.map +0 -1
  344. package/lib/cjs/graph/document/GraphNodeInstance.cjs.map +0 -1
  345. package/lib/cjs/graph/document/GraphWorkflowDocument.cjs.map +0 -1
  346. package/lib/cjs/graph/document/GraphWorkflowDocumentBuilder.cjs.map +0 -1
  347. package/lib/cjs/graph/document/GraphWorkflowDocumentReader.cjs.map +0 -1
  348. package/lib/cjs/graph/document/GraphWorkflowDocumentSerializer.cjs.map +0 -1
  349. package/lib/cjs/graph/document/GraphWorkflowUiState.cjs.map +0 -1
  350. package/lib/cjs/graph/document/index.cjs.map +0 -1
  351. package/lib/cjs/graph/index.cjs.map +0 -1
  352. package/lib/cjs/graph/overrides/Metadata.cjs.map +0 -1
  353. package/lib/cjs/graph/overrides/Rendering.cjs.map +0 -1
  354. package/lib/cjs/graph/overrides/index.cjs.map +0 -1
  355. package/lib/cjs/graph/overrides/overrides.cjs.map +0 -1
  356. package/lib/cjs/graph/reader.cjs.map +0 -1
  357. package/lib/cjs/graph/registry.cjs.map +0 -1
  358. package/lib/cjs/graph/snapshot.cjs.map +0 -1
  359. package/lib/cjs/graph/types.cjs.map +0 -1
  360. package/lib/cjs/index.cjs.map +0 -1
  361. package/lib/cjs/model/Renderable.cjs.map +0 -1
  362. package/lib/cjs/model/decorators.cjs.map +0 -1
  363. package/lib/cjs/model/index.cjs.map +0 -1
  364. package/lib/cjs/model/model.cjs.map +0 -1
  365. package/lib/cjs/model/overrides.cjs.map +0 -1
  366. package/lib/cjs/overrides/ModelBuilderExtensions.cjs.map +0 -1
  367. package/lib/cjs/overrides/index.cjs.map +0 -1
  368. package/lib/cjs/ui/DecafComponent.cjs.map +0 -1
  369. package/lib/cjs/ui/DecafEventHandler.cjs.map +0 -1
  370. package/lib/cjs/ui/DecafTranslateService.cjs.map +0 -1
  371. package/lib/cjs/ui/Rendering.cjs.map +0 -1
  372. package/lib/cjs/ui/UIValidator.cjs.map +0 -1
  373. package/lib/cjs/ui/constants.cjs.map +0 -1
  374. package/lib/cjs/ui/decorators.cjs.map +0 -1
  375. package/lib/cjs/ui/errors.cjs.map +0 -1
  376. package/lib/cjs/ui/index.cjs.map +0 -1
  377. package/lib/cjs/ui/interfaces/IDecafModal.cjs.map +0 -1
  378. package/lib/cjs/ui/interfaces/IDecafRouter.cjs.map +0 -1
  379. package/lib/cjs/ui/interfaces/IDecafSpinner.cjs.map +0 -1
  380. package/lib/cjs/ui/interfaces/IDecafToast.cjs.map +0 -1
  381. package/lib/cjs/ui/interfaces/index.cjs.map +0 -1
  382. package/lib/cjs/ui/overrides.cjs.map +0 -1
  383. package/lib/cjs/ui/types.cjs.map +0 -1
  384. package/lib/cjs/ui/utils.cjs.map +0 -1
  385. package/lib/cjs/ui/validator.cjs.map +0 -1
  386. package/lib/cjs/user-requests/UserRequestHandler.cjs.map +0 -1
  387. package/lib/cjs/user-requests/constants.cjs.map +0 -1
  388. package/lib/cjs/user-requests/decorators.cjs.map +0 -1
  389. package/lib/cjs/user-requests/errors.cjs.map +0 -1
  390. package/lib/cjs/user-requests/index.cjs.map +0 -1
  391. package/lib/cjs/user-requests/types.cjs.map +0 -1
  392. package/lib/esm/graph/catalog/GraphConnectionPolicy.js.map +0 -1
  393. package/lib/esm/graph/catalog/GraphCredentialReference.js.map +0 -1
  394. package/lib/esm/graph/catalog/GraphCredentialRequirement.js.map +0 -1
  395. package/lib/esm/graph/catalog/GraphDynamicPortRule.js.map +0 -1
  396. package/lib/esm/graph/catalog/GraphIconReference.js.map +0 -1
  397. package/lib/esm/graph/catalog/GraphManifestCompiler.js.map +0 -1
  398. package/lib/esm/graph/catalog/GraphNodeCapability.js.map +0 -1
  399. package/lib/esm/graph/catalog/GraphNodeDisplayManifest.js.map +0 -1
  400. package/lib/esm/graph/catalog/GraphNodeManifest.js.map +0 -1
  401. package/lib/esm/graph/catalog/GraphNodeManifestSerialization.js.map +0 -1
  402. package/lib/esm/graph/catalog/GraphNodeMethodManifest.js.map +0 -1
  403. package/lib/esm/graph/catalog/GraphNodePolicyManifest.js.map +0 -1
  404. package/lib/esm/graph/catalog/GraphParameterBase.js.map +0 -1
  405. package/lib/esm/graph/catalog/GraphParameterDefinition.js.map +0 -1
  406. package/lib/esm/graph/catalog/GraphParameterOption.js.map +0 -1
  407. package/lib/esm/graph/catalog/GraphParameterValidation.js.map +0 -1
  408. package/lib/esm/graph/catalog/GraphPortManifest.js.map +0 -1
  409. package/lib/esm/graph/catalog/GraphResourceLocatorMode.js.map +0 -1
  410. package/lib/esm/graph/catalog/GraphValueSchema.js.map +0 -1
  411. package/lib/esm/graph/catalog/GraphValueSchemaDerivation.js.map +0 -1
  412. package/lib/esm/graph/catalog/GraphVisibilityExpression.js.map +0 -1
  413. package/lib/esm/graph/catalog/index.js.map +0 -1
  414. package/lib/esm/graph/constants.js.map +0 -1
  415. package/lib/esm/graph/decorators.js.map +0 -1
  416. package/lib/esm/graph/document/GraphDecoratedWorkflowCompiler.js.map +0 -1
  417. package/lib/esm/graph/document/GraphEdgeInstance.js.map +0 -1
  418. package/lib/esm/graph/document/GraphEndpoint.js.map +0 -1
  419. package/lib/esm/graph/document/GraphJsonValue.js.map +0 -1
  420. package/lib/esm/graph/document/GraphLoopConfiguration.js.map +0 -1
  421. package/lib/esm/graph/document/GraphNodeBinding.js.map +0 -1
  422. package/lib/esm/graph/document/GraphNodeInstance.js.map +0 -1
  423. package/lib/esm/graph/document/GraphWorkflowDocument.js.map +0 -1
  424. package/lib/esm/graph/document/GraphWorkflowDocumentBuilder.js.map +0 -1
  425. package/lib/esm/graph/document/GraphWorkflowDocumentReader.js.map +0 -1
  426. package/lib/esm/graph/document/GraphWorkflowDocumentSerializer.js.map +0 -1
  427. package/lib/esm/graph/document/GraphWorkflowUiState.js.map +0 -1
  428. package/lib/esm/graph/document/index.js.map +0 -1
  429. package/lib/esm/graph/index.js.map +0 -1
  430. package/lib/esm/graph/overrides/Metadata.js.map +0 -1
  431. package/lib/esm/graph/overrides/Rendering.js.map +0 -1
  432. package/lib/esm/graph/overrides/index.js.map +0 -1
  433. package/lib/esm/graph/overrides/overrides.js.map +0 -1
  434. package/lib/esm/graph/reader.js.map +0 -1
  435. package/lib/esm/graph/registry.js.map +0 -1
  436. package/lib/esm/graph/snapshot.js.map +0 -1
  437. package/lib/esm/graph/types.js.map +0 -1
  438. package/lib/esm/index.js.map +0 -1
  439. package/lib/esm/model/Renderable.js.map +0 -1
  440. package/lib/esm/model/decorators.js.map +0 -1
  441. package/lib/esm/model/index.js.map +0 -1
  442. package/lib/esm/model/model.js.map +0 -1
  443. package/lib/esm/model/overrides.js.map +0 -1
  444. package/lib/esm/overrides/ModelBuilderExtensions.js.map +0 -1
  445. package/lib/esm/overrides/index.js.map +0 -1
  446. package/lib/esm/ui/DecafComponent.js.map +0 -1
  447. package/lib/esm/ui/DecafEventHandler.js.map +0 -1
  448. package/lib/esm/ui/DecafTranslateService.js.map +0 -1
  449. package/lib/esm/ui/Rendering.js.map +0 -1
  450. package/lib/esm/ui/UIValidator.js.map +0 -1
  451. package/lib/esm/ui/constants.js.map +0 -1
  452. package/lib/esm/ui/decorators.js.map +0 -1
  453. package/lib/esm/ui/errors.js.map +0 -1
  454. package/lib/esm/ui/index.js.map +0 -1
  455. package/lib/esm/ui/interfaces/IDecafModal.js.map +0 -1
  456. package/lib/esm/ui/interfaces/IDecafRouter.js.map +0 -1
  457. package/lib/esm/ui/interfaces/IDecafSpinner.js.map +0 -1
  458. package/lib/esm/ui/interfaces/IDecafToast.js.map +0 -1
  459. package/lib/esm/ui/interfaces/index.js.map +0 -1
  460. package/lib/esm/ui/overrides.js.map +0 -1
  461. package/lib/esm/ui/types.js.map +0 -1
  462. package/lib/esm/ui/utils.js.map +0 -1
  463. package/lib/esm/ui/validator.js.map +0 -1
  464. package/lib/esm/user-requests/UserRequestHandler.js.map +0 -1
  465. package/lib/esm/user-requests/constants.js.map +0 -1
  466. package/lib/esm/user-requests/decorators.js.map +0 -1
  467. package/lib/esm/user-requests/errors.js.map +0 -1
  468. package/lib/esm/user-requests/index.js.map +0 -1
  469. package/lib/esm/user-requests/types.js.map +0 -1
@@ -1,2 +1,1059 @@
1
- var e,t;e=this,t=function(e,t,r,a,o){"use strict";var s;e.UIMediaBreakPoints=void 0,(s=e.UIMediaBreakPoints||(e.UIMediaBreakPoints={})).SMALL="small",s.MEDIUM="medium",s.LARGE="large",s.XLARGE="xlarge";const n={REFLECT:"ui",UIMODEL:"uimodel",RENDERED_BY:"rendered-by",ELEMENT:"uielement",PROP:"uiprop",CHILD:"uichild",NAME:"name",NAME_PREFIX:"input-",VALIDATION_MESSAGE:"validationMessage",UILISTMODEL:"uilistmodel",UILISTPROP:"uilistprop",UILAYOUT:"uilayout",UILAYOUTPROP:"uilayoutprop",HANDLERS:"handlers",TYPE:"type",SUB_TYPE:"subType",HIDDEN:"hidden",HIDE_FOR:"hide-for",SHOW_FOR:"show-for",RENDER_IF:"render-if",FORMAT:"format",ORDER:"order",PAGE:"page",EVENTS:"events",FIRST:"first",LAST:"last",READ_ONLY:"readonly",SEQUENCE:"sequence",REQUIRED:t.ValidationKeys.REQUIRED,MIN:t.ValidationKeys.MIN,MIN_LENGTH:t.ValidationKeys.MIN_LENGTH,MAX:t.ValidationKeys.MAX,MAX_LENGTH:t.ValidationKeys.MAX_LENGTH,PATTERN:t.ValidationKeys.PATTERN,URL:t.ValidationKeys.URL,STEP:t.ValidationKeys.STEP,DATE:t.ValidationKeys.DATE,EMAIL:t.ValidationKeys.EMAIL,PASSWORD:t.ValidationKeys.PASSWORD,EQUALS:t.ValidationKeys.EQUALS,DIFF:t.ValidationKeys.DIFF,LESS_THAN:t.ValidationKeys.LESS_THAN,LESS_THAN_OR_EQUAL:t.ValidationKeys.LESS_THAN_OR_EQUAL,GREATER_THAN:t.ValidationKeys.GREATER_THAN,GREATER_THAN_OR_EQUAL:t.ValidationKeys.GREATER_THAN_OR_EQUAL},i={[n.EMAIL]:t.EmailValidator,[n.URL]:t.URLValidator,[n.DATE]:t.DateValidator,[n.PASSWORD]:t.PasswordValidator},d={[n.REQUIRED]:t.RequiredValidator,[n.MIN]:t.MinValidator,[n.MAX]:t.MaxValidator,[n.STEP]:t.StepValidator,[n.MIN_LENGTH]:t.MinLengthValidator,[n.MAX_LENGTH]:t.MaxLengthValidator,[n.PATTERN]:t.PatternValidator,[n.EQUALS]:t.EqualsValidator,[n.DIFF]:t.DiffValidator,[n.LESS_THAN]:t.LessThanValidator,[n.LESS_THAN_OR_EQUAL]:t.LessThanOrEqualValidator,[n.GREATER_THAN]:t.GreaterThanValidator,[n.GREATER_THAN_OR_EQUAL]:t.GreaterThanOrEqualValidator},l="yyyy-MM-dd",c={BUTTON:"button",CHECKBOX:"checkbox",COLOR:"color",DATE:n.DATE,DATETIME_LOCAL:"datetime-local",EMAIL:n.EMAIL,FILE:"file",HIDDEN:"hidden",IMAGE:"image",MONTH:"month",NUMBER:"number",PASSWORD:n.PASSWORD,RADIO:"radio",RANGE:"range",RESET:"reset",SEARCH:"search",SUBMIT:"submit",TEL:"tel",TEXT:"text",TEXTAREA:"textarea",SELECT:"select",TIME:"time",URL:n.URL,WEEK:"week"},p=[c.CHECKBOX,c.RADIO],E={cancel:"cancel",confirm:"confirm",submit:"submit",clear:"clear",back:"back",[r.OperationKeys.CREATE]:r.OperationKeys.CREATE,[r.OperationKeys.READ]:r.OperationKeys.READ,[r.OperationKeys.UPDATE]:r.OperationKeys.UPDATE,[r.OperationKeys.DELETE]:r.OperationKeys.DELETE};class u extends r.InternalError{constructor(e){super(e,u.name)}}const f=e=>"function"==typeof e&&/^class\s/.test(e+"");function h(e,t){return a.Metadata.key(n.REFLECT,a.DecorationKeys.PROPERTIES,e,t)}function y(e,r,...a){if(e===n.DATE){if(!r)return"";const e=a.shift()||l;return t.formatDate(new Date(r),e)}return r}function M(e){if("number"==typeof e&&!isNaN(e))return e;const t=Number(e);return isNaN(t)?void 0:t}function R(e){if(!e)return e;const t={"&":"&amp;","<":"&lt;",">":"&gt;"};return(""+e).replace(/[&<>]/g,e=>t[e]||e)}function T(e){let r=Date.now();try{t.Model.pk(e.constructor)&&(r=e[t.Model.pk(e.constructor)])}catch(e){}return`${e.constructor.name}-${r}`}class m{static{this.cache={}}constructor(e){this.flavour=e,this.initialized=!1,m.register(this)}translate(e,r=!0){if(r)switch(e){case t.ReservedModels.STRING.name.toLowerCase():return c.TEXT;case t.ReservedModels.NUMBER.name.toLowerCase():case t.ReservedModels.BIGINT.name.toLowerCase():return c.NUMBER;case t.ReservedModels.BOOLEAN.name.toLowerCase():return c.CHECKBOX;case t.ReservedModels.DATE.name.toLowerCase():return c.DATE}else switch(e){case c.SELECT:case c.TEXT:case c.EMAIL:case c.COLOR:case c.PASSWORD:case c.TEL:case c.URL:case c.SEARCH:case c.HIDDEN:case c.TEXTAREA:case c.RADIO:return t.ReservedModels.STRING.name.toLowerCase();case c.NUMBER:return t.ReservedModels.NUMBER.name.toLowerCase();case c.CHECKBOX:return t.ReservedModels.BOOLEAN.name.toLowerCase();case c.DATE:case c.DATETIME_LOCAL:case c.TIME:return t.ReservedModels.DATE.name.toLowerCase()}return e}getClassDecoratorsMetadata(e){return[t.Model.uiModelOf(e.constructor),t.Model.uiListModelOf(e.constructor),t.Model.uiHandlersFor(e.constructor),t.Model.uiLayoutOf(e.constructor)].filter(Boolean)}sortChildrenByOrder(e=[]){return e.sort((r,a)=>{const o=r.props?.order??0,s=a.props?.order??0,i=r=>r===n.FIRST?0:typeof r===t.Primitives.NUMBER?1:r===n.LAST?e.length+e.indexOf(a):1,d=i(o),l=i(s);return d!==l?d-l:1===d&&typeof o===t.Primitives.NUMBER&&typeof s===t.Primitives.NUMBER?o-s:0})}isCustomValidator(e){return!Object.values(t.ValidationKeys).includes(e)&&!Object.values(n).includes(e)}isValidatableByType(e){return Object.keys(i).includes(e)}isValidatableByAttribute(e){return Object.keys(d).includes(e)}toAttributeValue(e,t){if(!Object.keys(d).includes(e))throw Error(`Invalid attribute key "${e}". Expected one of: ${Object.keys(d).join(", ")}.`);return e===n.REQUIRED||t[e]}toFieldDefinition(e,o={},s=!0){const{inheritProps:i,...d}=o;o=d;const p=this.getClassDecoratorsMetadata(e);if(!p.length)throw new u(`No ui definitions set for model ${e.constructor.name}. Did you use @uimodel?`);const E=Object.assign({},...p,i||{}),{tag:f,props:h,item:M,handlers:R}=E,m=t.Model.uiPropertiesOf(e.constructor);let O,g=M?.props||{},L={};const A=(e,t)=>e?[e,t].join("."):t;if(m){const s=a.Metadata.get(e.constructor,t.ValidationKeys.REFLECT)||{};for(const i of m){const d=t.Model.uiDecorationOf(e.constructor,i);let p;try{p=t.Model.uiTypeOf(e.constructor,i)}catch(e){if(!(e instanceof r.NotFoundError))throw e}if(t.Model.uiIsHidden(e.constructor,i)&&!t.Model.uiElementOf(e.constructor,i))throw new u(`@uielement no found in "${i}". It is required to use hiddenOn decorator.`);Object.entries(d).map(([e,t])=>({key:e,props:t})).sort(e=>[n.ELEMENT,n.CHILD].includes(e.key)?-1:1).forEach(r=>{if(!r)throw new u("No decorator found");switch(r.key){case n.PROP:g[i]=r.props;break;case n.CHILD:{const a=r.props?.props?.name||i;try{if(!t.Model.isModel(t.Model.build({},a))&&!t.Model.isPropertyModel(e,a))throw new u(`Child "${a}" must be a model.`)}catch(e){throw new u(`Child "${a}" must be a model.`)}let s;const n=e[i];if("object"!=typeof n||null===n||Array.isArray(n)){const e=r.props.props?.name;s=new(t.Model.get(e))}O=O||[];const d=Object.assign({},o||{},{model:s},{inheritProps:r.props,childOf:A(o?.childOf,i)}),l=this.toFieldDefinition(n||s,d,!1),{inheritProps:c}=d;c&&(l.props=Object.assign({},l.props,c.props||{})),O.push(l);break}case n.UILISTPROP:{L=L||{};const e=r.props;e.name&&(L[e.name]="object"==typeof e?.props&&n.SEQUENCE in e.props?e.props:i);const t=Object.assign({},E.props?.item||{},M?.props||{},e?.props||{},o);g={tag:M?.tag||t.render||"",props:Object.assign({},g?.props,{mapper:L},t)};break}case n.EVENTS:case n.HIDDEN:case n.HIDE_FOR:case n.SHOW_FOR:case n.PAGE:case n.ORDER:case n.UILAYOUTPROP:case n.ELEMENT:{O=O||[];const t=r.props,d=r.key===n.HIDE_FOR?{hideFor:r.props}:r.key===n.SHOW_FOR?{showFor:r.props}:{},p=Object.assign({},g?.props,t.props||{},d,t?.props?.name?{path:A(o?.childOf,t.props.name),childOf:void 0}:{},o,{name:t.props?.name||i});if(r.key===n.ELEMENT){const r={tag:t.tag||g?.tag||f||"",props:p},o=s[i];if(o)for(const e of Object.entries(o).map(([e,t])=>({key:e,props:t})))this.isValidatableByAttribute(e.key)?r.props[this.translate(e.key)]=this.toAttributeValue(e.key,e.props):this.isValidatableByType(e.key)?(e.key===c.DATE&&(r.props[n.FORMAT]=e.props.format||l),r.props[n.TYPE]=e.key):this.isCustomValidator(e.key)&&(p[n.SUB_TYPE]=e.key,e.props?.message&&(p[n.VALIDATION_MESSAGE]=e.props.message));if(!r.props[n.TYPE]){const t=a.Metadata.type(e.constructor,i).name;r.props[n.TYPE]=this.translate(t.toLowerCase(),!0)}r.props.value=y(r.props[n.TYPE],e[i],r.props[n.FORMAT]),O.push(r)}else{const e=O.find(e=>e.props?.name===i||[n.UILAYOUTPROP,n.PAGE,n.EVENTS].includes(r.key)&&(e.props?.childOf===i||e.props?.childOf?.endsWith("."+i)));if(e)if(r.key===n.HIDE_FOR||r.key===n.SHOW_FOR)e.props=Object.assign({},e.props,d);else if(r.key!==n.UILAYOUTPROP)e.props=Object.assign({},e.props,{[r.key]:t});else{const{row:t,col:a,props:o}=r.props;e.props=Object.assign({},o||{},e.props,t,a)}}break}default:throw new u("Invalid key: "+r.key)}})}}o=Object.assign({},h,o,{handlers:R||{}});const D=new Set([...Array.isArray(o?.namespaces)?o.namespaces:[],..."string"==typeof o?.namespace?[o.namespace]:[]].filter(Boolean)),I=o?.operation;O=this.sortChildrenByOrder(O).filter(e=>{const t=e?.props?.hidden||[];if(t.length>0&&t.includes(I))return!1;const r=e?.props?.hideFor||[],a=e?.props?.showFor||[];return!(r.length>0&&[...D].some(e=>r.includes(e))||a.length>0&&![...D].some(e=>a.includes(e)))});const N={tag:f,item:g,props:o,children:O?.length?O:void 0};return s&&(N.rendererId=T(e)),N}static register(e){if(e.flavour in this.cache)throw new r.InternalError(`Rendering engine under ${e.flavour} already exists`);this.cache[e.flavour]=e,this.current=e}static getOrBoot(e){if(e instanceof m)return e;const t=new e;return t.initialize(),t}static get(e){if(!e)return this.getOrBoot(this.current);if(!(e in this.cache))throw new r.InternalError(`Rendering engine under ${e} does not exist`);return this.getOrBoot(this.cache[e])}static render(e,...a){if(!t.Model.get(e.constructor.name)&&!t.Model.fromObject(e))throw new r.InternalError("No model registered found");const o=t.Model.renderedBy(e.constructor);return m.get(o).render(e,...a)}}function O(...e){return(t,r)=>a.propMetadata(h(r,n.HIDDEN),e)(t,r)}function g(...e){return(t,r)=>a.propMetadata(h(r,n.SHOW_FOR),e)(t,r)}function L(e,t){return(r,o)=>{a.propMetadata(h(o,n.EVENTS),{..."object"==typeof e?e:{[e]:t}})(r,o)}}class A extends t.Validator{getMessage(e,...t){return A.translateService?A.translateService.translate(e,...t):super.getMessage(e,...t)}}class D extends o.LoggedClass{constructor(){super(),this.enableDarkMode=!0,this.isDarkMode=!1,this.item={tag:""},this.props={},this.route="",this.borders=!1,this.OperationKeys=r.OperationKeys,this.initialized=!1,this.events={},this.handlers={}}get repository(){return this._repository}set repository(e){this._repository=e}async render(...e){this.log.for(this.render).info(`render for ${this.componentName} with ${JSON.stringify(e)}`)}async refresh(...e){this.log.for(this.refresh).info("Refresh called with args: "+e)}async initialize(...e){this.initialized=!0}async translate(...e){this.log.for(this.translate).info(`translate for ${this.componentName} with ${JSON.stringify(e)}`)}async preview(...e){this.log.for(this.preview).debug("Preview called with args: "+e)}async submit(...e){this.log.for(this.submit).info(`submit for ${this.componentName} with ${JSON.stringify(e)}`)}parseHandlers(e,t){const r={};return Object.entries(e).forEach(([e,a])=>{if(f(a)){const o=new a,s=e in o?o[e]:o.handle;r[e]=s,t.handlers[e]=s}else r[e]=a,t.handlers[e]=a}),r}parseEvents(e,t){const r={};return Object.entries(e).forEach(([e,a])=>{const o=e,s=a();if(f(s)){const a=(new s)[e];a&&(r[o]=a,t.events[o]=a)}else r[o]=a,t.events[o]=a}),r}}class I extends o.LoggedClass{translate(e,t){this.log.for(this.translate).info(`Must translate ${e} with params ${JSON.stringify(t||{})}`)}instant(e,t){this.log.for(this.instant).info(`Must translate ${e} with params ${JSON.stringify(t||{})}`)}}function N(e,t){return(r,o)=>{const s={tag:e||r.name,props:t};return a.metadata(a.Metadata.key(n.REFLECT,n.UIMODEL),s)(r)}}function b(e){return a.apply(a.metadata(a.Metadata.key(n.REFLECT,n.RENDERED_BY),e))}function C(e,t){return(r,o)=>{const s={item:{tag:e||r.name,props:t}};return a.metadata(a.Metadata.key(n.REFLECT,n.UILISTMODEL),s)(r)}}function S(e){return t=>{const r={handlers:e};return a.metadata(a.Metadata.key(n.REFLECT,n.HANDLERS),r)(t)}}function P(t,r=1,o=1,s={}){const i=Object.assign({..."boolean"==typeof r?{flexMode:r,cols:1}:{flexMode:!1,cols:r},rows:o,...Object.assign({breakpoint:e.UIMediaBreakPoints.LARGE},s)});return(e,r)=>(a.metadata(a.Metadata.key(n.REFLECT,n.UILAYOUT),i)(e),N(t,i)(e,r))}function k(e,t=1,r=!1,a={}){let o=[];return"object"==typeof t&&(o=t,t=o.length),N(e,{pages:t,paginated:r,pageTitles:o,props:a})}t.Model.prototype.render=function(...e){return m.render(this,...e)},t.Model.renderedBy=(e=>a.Metadata.get(e,a.Metadata.key(n.REFLECT,n.RENDERED_BY))).bind(t.Model),t.Model.uiPropertiesOf=(e=>{const t=a.Metadata.get(e,a.Metadata.key(n.REFLECT,a.DecorationKeys.PROPERTIES));if(t)return Object.keys(t)}).bind(t.Model),t.Model.uiDecorationOf=(e,t,r)=>{const o=a.Metadata.get(e,a.Metadata.key(n.REFLECT,a.DecorationKeys.PROPERTIES,t));if(o)return r?o[r]:o},t.Model.uiModelOf=e=>a.Metadata.get(e,a.Metadata.key(n.REFLECT,n.UIMODEL)),t.Model.uiElementOf=(e,t)=>a.Metadata.get(e,h(t,n.ELEMENT)),t.Model.uiListModelOf=e=>a.Metadata.get(e,a.Metadata.key(n.REFLECT,n.UILISTMODEL)),t.Model.uiHandlersFor=e=>a.Metadata.get(e,a.Metadata.key(n.REFLECT,n.HANDLERS)),t.Model.uiLayoutOf=e=>a.Metadata.get(e,a.Metadata.key(n.REFLECT,n.UILAYOUT)),t.Model.uiIsHidden=(e,t)=>!!a.Metadata.get(e,h(t,n.HIDDEN)),t.Model.uiIsHiddenOn=(e,t,r)=>{const o=a.Metadata.get(e,h(t,n.HIDDEN));return!!o&&(r?o.includes(r):o)},t.Model.uiTypeOf=(e,t)=>{const o=a.Metadata.get(e,a.Metadata.key(n.REFLECT,a.DecorationKeys.PROPERTIES,t));if(!o)throw new r.NotFoundError(`No metadata found for property '${t}' on model '${e.name}'`);const s=Object.keys(o).filter(e=>[n.PROP,n.ELEMENT,n.CHILD].includes(e));if(0===s.length)throw new r.NotFoundError(`No UI type metadata found for property '${t}' on model '${e.name}'`);if(s.length>1)throw new u("Only one type of decoration is allowed. Please choose between @uiprop, @uichild or @uielement");return o[s[0]]},t.Model.uiListItems=(e=>{const t=a.Metadata.get(e,a.Metadata.key(n.REFLECT,a.DecorationKeys.PROPERTIES));if(t)return Object.keys(t)}).bind(t.Model);const U=t.ModelBuilder.prototype;U.decorateClass||(U.decorateClass=function(e){return this._classDecorators||(this._classDecorators=[]),this._classDecorators.push(e),this}),U.uimodel=function(e,t){return this.decorateClass(N(e,t))},U.renderedBy=function(e){return this.decorateClass(b(e))},U.uilistmodel=function(e,t){return this.decorateClass(C(e,t))},U.uihandlers=function(e){return this.decorateClass(S(e))},U.uilayout=function(e,t,r,a){return this.decorateClass(P(e,t,r,a))},U.uisteppedmodel=function(e,t,r,a){return this.decorateClass(k(e,t,r,a))};const w="##VERSION##",v="##PACKAGE##";a.Metadata.registerLibrary(v,w),e.ActionRoles=E,e.COMMIT="b1ab2bc",e.ComponentEventNames={Render:"render",BackButtonClickEvent:"backButtonNavigationEndEvent",Refresh:"RefreshEvent",Click:"ClickEvent",Change:"ChangeEvent",Submit:"SubmitEvent",ValidationError:"validationErrorEvent",ThemeChange:"themeChangeEvent",FormGroupLoaded:"formGroupLoadedEvent"},e.DecafComponent=D,e.DecafEventHandler=class extends D{constructor(){super()}handle(...e){this.log.for(this.handle).info(`component ${this.componentName} handling ${JSON.stringify(e)}`)}handleClick(...e){this.log.for(this.handleClick).info(`component ${this.componentName} handling click ${JSON.stringify(e)}`)}handleAction(...e){this.log.for(this.handleAction).info(`component ${this.componentName} handling action ${JSON.stringify(e)}`)}},e.DecafTranslateService=I,e.ElementPositions={left:"left",center:"center",right:"right",top:"top",bottom:"bottom"},e.ElementSizes={xsmall:"xsmall",small:"small",medium:"medium",default:"default",large:"large",xLarge:"xlarge","2xLarge":"2xlarge",auto:"auto",expand:"expand",block:"block",half:"half",full:"full"},e.FULL_VERSION="0.20.4-b1ab2bc",e.HTML5CheckTypes=p,e.HTML5DateFormat=l,e.HTML5InputTypes=c,e.LayoutGridGaps={small:"small",medium:"medium",large:"large",collapse:"collapse",none:""},e.PACKAGE_NAME=v,e.RenderingEngine=m,e.RenderingError=u,e.TransactionHooks={BeforeRead:"beforeRead",AfterRead:"afterRead",BeforeCreate:"beforeCreate",AfterCreate:"afterCreate",BeforeUpdate:"beforeUpdate",AfterUpdate:"afterUpdate",BeforeDelete:"beforeDelete",AfterDelete:"afterDelete"},e.UIKeys=n,e.UIValidator=A,e.VERSION=w,e.ValidatableByAttribute=d,e.ValidatableByType=i,e.WindowColorSchemes={light:"light",dark:"dark",undefined:"undefined"},e.escapeHtml=R,e.formatByType=y,e.generateUIModelID=T,e.getUIAttributeKey=h,e.hidden=()=>O(r.OperationKeys.CREATE,r.OperationKeys.READ,r.OperationKeys.UPDATE,r.OperationKeys.DELETE),e.hideFor=(...e)=>(t,r)=>a.propMetadata(h(r,n.HIDE_FOR),e)(t,r),e.hideOn=O,e.isClassConstructor=f,e.parseToNumber=M,e.parseValueByType=function e(a,o,s){let n;switch(a){case Array.name:n=(Array.isArray(o)?o.map(r=>e(t.ReservedModels.STRING.name.toLowerCase(),r,s)):[o]).join(",");break;case c.NUMBER:n=M(o);break;case c.DATE:{const e=s.format;o&&(""+o).trim().length&&(n=typeof o===t.ReservedModels.NUMBER.name.toLowerCase()?new Date(o):o?e?t.parseDate(e,o):new Date(o):void 0);break}default:n=typeof o===t.ReservedModels.OBJECT.name.toLowerCase()?Array.isArray(o)?o.join(","):JSON.stringify(o):typeof o===t.ReservedModels.BOOLEAN.name.toLowerCase()?o:typeof o===t.ReservedModels.STRING.name.toLowerCase()?R(o):n}if(void 0===n)throw new r.InternalError(`Failed to parse value of type ${a} from ${typeof o} - ${o}`);return n},e.renderIf=(...e)=>g(...e),e.renderedBy=b,e.revertHtml=e=>{const t={"&amp;":"&","&lt;":"<","&gt;":">"};return(""+e).replace(/&lt;|&gt;|&amp;/g,e=>t[e]||e)},e.showFor=g,e.uichild=(e,t,r={},o=!1,s=!1)=>(i,d)=>{const l={tag:t,serialize:s,props:Object.assign({},r||{},{name:e||d},o?{customTypes:[Array.name],multiple:!0}:{multiple:r?.multiple||!1})};a.propMetadata(h(d,n.CHILD),l)(i,d)},e.uielement=(e,t,r=!1)=>(o,s)=>{"object"==typeof e&&(t=e,e="");const i={tag:e,serialize:r,props:Object.assign({},t||{},{name:s})};return a.propMetadata(h(s,n.ELEMENT),i)(o,s)},e.uihandlers=S,e.uilayout=P,e.uilayoutprop=(e=1,t=1)=>(r,o)=>{const s={name:o,props:Object.assign({},{row:t,col:e})};a.propMetadata(h(o,n.UILAYOUTPROP),s)(r,o)},e.uilistmodel=C,e.uilistprop=(e=void 0,t)=>(r,o)=>{const s={name:e||o,props:t||{}};a.propMetadata(h(o,n.UILISTPROP),s)(r,o)},e.uimodel=N,e.uion=L,e.uionclick=e=>L("handleClick",e),e.uionrender=e=>L("render",e),e.uiorder=(e=n.FIRST)=>(t,r)=>a.propMetadata(h(r,n.ORDER),e)(t,r),e.uipageprop=(e=1)=>(t,r)=>a.propMetadata(h(r,n.PAGE),e)(t,r),e.uiprop=(e=void 0,t=!1)=>(r,o)=>{const s={name:e||o,stringify:t};a.propMetadata(h(o,n.PROP),s)(r,o)},e.uisteppedmodel=k,e.uitablecol=(e=n.LAST,t)=>(r,o)=>{const s={name:o,props:{sequence:e,...t?{valueParserFn:t}:{}}};a.propMetadata(h(o,n.UILISTPROP),s)(r,o)}},"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@decaf-ts/decorator-validation"),require("@decaf-ts/db-decorators"),require("@decaf-ts/decoration"),require("@decaf-ts/logging")):"function"==typeof define&&define.amd?define(["exports","@decaf-ts/decorator-validation","@decaf-ts/db-decorators","@decaf-ts/decoration","@decaf-ts/logging"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["ui-decorators"]={},e.decafTsDecoratorValidation,e.decafTsDbDecorators,e.decafTsDecoration,e.decafTsLogging);
2
- //# sourceMappingURL=ui-decorators.cjs.map
1
+ (function(global, factory) {
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@decaf-ts/decorator-validation"), require("@decaf-ts/db-decorators"), require("@decaf-ts/decoration"), require("@decaf-ts/logging")) : typeof define === "function" && define.amd ? define([ "exports", "@decaf-ts/decorator-validation", "@decaf-ts/db-decorators", "@decaf-ts/decoration", "@decaf-ts/logging" ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self,
3
+ factory(global["ui-decorators"] = {}, global.decafTsDecoratorValidation, global.decafTsDbDecorators, global.decafTsDecoration, global.decafTsLogging));
4
+ })(this, function(exports, decoratorValidation, dbDecorators, decoration, logging) {
5
+ "use strict";
6
+ exports.UIMediaBreakPoints = void 0;
7
+ (function(UIMediaBreakPoints) {
8
+ UIMediaBreakPoints["SMALL"] = "small";
9
+ UIMediaBreakPoints["MEDIUM"] = "medium";
10
+ UIMediaBreakPoints["LARGE"] = "large";
11
+ UIMediaBreakPoints["XLARGE"] = "xlarge";
12
+ })(exports.UIMediaBreakPoints || (exports.UIMediaBreakPoints = {}));
13
+ const UIKeys = {
14
+ REFLECT: `ui`,
15
+ UIMODEL: "uimodel",
16
+ RENDERED_BY: "rendered-by",
17
+ ELEMENT: "uielement",
18
+ PROP: "uiprop",
19
+ CHILD: "uichild",
20
+ NAME: "name",
21
+ NAME_PREFIX: "input-",
22
+ VALIDATION_MESSAGE: "validationMessage",
23
+ UILISTMODEL: "uilistmodel",
24
+ UILISTPROP: "uilistprop",
25
+ UILAYOUT: "uilayout",
26
+ UILAYOUTPROP: "uilayoutprop",
27
+ HANDLERS: "handlers",
28
+ TYPE: "type",
29
+ SUB_TYPE: "subType",
30
+ HIDDEN: "hidden",
31
+ HIDE_FOR: "hide-for",
32
+ SHOW_FOR: "show-for",
33
+ RENDER_IF: "render-if",
34
+ FORMAT: "format",
35
+ ORDER: "order",
36
+ PAGE: "page",
37
+ EVENTS: "events",
38
+ FIRST: "first",
39
+ LAST: "last",
40
+ READ_ONLY: "readonly",
41
+ SEQUENCE: "sequence",
42
+ REQUIRED: decoratorValidation.ValidationKeys.REQUIRED,
43
+ MIN: decoratorValidation.ValidationKeys.MIN,
44
+ MIN_LENGTH: decoratorValidation.ValidationKeys.MIN_LENGTH,
45
+ MAX: decoratorValidation.ValidationKeys.MAX,
46
+ MAX_LENGTH: decoratorValidation.ValidationKeys.MAX_LENGTH,
47
+ PATTERN: decoratorValidation.ValidationKeys.PATTERN,
48
+ URL: decoratorValidation.ValidationKeys.URL,
49
+ STEP: decoratorValidation.ValidationKeys.STEP,
50
+ DATE: decoratorValidation.ValidationKeys.DATE,
51
+ EMAIL: decoratorValidation.ValidationKeys.EMAIL,
52
+ PASSWORD: decoratorValidation.ValidationKeys.PASSWORD,
53
+ EQUALS: decoratorValidation.ValidationKeys.EQUALS,
54
+ DIFF: decoratorValidation.ValidationKeys.DIFF,
55
+ LESS_THAN: decoratorValidation.ValidationKeys.LESS_THAN,
56
+ LESS_THAN_OR_EQUAL: decoratorValidation.ValidationKeys.LESS_THAN_OR_EQUAL,
57
+ GREATER_THAN: decoratorValidation.ValidationKeys.GREATER_THAN,
58
+ GREATER_THAN_OR_EQUAL: decoratorValidation.ValidationKeys.GREATER_THAN_OR_EQUAL
59
+ };
60
+ const ValidatableByType = {
61
+ [UIKeys.EMAIL]: decoratorValidation.EmailValidator,
62
+ [UIKeys.URL]: decoratorValidation.URLValidator,
63
+ [UIKeys.DATE]: decoratorValidation.DateValidator,
64
+ [UIKeys.PASSWORD]: decoratorValidation.PasswordValidator
65
+ };
66
+ const ValidatableByAttribute = {
67
+ [UIKeys.REQUIRED]: decoratorValidation.RequiredValidator,
68
+ [UIKeys.MIN]: decoratorValidation.MinValidator,
69
+ [UIKeys.MAX]: decoratorValidation.MaxValidator,
70
+ [UIKeys.STEP]: decoratorValidation.StepValidator,
71
+ [UIKeys.MIN_LENGTH]: decoratorValidation.MinLengthValidator,
72
+ [UIKeys.MAX_LENGTH]: decoratorValidation.MaxLengthValidator,
73
+ [UIKeys.PATTERN]: decoratorValidation.PatternValidator,
74
+ [UIKeys.EQUALS]: decoratorValidation.EqualsValidator,
75
+ [UIKeys.DIFF]: decoratorValidation.DiffValidator,
76
+ [UIKeys.LESS_THAN]: decoratorValidation.LessThanValidator,
77
+ [UIKeys.LESS_THAN_OR_EQUAL]: decoratorValidation.LessThanOrEqualValidator,
78
+ [UIKeys.GREATER_THAN]: decoratorValidation.GreaterThanValidator,
79
+ [UIKeys.GREATER_THAN_OR_EQUAL]: decoratorValidation.GreaterThanOrEqualValidator
80
+ };
81
+ const HTML5DateFormat = "yyyy-MM-dd";
82
+ const HTML5InputTypes = {
83
+ BUTTON: "button",
84
+ CHECKBOX: "checkbox",
85
+ COLOR: "color",
86
+ DATE: UIKeys.DATE,
87
+ DATETIME_LOCAL: "datetime-local",
88
+ EMAIL: UIKeys.EMAIL,
89
+ FILE: "file",
90
+ HIDDEN: "hidden",
91
+ IMAGE: "image",
92
+ MONTH: "month",
93
+ NUMBER: "number",
94
+ PASSWORD: UIKeys.PASSWORD,
95
+ RADIO: "radio",
96
+ RANGE: "range",
97
+ RESET: "reset",
98
+ SEARCH: "search",
99
+ SUBMIT: "submit",
100
+ TEL: "tel",
101
+ TEXT: "text",
102
+ TEXTAREA: "textarea",
103
+ SELECT: "select",
104
+ TIME: "time",
105
+ URL: UIKeys.URL,
106
+ WEEK: "week"
107
+ };
108
+ const HTML5CheckTypes = [ HTML5InputTypes.CHECKBOX, HTML5InputTypes.RADIO ];
109
+ const ComponentEventNames = {
110
+ Render: "render",
111
+ BackButtonClickEvent: "backButtonNavigationEndEvent",
112
+ Refresh: "RefreshEvent",
113
+ Click: "ClickEvent",
114
+ Change: "ChangeEvent",
115
+ Submit: "SubmitEvent",
116
+ ValidationError: "validationErrorEvent",
117
+ ThemeChange: "themeChangeEvent",
118
+ FormGroupLoaded: "formGroupLoadedEvent"
119
+ };
120
+ const TransactionHooks = {
121
+ BeforeRead: "beforeRead",
122
+ AfterRead: "afterRead",
123
+ BeforeCreate: "beforeCreate",
124
+ AfterCreate: "afterCreate",
125
+ BeforeUpdate: "beforeUpdate",
126
+ AfterUpdate: "afterUpdate",
127
+ BeforeDelete: "beforeDelete",
128
+ AfterDelete: "afterDelete"
129
+ };
130
+ const ElementSizes = {
131
+ xsmall: "xsmall",
132
+ small: "small",
133
+ medium: "medium",
134
+ default: "default",
135
+ large: "large",
136
+ xLarge: "xlarge",
137
+ "2xLarge": "2xlarge",
138
+ auto: "auto",
139
+ expand: "expand",
140
+ block: "block",
141
+ half: "half",
142
+ full: "full"
143
+ };
144
+ const ElementPositions = {
145
+ left: "left",
146
+ center: "center",
147
+ right: "right",
148
+ top: "top",
149
+ bottom: "bottom"
150
+ };
151
+ const LayoutGridGaps = {
152
+ small: "small",
153
+ medium: "medium",
154
+ large: "large",
155
+ collapse: "collapse",
156
+ none: ""
157
+ };
158
+ const ActionRoles = {
159
+ cancel: "cancel",
160
+ confirm: "confirm",
161
+ submit: "submit",
162
+ clear: "clear",
163
+ back: "back",
164
+ [dbDecorators.OperationKeys.CREATE]: dbDecorators.OperationKeys.CREATE,
165
+ [dbDecorators.OperationKeys.READ]: dbDecorators.OperationKeys.READ,
166
+ [dbDecorators.OperationKeys.UPDATE]: dbDecorators.OperationKeys.UPDATE,
167
+ [dbDecorators.OperationKeys.DELETE]: dbDecorators.OperationKeys.DELETE
168
+ };
169
+ const WindowColorSchemes = {
170
+ light: "light",
171
+ dark: "dark",
172
+ undefined: "undefined"
173
+ };
174
+ class RenderingError extends dbDecorators.InternalError {
175
+ constructor(msg) {
176
+ super(msg, RenderingError.name);
177
+ }
178
+ }
179
+ const isClassConstructor = fn => typeof fn === "function" && /^class\s/.test(String(fn));
180
+ function getUIAttributeKey(prop, key) {
181
+ return decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES, prop, key);
182
+ }
183
+ function formatByType(type, value, ...args) {
184
+ if (type === UIKeys.DATE) {
185
+ if (!value) return "";
186
+ const format = args.shift() || HTML5DateFormat;
187
+ return decoratorValidation.formatDate(new Date(value), format);
188
+ }
189
+ return value;
190
+ }
191
+ function parseValueByType(type, value, fieldProps) {
192
+ let result = undefined;
193
+ switch (type) {
194
+ case Array.name:
195
+ {
196
+ const parsed = Array.isArray(value) ? value.map(v => parseValueByType(decoratorValidation.ReservedModels.STRING.name.toLowerCase(), v, fieldProps)) : [ value ];
197
+ result = parsed.join(",");
198
+ break;
199
+ }
200
+
201
+ case HTML5InputTypes.NUMBER:
202
+ result = parseToNumber(value);
203
+ break;
204
+
205
+ case HTML5InputTypes.DATE:
206
+ {
207
+ const format = fieldProps.format;
208
+ if (value && `${value}`.trim().length) {
209
+ result = typeof value === decoratorValidation.ReservedModels.NUMBER.name.toLowerCase() ? new Date(value) : value ? format ? decoratorValidation.parseDate(format, value) : new Date(value) : undefined;
210
+ }
211
+ break;
212
+ }
213
+
214
+ default:
215
+ result = typeof value === decoratorValidation.ReservedModels.OBJECT.name.toLowerCase() ? Array.isArray(value) ? value.join(",") : JSON.stringify(value) : typeof value === decoratorValidation.ReservedModels.BOOLEAN.name.toLowerCase() ? value : typeof value === decoratorValidation.ReservedModels.STRING.name.toLowerCase() ? escapeHtml(value) : result;
216
+ }
217
+ if (typeof result === "undefined") {
218
+ throw new dbDecorators.InternalError(`Failed to parse value of type ${type} from ${typeof value} - ${value}`);
219
+ }
220
+ return result;
221
+ }
222
+ function parseToNumber(value) {
223
+ if (typeof value === "number" && !isNaN(value)) return value;
224
+ const parsed = Number(value);
225
+ if (!isNaN(parsed)) return parsed;
226
+ return undefined;
227
+ }
228
+ function escapeHtml(value) {
229
+ if (!value) return value;
230
+ const tagsToReplace = {
231
+ "&": "&amp;",
232
+ "<": "&lt;",
233
+ ">": "&gt;"
234
+ };
235
+ return `${value}`.replace(/[&<>]/g, tag => tagsToReplace[tag] || tag);
236
+ }
237
+ function revertHtml(value) {
238
+ const tagsToReplace = {
239
+ "&amp;": "&",
240
+ "&lt;": "<",
241
+ "&gt;": ">"
242
+ };
243
+ return `${value}`.replace(/&lt;|&gt;|&amp;/g, tag => tagsToReplace[tag] || tag);
244
+ }
245
+ function generateUIModelID(model) {
246
+ let id = Date.now();
247
+ try {
248
+ const pk = decoratorValidation.Model.pk(model.constructor);
249
+ if (pk) id = model[decoratorValidation.Model.pk(model.constructor)];
250
+ } catch (e) {}
251
+ const name = model.constructor.name;
252
+ return `${name}-${id}`;
253
+ }
254
+ class RenderingEngine {
255
+ static {
256
+ this.cache = {};
257
+ }
258
+ constructor(flavour) {
259
+ this.flavour = flavour;
260
+ this.initialized = false;
261
+ RenderingEngine.register(this);
262
+ console.log(`decaf's ${flavour} rendering engine loaded`);
263
+ }
264
+ translate(key, toView = true) {
265
+ if (toView) {
266
+ switch (key) {
267
+ case decoratorValidation.ReservedModels.STRING.name.toLowerCase():
268
+ return HTML5InputTypes.TEXT;
269
+
270
+ case decoratorValidation.ReservedModels.NUMBER.name.toLowerCase():
271
+ case decoratorValidation.ReservedModels.BIGINT.name.toLowerCase():
272
+ return HTML5InputTypes.NUMBER;
273
+
274
+ case decoratorValidation.ReservedModels.BOOLEAN.name.toLowerCase():
275
+ return HTML5InputTypes.CHECKBOX;
276
+
277
+ case decoratorValidation.ReservedModels.DATE.name.toLowerCase():
278
+ return HTML5InputTypes.DATE;
279
+ }
280
+ } else {
281
+ switch (key) {
282
+ case HTML5InputTypes.SELECT:
283
+ case HTML5InputTypes.TEXT:
284
+ case HTML5InputTypes.EMAIL:
285
+ case HTML5InputTypes.COLOR:
286
+ case HTML5InputTypes.PASSWORD:
287
+ case HTML5InputTypes.TEL:
288
+ case HTML5InputTypes.URL:
289
+ case HTML5InputTypes.SEARCH:
290
+ case HTML5InputTypes.HIDDEN:
291
+ case HTML5InputTypes.TEXTAREA:
292
+ case HTML5InputTypes.RADIO:
293
+ return decoratorValidation.ReservedModels.STRING.name.toLowerCase();
294
+
295
+ case HTML5InputTypes.NUMBER:
296
+ return decoratorValidation.ReservedModels.NUMBER.name.toLowerCase();
297
+
298
+ case HTML5InputTypes.CHECKBOX:
299
+ return decoratorValidation.ReservedModels.BOOLEAN.name.toLowerCase();
300
+
301
+ case HTML5InputTypes.DATE:
302
+ case HTML5InputTypes.DATETIME_LOCAL:
303
+ case HTML5InputTypes.TIME:
304
+ return decoratorValidation.ReservedModels.DATE.name.toLowerCase();
305
+ }
306
+ }
307
+ return key;
308
+ }
309
+ getClassDecoratorsMetadata(model) {
310
+ return [ decoratorValidation.Model.uiModelOf(model.constructor), decoratorValidation.Model.uiListModelOf(model.constructor), decoratorValidation.Model.uiHandlersFor(model.constructor), decoratorValidation.Model.uiLayoutOf(model.constructor) ].filter(Boolean);
311
+ }
312
+ sortChildrenByOrder(children = []) {
313
+ return children.sort((a, b) => {
314
+ const aOrder = a.props?.order ?? 0;
315
+ const bOrder = b.props?.order ?? 0;
316
+ const weight = v => v === UIKeys.FIRST ? 0 : typeof v === decoratorValidation.Primitives.NUMBER ? 1 : v === UIKeys.LAST ? children.length + children.indexOf(b) : 1;
317
+ const aWeight = weight(aOrder);
318
+ const bWeight = weight(bOrder);
319
+ if (aWeight !== bWeight) {
320
+ return aWeight - bWeight;
321
+ }
322
+ if (aWeight === 1 && typeof aOrder === decoratorValidation.Primitives.NUMBER && typeof bOrder === decoratorValidation.Primitives.NUMBER) {
323
+ return aOrder - bOrder;
324
+ }
325
+ return 0;
326
+ });
327
+ }
328
+ isCustomValidator(key) {
329
+ return !Object.values(decoratorValidation.ValidationKeys).includes(key) && !Object.values(UIKeys).includes(key);
330
+ }
331
+ isValidatableByType(key) {
332
+ return Object.keys(ValidatableByType).includes(key);
333
+ }
334
+ isValidatableByAttribute(key) {
335
+ return Object.keys(ValidatableByAttribute).includes(key);
336
+ }
337
+ toAttributeValue(key, value) {
338
+ if (!Object.keys(ValidatableByAttribute).includes(key)) throw new Error(`Invalid attribute key "${key}". Expected one of: ${Object.keys(ValidatableByAttribute).join(", ")}.`);
339
+ return key === UIKeys.REQUIRED ? true : value[key];
340
+ }
341
+ toFieldDefinition(model, globalProps = {}, generateId = true) {
342
+ const {inheritProps: inheritProps, ...globalPropsWithoutInherits} = globalProps;
343
+ globalProps = globalPropsWithoutInherits;
344
+ const classDecorators = this.getClassDecoratorsMetadata(model);
345
+ if (!classDecorators.length) throw new RenderingError(`No ui definitions set for model ${model.constructor.name}. Did you use @uimodel?`);
346
+ const classDecorator = Object.assign({}, ...classDecorators, inheritProps ? inheritProps : {});
347
+ const {tag: tag, props: props, item: item, handlers: handlers} = classDecorator;
348
+ const uiDecorators = decoratorValidation.Model.uiPropertiesOf(model.constructor);
349
+ let children;
350
+ let childProps = item?.props || {};
351
+ let mapper = {};
352
+ const getPath = (parent, prop) => parent ? [ parent, prop ].join(".") : prop;
353
+ if (uiDecorators) {
354
+ const validationDecorators = decoration.Metadata.get(model.constructor, decoratorValidation.ValidationKeys.REFLECT) || {};
355
+ for (const key of uiDecorators) {
356
+ const decs = decoratorValidation.Model.uiDecorationOf(model.constructor, key);
357
+ let type;
358
+ try {
359
+ type = decoratorValidation.Model.uiTypeOf(model.constructor, key);
360
+ } catch (e) {
361
+ if (!(e instanceof dbDecorators.NotFoundError)) throw e;
362
+ }
363
+ const hasHideOnDecorator = decoratorValidation.Model.uiIsHidden(model.constructor, key);
364
+ if (hasHideOnDecorator) {
365
+ const hasUiElementDecorator = decoratorValidation.Model.uiElementOf(model.constructor, key);
366
+ if (!hasUiElementDecorator) throw new RenderingError(`@uielement no found in "${key}". It is required to use hiddenOn decorator.`);
367
+ }
368
+ const sorted = Object.entries(decs).map(([k, v]) => ({
369
+ key: k,
370
+ props: v
371
+ })).sort(a => [ UIKeys.ELEMENT, UIKeys.CHILD ].includes(a.key) ? -1 : 1);
372
+ sorted.forEach(dec => {
373
+ if (!dec) throw new RenderingError(`No decorator found`);
374
+ switch (dec.key) {
375
+ case UIKeys.PROP:
376
+ {
377
+ childProps[key] = dec.props;
378
+ break;
379
+ }
380
+
381
+ case UIKeys.CHILD:
382
+ {
383
+ const modelName = dec.props?.props?.name || key;
384
+ try {
385
+ const isPropertyModel = decoratorValidation.Model.isModel(decoratorValidation.Model.build({}, modelName)) || decoratorValidation.Model.isPropertyModel(model, modelName);
386
+ if (!isPropertyModel) throw new RenderingError(`Child "${modelName}" must be a model.`);
387
+ } catch (e) {
388
+ throw new RenderingError(`Child "${modelName}" must be a model.`);
389
+ }
390
+ let Clazz;
391
+ const submodel = model[key];
392
+ const constructable = typeof submodel === "object" && submodel !== null && !Array.isArray(submodel);
393
+ if (!constructable) {
394
+ const clazzName = dec.props.props?.name;
395
+ Clazz = new (decoratorValidation.Model.get(clazzName));
396
+ }
397
+ children = children || [];
398
+ const childrenGlobalProps = Object.assign({}, globalProps || {}, {
399
+ model: Clazz
400
+ }, {
401
+ inheritProps: dec.props,
402
+ childOf: getPath(globalProps?.childOf, key)
403
+ });
404
+ const childDefinition = this.toFieldDefinition(submodel || Clazz, childrenGlobalProps, false);
405
+ const {inheritProps: inheritProps} = childrenGlobalProps;
406
+ if (inheritProps) childDefinition.props = Object.assign({}, childDefinition.props, inheritProps.props || {});
407
+ children.push(childDefinition);
408
+ break;
409
+ }
410
+
411
+ case UIKeys.UILISTPROP:
412
+ {
413
+ mapper = mapper || {};
414
+ const decProps = dec.props;
415
+ if (decProps.name) mapper[decProps.name] = typeof decProps?.props === "object" && UIKeys.SEQUENCE in decProps.props ? decProps.props : key;
416
+ const props = Object.assign({}, classDecorator.props?.item || {}, item?.props || {}, decProps?.props || {}, globalProps);
417
+ childProps = {
418
+ tag: item?.tag || props.render || "",
419
+ props: Object.assign({}, childProps?.props, {
420
+ mapper: mapper
421
+ }, props)
422
+ };
423
+ break;
424
+ }
425
+
426
+ case UIKeys.EVENTS:
427
+ case UIKeys.HIDDEN:
428
+ case UIKeys.HIDE_FOR:
429
+ case UIKeys.SHOW_FOR:
430
+ case UIKeys.PAGE:
431
+ case UIKeys.ORDER:
432
+ case UIKeys.UILAYOUTPROP:
433
+ case UIKeys.ELEMENT:
434
+ {
435
+ children = children || [];
436
+ const uiProps = dec.props;
437
+ const visibilityProps = dec.key === UIKeys.HIDE_FOR ? {
438
+ hideFor: dec.props
439
+ } : dec.key === UIKeys.SHOW_FOR ? {
440
+ showFor: dec.props
441
+ } : {};
442
+ const props = Object.assign({}, childProps?.props, uiProps.props || {}, visibilityProps, uiProps?.props?.name ? {
443
+ path: getPath(globalProps?.childOf, uiProps.props.name),
444
+ childOf: undefined
445
+ } : {}, globalProps, {
446
+ name: uiProps.props?.name || key
447
+ });
448
+ if (dec.key === UIKeys.ELEMENT) {
449
+ const childDefinition = {
450
+ tag: uiProps.tag || childProps?.tag || tag || "",
451
+ props: props
452
+ };
453
+ const validationDecs = validationDecorators[key];
454
+ if (validationDecs) {
455
+ for (const dec of Object.entries(validationDecs).map(([k, v]) => ({
456
+ key: k,
457
+ props: v
458
+ }))) {
459
+ if (this.isValidatableByAttribute(dec.key)) {
460
+ childDefinition.props[this.translate(dec.key)] = this.toAttributeValue(dec.key, dec.props);
461
+ continue;
462
+ }
463
+ if (this.isValidatableByType(dec.key)) {
464
+ if (dec.key === HTML5InputTypes.DATE) {
465
+ childDefinition.props[UIKeys.FORMAT] = dec.props.format || HTML5DateFormat;
466
+ }
467
+ childDefinition.props[UIKeys.TYPE] = dec.key;
468
+ continue;
469
+ }
470
+ if (this.isCustomValidator(dec.key)) {
471
+ props[UIKeys.SUB_TYPE] = dec.key;
472
+ if (dec.props?.message) {
473
+ props[UIKeys.VALIDATION_MESSAGE] = dec.props.message;
474
+ }
475
+ }
476
+ }
477
+ }
478
+ if (!childDefinition.props[UIKeys.TYPE]) {
479
+ const basicType = decoration.Metadata.type(model.constructor, key).name;
480
+ childDefinition.props[UIKeys.TYPE] = this.translate(basicType.toLowerCase(), true);
481
+ }
482
+ childDefinition.props.value = formatByType(childDefinition.props[UIKeys.TYPE], model[key], childDefinition.props[UIKeys.FORMAT]);
483
+ children.push(childDefinition);
484
+ } else {
485
+ const child = children.find(c => c.props?.name === key || [ UIKeys.UILAYOUTPROP, UIKeys.PAGE, UIKeys.EVENTS ].includes(dec.key) && (c.props?.childOf === key || c.props?.childOf?.endsWith(`.${key}`)));
486
+ if (child) {
487
+ if (dec.key === UIKeys.HIDE_FOR || dec.key === UIKeys.SHOW_FOR) {
488
+ child.props = Object.assign({}, child.props, visibilityProps);
489
+ } else if (dec.key !== UIKeys.UILAYOUTPROP) {
490
+ child.props = Object.assign({}, child.props, {
491
+ [dec.key]: uiProps
492
+ });
493
+ } else {
494
+ const {row: row, col: col, props: props} = dec.props;
495
+ child.props = Object.assign({}, props || {}, child.props, row, col);
496
+ }
497
+ }
498
+ }
499
+ break;
500
+ }
501
+
502
+ default:
503
+ throw new RenderingError(`Invalid key: ${dec.key}`);
504
+ }
505
+ });
506
+ }
507
+ }
508
+ globalProps = Object.assign({}, props, globalProps, {
509
+ handlers: handlers || {}
510
+ });
511
+ const currentNamespaces = new Set([ ...Array.isArray(globalProps?.namespaces) ? globalProps.namespaces : [], ...typeof globalProps?.namespace === "string" ? [ globalProps.namespace ] : [] ].filter(Boolean));
512
+ const operation = globalProps?.operation;
513
+ children = this.sortChildrenByOrder(children).filter(item => {
514
+ const hiddenOn = item?.props?.hidden || [];
515
+ if (hiddenOn.length > 0 && hiddenOn.includes(operation)) {
516
+ return false;
517
+ }
518
+ const hideFor = item?.props?.hideFor || [];
519
+ const showFor = item?.props?.showFor || [];
520
+ if (hideFor.length > 0 && [ ...currentNamespaces ].some(namespace => hideFor.includes(namespace))) {
521
+ return false;
522
+ }
523
+ if (showFor.length > 0 && ![ ...currentNamespaces ].some(namespace => showFor.includes(namespace))) {
524
+ return false;
525
+ }
526
+ return true;
527
+ });
528
+ const result = {
529
+ tag: tag,
530
+ item: childProps,
531
+ props: globalProps,
532
+ children: children?.length ? children : undefined
533
+ };
534
+ if (generateId) result.rendererId = generateUIModelID(model);
535
+ return result;
536
+ }
537
+ static register(engine) {
538
+ if (engine.flavour in this.cache) throw new dbDecorators.InternalError(`Rendering engine under ${engine.flavour} already exists`);
539
+ this.cache[engine.flavour] = engine;
540
+ this.current = engine;
541
+ }
542
+ static getOrBoot(obj) {
543
+ if (obj instanceof RenderingEngine) return obj;
544
+ const engine = new obj;
545
+ engine.initialize();
546
+ return engine;
547
+ }
548
+ static get(flavour) {
549
+ if (!flavour) return this.getOrBoot(this.current);
550
+ if (!(flavour in this.cache)) throw new dbDecorators.InternalError(`Rendering engine under ${flavour} does not exist`);
551
+ return this.getOrBoot(this.cache[flavour]);
552
+ }
553
+ static render(model, ...args) {
554
+ const constructor = decoratorValidation.Model.get(model.constructor.name) || decoratorValidation.Model.fromObject(model);
555
+ if (!constructor) throw new dbDecorators.InternalError("No model registered found");
556
+ const flavour = decoratorValidation.Model.renderedBy(model.constructor);
557
+ return RenderingEngine.get(flavour).render(model, ...args);
558
+ }
559
+ }
560
+ function hideOn(...operations) {
561
+ return function hideOn(object, propertyKey) {
562
+ return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.HIDDEN), operations)(object, propertyKey);
563
+ };
564
+ }
565
+ function hideFor(...namespaces) {
566
+ return function hideFor(object, propertyKey) {
567
+ return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.HIDE_FOR), namespaces)(object, propertyKey);
568
+ };
569
+ }
570
+ function showFor(...namespaces) {
571
+ return function showFor(object, propertyKey) {
572
+ return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.SHOW_FOR), namespaces)(object, propertyKey);
573
+ };
574
+ }
575
+ function renderIf(...namespaces) {
576
+ return showFor(...namespaces);
577
+ }
578
+ function uiorder(order = UIKeys.FIRST) {
579
+ return function uiorder(object, propertyKey) {
580
+ return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.ORDER), order)(object, propertyKey);
581
+ };
582
+ }
583
+ function hidden() {
584
+ return hideOn(dbDecorators.OperationKeys.CREATE, dbDecorators.OperationKeys.READ, dbDecorators.OperationKeys.UPDATE, dbDecorators.OperationKeys.DELETE);
585
+ }
586
+ function uielement(tag, props, serialize = false) {
587
+ return (original, propertyKey) => {
588
+ if (typeof tag === "object") {
589
+ props = tag;
590
+ tag = "";
591
+ }
592
+ const metadata = {
593
+ tag: tag,
594
+ serialize: serialize,
595
+ props: Object.assign({}, props || {}, {
596
+ name: propertyKey
597
+ })
598
+ };
599
+ return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.ELEMENT), metadata)(original, propertyKey);
600
+ };
601
+ }
602
+ function uiprop(propName = undefined, stringify = false) {
603
+ return (target, propertyKey) => {
604
+ const metadata = {
605
+ name: propName || propertyKey,
606
+ stringify: stringify
607
+ };
608
+ decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.PROP), metadata)(target, propertyKey);
609
+ };
610
+ }
611
+ function uichild(clazz, tag, props = {}, isArray = false, serialize = false) {
612
+ return (target, propertyKey) => {
613
+ const metadata = {
614
+ tag: tag,
615
+ serialize: serialize,
616
+ props: Object.assign({}, props || {}, {
617
+ name: clazz || propertyKey
618
+ }, isArray ? {
619
+ customTypes: [ Array.name ],
620
+ multiple: true
621
+ } : {
622
+ multiple: props?.multiple || false
623
+ })
624
+ };
625
+ decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.CHILD), metadata)(target, propertyKey);
626
+ };
627
+ }
628
+ function uilistprop(propName = undefined, props) {
629
+ return (target, propertyKey) => {
630
+ const metadata = {
631
+ name: propName || propertyKey,
632
+ props: props || {}
633
+ };
634
+ decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILISTPROP), metadata)(target, propertyKey);
635
+ };
636
+ }
637
+ function uilayoutprop(col = 1, row = 1) {
638
+ return (target, propertyKey) => {
639
+ const metadata = {
640
+ name: propertyKey,
641
+ props: Object.assign({}, {
642
+ row: row,
643
+ col: col
644
+ })
645
+ };
646
+ decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILAYOUTPROP), metadata)(target, propertyKey);
647
+ };
648
+ }
649
+ function uipageprop(page = 1) {
650
+ return function uipageprop(original, propertyKey) {
651
+ return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.PAGE), page)(original, propertyKey);
652
+ };
653
+ }
654
+ function uion(event, handler) {
655
+ return function uion(original, propertyKey) {
656
+ decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.EVENTS), {
657
+ ...typeof event === "object" ? event : {
658
+ [event]: handler
659
+ }
660
+ })(original, propertyKey);
661
+ };
662
+ }
663
+ function uionclick(handler) {
664
+ return uion("handleClick", handler);
665
+ }
666
+ function uionrender(handler) {
667
+ return uion("render", handler);
668
+ }
669
+ function uitablecol(sequence = UIKeys.LAST, valueParserFn) {
670
+ return (target, propertyKey) => {
671
+ const metadata = {
672
+ name: propertyKey,
673
+ props: {
674
+ sequence: sequence,
675
+ ...!valueParserFn ? {} : {
676
+ valueParserFn: valueParserFn
677
+ }
678
+ }
679
+ };
680
+ decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILISTPROP), metadata)(target, propertyKey);
681
+ };
682
+ }
683
+ class UIValidator extends decoratorValidation.Validator {
684
+ getMessage(message, ...args) {
685
+ if (UIValidator.translateService) return UIValidator.translateService.translate(message, ...args);
686
+ return super.getMessage(message, ...args);
687
+ }
688
+ }
689
+ class DecafComponent extends logging.LoggedClass {
690
+ constructor() {
691
+ super();
692
+ this.enableDarkMode = true;
693
+ this.isDarkMode = false;
694
+ this.item = {
695
+ tag: ""
696
+ };
697
+ this.props = {};
698
+ this.route = "";
699
+ this.borders = false;
700
+ this.OperationKeys = dbDecorators.OperationKeys;
701
+ this.initialized = false;
702
+ this.events = {};
703
+ this.handlers = {};
704
+ }
705
+ get repository() {
706
+ return this._repository;
707
+ }
708
+ set repository(repository) {
709
+ this._repository = repository;
710
+ }
711
+ async render(...args) {
712
+ this.log.for(this.render).info(`render for ${this.componentName} with ${JSON.stringify(args)}`);
713
+ }
714
+ async refresh(...args) {
715
+ this.log.for(this.refresh).info(`Refresh called with args: ${args}`);
716
+ }
717
+ async initialize(...args) {
718
+ this.initialized = true;
719
+ }
720
+ async translate(...args) {
721
+ this.log.for(this.translate).info(`translate for ${this.componentName} with ${JSON.stringify(args)}`);
722
+ }
723
+ async preview(...args) {
724
+ this.log.for(this.preview).debug(`Preview called with args: ${args}`);
725
+ }
726
+ async submit(...args) {
727
+ this.log.for(this.submit).info(`submit for ${this.componentName} with ${JSON.stringify(args)}`);
728
+ }
729
+ parseHandlers(handlers, instance) {
730
+ const result = {};
731
+ Object.entries(handlers).forEach(([key, fn]) => {
732
+ if (isClassConstructor(fn)) {
733
+ const clazz = new fn;
734
+ const event = key in clazz ? clazz[key] : clazz.handle;
735
+ result[key] = event;
736
+ instance.handlers[key] = event;
737
+ } else {
738
+ result[key] = fn;
739
+ instance.handlers[key] = fn;
740
+ }
741
+ });
742
+ return result;
743
+ }
744
+ parseEvents(events, instance) {
745
+ const result = {};
746
+ Object.entries(events).forEach(([key, fn]) => {
747
+ const name = key;
748
+ const evt = fn();
749
+ if (isClassConstructor(evt)) {
750
+ const fn = (new evt)[key];
751
+ if (fn) {
752
+ result[name] = fn;
753
+ instance.events[name] = fn;
754
+ }
755
+ } else {
756
+ result[name] = fn;
757
+ instance.events[name] = fn;
758
+ }
759
+ });
760
+ return result;
761
+ }
762
+ }
763
+ class DecafEventHandler extends DecafComponent {
764
+ constructor() {
765
+ super();
766
+ }
767
+ handle(...args) {
768
+ this.log.for(this.handle).info(`component ${this.componentName} handling ${JSON.stringify(args)}`);
769
+ }
770
+ handleClick(...args) {
771
+ this.log.for(this.handleClick).info(`component ${this.componentName} handling click ${JSON.stringify(args)}`);
772
+ }
773
+ handleAction(...args) {
774
+ this.log.for(this.handleAction).info(`component ${this.componentName} handling action ${JSON.stringify(args)}`);
775
+ }
776
+ }
777
+ class DecafTranslateService extends logging.LoggedClass {
778
+ translate(key, params) {
779
+ this.log.for(this.translate).info(`Must translate ${key} with params ${JSON.stringify(params || {})}`);
780
+ }
781
+ instant(key, params) {
782
+ this.log.for(this.instant).info(`Must translate ${key} with params ${JSON.stringify(params || {})}`);
783
+ }
784
+ }
785
+ decoratorValidation.Model.prototype.render = function(...args) {
786
+ return RenderingEngine.render(this, ...args);
787
+ };
788
+ decoratorValidation.Model.renderedBy = function(model) {
789
+ return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.RENDERED_BY));
790
+ }.bind(decoratorValidation.Model);
791
+ decoratorValidation.Model.uiPropertiesOf = function(model) {
792
+ const meta = decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES));
793
+ if (!meta) return undefined;
794
+ return Object.keys(meta);
795
+ }.bind(decoratorValidation.Model);
796
+ decoratorValidation.Model.uiDecorationOf = function(model, prop, key) {
797
+ const meta = decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES, prop));
798
+ if (!meta) return undefined;
799
+ if (!key) return meta;
800
+ return meta[key];
801
+ };
802
+ decoratorValidation.Model.uiModelOf = function(model) {
803
+ return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UIMODEL));
804
+ };
805
+ decoratorValidation.Model.uiElementOf = function(model, prop) {
806
+ return decoration.Metadata.get(model, getUIAttributeKey(prop, UIKeys.ELEMENT));
807
+ };
808
+ decoratorValidation.Model.uiListModelOf = function(model) {
809
+ return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UILISTMODEL));
810
+ };
811
+ decoratorValidation.Model.uiHandlersFor = function(model) {
812
+ return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.HANDLERS));
813
+ };
814
+ decoratorValidation.Model.uiLayoutOf = function(model) {
815
+ return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UILAYOUT));
816
+ };
817
+ decoratorValidation.Model.uiIsHidden = function(model, prop) {
818
+ return !!decoration.Metadata.get(model, getUIAttributeKey(prop, UIKeys.HIDDEN));
819
+ };
820
+ decoratorValidation.Model.uiIsHiddenOn = function(model, prop, op) {
821
+ const meta = decoration.Metadata.get(model, getUIAttributeKey(prop, UIKeys.HIDDEN));
822
+ if (!meta) return false;
823
+ if (!op) return meta;
824
+ return meta.includes(op);
825
+ };
826
+ decoratorValidation.Model.uiTypeOf = function(model, prop) {
827
+ const meta = decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES, prop));
828
+ if (!meta) throw new dbDecorators.NotFoundError(`No metadata found for property '${prop}' on model '${model.name}'`);
829
+ const keys = Object.keys(meta).filter(k => [ UIKeys.PROP, UIKeys.ELEMENT, UIKeys.CHILD ].includes(k));
830
+ if (keys.length === 0) throw new dbDecorators.NotFoundError(`No UI type metadata found for property '${prop}' on model '${model.name}'`);
831
+ if (keys.length > 1) throw new RenderingError(`Only one type of decoration is allowed. Please choose between @uiprop, @uichild or @uielement`);
832
+ return meta[keys[0]];
833
+ };
834
+ decoratorValidation.Model.uiListItems = function(model) {
835
+ const meta = decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES));
836
+ if (!meta) return undefined;
837
+ return Object.keys(meta);
838
+ }.bind(decoratorValidation.Model);
839
+ function uimodel(tag, props) {
840
+ return (original, propertyKey) => {
841
+ const meta = {
842
+ tag: tag || original.name,
843
+ props: props
844
+ };
845
+ return decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UIMODEL), meta)(original);
846
+ };
847
+ }
848
+ function renderedBy(engine) {
849
+ return decoration.apply(decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.RENDERED_BY), engine));
850
+ }
851
+ function uilistmodel(name, props) {
852
+ return (original, propertyKey) => {
853
+ const meta = {
854
+ item: {
855
+ tag: name || original.name,
856
+ props: props
857
+ }
858
+ };
859
+ return decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UILISTMODEL), meta)(original);
860
+ };
861
+ }
862
+ function uihandlers(props) {
863
+ return original => {
864
+ const meta = {
865
+ handlers: props
866
+ };
867
+ return decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.HANDLERS), meta)(original);
868
+ };
869
+ }
870
+ function uilayout(tag, colsMode = 1, rows = 1, props = {}) {
871
+ const config = Object.assign({
872
+ ...typeof colsMode === "boolean" ? {
873
+ flexMode: colsMode,
874
+ cols: 1
875
+ } : {
876
+ flexMode: false,
877
+ cols: colsMode
878
+ },
879
+ rows: rows,
880
+ ...Object.assign({
881
+ breakpoint: exports.UIMediaBreakPoints.LARGE
882
+ }, props)
883
+ });
884
+ return (original, propertyKey) => {
885
+ decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UILAYOUT), config)(original);
886
+ return uimodel(tag, config)(original, propertyKey);
887
+ };
888
+ }
889
+ function uisteppedmodel(tag, pages = 1, paginated = false, props = {}) {
890
+ let pageTitles = [];
891
+ if (typeof pages === "object") {
892
+ pageTitles = pages;
893
+ pages = pageTitles.length;
894
+ }
895
+ return uimodel(tag, {
896
+ pages: pages,
897
+ paginated: paginated,
898
+ pageTitles: pageTitles,
899
+ props: props
900
+ });
901
+ }
902
+ const prototype = decoratorValidation.ModelBuilder.prototype;
903
+ if (!prototype.decorateClass) {
904
+ prototype.decorateClass = function(decorator) {
905
+ if (!this._classDecorators) {
906
+ this._classDecorators = [];
907
+ }
908
+ this._classDecorators.push(decorator);
909
+ return this;
910
+ };
911
+ }
912
+ prototype.uimodel = function(tag, props) {
913
+ return this.decorateClass(uimodel(tag, props));
914
+ };
915
+ prototype.renderedBy = function(engine) {
916
+ return this.decorateClass(renderedBy(engine));
917
+ };
918
+ prototype.uilistmodel = function(name, props) {
919
+ return this.decorateClass(uilistmodel(name, props));
920
+ };
921
+ prototype.uihandlers = function(props) {
922
+ return this.decorateClass(uihandlers(props));
923
+ };
924
+ prototype.uilayout = function(tag, colsMode, rows, props) {
925
+ return this.decorateClass(uilayout(tag, colsMode, rows, props));
926
+ };
927
+ prototype.uisteppedmodel = function(tag, pages, paginated, props) {
928
+ return this.decorateClass(uisteppedmodel(tag, pages, paginated, props));
929
+ };
930
+ exports.DashKeys = void 0;
931
+ (function(DashKeys) {
932
+ DashKeys["ROOT"] = "dashboard";
933
+ DashKeys["COMPONENT"] = "dashboard.component";
934
+ })(exports.DashKeys || (exports.DashKeys = {}));
935
+ const DASH_COMPONENT_REGISTRY = new Set;
936
+ function registerDashComponent(ctor) {
937
+ DASH_COMPONENT_REGISTRY.add(ctor);
938
+ }
939
+ function dashComponents() {
940
+ return [ ...DASH_COMPONENT_REGISTRY ];
941
+ }
942
+ function resetDashComponentRegistry() {
943
+ DASH_COMPONENT_REGISTRY.clear();
944
+ }
945
+ function dashcomponent(tag, dash, props) {
946
+ function dashcomponent(tag, dash, props) {
947
+ const meta = {
948
+ tag: dash?.tag || tag,
949
+ ...dash,
950
+ defaultSize: dash?.defaultSize ?? {
951
+ cols: 1,
952
+ rows: 1
953
+ }
954
+ };
955
+ return function innerDashComponent(target) {
956
+ const result = decoration.apply(uimodel(tag, props), decoration.metadata(exports.DashKeys.COMPONENT, meta))(target);
957
+ registerDashComponent(target);
958
+ return result;
959
+ };
960
+ }
961
+ return decoration.Decoration.for(exports.DashKeys.COMPONENT).define({
962
+ decorator: dashcomponent,
963
+ args: [ tag, dash, props ]
964
+ }).apply();
965
+ }
966
+ function resolveModel(model) {
967
+ const resolved = decoration.Metadata.constr(model);
968
+ if (typeof resolved === "function") return resolved;
969
+ const fallback = model.constructor;
970
+ if (typeof fallback === "function") return fallback;
971
+ return model;
972
+ }
973
+ function dashComponentMetadataOf(model) {
974
+ const resolved = resolveModel(model);
975
+ return decoration.Metadata.get(resolved, exports.DashKeys.COMPONENT);
976
+ }
977
+ function dashComponentDefinitionOf(model) {
978
+ const resolved = resolveModel(model);
979
+ const meta = dashComponentMetadataOf(resolved) || {};
980
+ const tag = meta.tag || resolved.name;
981
+ return {
982
+ name: resolved.name,
983
+ tag: tag,
984
+ label: meta.label,
985
+ defaultSize: meta.defaultSize ?? {
986
+ cols: 1,
987
+ rows: 1
988
+ },
989
+ model: meta.model,
990
+ props: meta.props,
991
+ metadata: meta.metadata
992
+ };
993
+ }
994
+ const VERSION = "0.20.7";
995
+ const COMMIT = "f92e8d1";
996
+ const FULL_VERSION = "0.20.7-f92e8d1";
997
+ const PACKAGE_NAME = "@decaf-ts/ui-decorators";
998
+ decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
999
+ exports.ActionRoles = ActionRoles;
1000
+ exports.COMMIT = COMMIT;
1001
+ exports.ComponentEventNames = ComponentEventNames;
1002
+ exports.DecafComponent = DecafComponent;
1003
+ exports.DecafEventHandler = DecafEventHandler;
1004
+ exports.DecafTranslateService = DecafTranslateService;
1005
+ exports.ElementPositions = ElementPositions;
1006
+ exports.ElementSizes = ElementSizes;
1007
+ exports.FULL_VERSION = FULL_VERSION;
1008
+ exports.HTML5CheckTypes = HTML5CheckTypes;
1009
+ exports.HTML5DateFormat = HTML5DateFormat;
1010
+ exports.HTML5InputTypes = HTML5InputTypes;
1011
+ exports.LayoutGridGaps = LayoutGridGaps;
1012
+ exports.PACKAGE_NAME = PACKAGE_NAME;
1013
+ exports.RenderingEngine = RenderingEngine;
1014
+ exports.RenderingError = RenderingError;
1015
+ exports.TransactionHooks = TransactionHooks;
1016
+ exports.UIKeys = UIKeys;
1017
+ exports.UIValidator = UIValidator;
1018
+ exports.VERSION = VERSION;
1019
+ exports.ValidatableByAttribute = ValidatableByAttribute;
1020
+ exports.ValidatableByType = ValidatableByType;
1021
+ exports.WindowColorSchemes = WindowColorSchemes;
1022
+ exports.dashComponentDefinitionOf = dashComponentDefinitionOf;
1023
+ exports.dashComponentMetadataOf = dashComponentMetadataOf;
1024
+ exports.dashComponents = dashComponents;
1025
+ exports.dashcomponent = dashcomponent;
1026
+ exports.escapeHtml = escapeHtml;
1027
+ exports.formatByType = formatByType;
1028
+ exports.generateUIModelID = generateUIModelID;
1029
+ exports.getUIAttributeKey = getUIAttributeKey;
1030
+ exports.hidden = hidden;
1031
+ exports.hideFor = hideFor;
1032
+ exports.hideOn = hideOn;
1033
+ exports.isClassConstructor = isClassConstructor;
1034
+ exports.parseToNumber = parseToNumber;
1035
+ exports.parseValueByType = parseValueByType;
1036
+ exports.registerDashComponent = registerDashComponent;
1037
+ exports.renderIf = renderIf;
1038
+ exports.renderedBy = renderedBy;
1039
+ exports.resetDashComponentRegistry = resetDashComponentRegistry;
1040
+ exports.revertHtml = revertHtml;
1041
+ exports.showFor = showFor;
1042
+ exports.uichild = uichild;
1043
+ exports.uielement = uielement;
1044
+ exports.uihandlers = uihandlers;
1045
+ exports.uilayout = uilayout;
1046
+ exports.uilayoutprop = uilayoutprop;
1047
+ exports.uilistmodel = uilistmodel;
1048
+ exports.uilistprop = uilistprop;
1049
+ exports.uimodel = uimodel;
1050
+ exports.uion = uion;
1051
+ exports.uionclick = uionclick;
1052
+ exports.uionrender = uionrender;
1053
+ exports.uiorder = uiorder;
1054
+ exports.uipageprop = uipageprop;
1055
+ exports.uiprop = uiprop;
1056
+ exports.uisteppedmodel = uisteppedmodel;
1057
+ exports.uitablecol = uitablecol;
1058
+ });
1059
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZGVjb3JhdG9ycy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy91aS9jb25zdGFudHMudHMiLCIuLi9zcmMvdWkvZXJyb3JzLnRzIiwiLi4vc3JjL3VpL3V0aWxzLnRzIiwiLi4vc3JjL3VpL1JlbmRlcmluZy50cyIsIi4uL3NyYy91aS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3VpL1VJVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3VpL0RlY2FmQ29tcG9uZW50LnRzIiwiLi4vc3JjL3VpL0RlY2FmRXZlbnRIYW5kbGVyLnRzIiwiLi4vc3JjL3VpL0RlY2FmVHJhbnNsYXRlU2VydmljZS50cyIsIi4uL3NyYy9tb2RlbC9vdmVycmlkZXMudHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9vdmVycmlkZXMvTW9kZWxCdWlsZGVyRXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9kYXNoYm9hcmQvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Rhc2hib2FyZC9yZWdpc3RyeS50cyIsIi4uL3NyYy9kYXNoYm9hcmQvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9kYXNoYm9hcmQvcmVhZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyBhbmQgZW51bXMgZm9yIFVJIHJlbmRlcmluZyBhbmQgdmFsaWRhdGlvblxuICogQHN1bW1hcnkgRGVmaW5lcyBrZXlzLCBtYXBwaW5ncywgYW5kIEhUTUw1IGlucHV0IHR5cGVzIGZvciBVSSBjb21wb25lbnRzXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb25zdGFudHMgdXNlZCB0aHJvdWdob3V0IHRoZSBVSSBkZWNvcmF0b3JzIGxpYnJhcnkgZm9yXG4gKiByZW5kZXJpbmcsIHZhbGlkYXRpb24sIGFuZCBIVE1MIGVsZW1lbnQgZ2VuZXJhdGlvbi5cbiAqIEBtb2R1bGUgdWkvY29uc3RhbnRzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuXG5pbXBvcnQge1xuICBEYXRlVmFsaWRhdG9yLFxuICBEaWZmVmFsaWRhdG9yLFxuICBFbWFpbFZhbGlkYXRvcixcbiAgRXF1YWxzVmFsaWRhdG9yLFxuICBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG4gIEdyZWF0ZXJUaGFuVmFsaWRhdG9yLFxuICBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG4gIExlc3NUaGFuVmFsaWRhdG9yLFxuICBNYXhMZW5ndGhWYWxpZGF0b3IsXG4gIE1heFZhbGlkYXRvcixcbiAgTWluTGVuZ3RoVmFsaWRhdG9yLFxuICBNaW5WYWxpZGF0b3IsXG4gIFBhc3N3b3JkVmFsaWRhdG9yLFxuICBQYXR0ZXJuVmFsaWRhdG9yLFxuICBSZXF1aXJlZFZhbGlkYXRvcixcbiAgU3RlcFZhbGlkYXRvcixcbiAgVVJMVmFsaWRhdG9yLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgZW51bSBVSU1lZGlhQnJlYWtQb2ludHMge1xuICBTTUFMTCA9IFwic21hbGxcIixcbiAgTUVESVVNID0gXCJtZWRpdW1cIixcbiAgTEFSR0UgPSBcImxhcmdlXCIsXG4gIFhMQVJHRSA9IFwieGxhcmdlXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleSBjb25zdGFudHMgdXNlZCBmb3IgVUkgbWV0YWRhdGEgYW5kIHJlbmRlcmluZ1xuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RhbnRzIHVzZWQgYXMga2V5cyBmb3IgVUktcmVsYXRlZCBtZXRhZGF0YVxuICogVGhlc2Uga2V5cyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSByZWxhdGVkIHRvXG4gKiBVSSBtb2RlbHMsIGVsZW1lbnRzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsaWRhdGlvbiBydWxlcy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVSUtleXNUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIEJhc2UgcmVmbGVjdGlvbiBrZXkgZm9yIFVJIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlNT0RFTCAtIEtleSBmb3IgVUkgbW9kZWwgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRU5ERVJFRF9CWSAtIEtleSBmb3Igc3BlY2lmeWluZyByZW5kZXJpbmcgZW5naW5lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRUxFTUVOVCAtIEtleSBmb3IgZWxlbWVudCBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBST1AgLSBLZXkgZm9yIHByb3BlcnR5IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTkFNRSAtIEtleSBmb3IgbmFtZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOQU1FX1BSRUZJWCAtIFByZWZpeCBmb3IgaW5wdXQgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDVVNUT01fUFJPUFMgLSBLZXkgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIHByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVSUxJU1RNT0RFTCAtIEtleSBmb3IgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlMSVNUUFJPUCAtIEtleSBmb3IgbGlzdCBwcm9wZXJ0eSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgLSBLZXkgZm9yIHR5cGUgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVUJfVFlQRSAtIEtleSBmb3Igc3VidHlwZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJRERFTiAtIEtleSBmb3IgaGlkZGVuIGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZPUk1BVCAtIEtleSBmb3IgZm9ybWF0IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRF9PTkxZIC0gS2V5IGZvciByZWFkb25seSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCAtIEtleSBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTiAtIEtleSBmb3IgbWluaW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOX0xFTkdUSCAtIEtleSBmb3IgbWluaW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWCAtIEtleSBmb3IgbWF4aW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCAtIEtleSBmb3IgbWF4aW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBVFRFUk4gLSBLZXkgZm9yIHBhdHRlcm4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCAtIEtleSBmb3IgVVJMIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIC0gS2V5IGZvciBzdGVwIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIC0gS2V5IGZvciBkYXRlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCAtIEtleSBmb3IgZW1haWwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIC0gS2V5IGZvciBwYXNzd29yZCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUxTIC0gS2V5IGZvciBlcXVhbGl0eSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRiAtIEtleSBmb3IgZGlmZmVyZW5jZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOIC0gS2V5IGZvciBsZXNzIHRoYW4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IExFU1NfVEhBTl9PUl9FUVVBTCAtIEtleSBmb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU4gLSBLZXkgZm9yIGdyZWF0ZXIgdGhhbiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gR1JFQVRFUl9USEFOX09SX0VRVUFMIC0gS2V5IGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvblxuICpcbiAqIEBjb25zdCBVSUtleXNcbiAqIEB0eXBlIHtVSUtleXNUeXBlfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFVJS2V5cyA9IHtcbiAgUkVGTEVDVDogYHVpYCxcbiAgVUlNT0RFTDogXCJ1aW1vZGVsXCIsXG4gIFJFTkRFUkVEX0JZOiBcInJlbmRlcmVkLWJ5XCIsXG4gIEVMRU1FTlQ6IFwidWllbGVtZW50XCIsXG4gIFBST1A6IFwidWlwcm9wXCIsXG4gIENISUxEOiBcInVpY2hpbGRcIixcbiAgTkFNRTogXCJuYW1lXCIsXG4gIE5BTUVfUFJFRklYOiBcImlucHV0LVwiLFxuICBWQUxJREFUSU9OX01FU1NBR0U6IFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcblxuICBVSUxJU1RNT0RFTDogXCJ1aWxpc3Rtb2RlbFwiLFxuICBVSUxJU1RQUk9QOiBcInVpbGlzdHByb3BcIixcbiAgVUlMQVlPVVQ6IFwidWlsYXlvdXRcIixcbiAgVUlMQVlPVVRQUk9QOiBcInVpbGF5b3V0cHJvcFwiLFxuICBIQU5ETEVSUzogXCJoYW5kbGVyc1wiLFxuXG4gIFRZUEU6IFwidHlwZVwiLFxuICBTVUJfVFlQRTogXCJzdWJUeXBlXCIsXG5cbiAgSElEREVOOiBcImhpZGRlblwiLFxuICBISURFX0ZPUjogXCJoaWRlLWZvclwiLFxuICBTSE9XX0ZPUjogXCJzaG93LWZvclwiLFxuICBSRU5ERVJfSUY6IFwicmVuZGVyLWlmXCIsXG4gIEZPUk1BVDogXCJmb3JtYXRcIixcbiAgT1JERVI6IFwib3JkZXJcIixcbiAgUEFHRTogXCJwYWdlXCIsXG4gIEVWRU5UUzogXCJldmVudHNcIixcblxuICBGSVJTVDogXCJmaXJzdFwiLFxuICBMQVNUOiBcImxhc3RcIixcblxuICBSRUFEX09OTFk6IFwicmVhZG9ubHlcIixcbiAgU0VRVUVOQ0U6IFwic2VxdWVuY2VcIixcbiAgUkVRVUlSRUQ6IFZhbGlkYXRpb25LZXlzLlJFUVVJUkVELFxuICBNSU46IFZhbGlkYXRpb25LZXlzLk1JTixcbiAgTUlOX0xFTkdUSDogVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCxcbiAgTUFYOiBWYWxpZGF0aW9uS2V5cy5NQVgsXG4gIE1BWF9MRU5HVEg6IFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gIFBBVFRFUk46IFZhbGlkYXRpb25LZXlzLlBBVFRFUk4sXG4gIFVSTDogVmFsaWRhdGlvbktleXMuVVJMLFxuICBTVEVQOiBWYWxpZGF0aW9uS2V5cy5TVEVQLFxuICBEQVRFOiBWYWxpZGF0aW9uS2V5cy5EQVRFLFxuICBFTUFJTDogVmFsaWRhdGlvbktleXMuRU1BSUwsXG4gIFBBU1NXT1JEOiBWYWxpZGF0aW9uS2V5cy5QQVNTV09SRCxcbiAgRVFVQUxTOiBWYWxpZGF0aW9uS2V5cy5FUVVBTFMsXG4gIERJRkY6IFZhbGlkYXRpb25LZXlzLkRJRkYsXG4gIExFU1NfVEhBTjogVmFsaWRhdGlvbktleXMuTEVTU19USEFOLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTCxcbiAgR1JFQVRFUl9USEFOOiBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU4sXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDogVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBpbnB1dCB0eXBlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvcnNcbiAqIEBzdW1tYXJ5IE1hcHMgc3BlY2lhbCBpbnB1dCB0eXBlcyB0byB0aGVpciB2YWxpZGF0b3IgY2xhc3Nlc1xuICogVGhpcyBjb25zdGFudCBtYXBzIGlucHV0IHR5cGVzIGxpa2UgZW1haWwsIFVSTCwgZGF0ZSwgYW5kIHBhc3N3b3JkIHRvIHRoZWlyXG4gKiBjb3JyZXNwb25kaW5nIHZhbGlkYXRvciBjbGFzc2VzIGZyb20gdGhlIGRlY29yYXRvci12YWxpZGF0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYge09iamVjdC48c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+Pn0gVmFsaWRhdGFibGVCeVR5cGVNYXBcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RW1haWxWYWxpZGF0b3I+fSBlbWFpbCAtIFZhbGlkYXRvciBmb3IgZW1haWwgaW5wdXRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFVSTFZhbGlkYXRvcj59IHVybCAtIFZhbGlkYXRvciBmb3IgVVJMIGlucHV0c1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxEYXRlVmFsaWRhdG9yPn0gZGF0ZSAtIFZhbGlkYXRvciBmb3IgZGF0ZSBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UGFzc3dvcmRWYWxpZGF0b3I+fSBwYXNzd29yZCAtIFZhbGlkYXRvciBmb3IgcGFzc3dvcmQgaW5wdXRzXG4gKlxuICogQGNvbnN0IFZhbGlkYXRhYmxlQnlUeXBlXG4gKiBAdHlwZSB7VmFsaWRhdGFibGVCeVR5cGVNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVmFsaWRhdGFibGVCeVR5cGU6IFJlY29yZDxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+ID0ge1xuICBbVUlLZXlzLkVNQUlMXTogRW1haWxWYWxpZGF0b3IsXG4gIFtVSUtleXMuVVJMXTogVVJMVmFsaWRhdG9yLFxuICBbVUlLZXlzLkRBVEVdOiBEYXRlVmFsaWRhdG9yLFxuICBbVUlLZXlzLlBBU1NXT1JEXTogUGFzc3dvcmRWYWxpZGF0b3IsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIHZhbGlkYXRpb24gYXR0cmlidXRlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvcnNcbiAqIEBzdW1tYXJ5IE1hcHMgSFRNTCB2YWxpZGF0aW9uIGF0dHJpYnV0ZXMgdG8gdGhlaXIgdmFsaWRhdG9yIGNsYXNzZXNcbiAqIFRoaXMgY29uc3RhbnQgbWFwcyBIVE1MIHZhbGlkYXRpb24gYXR0cmlidXRlcyBsaWtlIHJlcXVpcmVkLCBtaW4sIG1heCwgcGF0dGVybiwgZXRjLlxuICogdG8gdGhlaXIgY29ycmVzcG9uZGluZyB2YWxpZGF0b3IgY2xhc3NlcyBmcm9tIHRoZSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3QuPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj59IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVNYXBcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UmVxdWlyZWRWYWxpZGF0b3I+fSByZXF1aXJlZCAtIFZhbGlkYXRvciBmb3IgcmVxdWlyZWQgZmllbGRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1pblZhbGlkYXRvcj59IG1pbiAtIFZhbGlkYXRvciBmb3IgbWluaW11bSB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNYXhWYWxpZGF0b3I+fSBtYXggLSBWYWxpZGF0b3IgZm9yIG1heGltdW0gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8U3RlcFZhbGlkYXRvcj59IHN0ZXAgLSBWYWxpZGF0b3IgZm9yIHN0ZXAgdmFsdWVcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWluTGVuZ3RoVmFsaWRhdG9yPn0gbWlubGVuZ3RoIC0gVmFsaWRhdG9yIGZvciBtaW5pbXVtIGxlbmd0aFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNYXhMZW5ndGhWYWxpZGF0b3I+fSBtYXhsZW5ndGggLSBWYWxpZGF0b3IgZm9yIG1heGltdW0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFBhdHRlcm5WYWxpZGF0b3I+fSBwYXR0ZXJuIC0gVmFsaWRhdG9yIGZvciByZWdleCBwYXR0ZXJuXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEVxdWFsc1ZhbGlkYXRvcj59IGVxdWFscyAtIFZhbGlkYXRvciBmb3IgZXF1YWxpdHlcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RGlmZlZhbGlkYXRvcj59IGRpZmYgLSBWYWxpZGF0b3IgZm9yIGRpZmZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TGVzc1RoYW5WYWxpZGF0b3I+fSBsZXNzdGhhbiAtIFZhbGlkYXRvciBmb3IgbGVzcyB0aGFuIGNvbXBhcmlzb25cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yPn0gbGVzc3RoYW5vcmVxdWFsIC0gVmFsaWRhdG9yIGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxHcmVhdGVyVGhhblZhbGlkYXRvcj59IGdyZWF0ZXJ0aGFuIC0gVmFsaWRhdG9yIGZvciBncmVhdGVyIHRoYW4gY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3I+fSBncmVhdGVydGhhbm9yZXF1YWwgLSBWYWxpZGF0b3IgZm9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gKlxuICogQGNvbnN0IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVcbiAqIEB0eXBlIHtWYWxpZGF0YWJsZUJ5QXR0cmlidXRlTWFwfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGU6IFJlY29yZDxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+ID0ge1xuICBbVUlLZXlzLlJFUVVJUkVEXTogUmVxdWlyZWRWYWxpZGF0b3IsXG4gIFtVSUtleXMuTUlOXTogTWluVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1BWF06IE1heFZhbGlkYXRvcixcbiAgW1VJS2V5cy5TVEVQXTogU3RlcFZhbGlkYXRvcixcbiAgW1VJS2V5cy5NSU5fTEVOR1RIXTogTWluTGVuZ3RoVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1BWF9MRU5HVEhdOiBNYXhMZW5ndGhWYWxpZGF0b3IsXG4gIFtVSUtleXMuUEFUVEVSTl06IFBhdHRlcm5WYWxpZGF0b3IsXG4gIFtVSUtleXMuRVFVQUxTXTogRXF1YWxzVmFsaWRhdG9yLFxuICBbVUlLZXlzLkRJRkZdOiBEaWZmVmFsaWRhdG9yLFxuICBbVUlLZXlzLkxFU1NfVEhBTl06IExlc3NUaGFuVmFsaWRhdG9yLFxuICBbVUlLZXlzLkxFU1NfVEhBTl9PUl9FUVVBTF06IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgW1VJS2V5cy5HUkVBVEVSX1RIQU5dOiBHcmVhdGVyVGhhblZhbGlkYXRvcixcbiAgW1VJS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdOiBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGFuZGFyZCBkYXRlIGZvcm1hdCBzdHJpbmcgZm9yIEhUTUw1IGRhdGUgaW5wdXRzXG4gKiBAc3VtbWFyeSBGb3JtYXQgc3RyaW5nIGZvciBIVE1MNSBkYXRlIGlucHV0cyAoeXl5eS1NTS1kZClcbiAqIFRoaXMgY29uc3RhbnQgZGVmaW5lcyB0aGUgc3RhbmRhcmQgZGF0ZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIEhUTUw1IGRhdGUgaW5wdXRzLlxuICpcbiAqIEBjb25zdCBIVE1MNURhdGVGb3JtYXRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVEYXRlRm9ybWF0ID0gXCJ5eXl5LU1NLWRkXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbGxlY3Rpb24gb2YgSFRNTDUgaW5wdXQgdHlwZSB2YWx1ZXNcbiAqIEBzdW1tYXJ5IE1hcHMgaW5wdXQgdHlwZSBjb25zdGFudHMgdG8gdGhlaXIgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzXG4gKiBUaGlzIGNvbnN0YW50IHByb3ZpZGVzIGEgbWFwcGluZyBvZiBpbnB1dCB0eXBlIGNvbnN0YW50cyB0byB0aGVpciBjb3JyZXNwb25kaW5nXG4gKiBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIHVzZSBpbiBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEhUTUw1SW5wdXRUeXBlc01hcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJVVFRPTiAtIEJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ0hFQ0tCT1ggLSBDaGVja2JveCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ09MT1IgLSBDb2xvciBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEUgLSBEYXRlIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURVRJTUVfTE9DQUwgLSBMb2NhbCBkYXRldGltZSBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIC0gRW1haWwgaW5wdXQgdHlwZSB3aXRoIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBGSUxFIC0gRmlsZSB1cGxvYWQgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJRERFTiAtIEhpZGRlbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU1BR0UgLSBJbWFnZSBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9OVEggLSBNb250aCBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTUJFUiAtIE51bWVyaWMgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIC0gUGFzc3dvcmQgaW5wdXQgdHlwZSB3aXRoIG1hc2tlZCB0ZXh0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkFESU8gLSBSYWRpbyBidXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJBTkdFIC0gUmFuZ2Ugc2xpZGVyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVNFVCAtIEZvcm0gcmVzZXQgYnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRUFSQ0ggLSBTZWFyY2ggaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNVQk1JVCAtIEZvcm0gc3VibWl0IGJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVEVMIC0gVGVsZXBob25lIG51bWJlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVEVYVCAtIEJhc2ljIHRleHQgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRJTUUgLSBUaW1lIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVVJMIC0gVVJMIGlucHV0IHR5cGUgd2l0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gV0VFSyAtIFdlZWsgcGlja2VyIGlucHV0IHR5cGVcbiAqXG4gKiBAY29uc3QgSFRNTDVJbnB1dFR5cGVzXG4gKiBAdHlwZSB7SFRNTDVJbnB1dFR5cGVzTWFwfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEhUTUw1SW5wdXRUeXBlcyA9IHtcbiAgQlVUVE9OOiBcImJ1dHRvblwiLFxuICBDSEVDS0JPWDogXCJjaGVja2JveFwiLFxuICBDT0xPUjogXCJjb2xvclwiLFxuICBEQVRFOiBVSUtleXMuREFURSxcbiAgREFURVRJTUVfTE9DQUw6IFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgRU1BSUw6IFVJS2V5cy5FTUFJTCxcbiAgRklMRTogXCJmaWxlXCIsXG4gIEhJRERFTjogXCJoaWRkZW5cIixcbiAgSU1BR0U6IFwiaW1hZ2VcIixcbiAgTU9OVEg6IFwibW9udGhcIixcbiAgTlVNQkVSOiBcIm51bWJlclwiLFxuICBQQVNTV09SRDogVUlLZXlzLlBBU1NXT1JELFxuICBSQURJTzogXCJyYWRpb1wiLFxuICBSQU5HRTogXCJyYW5nZVwiLFxuICBSRVNFVDogXCJyZXNldFwiLFxuICBTRUFSQ0g6IFwic2VhcmNoXCIsXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgVEVMOiBcInRlbFwiLFxuICBURVhUOiBcInRleHRcIixcbiAgVEVYVEFSRUE6IFwidGV4dGFyZWFcIixcbiAgU0VMRUNUOiBcInNlbGVjdFwiLFxuICBUSU1FOiBcInRpbWVcIixcbiAgVVJMOiBVSUtleXMuVVJMLFxuICBXRUVLOiBcIndlZWtcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIEhUTUw1IGlucHV0IHR5cGVzIHRoYXQgdXNlIGNoZWNrYm94ZXNcbiAqIEBzdW1tYXJ5IExpc3Qgb2YgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnQgY2hlY2thYmxlIGNvbnRyb2xzXG4gKiBUaGlzIGNvbnN0YW50IGRlZmluZXMgYW4gYXJyYXkgb2YgSFRNTDUgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnRcbiAqIGNoZWNrYWJsZSBjb250cm9scyAoY2hlY2tib3ggYW5kIHJhZGlvKS5cbiAqXG4gKiBAY29uc3QgSFRNTDVDaGVja1R5cGVzXG4gKiBAdHlwZSB7c3RyaW5nW119XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVDaGVja1R5cGVzOiBzdHJpbmdbXSA9IFtcbiAgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YLFxuICBIVE1MNUlucHV0VHlwZXMuUkFESU8sXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBuYW1lIGNvbnN0YW50cy5cbiAqIEBzdW1tYXJ5IENvbnRhaW5zIGNvbnN0YW50cyBmb3Igc3RhbmRhcmRpemVkIGV2ZW50IG5hbWVzIHVzZWQgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKiBUaGVzZSBjb25zdGFudHMgZW5zdXJlIGNvbnNpc3RlbnQgZXZlbnQgbmFtaW5nIGFjcm9zcyBjb21wb25lbnRzIGFuZCBtYWtlIGl0IGVhc2llciB0b1xuICogdHJhY2sgYW5kIGhhbmRsZSBldmVudHMuIEVhY2ggY29uc3RhbnQgcmVwcmVzZW50cyBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIGV2ZW50IHR5cGUuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb21wb25lbnRFdmVudE5hbWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQmFja0J1dHRvbkNsaWNrRXZlbnQgLSBFdmVudCBmaXJlZCB3aGVuIGJhY2sgYnV0dG9uIG5hdmlnYXRpb24gZW5kc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJlbmRlciAtIEV2ZW50IGFmdGVyIGNvbXBvbmVudCBpbml0aWFsaXplIGFjdGlvbiBvY2N1cnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSZWZyZXNoIC0gRXZlbnQgZmlyZWQgd2hlbiBhIHJlZnJlc2ggYWN0aW9uIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IENsaWNrIC0gRXZlbnQgZmlyZWQgd2hlbiBhIGNsaWNrIGFjdGlvbiBvY2N1cnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDaGFuZ2UgLSBFdmVudCBmaXJlZCB3aGVuIGEgY2hhbmdlIGFjdGlvbiBvY2N1cnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTdWJtaXQgLSBFdmVudCBmaXJlZCB3aGVuIGEgZm9ybSBzdWJtaXNzaW9uIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFZhbGlkYXRpb25FcnJvciAtIEV2ZW50IGZpcmVkIHdoZW4gYSB2YWxpZGF0aW9uIGVycm9yIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFRoZW1lQ2hhbmdlIC0gRXZlbnQgZmlyZWQgd2hlbiBhIHRoZW1lIGNoYW5nZSBvY2N1cnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBGb3JtR3JvdXBMb2FkZWQgLSBFdmVudCBmaXJlZCB3aGVuIGEgcmVhY3R2ZSBmb3JtIGdyb3VwIGlzIGxvYWRlZFxuICogQGNvbnN0IENvbXBvbmVudEV2ZW50TmFtZXNcbiAqL1xuZXhwb3J0IGNvbnN0IENvbXBvbmVudEV2ZW50TmFtZXMgPSB7XG4gIFJlbmRlcjogXCJyZW5kZXJcIixcbiAgQmFja0J1dHRvbkNsaWNrRXZlbnQ6IFwiYmFja0J1dHRvbk5hdmlnYXRpb25FbmRFdmVudFwiLFxuICBSZWZyZXNoOiBcIlJlZnJlc2hFdmVudFwiLFxuICBDbGljazogXCJDbGlja0V2ZW50XCIsXG4gIENoYW5nZTogXCJDaGFuZ2VFdmVudFwiLFxuICBTdWJtaXQ6IFwiU3VibWl0RXZlbnRcIixcbiAgVmFsaWRhdGlvbkVycm9yOiBcInZhbGlkYXRpb25FcnJvckV2ZW50XCIsXG4gIFRoZW1lQ2hhbmdlOiBcInRoZW1lQ2hhbmdlRXZlbnRcIixcbiAgRm9ybUdyb3VwTG9hZGVkOiBcImZvcm1Hcm91cExvYWRlZEV2ZW50XCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayBsYWJlbHMgZm9yIHJlcG9zaXRvcnkgdHJhbnNhY3Rpb25zLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgY2Fub25pY2FsIG5hbWVzIGZvciBDUlVEIGxpZmVjeWNsZSBjYWxsYmFja3Mgc28gZGVjb3JhdG9ycyBhbmRcbiAqIGNvbXBvbmVudHMgY2FuIHJlZ2lzdGVyIHdvcmsgYmVmb3JlIG9yIGFmdGVyIHJlcG9zaXRvcnkgb3BlcmF0aW9ucyBpbiBhIGNvbnNpc3RlbnQgd2F5LlxuICogRWFjaCBrZXkgbWFwcyB0byB0aGUgc3RyaW5nIHVzZWQgd2hlbiB3aXJpbmcgdHJhbnNhY3Rpb24gbWlkZGxld2FyZS5cbiAqIEBjb25zdCBUcmFuc2FjdGlvbkhvb2tzXG4gKi9cbmV4cG9ydCBjb25zdCBUcmFuc2FjdGlvbkhvb2tzID0ge1xuICBCZWZvcmVSZWFkOiBcImJlZm9yZVJlYWRcIixcbiAgQWZ0ZXJSZWFkOiBcImFmdGVyUmVhZFwiLFxuICBCZWZvcmVDcmVhdGU6IFwiYmVmb3JlQ3JlYXRlXCIsXG4gIEFmdGVyQ3JlYXRlOiBcImFmdGVyQ3JlYXRlXCIsXG4gIEJlZm9yZVVwZGF0ZTogXCJiZWZvcmVVcGRhdGVcIixcbiAgQWZ0ZXJVcGRhdGU6IFwiYWZ0ZXJVcGRhdGVcIixcbiAgQmVmb3JlRGVsZXRlOiBcImJlZm9yZURlbGV0ZVwiLFxuICBBZnRlckRlbGV0ZTogXCJhZnRlckRlbGV0ZVwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhbmRhcmRpemVkIHNpemUgdG9rZW5zIGZvciBVSSBlbGVtZW50cy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHNlbWFudGljIHNpemUga2V5d29yZHMgc3VwcG9ydGVkIGJ5IGxheW91dCBhbmQgZm9ybSBkZWNvcmF0b3JzLlxuICogVGhlc2UgdmFsdWVzIGZlZWQgcmVuZGVyaW5nIGVuZ2luZXMgc28gY29tcG9uZW50cyBjYW4gZXhwcmVzcyBzaXppbmcgaW4gYSB1bmlmb3JtIHZvY2FidWxhcnkuXG4gKiBAY29uc3QgRWxlbWVudFNpemVzXG4gKi9cbmV4cG9ydCBjb25zdCBFbGVtZW50U2l6ZXMgPSB7XG4gIHhzbWFsbDogXCJ4c21hbGxcIixcbiAgc21hbGw6IFwic21hbGxcIixcbiAgbWVkaXVtOiBcIm1lZGl1bVwiLFxuICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgbGFyZ2U6IFwibGFyZ2VcIixcbiAgeExhcmdlOiBcInhsYXJnZVwiLFxuICBcIjJ4TGFyZ2VcIjogXCIyeGxhcmdlXCIsXG4gIGF1dG86IFwiYXV0b1wiLFxuICBleHBhbmQ6IFwiZXhwYW5kXCIsXG4gIGJsb2NrOiBcImJsb2NrXCIsXG4gIGhhbGY6IFwiaGFsZlwiLFxuICBmdWxsOiBcImZ1bGxcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFsaWdubWVudCBrZXl3b3JkcyBmb3IgZWxlbWVudCBwb3NpdGlvbmluZy5cbiAqIEBzdW1tYXJ5IFN1cHBsaWVzIGNhbm9uaWNhbCBwb3NpdGlvbiB2YWx1ZXMgKGhvcml6b250YWwgYW5kIHZlcnRpY2FsKSB0aGF0IGRlY29yYXRvcnMgY2FuXG4gKiB1c2Ugd2hlbiBhbGlnbmluZyBsYWJlbHMsIGNvbnRyb2xzLCBvciBoZWxwZXIgdGV4dCBhY3Jvc3MgY29tcG9uZW50cy5cbiAqIEBjb25zdCBFbGVtZW50UG9zaXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBFbGVtZW50UG9zaXRpb25zID0ge1xuICBsZWZ0OiBcImxlZnRcIixcbiAgY2VudGVyOiBcImNlbnRlclwiLFxuICByaWdodDogXCJyaWdodFwiLFxuICB0b3A6IFwidG9wXCIsXG4gIGJvdHRvbTogXCJib3R0b21cIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdyaWQgc3BhY2luZyBwcmVzZXRzIGZvciBsYXlvdXQgZGVjb3JhdG9ycy5cbiAqIEBzdW1tYXJ5IE1hcHMgaHVtYW4tcmVhZGFibGUgZ2FwIHNpemVzIHRvIHRoZSB0b2tlbnMgaW50ZXJwcmV0ZWQgYnkgdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAqIHdoZW4gYnVpbGRpbmcgQ1NTIGdyaWQgbGF5b3V0cywgZW5hYmxpbmcgcHJlZGljdGFibGUgc3BhY2luZyBhY3Jvc3MgY29tcG9uZW50cy5cbiAqIEBjb25zdCBMYXlvdXRHcmlkR2Fwc1xuICovXG5leHBvcnQgY29uc3QgTGF5b3V0R3JpZEdhcHMgPSB7XG4gIHNtYWxsOiBcInNtYWxsXCIsXG4gIG1lZGl1bTogXCJtZWRpdW1cIixcbiAgbGFyZ2U6IFwibGFyZ2VcIixcbiAgY29sbGFwc2U6IFwiY29sbGFwc2VcIixcbiAgbm9uZTogXCJcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhbm9uaWNhbCBhY3Rpb24gcm9sZSBpZGVudGlmaWVycyBmb3IgVUkgY29udHJvbHMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzZW1hbnRpYyByb2xlcyBhIGJ1dHRvbiBvciBhY3Rpb24gbWF5IHJlcHJlc2VudCBzbyBkZWNvcmF0b3JzIGFuZFxuICogcmVuZGVyZXJzIGNhbiBhdHRhY2ggY29uc2lzdGVudCBiZWhhdmlvcnMgYW5kIHN0eWxpbmcgKGluY2x1ZGluZyBDUlVEIHZlcmJzIHRpZWQgdG9cbiAqIGBPcGVyYXRpb25LZXlzYCkuXG4gKiBAY29uc3QgQWN0aW9uUm9sZXNcbiAqL1xuZXhwb3J0IGNvbnN0IEFjdGlvblJvbGVzID0ge1xuICBjYW5jZWw6IFwiY2FuY2VsXCIsXG4gIGNvbmZpcm06IFwiY29uZmlybVwiLFxuICBzdWJtaXQ6IFwic3VibWl0XCIsXG4gIGNsZWFyOiBcImNsZWFyXCIsXG4gIGJhY2s6IFwiYmFja1wiLFxuICBbT3BlcmF0aW9uS2V5cy5DUkVBVEVdOiBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgW09wZXJhdGlvbktleXMuUkVBRF06IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgW09wZXJhdGlvbktleXMuVVBEQVRFXTogT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gIFtPcGVyYXRpb25LZXlzLkRFTEVURV06IE9wZXJhdGlvbktleXMuREVMRVRFLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWxsb3dlZCBjb2xvciBzY2hlbWUgdG9rZW5zIGZvciB3aW5kb3dlZCBzdXJmYWNlcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBzdXBwb3J0ZWQgdGhlbWUgaWRlbnRpZmllcnMgZXhwb3NlZCB0byBjb25zdW1pbmcgYXBwcyBzbyB0aGV5XG4gKiBjYW4gdGFyZ2V0IGxpZ2h0LCBkYXJrLCBvciB1bnNldCB3aW5kb3cgY29sb3Igc2NoZW1lcyBpbiBhIHByZWRpY3RhYmxlIHdheS5cbiAqIEBjb25zdCBXaW5kb3dDb2xvclNjaGVtZXNcbiAqL1xuZXhwb3J0IGNvbnN0IFdpbmRvd0NvbG9yU2NoZW1lcyA9IHtcbiAgbGlnaHQ6IFwibGlnaHRcIixcbiAgZGFyazogXCJkYXJrXCIsXG4gIHVuZGVmaW5lZDogXCJ1bmRlZmluZWRcIixcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgcmVuZGVyaW5nIG9wZXJhdGlvbiBmYWlsc1xuICogQHN1bW1hcnkgU3BlY2lhbGl6ZWQgZXJyb3IgZm9yIHJlbmRlcmluZyBmYWlsdXJlcyBpbiBVSSBjb21wb25lbnRzXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSByZW5kZXJpbmcgZW5naW5lIGVuY291bnRlcnMgYW4gZXJyb3Igd2hpbGVcbiAqIGF0dGVtcHRpbmcgdG8gcmVuZGVyIGEgVUkgY29tcG9uZW50IG9yIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAqXG4gKiBAY2xhc3MgUmVuZGVyaW5nRXJyb3JcbiAqIEBleHRlbmRzIEJhc2VFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvd2luZyBhIHJlbmRlcmluZyBlcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUmVuZGVyaW5nIGNvZGUgdGhhdCBtaWdodCBmYWlsXG4gKiAgIGlmICghY29tcG9uZW50LmNhblJlbmRlcigpKSB7XG4gKiAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKCdDb21wb25lbnQgY2Fubm90IGJlIHJlbmRlcmVkJyk7XG4gKiAgIH1cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoJ1JlbmRlcmluZyBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJpbmdFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUmVuZGVyaW5nRXJyb3IgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGVycm9yIHdpdGggYSBtZXNzYWdlIG9yIG9yaWdpbmFsIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFJlbmRlcmluZ0Vycm9yLm5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBmb3JtYXREYXRlLFxuICBNb2RlbCxcbiAgcGFyc2VEYXRlLFxuICBSZXNlcnZlZE1vZGVscyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSFRNTDVEYXRlRm9ybWF0LCBIVE1MNUlucHV0VHlwZXMsIFVJS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRmllbGRQcm9wZXJ0aWVzLCBVSUZ1bmN0aW9uTGlrZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbktleXMsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICpcbiAqIFR5cGUgZ3VhcmQgdGhhdCB2ZXJpZmllcyBpZiBhIHByb3ZpZGVkIFVJIGZ1bmN0aW9uLWxpa2UgdmFsdWUgaXMgYSBjbGFzcyBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ2xhc3NDb25zdHJ1Y3RvciA9IDxDPihcbiAgZm46IFVJRnVuY3Rpb25MaWtlIHwgQ29uc3RydWN0b3I8Qz5cbik6IGZuIGlzIENvbnN0cnVjdG9yPEM+ID0+IHtcbiAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiICYmIC9eY2xhc3NcXHMvLnRlc3QoU3RyaW5nKGZuKSk7XG59O1xuXG4vKipcbiAqIERlcml2ZXMgdGhlIG1ldGFkYXRhIGtleSBmb3IgYSBVSSBhdHRyaWJ1dGUgb24gYSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHByb3AgLSBQcm9wZXJ0eSBuYW1lIGRlY29yYXRlZCBvbiB0aGUgVUkgbW9kZWwuXG4gKiBAcGFyYW0ga2V5IC0gQXR0cmlidXRlIGlkZW50aWZpZXIgc3RvcmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIEZ1bGx5IHF1YWxpZmllZCBtZXRhZGF0YSBrZXkgc2NvcGVkIHRvIGBVSUtleXMuUkVGTEVDVGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVSUF0dHJpYnV0ZUtleShwcm9wOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMsIHByb3AsIGtleSk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uIGZvcm1hdEJ5VHlwZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QnlUeXBlKFxuICB0eXBlOiBhbnksXG4gIHZhbHVlOiBhbnksXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgaWYgKHR5cGUgPT09IFVJS2V5cy5EQVRFKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgZm9ybWF0OiBzdHJpbmcgPSAoYXJncy5zaGlmdCgpIGFzIHN0cmluZykgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgIHJldHVybiBmb3JtYXREYXRlKG5ldyBEYXRlKHZhbHVlKSwgZm9ybWF0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlQnlUeXBlKFxuICB0eXBlOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gIGZpZWxkUHJvcHM6IEZpZWxkUHJvcGVydGllc1xuKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XG4gIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgQXJyYXkubmFtZToge1xuICAgICAgY29uc3QgcGFyc2VkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS5tYXAoKHYpID0+XG4gICAgICAgICAgICBwYXJzZVZhbHVlQnlUeXBlKFxuICAgICAgICAgICAgICBSZXNlcnZlZE1vZGVscy5TVFJJTkcubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICB2LFxuICAgICAgICAgICAgICBmaWVsZFByb3BzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IFt2YWx1ZV07XG4gICAgICByZXN1bHQgPSBwYXJzZWQuam9pbihcIixcIik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgcmVzdWx0ID0gcGFyc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFOiB7XG4gICAgICBjb25zdCBmb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGZpZWxkUHJvcHMuZm9ybWF0O1xuICAgICAgaWYgKHZhbHVlICYmIGAke3ZhbHVlfWAudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gUmVzZXJ2ZWRNb2RlbHMuTlVNQkVSLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgPyBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgPyBmb3JtYXRcbiAgICAgICAgICAgICAgICA/IHBhcnNlRGF0ZShmb3JtYXQsIHZhbHVlKVxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXN1bHQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFJlc2VydmVkTW9kZWxzLk9CSkVDVC5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA/IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLmpvaW4oXCIsXCIpXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5CT09MRUFOLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFJlc2VydmVkTW9kZWxzLlNUUklORy5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgPyBlc2NhcGVIdG1sKHZhbHVlIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgOiByZXN1bHQ7XG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgdmFsdWUgb2YgdHlwZSAke3R5cGV9IGZyb20gJHt0eXBlb2YgdmFsdWV9IC0gJHt2YWx1ZX1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb051bWJlcih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIGlmICghaXNOYU4ocGFyc2VkKSkgcmV0dXJuIHBhcnNlZDtcblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJlwiOiBcIiZhbXA7XCIsXG4gICAgXCI8XCI6IFwiJmx0O1wiLFxuICAgIFwiPlwiOiBcIiZndDtcIixcbiAgfTtcbiAgcmV0dXJuIGAke3ZhbHVlfWAucmVwbGFjZSgvWyY8Pl0vZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldmVydEh0bWwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJmFtcDtcIjogXCImXCIsXG4gICAgXCImbHQ7XCI6IFwiPFwiLFxuICAgIFwiJmd0O1wiOiBcIj5cIixcbiAgfTtcblxuICByZXR1cm4gYCR7dmFsdWV9YC5yZXBsYWNlKC8mbHQ7fCZndDt8JmFtcDsvZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVUlNb2RlbElEPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgbGV0IGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xuICAgIGlmIChwaylcbiAgICAgIGlkID0gbW9kZWxbXG4gICAgICAgIE1vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSBhcyBrZXlvZiB0eXBlb2YgbW9kZWxcbiAgICAgIF0gYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIGRvIG5vdGhpbmc7XG4gIH1cbiAgY29uc3QgbmFtZSA9IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gIHJldHVybiBgJHtuYW1lfS0ke2lkfWA7XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBIVE1MNURhdGVGb3JtYXQsXG4gIEhUTUw1SW5wdXRUeXBlcyxcbiAgVUlLZXlzLFxuICBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlLFxuICBWYWxpZGF0YWJsZUJ5VHlwZSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9uS2V5cyxcbiAgRGVjYWZTcGlubmVyT3B0aW9ucyxcbiAgRGVjYWZUb2FzdE9wdGlvbnMsXG4gIEZpZWxkRGVmaW5pdGlvbixcbiAgRmllbGRQcm9wZXJ0aWVzLFxuICBVSUNsYXNzTWV0YWRhdGEsXG4gIFVJRWxlbWVudE1ldGFkYXRhLFxuICBVSUxpc3RJdGVtRWxlbWVudE1ldGFkYXRhLFxuICBVSUxpc3RQcm9wTWV0YWRhdGEsXG4gIFVJTW9kZWxNZXRhZGF0YSxcbiAgVUlQcm9wTWV0YWRhdGEsXG4gIElQYWdlZENvbXBvbmVudFByb3BlcnRpZXMsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgZm9ybWF0QnlUeXBlLCBnZW5lcmF0ZVVJTW9kZWxJRCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBQcmltaXRpdmVzLFxuICBSZXNlcnZlZE1vZGVscyxcbiAgVmFsaWRhdGlvbktleXMsXG4gIFZhbGlkYXRpb25NZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSURlY2FmTW9kYWwgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lEZWNhZk1vZGFsXCI7XG5pbXBvcnQgeyBEZWNhZkNvbXBvbmVudCB9IGZyb20gXCIuL0RlY2FmQ29tcG9uZW50XCI7XG5cbmltcG9ydCB7IElEZWNhZlNwaW5uZXIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lEZWNhZlNwaW5uZXJcIjtcbmltcG9ydCB7IElEZWNhZlJvdXRlciB9IGZyb20gXCIuL2ludGVyZmFjZXMvSURlY2FmUm91dGVyXCI7XG5pbXBvcnQgeyBJRGVjYWZUb2FzdCB9IGZyb20gXCIuL2ludGVyZmFjZXMvSURlY2FmVG9hc3RcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgY2xhc3MgZm9yIHJlbmRlcmluZyBVSSBjb21wb25lbnRzIGJhc2VkIG9uIG1vZGVsIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgVGhlIFJlbmRlcmluZ0VuZ2luZSBjbGFzcyBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgY29udmVydGluZyBtb2RlbCBtZXRhZGF0YSBpbnRvIFVJIGZpZWxkIGRlZmluaXRpb25zLlxuICogSXQgaGFuZGxlcyB0aGUgdHJhbnNsYXRpb24gb2YgbW9kZWwgcHJvcGVydGllcyB0byBVSSBlbGVtZW50cywgYXBwbGllcyB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgbWFuYWdlcyBkaWZmZXJlbnQgcmVuZGVyaW5nIGZsYXZvcnMuXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIGJ5IHNwZWNpZmljIHJlbmRlcmluZyBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyByZXN1bHQsIGRlZmF1bHRzIHRvIHZvaWRcbiAqIEB0ZW1wbGF0ZSBSIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCBkZWZpbml0aW9uLCBkZWZhdWx0cyB0byBGaWVsZERlZmluaXRpb248VD5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3Igb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gKlxuICogQGNsYXNzIFJlbmRlcmluZ0VuZ2luZVxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGJhc2UgYWJzdHJhY3Rpb24gZm9yIGRlY2FmIHJlbmRlcmluZyBlbmdpbmVzLCBoYW5kbGluZyBlbmdpbmUgcmVnaXN0cmF0aW9uLFxuICogaW5pdGlhbGl6YXRpb24sIG1vZGVsLXRvLWZpZWxkIHRyYW5zbGF0aW9uLCBhbmQgcnVudGltZSByZW5kZXJpbmcgb3JjaGVzdHJhdGlvbi5cbiAqIEltcGxlbWVudGF0aW9ucyBtdXN0IHByb3ZpZGUgaW5pdGlhbGl6YXRpb24gYW5kIHJlbmRlcmluZyBsb2dpYyB3aGlsZSBsZXZlcmFnaW5nIHRoZSBzaGFyZWRcbiAqIG1ldGFkYXRhLWRyaXZlbiBjb252ZXJzaW9uIHV0aWxpdGllcyBzdXBwbGllZCBoZXJlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVuZGVyaW5nRW5naW5lPFQgPSB2b2lkLCBSID0gRmllbGREZWZpbml0aW9uPFQ+PiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2FjaGUgZm9yIHN0b3JpbmcgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZXMgb3IgY29uc3RydWN0b3JzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPj5cbiAgICB8IFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudGx5IGFjdGl2ZSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OlxuICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+PlxuICAgIHwgUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVuZGVyaW5nIGVuZ2luZSBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihyZWFkb25seSBmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICBSZW5kZXJpbmdFbmdpbmUucmVnaXN0ZXIodGhpcyk7XG4gICAgY29uc29sZS5sb2coYGRlY2FmJ3MgJHtmbGF2b3VyfSByZW5kZXJpbmcgZW5naW5lIGxvYWRlZGApO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0TW9kYWw8QyBleHRlbmRzIERlY2FmQ29tcG9uZW50PE1vZGVsPj4oXG4gICAgY29tcG9uZW50OiBQYXJ0aWFsPEM+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8SURlY2FmTW9kYWw+O1xuXG4gIGFic3RyYWN0IGdldFRvYXN0KG9wdGlvbnM6IERlY2FmVG9hc3RPcHRpb25zKTogUHJvbWlzZTxJRGVjYWZUb2FzdD47XG5cbiAgYWJzdHJhY3QgZ2V0U3Bpbm5lcihvcHRpb25zOiBEZWNhZlNwaW5uZXJPcHRpb25zKTogUHJvbWlzZTxJRGVjYWZTcGlubmVyPjtcblxuICBhYnN0cmFjdCByb3V0ZXIoKTogSURlY2FmUm91dGVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIGZvciBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBuZWVkZWQgZm9yIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0ZXMgYmV0d2VlbiBtb2RlbCB0eXBlcyBhbmQgSFRNTCBpbnB1dCB0eXBlcy5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgbW9kZWwgZGF0YSB0eXBlcyB0byBhcHByb3ByaWF0ZSBIVE1MIGlucHV0IHR5cGVzIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byB0cmFuc2xhdGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvVmlldz10cnVlXSAtIERpcmVjdGlvbiBvZiB0cmFuc2xhdGlvbiAodHJ1ZSBmb3IgbW9kZWwgdG8gdmlldywgZmFsc2UgZm9yIHZpZXcgdG8gbW9kZWwpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdHJhbnNsYXRlZCB0eXBlLlxuICAgKi9cbiAgdHJhbnNsYXRlKGtleTogc3RyaW5nLCB0b1ZpZXc6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBpZiAodG9WaWV3KSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLlNUUklORy5uYW1lLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5URVhUO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLk5VTUJFUi5uYW1lLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuQklHSU5ULm5hbWUudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLk5VTUJFUjtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CT09MRUFOLm5hbWUudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkRBVEUubmFtZS50b0xvd2VyQ2FzZSgpOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuREFURTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuU0VMRUNUOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URVhUOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5FTUFJTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuQ09MT1I6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlBBU1NXT1JEOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlVSTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuU0VBUkNIOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5ISURERU46XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRFWFRBUkVBOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5SQURJTzpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5OVU1CRVIubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5DSEVDS0JPWDpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTi5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEVUSU1FX0xPQ0FMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5USU1FOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5EQVRFLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGNsYXNzIGRlY29yYXRvciBtZXRhZGF0YSBmb3IgYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyBVSS1yZWxhdGVkIGNsYXNzIGRlY29yYXRvcnMgZnJvbSBhIG1vZGVsIGFuZCByZXR1cm5zIHRoZW0gYXMgYW4gYXJyYXlcbiAgICogVGhpcyBtZXRob2QgY29sbGVjdHMgbWV0YWRhdGEgZnJvbSB2YXJpb3VzIFVJIGNsYXNzIGRlY29yYXRvcnMgaW5jbHVkaW5nIEB1aW1vZGVsLFxuICAgKiBAdWlsaXN0bW9kZWwsIEB1aWhhbmRsZXJzLCBhbmQgQHVpbGF5b3V0IGFwcGxpZWQgdG8gdGhlIG1vZGVsIGNsYXNzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbVxuICAgKiBAcmV0dXJucyB7VUlDbGFzc01ldGFkYXRhW119IEFycmF5IG9mIFVJIGNsYXNzIG1ldGFkYXRhIG9iamVjdHNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0Q2xhc3NEZWNvcmF0b3JzTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTVxuICApOiBVSUNsYXNzTWV0YWRhdGFbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIE1vZGVsLnVpTW9kZWxPZihtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPiksXG4gICAgICBNb2RlbC51aUxpc3RNb2RlbE9mKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSxcbiAgICAgIE1vZGVsLnVpSGFuZGxlcnNGb3IobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pLFxuICAgICAgTW9kZWwudWlMYXlvdXRPZihtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPiksXG4gICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgVUlDbGFzc01ldGFkYXRhW107XG4gIH1cblxuICBwcml2YXRlIHNvcnRDaGlsZHJlbkJ5T3JkZXIoY2hpbGRyZW46IEZpZWxkRGVmaW5pdGlvbjxhbnk+W10gPSBbXSkge1xuICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhT3JkZXIgPSBhLnByb3BzPy5vcmRlciA/PyAwO1xuICAgICAgY29uc3QgYk9yZGVyID0gYi5wcm9wcz8ub3JkZXIgPz8gMDtcbiAgICAgIGNvbnN0IHdlaWdodCA9ICh2OiBudW1iZXIgfCBzdHJpbmcpID0+XG4gICAgICAgIHYgPT09IFVJS2V5cy5GSVJTVFxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogdHlwZW9mIHYgPT09IFByaW1pdGl2ZXMuTlVNQkVSXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogdiA9PT0gVUlLZXlzLkxBU1RcbiAgICAgICAgICAgICAgPyAvL1RPRE86IHJldmlldyB0aGlzXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ubGVuZ3RoICsgY2hpbGRyZW4uaW5kZXhPZihiKVxuICAgICAgICAgICAgICA6IDE7XG5cbiAgICAgIGNvbnN0IGFXZWlnaHQgPSB3ZWlnaHQoYU9yZGVyKTtcbiAgICAgIGNvbnN0IGJXZWlnaHQgPSB3ZWlnaHQoYk9yZGVyKTtcbiAgICAgIGlmIChhV2VpZ2h0ICE9PSBiV2VpZ2h0KSB7XG4gICAgICAgIHJldHVybiBhV2VpZ2h0IC0gYldlaWdodDtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBhV2VpZ2h0ID09PSAxICYmXG4gICAgICAgIHR5cGVvZiBhT3JkZXIgPT09IFByaW1pdGl2ZXMuTlVNQkVSICYmXG4gICAgICAgIHR5cGVvZiBiT3JkZXIgPT09IFByaW1pdGl2ZXMuTlVNQkVSXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWxpZGF0aW9uIGtleSByZXByZXNlbnRzIGEgY3VzdG9tIHZhbGlkYXRvciAoaS5lLiwgbm90IGEgYnVpbHQtaW4gdmFsaWRhdGlvbiBvciBVSSBrZXkpLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGtleSBjb3JyZXNwb25kcyB0byBhIHVzZXItZGVmaW5lZCB2YWxpZGF0b3IgYnkgZXhjbHVkaW5nIGFsbCBidWlsdC1pbiBWYWxpZGF0aW9uS2V5cyBhbmQgVUlLZXlzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHZhbGlkYXRpb24ga2V5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUga2V5IGlzIGEgY3VzdG9tIHZhbGlkYXRvciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUga2V5IGlzIG5vdCBhIGJ1aWx0LWluIHZhbGlkYXRpb24ga2V5IG9yIFVJIGtleSAoaS5lLiBpcyBjdXN0b20pLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNDdXN0b21WYWxpZGF0b3Ioa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIU9iamVjdC52YWx1ZXMoVmFsaWRhdGlvbktleXMpLmluY2x1ZGVzKFxuICAgICAgICBrZXkgYXMgKHR5cGVvZiBWYWxpZGF0aW9uS2V5cylba2V5b2YgdHlwZW9mIFZhbGlkYXRpb25LZXlzXVxuICAgICAgKSAmJiAhT2JqZWN0LnZhbHVlcyhVSUtleXMpLmluY2x1ZGVzKGtleSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGl0cyBuYXR1cmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBVSSBrZXkgcmVwcmVzZW50cyBhIHR5cGUgdGhhdCBpcyBpbmhlcmVudGx5IHZhbGlkYXRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFVJIGtleSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdmFsaWRhdGFibGUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkYXRhYmxlQnlUeXBlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlUeXBlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFVJIGtleSByZXByZXNlbnRzIGEgdmFsaWRhdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBVSSBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB2YWxpZGF0aW9uIG1ldGFkYXRhIHRvIGFuIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgVHJhbnNmb3JtcyB2YWxpZGF0aW9uIG1ldGFkYXRhIGludG8gYSB2YWx1ZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIEhUTUwgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHZhbGlkYXRpb24ga2V5LlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25NZXRhZGF0YX0gdmFsdWUgLSBUaGUgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW59IFRoZSBjb252ZXJ0ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGtleSBpcyBub3QgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvQXR0cmlidXRlVmFsdWUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFZhbGlkYXRpb25NZXRhZGF0YVxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmluY2x1ZGVzKGtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGF0dHJpYnV0ZSBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgb25lIG9mOiAke09iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmpvaW4oXCIsIFwiKX0uYFxuICAgICAgKTtcblxuICAgIHJldHVybiBrZXkgPT09IFVJS2V5cy5SRVFVSVJFRCA/IHRydWUgOiB2YWx1ZVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIG1vZGVsIHRvIGEgZmllbGQgZGVmaW5pdGlvbi5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgbW9kZWwgaW5zdGFuY2UsIGV4dHJhY3RpbmcgVUktcmVsYXRlZCBtZXRhZGF0YSBhbmQgdmFsaWRhdGlvbiBydWxlcyB0byBjcmVhdGUgYSBmaWVsZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIHJlZmVyZW5jaW5nIHRoZSBzcGVjaWZpYyBSZW5kZXJpbmcgZW5naW5lIGZpZWxkIHByb3BlcnRpZXMvaW5wdXRzXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY29udmVydC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2dsb2JhbFByb3BzPXt9XSAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCBlbGVtZW50cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZ2VuZXJhdGVJZD10cnVlXSAtIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHBvcHVsYXRlIHRoZSByZW5kZXJlcklkIHByb3BlcnR5LlxuICAgKiBAcmV0dXJucyB7RmllbGREZWZpbml0aW9uPFQ+fSBBIGZpZWxkIGRlZmluaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVUkgc3RydWN0dXJlIG9mIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7UmVuZGVyaW5nRXJyb3J9IElmIG5vIFVJIGRlZmluaXRpb25zIGFyZSBzZXQgZm9yIHRoZSBtb2RlbCBvciBpZiB0aGVyZSBhcmUgaW52YWxpZCBkZWNvcmF0b3JzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gICAqICBwYXJ0aWNpcGFudCBSRSBhcyBSZW5kZXJpbmdFbmdpbmVcbiAgICogIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdGlvblxuICAgKiAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgQy0+PlJFOiB0b0ZpZWxkRGVmaW5pdGlvbihtb2RlbCwgZ2xvYmFsUHJvcHMpXG4gICAqICBSRS0+PlI6IGdldE1ldGFkYXRhKFVJS2V5cy5VSU1PREVMLCBtb2RlbC5jb25zdHJ1Y3RvcilcbiAgICogIFItLT4+UkU6IFVJTW9kZWxNZXRhZGF0YVxuICAgKiAgUkUtPj5SOiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFVJS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT5cbiAgICogIFJFLT4+UjogZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdPlxuICAgKiAgbG9vcCBGb3IgZWFjaCBwcm9wZXJ0eVxuICAgKiAgICBSRS0+PlJFOiBQcm9jZXNzIFVJIGRlY29yYXRvcnNcbiAgICogICAgUkUtPj5SRTogQXBwbHkgdmFsaWRhdGlvbiBydWxlc1xuICAgKiAgZW5kXG4gICAqICBSRS0tPj5DOiBGaWVsZERlZmluaXRpb248VD5cbiAgICovXG4gIHByb3RlY3RlZCB0b0ZpZWxkRGVmaW5pdGlvbjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIGdsb2JhbFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGdlbmVyYXRlSWQ6IGJvb2xlYW4gPSB0cnVlXG4gICk6IEZpZWxkRGVmaW5pdGlvbjxUPiB7XG4gICAgY29uc3QgeyBpbmhlcml0UHJvcHMsIC4uLmdsb2JhbFByb3BzV2l0aG91dEluaGVyaXRzIH0gPSBnbG9iYWxQcm9wcztcbiAgICBnbG9iYWxQcm9wcyA9IGdsb2JhbFByb3BzV2l0aG91dEluaGVyaXRzO1xuXG4gICAgY29uc3QgY2xhc3NEZWNvcmF0b3JzID0gdGhpcy5nZXRDbGFzc0RlY29yYXRvcnNNZXRhZGF0YTxNPihtb2RlbCk7XG5cbiAgICBpZiAoIWNsYXNzRGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoXG4gICAgICAgIGBObyB1aSBkZWZpbml0aW9ucyBzZXQgZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0uIERpZCB5b3UgdXNlIEB1aW1vZGVsP2BcbiAgICAgICk7XG5cbiAgICBjb25zdCBjbGFzc0RlY29yYXRvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIC4uLmNsYXNzRGVjb3JhdG9ycyxcbiAgICAgIGluaGVyaXRQcm9wcyA/IGluaGVyaXRQcm9wcyA6IHt9IC8vIG92ZXJyaWRlIHRhZyBhbmQgcHJvcGVydGllcyB3aGVuIGl0IGlzIGEgY29tcG9uZW50IHRoYXQgc2hvdWxkIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIGl0cyBwYXJlbnQuXG4gICAgKTtcbiAgICBjb25zdCB7IHRhZywgcHJvcHMsIGl0ZW0sIGhhbmRsZXJzIH0gPSBjbGFzc0RlY29yYXRvcjtcblxuICAgIGNvbnN0IHVpRGVjb3JhdG9ycyA9IE1vZGVsLnVpUHJvcGVydGllc09mKFxuICAgICAgbW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT5cbiAgICApIGFzIChrZXlvZiBNKVtdO1xuXG4gICAgLy8gY29uc3QgdWlEZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiA9XG4gICAgLy8gICBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVUlLZXlzLlJFRkxFQ1QpIGFzIFJlY29yZDxcbiAgICAvLyAgICAgc3RyaW5nLFxuICAgIC8vICAgICBEZWNvcmF0b3JNZXRhZGF0YVtdXG4gICAgLy8gICA+O1xuICAgIGxldCBjaGlsZHJlbjogRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+W10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNoaWxkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBpdGVtPy5wcm9wcyB8fCB7fTtcbiAgICBsZXQgbWFwcGVyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZ2V0UGF0aCA9IChwYXJlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gcGFyZW50ID8gW3BhcmVudCwgcHJvcF0uam9pbihcIi5cIikgOiBwcm9wO1xuICAgIH07XG5cbiAgICBpZiAodWlEZWNvcmF0b3JzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4gICAgICAgICkgfHwge307XG4gICAgICAvLyBjb25zdCB2YWxpZGF0aW9uRGVjb3JhdG9yczogUmVjb3JkPFxuICAgICAgLy8gICBzdHJpbmcsXG4gICAgICAvLyAgIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXVxuICAgICAgLy8gPiA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgLy8gICBtb2RlbCxcbiAgICAgIC8vICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVFxuICAgICAgLy8gKSBhcyBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10+O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgdWlEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSBNb2RlbC51aURlY29yYXRpb25PZihcbiAgICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPixcbiAgICAgICAgICBrZXlcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHR5cGU6IGFueTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgdHlwZSA9IE1vZGVsLnVpVHlwZU9mKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+LCBrZXkpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyhkZWNzKS5maWx0ZXIoKHsga2V5IH0pID0+XG4gICAgICAgIC8vICAgW1VJS2V5cy5QUk9QLCBVSUtleXMuRUxFTUVOVCwgVUlLZXlzLkNISUxEXS5pbmNsdWRlcyhrZXkpXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGlmICghdHlwZSlcbiAgICAgICAgLy8gICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoXG4gICAgICAgIC8vICAgICBgT25seSBvbmUgdHlwZSBvZiBkZWNvcmF0aW9uIGlzIGFsbG93ZWQuIFBsZWFzZSBjaG9vc2UgYmV0d2VlbiBAdWlwcm9wLCBAdWljaGlsZCBvciBAdWllbGVtZW50YFxuICAgICAgICAvLyAgICk7XG4gICAgICAgIGNvbnN0IGhhc0hpZGVPbkRlY29yYXRvciA9IE1vZGVsLnVpSXNIaWRkZW4oXG4gICAgICAgICAgbW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4sXG4gICAgICAgICAga2V5XG4gICAgICAgICk7XG4gICAgICAgIGlmIChoYXNIaWRlT25EZWNvcmF0b3IpIHtcbiAgICAgICAgICBjb25zdCBoYXNVaUVsZW1lbnREZWNvcmF0b3IgPSBNb2RlbC51aUVsZW1lbnRPZihcbiAgICAgICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+LFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWhhc1VpRWxlbWVudERlY29yYXRvcilcbiAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgICAgICAgYEB1aWVsZW1lbnQgbm8gZm91bmQgaW4gXCIke2tleSBhcyBzdHJpbmd9XCIuIEl0IGlzIHJlcXVpcmVkIHRvIHVzZSBoaWRkZW5PbiBkZWNvcmF0b3IuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0ZWQgPSBPYmplY3QuZW50cmllcyhkZWNzKVxuICAgICAgICAgIC5tYXAoKFtrLCB2XSkgPT4gKHtcbiAgICAgICAgICAgIGtleTogayxcbiAgICAgICAgICAgIHByb3BzOiB2LFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIC5zb3J0KChhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW1VJS2V5cy5FTEVNRU5ULCBVSUtleXMuQ0hJTERdLmluY2x1ZGVzKGEua2V5KSA/IC0xIDogMTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgc29ydGVkLmZvckVhY2goKGRlYykgPT4ge1xuICAgICAgICAgIGlmICghZGVjKSB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYE5vIGRlY29yYXRvciBmb3VuZGApO1xuXG4gICAgICAgICAgc3dpdGNoIChkZWMua2V5KSB7XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5QUk9QOiB7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHNba2V5IGFzIGFueV0gPSBkZWMucHJvcHMgYXMgVUlQcm9wTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuQ0hJTEQ6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW9kZWxOYW1lID1cbiAgICAgICAgICAgICAgICAoZGVjLnByb3BzIGFzIFVJTW9kZWxNZXRhZGF0YSk/LnByb3BzPy5uYW1lIHx8IChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1Byb3BlcnR5TW9kZWwgPVxuICAgICAgICAgICAgICAgICAgTW9kZWwuaXNNb2RlbChNb2RlbC5idWlsZCh7fSwgbW9kZWxOYW1lKSkgfHxcbiAgICAgICAgICAgICAgICAgIE1vZGVsLmlzUHJvcGVydHlNb2RlbChtb2RlbCwgbW9kZWxOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzUHJvcGVydHlNb2RlbClcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENoaWxkIFwiJHttb2RlbE5hbWUgYXMgc3RyaW5nfVwiIG11c3QgYmUgYSBtb2RlbC5gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBDaGlsZCBcIiR7bW9kZWxOYW1lIGFzIHN0cmluZ31cIiBtdXN0IGJlIGEgbW9kZWwuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgQ2xheno7XG4gICAgICAgICAgICAgIGNvbnN0IHN1Ym1vZGVsID0gKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW1xuICAgICAgICAgICAgICAgIGtleSBhcyBhbnlcbiAgICAgICAgICAgICAgXSBhcyBNb2RlbDtcbiAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0YWJsZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHN1Ym1vZGVsID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzdWJtb2RlbCk7XG4gICAgICAgICAgICAgIC8vIGNyZWF0ZSBpbnN0YW5jZSBpZiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhenpOYW1lID0gKFxuICAgICAgICAgICAgICAgICAgKGRlYy5wcm9wcyBhcyBhbnkpLnByb3BzIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICAgICAgICApPy5uYW1lIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBDbGF6eiA9IG5ldyAoTW9kZWwuZ2V0KGNsYXp6TmFtZSkgYXMgTW9kZWxDb25zdHJ1Y3RvcjxNb2RlbD4pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbkdsb2JhbFByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBnbG9iYWxQcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICB7IG1vZGVsOiBDbGF6eiB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRQcm9wczogZGVjLnByb3BzIGFzIFVJTW9kZWxNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgIGNoaWxkT2Y6IGdldFBhdGgoXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAga2V5IGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IHRoaXMudG9GaWVsZERlZmluaXRpb24oXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgfHwgQ2xhenosIC8vIE11c3QgYXZvaWQgdW5kZWZpbmVkIHZhbHVlcyDigJQgYW4gaW5zdGFuY2UgaXMgcmVxdWlyZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgICBjaGlsZHJlbkdsb2JhbFByb3BzLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaW5oZXJpdFByb3BzIH0gPSBjaGlsZHJlbkdsb2JhbFByb3BzO1xuICAgICAgICAgICAgICBpZiAoaW5oZXJpdFByb3BzKVxuICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wcyxcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRQcm9wcy5wcm9wcyB8fCB7fVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uIGFzIEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlVJTElTVFBST1A6IHtcbiAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyIHx8IHt9O1xuICAgICAgICAgICAgICBjb25zdCBkZWNQcm9wcyA9IGRlYy5wcm9wcyBhcyBVSUxpc3RQcm9wTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGlmIChkZWNQcm9wcy5uYW1lKVxuICAgICAgICAgICAgICAgIG1hcHBlcltkZWNQcm9wcy5uYW1lXSA9XG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZGVjUHJvcHM/LnByb3BzID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgICBVSUtleXMuU0VRVUVOQ0UgaW4gZGVjUHJvcHMucHJvcHNcbiAgICAgICAgICAgICAgICAgICAgPyBkZWNQcm9wcy5wcm9wc1xuICAgICAgICAgICAgICAgICAgICA6IGtleTtcblxuICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgY2xhc3NEZWNvcmF0b3IucHJvcHM/Lml0ZW0gfHwge30sXG4gICAgICAgICAgICAgICAgaXRlbT8ucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgZGVjUHJvcHM/LnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgdGFnOiBpdGVtPy50YWcgfHwgcHJvcHMucmVuZGVyIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkUHJvcHM/LnByb3BzLCB7IG1hcHBlciB9LCBwcm9wcyksXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5FVkVOVFM6XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5ISURERU46XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5ISURFX0ZPUjpcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlNIT1dfRk9SOlxuICAgICAgICAgICAgY2FzZSBVSUtleXMuUEFHRTpcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLk9SREVSOlxuICAgICAgICAgICAgY2FzZSBVSUtleXMuVUlMQVlPVVRQUk9QOlxuICAgICAgICAgICAgY2FzZSBVSUtleXMuRUxFTUVOVDoge1xuICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgICAgICAgICAgICBjb25zdCB1aVByb3BzOiBVSUVsZW1lbnRNZXRhZGF0YSA9IGRlYy5wcm9wcyBhcyBVSUVsZW1lbnRNZXRhZGF0YTtcbiAgICAgICAgICAgICAgY29uc3QgdmlzaWJpbGl0eVByb3BzID1cbiAgICAgICAgICAgICAgICBkZWMua2V5ID09PSBVSUtleXMuSElERV9GT1JcbiAgICAgICAgICAgICAgICAgID8geyBoaWRlRm9yOiBkZWMucHJvcHMgYXMgc3RyaW5nW10gfVxuICAgICAgICAgICAgICAgICAgOiBkZWMua2V5ID09PSBVSUtleXMuU0hPV19GT1JcbiAgICAgICAgICAgICAgICAgICAgPyB7IHNob3dGb3I6IGRlYy5wcm9wcyBhcyBzdHJpbmdbXSB9XG4gICAgICAgICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBjaGlsZFByb3BzPy5wcm9wcyxcbiAgICAgICAgICAgICAgICB1aVByb3BzLnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlQcm9wcyxcbiAgICAgICAgICAgICAgICB1aVByb3BzPy5wcm9wcz8ubmFtZVxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgcGF0aDogZ2V0UGF0aChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMhLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2Y6IHVuZGVmaW5lZCwgLy8gVGhlIGNoaWxkT2YgcHJvcCBpcyBwYXNzZWQgYnkgZ2xvYmFsUHJvcHMgd2hlbiBpdCBpcyBhIG5lc3RlZCBwcm9wXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDoge30sXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHMsXG4gICAgICAgICAgICAgICAgeyBuYW1lOiB1aVByb3BzLnByb3BzPy5uYW1lIHx8IGtleSB9XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKGRlYy5rZXkgPT09IFVJS2V5cy5FTEVNRU5UKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGREZWZpbml0aW9uOiBGaWVsZERlZmluaXRpb248UmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gICAgICAgICAgICAgICAgICB0YWc6IHVpUHJvcHMudGFnIHx8IGNoaWxkUHJvcHM/LnRhZyB8fCB0YWcgfHwgXCJcIixcbiAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkRlY3MgPSB2YWxpZGF0aW9uRGVjb3JhdG9yc1tcbiAgICAgICAgICAgICAgICAgIGtleSBhcyBhbnlcbiAgICAgICAgICAgICAgICBdIGFzIFZhbGlkYXRpb25NZXRhZGF0YVtdO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRGVjcykge1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgT2JqZWN0LmVudHJpZXModmFsaWRhdGlvbkRlY3MpLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKFtrLCB2XSkgPT4gKHsga2V5OiBrLCBwcm9wczogdiB9KVxuICAgICAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbdGhpcy50cmFuc2xhdGUoZGVjLmtleSldID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9BdHRyaWJ1dGVWYWx1ZShkZWMua2V5LCBkZWMucHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGVCeVR5cGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjLmtleSA9PT0gSFRNTDVJbnB1dFR5cGVzLkRBVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuRk9STUFUXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlYy5wcm9wcy5mb3JtYXQgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdID0gZGVjLmtleTtcbiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0N1c3RvbVZhbGlkYXRvcihkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIHByb3BzW1VJS2V5cy5TVUJfVFlQRV0gPSBkZWMua2V5O1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWMucHJvcHM/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzW1VJS2V5cy5WQUxJREFUSU9OX01FU1NBR0VdID0gZGVjLnByb3BzLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY1R5cGUgPSBNZXRhZGF0YS50eXBlKFxuICAgICAgICAgICAgICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAga2V5IGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgKS5uYW1lO1xuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSA9IHRoaXMudHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgICAgICBiYXNpY1R5cGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHMudmFsdWUgPSBmb3JtYXRCeVR5cGUoXG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdLFxuICAgICAgICAgICAgICAgICAgbW9kZWxba2V5IGFzIGtleW9mIE1dLFxuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5GT1JNQVRdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uZmluZChcbiAgICAgICAgICAgICAgICAoYykgPT5cbiAgICAgICAgICAgICAgICAgIGMucHJvcHM/Lm5hbWUgPT09IGtleSB8fFxuICAgICAgICAgICAgICAgICAgKFtVSUtleXMuVUlMQVlPVVRQUk9QLCBVSUtleXMuUEFHRSwgVUlLZXlzLkVWRU5UU10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgIGRlYy5rZXlcbiAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGMucHJvcHM/LmNoaWxkT2YgPT09IGtleSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGMucHJvcHM/LmNoaWxkT2Y/LmVuZHNXaXRoKGAuJHtrZXkgYXMgc3RyaW5nfWApKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRlYy5rZXkgPT09IFVJS2V5cy5ISURFX0ZPUiB8fFxuICAgICAgICAgICAgICAgICAgICBkZWMua2V5ID09PSBVSUtleXMuU0hPV19GT1JcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkLnByb3BzLCB2aXNpYmlsaXR5UHJvcHMpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWMua2V5ICE9PSBVSUtleXMuVUlMQVlPVVRQUk9QKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgY2hpbGQucHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICBbZGVjLmtleV06IHVpUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByb3csIGNvbCwgcHJvcHMgfSA9IGRlYy5wcm9wcyBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgICAgICAgY29sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKGBJbnZhbGlkIGtleTogJHtkZWMua2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgZ2xvYmFsUHJvcHMsIHtcbiAgICAgIGhhbmRsZXJzOiBoYW5kbGVycyB8fCB7fSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGN1cnJlbnROYW1lc3BhY2VzID0gbmV3IFNldChcbiAgICAgIFtcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZ2xvYmFsUHJvcHM/Lm5hbWVzcGFjZXMpXG4gICAgICAgICAgPyAoZ2xvYmFsUHJvcHMubmFtZXNwYWNlcyBhcyBzdHJpbmdbXSlcbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHR5cGVvZiBnbG9iYWxQcm9wcz8ubmFtZXNwYWNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBbZ2xvYmFsUHJvcHMubmFtZXNwYWNlIGFzIHN0cmluZ11cbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBnbG9iYWxQcm9wcz8ub3BlcmF0aW9uO1xuICAgIGNoaWxkcmVuID0gdGhpcy5zb3J0Q2hpbGRyZW5CeU9yZGVyKGNoaWxkcmVuKS5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGhpZGRlbk9uID0gKGl0ZW0/LnByb3BzPy5oaWRkZW4gYXMgQ3J1ZE9wZXJhdGlvbktleXNbXSkgfHwgW107XG4gICAgICBpZiAoXG4gICAgICAgIGhpZGRlbk9uLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgaGlkZGVuT24uaW5jbHVkZXMob3BlcmF0aW9uIGFzIENydWRPcGVyYXRpb25LZXlzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGlkZUZvciA9IChpdGVtPy5wcm9wcz8uaGlkZUZvciBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgICBjb25zdCBzaG93Rm9yID0gKGl0ZW0/LnByb3BzPy5zaG93Rm9yIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgaGlkZUZvci5sZW5ndGggPiAwICYmXG4gICAgICAgIFsuLi5jdXJyZW50TmFtZXNwYWNlc10uc29tZSgobmFtZXNwYWNlKSA9PiBoaWRlRm9yLmluY2x1ZGVzKG5hbWVzcGFjZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBzaG93Rm9yLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgIVsuLi5jdXJyZW50TmFtZXNwYWNlc10uc29tZSgobmFtZXNwYWNlKSA9PiBzaG93Rm9yLmluY2x1ZGVzKG5hbWVzcGFjZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0OiBGaWVsZERlZmluaXRpb248VD4gPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIGl0ZW06IGNoaWxkUHJvcHMgYXMgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgICAgIHByb3BzOiBnbG9iYWxQcm9wcyBhcyBUICYgRmllbGRQcm9wZXJ0aWVzICYgSVBhZ2VkQ29tcG9uZW50UHJvcGVydGllcyxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgID8gKGNoaWxkcmVuIGFzIEZpZWxkRGVmaW5pdGlvbjxhbnk+W10pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBpZiAoZ2VuZXJhdGVJZCkgcmVzdWx0LnJlbmRlcmVySWQgPSBnZW5lcmF0ZVVJTW9kZWxJRChtb2RlbCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVuZGVycyBhIG1vZGVsIHdpdGggZ2xvYmFsIHByb3BlcnRpZXMgYW5kIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBkZWZpbmUgc3BlY2lmaWMgcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiBSZW5kZXJpbmcgZW5naW5lIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIG91dHB1dCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGdsb2JhbFByb3BzIC0gR2xvYmFsIHByb3BlcnRpZXMgdG8gYmUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMgZHVyaW5nIHJlbmRlcmluZy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgbWF5IGJlIHJlcXVpcmVkIGZvciBzcGVjaWZpYyByZW5kZXJpbmcgaW1wbGVtZW50YXRpb25zLlxuICAgKiBAcmV0dXJucyB7Un0gVGhlIHJlbmRlcmVkIHJlc3VsdCwgdHlwZSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCByZW5kZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBnbG9iYWxQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEFkZHMgYSByZW5kZXJpbmcgZW5naW5lIHRvIHRoZSBzdGF0aWMgY2FjaGUgYW5kIHNldHMgaXQgYXMgdGhlIGN1cnJlbnQgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPn0gZW5naW5lIC0gVGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gcmVnaXN0ZXIuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFuIGVuZ2luZSB3aXRoIHRoZSBzYW1lIGZsYXZvciBhbHJlYWR5IGV4aXN0cy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKGVuZ2luZTogUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+KSB7XG4gICAgaWYgKGVuZ2luZS5mbGF2b3VyIGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtlbmdpbmUuZmxhdm91cn0gYWxyZWFkeSBleGlzdHNgXG4gICAgICApO1xuICAgIHRoaXMuY2FjaGVbZW5naW5lLmZsYXZvdXJdID0gZW5naW5lO1xuICAgIHRoaXMuY3VycmVudCA9IGVuZ2luZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGluaXRpYWxpemVzIGEgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgR2V0cyBhbiBleGlzdGluZyBlbmdpbmUgaW5zdGFuY2Ugb3IgY3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBuZXcgb25lIGlmIGdpdmVuIGEgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz59IG9iaiAtIFRoZSBlbmdpbmUgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm5zIHtSZW5kZXJpbmdFbmdpbmU8Tz59IFRoZSBpbml0aWFsaXplZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRPckJvb3Q8Tz4oXG4gICAgb2JqOiBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICk6IFJlbmRlcmluZ0VuZ2luZTxPPiB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlbmRlcmluZ0VuZ2luZSkgcmV0dXJuIG9iaiBhcyBSZW5kZXJpbmdFbmdpbmU8Tz47XG4gICAgY29uc3QgZW5naW5lOiBSZW5kZXJpbmdFbmdpbmU8Tz4gPSBuZXcgb2JqKCk7XG4gICAgZW5naW5lLmluaXRpYWxpemUoKTsgLy8gbWFrZSB0aGUgYm9vdGluZyBhc3luYy4gdXNlIHRoZSBpbml0aWFsaXplZCBmbGFnIHRvIGNvbnRyb2wgaXRcbiAgICByZXR1cm4gZW5naW5lIGFzIFJlbmRlcmluZ0VuZ2luZTxPPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVuZGVyaW5nIGVuZ2luZSBieSBmbGF2b3IuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGVuZ2luZSBvciBhIHNwZWNpZmljIG9uZSBieSBmbGF2b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMge1JlbmRlcmluZ0VuZ2luZTxPPn0gVGhlIHJlcXVlc3RlZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGZsYXZvciBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldDxPPihmbGF2b3VyPzogc3RyaW5nKTogUmVuZGVyaW5nRW5naW5lPE8+IHtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRPckJvb3Q8Tz4oXG4gICAgICAgIHRoaXMuY3VycmVudCBhcyBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICAgICApO1xuICAgIGlmICghKGZsYXZvdXIgaW4gdGhpcy5jYWNoZSkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtmbGF2b3VyfSBkb2VzIG5vdCBleGlzdGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JCb290PE8+KFxuICAgICAgdGhpcy5jYWNoZVtmbGF2b3VyXSBhc1xuICAgICAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj5cbiAgICAgICAgfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIGEgbW9kZWwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGNvcnJlY3QgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbCBhbmQgaW52b2tlcyBpdHMgcmVuZGVyIG1ldGhvZC5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXIgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgcmVzdWx0IG9mIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gcmVnaXN0ZXJlZCBtb2RlbCBpcyBmb3VuZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlbmRlcjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPVxuICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIHx8IE1vZGVsLmZyb21PYmplY3QobW9kZWwpO1xuICAgIGlmICghY29uc3RydWN0b3IpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gbW9kZWwgcmVnaXN0ZXJlZCBmb3VuZFwiKTtcbiAgICBjb25zdCBmbGF2b3VyID0gTW9kZWwucmVuZGVyZWRCeShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZvciB0aGUgdmFyIGFyZ3MgdHlwZSBjaGVja1xuICAgIHJldHVybiBSZW5kZXJpbmdFbmdpbmUuZ2V0KGZsYXZvdXIpLnJlbmRlcihtb2RlbCwgLi4uYXJncyk7XG4gIH1cbn1cbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihEQktleXMuSUQpXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGsob3B0aW9uczogeyBnZW5lcmF0ZWQ6IGJvb2xlYW4gfSkge1xuLy8gICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyUGsodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4vLyAgICAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZClcbi8vICAgICAgICAgICBoaWRlT24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFKShcbi8vICAgICAgICAgICAgIHRhcmdldCxcbi8vICAgICAgICAgICAgIHByb3BlcnR5S2V5XG4vLyAgICAgICAgICAgKTtcbi8vICAgICAgIH07XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoREJLZXlzLlRJTUVTVEFNUClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0aW1lc3RhbXAob3BzOiBPcGVyYXRpb25LZXlzW10pIHtcbi8vICAgICAgIHJldHVybiBoaWRlT24oLi4uKG9wcyBhcyBhbnlbXSkpO1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy9cbi8vIERlY29yYXRpb24uZm9yKERCS2V5cy5DT01QT1NFRClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb21wb3NlZCgpIHtcbi8vICAgICAgIHJldHVybiBoaWRlT24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFKTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihcImNyZWF0ZWRCeVwiKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbi8vICAgICAgIHJldHVybiBoaWRlT24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFKTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihcInVwZGF0ZWRCeVwiKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbi8vICAgICAgIHJldHVybiBoaWRlT24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFKTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbiIsImltcG9ydCB7IFVJS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcHJvcE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9uS2V5cyxcbiAgVUlFbGVtZW50TWV0YWRhdGEsXG4gIFVJRXZlbnRIYW5kbGVyLFxuICBVSUV2ZW50TmFtZSxcbiAgVUlGdW5jdGlvbkxpa2UsXG4gIFVJTGF5b3V0Q29sLFxuICBVSUxheW91dFByb3BNZXRhZGF0YSxcbiAgVUlMaXN0UHJvcE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGdldFVJQXR0cmlidXRlS2V5IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgaGlkZXMgYSBwcm9wZXJ0eSBkdXJpbmcgc3BlY2lmaWMgQ1JVRCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDb250cm9scyBwcm9wZXJ0eSB2aXNpYmlsaXR5IGJhc2VkIG9uIG9wZXJhdGlvbiB0eXBlXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hpY2ggQ1JVRCBvcGVyYXRpb25zIHNob3VsZCBoaWRlIGEgcHJvcGVydHlcbiAqIGluIHRoZSBVSS4gVGhlIHByb3BlcnR5IHdpbGwgb25seSBiZSB2aXNpYmxlIGR1cmluZyBvcGVyYXRpb25zIG5vdCBzcGVjaWZpZWQuXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbnMgLSBUaGUgQ1JVRCBvcGVyYXRpb25zIGR1cmluZyB3aGljaCB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGhpZGVPblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSGlkZSB0aGUgcGFzc3dvcmQgZmllbGQgZHVyaW5nIFJFQUQgb3BlcmF0aW9uc1xuICogY2xhc3MgVXNlciB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEBoaWRlT24oT3BlcmF0aW9uS2V5cy5SRUFEKVxuICogICBwYXNzd29yZDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgaGlkZU9uXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PmhpZGVPbjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgaGlkZU9uLT4+TW9kZWw6IEFkZCBoaWRkZW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IENoZWNrIGlmIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBoaWRkZW4gb3BlcmF0aW9uc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogUmVuZGVyIG9yIGhpZGUgYmFzZWQgb24gY3VycmVudCBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGVPbiguLi5vcGVyYXRpb25zOiBDcnVkT3BlcmF0aW9uS2V5c1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoaWRlT24ob2JqZWN0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuSElEREVOKSxcbiAgICAgIG9wZXJhdGlvbnNcbiAgICApKG9iamVjdCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBoaWRlcyBhIHByb3BlcnR5IGZvciBzcGVjaWZpYyBuYW1lc3BhY2VzLlxuICogQHN1bW1hcnkgQ29udHJvbHMgcHJvcGVydHkgdmlzaWJpbGl0eSBiYXNlZCBvbiBuYW1lc3BhY2UgbWVtYmVyc2hpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGVGb3IoLi4ubmFtZXNwYWNlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhpZGVGb3Iob2JqZWN0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuSElERV9GT1IpLFxuICAgICAgbmFtZXNwYWNlc1xuICAgICkob2JqZWN0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHNob3dzIGEgcHJvcGVydHkgb25seSBmb3Igc3BlY2lmaWMgbmFtZXNwYWNlcy5cbiAqIEBzdW1tYXJ5IE5hbWVzcGFjZS1hd2FyZSBjb3VudGVycGFydCB0byBgaGlkZUZvcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG93Rm9yKC4uLm5hbWVzcGFjZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaG93Rm9yKG9iamVjdDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoXG4gICAgICBnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLlNIT1dfRk9SKSxcbiAgICAgIG5hbWVzcGFjZXNcbiAgICApKG9iamVjdCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCByZW5kZXJzIGEgcHJvcGVydHkgb25seSB3aGVuIHRoZSBuYW1lc3BhY2UgbWF0Y2hlcy5cbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIGFsaWFzIGZvciBuYW1lc3BhY2Utc2NvcGVkIHZpc2liaWxpdHkgY29udHJvbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcklmKC4uLm5hbWVzcGFjZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBzaG93Rm9yKC4uLm5hbWVzcGFjZXMpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSBvcmRlciBvZiBhIFVJIGVsZW1lbnRcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgcmVuZGVyaW5nIG9yZGVyIGZvciBVSSBjb21wb25lbnRzXG4gKiBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG1ldGFkYXRhIHRvIHRoZSBwcm9wZXJ0eSBvciBjbGFzcywgaW5kaWNhdGluZyBpdHMgb3JkZXIgaW4gdGhlIFVJIHJlbmRlcmluZyBzZXF1ZW5jZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29yZGVyPTFdIFRoZSBvcmRlciB2YWx1ZSBmb3IgdGhlIFVJIGVsZW1lbnQgKGRlZmF1bHQgaXMgMSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IG9yIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aW9yZGVyXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgb3JkZXIgZm9yIGEgZmllbGRcbiAqIEB1aW9yZGVyKDIpXG4gKiBmaWVsZE5hbWU6IHN0cmluZztcbiAqXG4gKiAvLyBTZXQgb3JkZXIgZm9yIGEgY2xhc3NcbiAqIEB1aW9yZGVyKDEpXG4gKiBjbGFzcyBVc2VyUHJvZmlsZSB7IC4uLiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlvcmRlclxuICogICBwYXJ0aWNpcGFudCBwcm9wZXJ0eVxuICogICBTeXN0ZW0tPj51aW9yZGVyOmRvKHByb3BlcnR5KVxuICogICB1aW9yZGVyLT4+cHJvcGVydHk6IHNldHMgb3JkZXIgbWV0YWRhdGFcbiAqICAgdWlvcmRlci0+PlN5c3RlbTogcmV0dXJucyBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpb3JkZXIoXG4gIG9yZGVyOiBudW1iZXIgfCB0eXBlb2YgVUlLZXlzLkZJUlNUIHwgdHlwZW9mIFVJS2V5cy5MQVNUID0gVUlLZXlzLkZJUlNUXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVpb3JkZXIob2JqZWN0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLk9SREVSKSwgb3JkZXIpKFxuICAgICAgb2JqZWN0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBjb21wbGV0ZWx5IGhpZGVzIGEgcHJvcGVydHkgaW4gYWxsIFVJIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IE1ha2VzIGEgcHJvcGVydHkgaW52aXNpYmxlIGluIGFsbCBDUlVEIG9wZXJhdGlvbnNcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgaGlkZU9uIHRoYXQgaGlkZXMgYSBwcm9wZXJ0eVxuICogZHVyaW5nIGFsbCBDUlVEIG9wZXJhdGlvbnMgKENSRUFURSwgUkVBRCwgVVBEQVRFLCBERUxFVEUpLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBoaWRkZW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbXBsZXRlbHkgaGlkZSB0aGUgaW50ZXJuYWxJZCBmaWVsZCBpbiB0aGUgVUlcbiAqIGNsYXNzIFByb2R1Y3Qge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEBoaWRkZW4oKVxuICogICBpbnRlcm5hbElkOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBoaWRkZW5cbiAqICAgcGFydGljaXBhbnQgaGlkZU9uXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBNb2RlbC0+PmhpZGRlbjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgaGlkZGVuLT4+aGlkZU9uOiBDYWxsIHdpdGggYWxsIG9wZXJhdGlvbnNcbiAqICAgaGlkZU9uLT4+TW9kZWw6IEFkZCBoaWRkZW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IENoZWNrIGlmIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBhbGwgb3BlcmF0aW9uc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogQWx3YXlzIGhpZGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGRlbigpIHtcbiAgcmV0dXJuIGhpZGVPbihcbiAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5ERUxFVEVcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZCBhcyBhIFVJIGVsZW1lbnRcbiAqIEBzdW1tYXJ5IE1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIHNwZWNpZmljIFVJIGVsZW1lbnQgd2l0aCBjdXN0b20gcHJvcGVydGllc1xuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgd2hpY2ggSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCBzaG91bGQgYmUgdXNlZFxuICogdG8gcmVuZGVyIGEgc3BlY2lmaWMgcHJvcGVydHksIGFsb25nIHdpdGggYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoYXQgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHRhZyBuYW1lIHRvIHVzZSBmb3IgcmVuZGVyaW5nXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NlcmlhbGl6ZT1mYWxzZV0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHNlcmlhbGl6ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWVsZW1lbnRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlbmRlciBhIHByb3BlcnR5IGFzIGEgdGV4dCBpbnB1dFxuICogY2xhc3MgTG9naW5Gb3JtIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2lucHV0JywgeyB0eXBlOiAndGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgdXNlcm5hbWUnIH0pXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnaW5wdXQnLCB7IHR5cGU6ICdwYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgcGFzc3dvcmQnIH0pXG4gKiAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnYnV0dG9uJywgeyBjbGFzczogJ2J0bi1wcmltYXJ5JyB9KVxuICogICBzdWJtaXQ6IHN0cmluZyA9ICdMb2dpbic7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWVsZW1lbnRcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+dWllbGVtZW50OiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWVsZW1lbnQtPj5Nb2RlbDogQWRkIGVsZW1lbnQgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBlbGVtZW50IG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gdGFnIGFuZCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogUmVuZGVyIHdpdGggc3BlY2lmaWVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpZWxlbWVudChcbiAgdGFnOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGFnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBwcm9wcyA9IHRhZztcbiAgICAgIHRhZyA9IFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IG1ldGFkYXRhOiBVSUVsZW1lbnRNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnIGFzIHN0cmluZyxcbiAgICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCB7XG4gICAgICAgIG5hbWU6IHByb3BlcnR5S2V5LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoXG4gICAgICBnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLkVMRU1FTlQpLFxuICAgICAgbWV0YWRhdGFcbiAgICApKG9yaWdpbmFsLCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSBwYXNzZWQgdG8gYSBVSSBjb21wb25lbnRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IHNob3VsZCBiZSBtYXBwZWQgdG9cbiAqIGEgcHJvcGVydHkgb2YgdGhlIFVJIGNvbXBvbmVudCB3aGVuIHJlbmRlcmluZy4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlXG4gKiBkZWNvcmF0ZWQgd2l0aCBAdWltb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BOYW1lXSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtib29sZWFufSBbc3RyaW5naWZ5PWZhbHNlXSBXaGV0aGVyIHRvIHN0cmluZ2lmeSB0aGUgcHJvcGVydHkgdmFsdWVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hcCBtb2RlbCBwcm9wZXJ0aWVzIHRvIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAnZnVsbE5hbWUnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZnVsbE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRW1haWwnKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAndXNlckVtYWlsJyB0byB0aGUgY29tcG9uZW50XG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgndXNlckRhdGEnLCB0cnVlKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyBzdHJpbmdpZmllZCBKU09OXG4gKiAgIHVzZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBDb21wb25lbnRcbiAqICAgTW9kZWwtPj51aXByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpcHJvcC0+Pk1vZGVsOiBBZGQgcHJvcCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IHByb3AgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUgYW5kIHN0cmluZ2lmeSBmbGFnXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkNvbXBvbmVudDogUGFzcyBwcm9wZXJ0eSB3aXRoIHNwZWNpZmllZCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHN0cmluZ2lmeTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlQcm9wTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBwcm9wTmFtZSB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5LFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG5lc3RlZCBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgaG93IGEgcGFyZW50IGNvbXBvbmVudCBzaG91bGQgcmVuZGVyIHRoZSBjaGlsZCBtb2RlbCB3aGVuIG5lc3RlZC5cbiAqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIGRlY29yYXRlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmVzdGVkIG1vZGVscy5cbiAqIFdoZW4gYXBwbGllZCwgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgdGFnIG9mIHRoZSBjaGlsZCBtb2RlbCB3aXRoIHRoZSBwcm92aWRlZCBvbmUsXG4gKiBlbmFibGluZyBkaWZmZXJlbnQgcmVuZGVyaW5nIGJlaGF2aW9yIHdoZW4gdGhlIG1vZGVsIGFjdHMgYXMgYSBjaGlsZCAobmVzdGVkKVxuICogY29tcGFyZWQgdG8gd2hlbiBpdCBpcyByZW5kZXJlZCBhcyB0aGUgcGFyZW50IG1vZGVsLlxuICpcbiAqIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZSBkZWNvcmF0ZWQgd2l0aCBgQHVpbW9kZWxgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiBUaGUgbW9kZWwgY2xhc3MgbmFtZSB0byBwYXNzIHRvIHRoZSBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCB0YWcgbmFtZSB0byBvdmVycmlkZSB0aGUgVUkgdGFnIG9mIHRoZSBuZXN0ZWQgbW9kZWxcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtib29sZWFufSBbc2VyaWFsaXplPWZhbHNlXSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2VyaWFsaXplZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiB1aWNoaWxkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNYXAgYSBuZXN0ZWQgbW9kZWwgdG8gYSBjb21wb25lbnQgcHJvcGVydHkgd2l0aCBhIGRpZmZlcmVudCB0YWcgd2hlbiBuZXN0ZWRcbiAqIEB1aW1vZGVsKCdhZGRyZXNzLWNvbXBvbmVudCcpXG4gKiBjbGFzcyBBZGRyZXNzIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHN0cmVldDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNpdHk6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWNoaWxkKEFkZHJlc3MubmFtZSwgJ2FkZHJlc3MtY2hpbGQtY29tcG9uZW50JylcbiAqICAgYWRkcmVzczogQWRkcmVzcztcbiAqIH1cbiAqXG4gKiAvLyBJbiB0aGlzIGV4YW1wbGUsIHRoZSBBZGRyZXNzIG1vZGVsIGhhcyB0aGUgZGVmYXVsdCB0YWcgJ2FkZHJlc3MtY29tcG9uZW50JyB3aGVuIHJlbmRlcmVkIGFzIGEgcm9vdCBjb21wb25lbnQsXG4gKiAvLyBidXQgd2hlbiB1c2VkIGluc2lkZSBVc2VyUHJvZmlsZSwgaXQgaXMgcmVuZGVyZWQgd2l0aCB0aGUgb3ZlcnJpZGRlbiB0YWcgJ2FkZHJlc3MtY2hpbGQtY29tcG9uZW50J1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWljaGlsZFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgQ29tcG9uZW50XG4gKiAgIE1vZGVsLT4+dWljaGlsZDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWljaGlsZC0+Pk1vZGVsOiBBZGQgY2hpbGQgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBjaGlsZCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSwgc3RyaW5naWZ5IGZsYWcsIGFuZCBjaGlsZCB0YWcgb3ZlcnJpZGVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+Q29tcG9uZW50OiBQYXNzIHByb3BlcnR5IHdpdGggc3BlY2lmaWVkIG5hbWUgYW5kIHJlbmRlciB3aXRoIG92ZXJyaWRkZW4gdGFnIGlmIG5lc3RlZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1aWNoaWxkKFxuICBjbGF6ejogc3RyaW5nLFxuICB0YWc6IHN0cmluZyxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgaXNBcnJheTogYm9vbGVhbiA9IGZhbHNlLFxuICBzZXJpYWxpemU6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJRWxlbWVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcsXG4gICAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZSxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgcHJvcHMgfHwge30sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBjbGF6eiB8fCBwcm9wZXJ0eUtleSxcbiAgICAgICAgfSxcbiAgICAgICAgaXNBcnJheVxuICAgICAgICAgID8geyBjdXN0b21UeXBlczogW0FycmF5Lm5hbWVdLCBtdWx0aXBsZTogdHJ1ZSB9XG4gICAgICAgICAgOiB7IG11bHRpcGxlOiBwcm9wcz8ubXVsdGlwbGUgfHwgZmFsc2UgfVxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuQ0hJTEQpLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIGxpc3QgaXRlbSBjb21wb25lbnRcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYSBsaXN0IGNvbnRleHRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBsaXN0XG4gKiBzaG91bGQgYmUgcmVuZGVyZWQuIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZSBkZWNvcmF0ZWQgd2l0aCBAdWlsaXN0bW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wTmFtZV0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHBhc3MgdG8gdGhlIGxpc3QgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBsaXN0IGNvbnRhaW5lclxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGlzdHByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhIGxpc3QgcHJvcGVydHkgd2l0aCBjdXN0b20gcmVuZGVyaW5nXG4gKiBAdWltb2RlbCgndG9kby1saXN0JylcbiAqIGNsYXNzIFRvZG9MaXN0IHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRpdGxlOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGlzdHByb3AoJ2l0ZW1zJywgeyBjbGFzczogJ3RvZG8taXRlbXMtY29udGFpbmVyJyB9KVxuICogICBpdGVtczogVG9kb0l0ZW1bXTtcbiAqIH1cbiAqXG4gKiBAdWlsaXN0bW9kZWwoJ2xpJywgeyBjbGFzczogJ3RvZG8taXRlbScgfSlcbiAqIGNsYXNzIFRvZG9JdGVtIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGV4dDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpbGlzdHByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExpc3RDb250YWluZXJcbiAqICAgcGFydGljaXBhbnQgTGlzdEl0ZW1zXG4gKiAgIE1vZGVsLT4+dWlsaXN0cHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsaXN0cHJvcC0+Pk1vZGVsOiBBZGQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lIGFuZCBjb250YWluZXIgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGlzdENvbnRhaW5lcjogQ3JlYXRlIGNvbnRhaW5lciB3aXRoIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pkxpc3RJdGVtczogUmVuZGVyIGVhY2ggaXRlbSB1c2luZyBAdWlsaXN0bW9kZWxcbiAqICAgTGlzdENvbnRhaW5lci0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHJlbmRlcmVkIGxpc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGlzdHByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFBhcnRpYWw8VUlMaXN0UHJvcE1ldGFkYXRhPiA9IHtcbiAgICAgIG5hbWU6IHByb3BOYW1lIHx8IHByb3BlcnR5S2V5LFxuICAgICAgcHJvcHM6IHByb3BzIHx8IHt9LFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuVUlMSVNUUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgcG9zaXRpb25zIGEgcHJvcGVydHkgaW4gYSBzcGVjaWZpYyBncmlkIGxheW91dCBwb3NpdGlvblxuICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2x1bW4gYW5kIHJvdyBwb3NpdGlvbiBmb3IgYSBwcm9wZXJ0eSBpbiBhIFVJIGxheW91dCBncmlkXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSB0aGUgc3BlY2lmaWMgcG9zaXRpb24gb2YgYSBwcm9wZXJ0eSB3aXRoaW5cbiAqIGEgZ3JpZC1iYXNlZCBsYXlvdXQgc3lzdGVtLiBJdCBzcGVjaWZpZXMgd2hpY2ggY29sdW1uIGFuZCByb3cgdGhlIHByb3BlcnR5XG4gKiBzaG91bGQgb2NjdXB5IHdoZW4gcmVuZGVyZWQgaW4gdGhlIFVJLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2wgVGhlIGNvbHVtbiBwb3NpdGlvbiBpbiB0aGUgZ3JpZCBsYXlvdXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcm93PTFdIFRoZSByb3cgcG9zaXRpb24gaW4gdGhlIGdyaWQgbGF5b3V0IChkZWZhdWx0cyB0byAxKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHM9e31dIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBsYXlvdXQgaXRlbVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGF5b3V0cHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUG9zaXRpb24gcHJvcGVydGllcyBpbiBhIGdyaWQgbGF5b3V0XG4gKiBAdWlsYXlvdXQoJ3VzZXItZm9ybScsIDIsIDMpIC8vIDIgY29sdW1ucywgMyByb3dzXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgVXNlckZvcm0ge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgxLCAxKSAvLyBPbmUgY29sdW1uLCBmaXJzdCByb3dcbiAqICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgyLCAxKSAvLyBPbmUgY29sdW1uLCBmaXJzdCByb3dcbiAqICAgbGFzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDEsIDIpIC8vIE9uZSBjb2x1bW4sIHNlY29uZCByb3dcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDIsIDMpIC8vIEFsbCBjb2x1bW5zLCB0aGlyZCByb3dcbiAqICAgYmlvOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWxheW91dHByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExheW91dENvbnRhaW5lclxuICogICBNb2RlbC0+PnVpbGF5b3V0cHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsYXlvdXRwcm9wLT4+TW9kZWw6IEFkZCBsYXlvdXQgaXRlbSBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGxheW91dCBpdGVtIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gY29sdW1uLCByb3csIGFuZCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MYXlvdXRDb250YWluZXI6IFBvc2l0aW9uIGVsZW1lbnQgYXQgZ3JpZCBjb29yZGluYXRlc1xuICogICBMYXlvdXRDb250YWluZXItPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwb3NpdGlvbmVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGF5b3V0cHJvcChjb2w6IFVJTGF5b3V0Q29sID0gMSwgcm93OiBudW1iZXIgPSAxKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJTGF5b3V0UHJvcE1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogcHJvcGVydHlLZXksXG4gICAgICAvLyBjb2wsXG4gICAgICAvLyByb3csXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgeyByb3csIGNvbCB9KSxcbiAgICB9O1xuICAgIHByb3BNZXRhZGF0YShnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLlVJTEFZT1VUUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgYXNzaWducyBhIHByb3BlcnR5IHRvIGEgc3BlY2lmaWMgcGFnZSBpbiBtdWx0aS1wYWdlIGZvcm1zXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggcGFnZSBhIHByb3BlcnR5IHNob3VsZCBhcHBlYXIgb24gaW4gcGFnaW5hdGVkIFVJIGxheW91dHNcbiAqIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gdGhlIHByb3BlcnR5LCBpbmRpY2F0aW5nIHdoaWNoIHBhZ2UgbnVtYmVyIGl0IGJlbG9uZ3MgdG9cbiAqIGluIGEgbXVsdGktcGFnZSBmb3JtIG9yIHdpemFyZC4gUHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIHBhZ2UgbnVtYmVyIGFyZSBncm91cGVkIHRvZ2V0aGVyXG4gKiBhbmQgcmVuZGVyZWQgb24gdGhlIHNhbWUgcGFnZS4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEB1aXN0ZXBwZWRtb2RlbCB0b1xuICogb3JnYW5pemUgbGFyZ2UgZm9ybXMgaW50byBtYW5hZ2VhYmxlIHNlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgd2hlcmUgdGhlIHByb3BlcnR5IHNob3VsZCBhcHBlYXIgKGRlZmF1bHQgaXMgMSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXBhZ2Vwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBtdWx0aS1zdGVwIHJlZ2lzdHJhdGlvbiBmb3JtIHdpdGggcGFnZS1iYXNlZCBsYXlvdXRcbiAqIEB1aXN0ZXBwZWRtb2RlbCgncmVnaXN0cmF0aW9uLWZvcm0nLCAyLCB0cnVlKVxuICogQG1vZGVsKClcbiAqIGNsYXNzIFJlZ2lzdHJhdGlvbkZvcm0ge1xuICogICAvLyBQYWdlIDE6IFBlcnNvbmFsIEluZm9ybWF0aW9uXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgxKVxuICogICBmaXJzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgxKVxuICogICBsYXN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDEpXG4gKiAgIGRhdGVPZkJpcnRoOiBEYXRlO1xuICpcbiAqICAgLy8gUGFnZSAyOiBDb250YWN0IEluZm9ybWF0aW9uXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgyKVxuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDIpXG4gKiAgIHBob25lOiBzdHJpbmc7XG4gKlxuICogICAvLyBQYWdlIDM6IENvbmZpcm1hdGlvblxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMylcbiAqICAgYWNjZXB0VGVybXM6IGJvb2xlYW47XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aXBhZ2Vwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBQYWdpbmF0aW9uQ29udHJvbGxlclxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PnVpcGFnZXByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpcGFnZXByb3AtPj5Nb2RlbDogQWRkIHBhZ2UgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBwYWdlIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcGFnZSBudW1iZXJcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+UGFnaW5hdGlvbkNvbnRyb2xsZXI6IEdyb3VwIHByb3BlcnRpZXMgYnkgcGFnZVxuICogICBQYWdpbmF0aW9uQ29udHJvbGxlci0+PlVJOiBSZW5kZXIgY3VycmVudCBwYWdlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpcGFnZXByb3AocGFnZTogbnVtYmVyID0gMSkge1xuICByZXR1cm4gZnVuY3Rpb24gdWlwYWdlcHJvcChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5QQUdFKSwgcGFnZSkoXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgYmluZHMgYSBVSSBldmVudCB0byBhIHNwZWNpZmllZCBoYW5kbGVyIGZ1bmN0aW9uLlxuICogVGhpcyBpcyB1c2VkIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycyB0byBzcGVjaWZpYyBsaWZlY3ljbGUgZXZlbnRzIG9mIGEgYERlY2FmQ29tcG9uZW50YCxcbiAqIHN1Y2ggYXMgYHJlbmRlcmAgfCBgaW5pdGlhbGl6ZWAgfCBgaGFuZGxlQ2xpY2tgIHwgYHJlZnJlc2hgXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGxpZmVjeWNsZSBldmVudCB0byBiaW5kIHRoZSBoYW5kbGVyIHRvLlxuICogICAgICAgICAgICAgICAgTXVzdCBiZSBvbmUgb2YgdGhlIGtleXMgaW4gYFBpY2s8RGVjYWZDb21wb25lbnQsICdyZW5kZXInIHwgJ2luaXRpYWxpemUnPmAuXG4gKiBAcGFyYW0gaGFuZGxlciAtIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyB0aGUgZXZlbnQtaGFuZGxlciBiaW5kaW5nIHRvIHRoZSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIEB1aW9uKCdyZW5kZXInLCAoKSA9PiBjb25zb2xlLmxvZygnUmVuZGVyaW5nLi4uJykpXG4gKiAgIHNvbWVQcm9wZXJ0eTogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW9uKFxuICBldmVudDogVUlFdmVudE5hbWUsXG4gIGhhbmRsZXI6IFVJRXZlbnRIYW5kbGVyXG4pOiAob3JpZ2luYWw6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBzdHJpbmcpID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gdWlvbihcbiAgZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBVSUV2ZW50SGFuZGxlcj5cbik6IChvcmlnaW5hbDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IHN0cmluZykgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiB1aW9uKFxuICBldmVudDogVUlFdmVudE5hbWUgfCBSZWNvcmQ8c3RyaW5nLCBVSUV2ZW50SGFuZGxlcj4sXG4gIGhhbmRsZXI/OiBVSUV2ZW50SGFuZGxlclxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiB1aW9uKG9yaWdpbmFsOiBvYmplY3QsIHByb3BlcnR5S2V5Pzogc3RyaW5nKSB7XG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5IGFzIHN0cmluZywgVUlLZXlzLkVWRU5UUyksIHtcbiAgICAgIC4uLih0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgPyBldmVudCA6IHsgW2V2ZW50XTogaGFuZGxlciB9KSxcbiAgICB9KShvcmlnaW5hbCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXNzb2NpYXRlcyBhIFVJIGNsaWNrIGhhbmRsZXIgd2l0aCB0aGUgJ2hhbmRsZUNsaWNrJyBldmVudC5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciAtIEEgZnVuY3Rpb24gdGhhdCBjb25mb3JtcyB0byB0aGUgYFVJRXZlbnRIYW5kbGVyYCB0eXBlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkXG4gKiAgICAgICAgICAgICAgICAgIHdoZW4gdGhlICdoYW5kbGVDbGljaycgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBkZWNvcmF0ZWQgZnVuY3Rpb24gdGhhdCBiaW5kcyB0aGUgaGFuZGxlciB0byB0aGUgJ2hhbmRsZUNsaWNrJyBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpb25jbGljayhoYW5kbGVyOiBVSUV2ZW50SGFuZGxlcikge1xuICByZXR1cm4gdWlvbihcImhhbmRsZUNsaWNrXCIsIGhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXNzb2NpYXRlcyBhIFVJIHJlbmRlcmluZyBoYW5kbGVyIHdpdGggdGhlICdyZW5kZXInIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIC0gQSBmdW5jdGlvbiB0aGF0IGNvbmZvcm1zIHRvIHRoZSBgVUlFdmVudEhhbmRsZXIgYCB0eXBlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkXG4gKiAgICAgICAgICAgICAgICAgIHdoZW4gdGhlICdyZW5kZXInIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEByZXR1cm5zIEEgZGVjb3JhdGVkIGZ1bmN0aW9uIHRoYXQgYmluZHMgdGhlIGhhbmRsZXIgdG8gdGhlICdyZW5kZXInIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlvbnJlbmRlcihoYW5kbGVyOiBVSUV2ZW50SGFuZGxlcikge1xuICByZXR1cm4gdWlvbihcInJlbmRlclwiLCBoYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSBhcyBhIGNvbHVtbiBpbiBhIFVJIHRhYmxlXG4gKiBAc3VtbWFyeSBDb250cm9scyBjb2x1bW4gb3JkZXJpbmcgYW5kIG9wdGlvbmFsIHZhbHVlIHBhcnNpbmcgZm9yIHRhYmxlIHByb3BzXG4gKiBVc2UgdGhpcyBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgbGlzdCBwcm9wZXJ0aWVzIGFzIHRhYmxlIGNvbHVtbnMsIGRlZmluZSB0aGVcbiAqIHNlcXVlbmNlIGluIHdoaWNoIHRoZXkgYXBwZWFyLCBhbmQgb3B0aW9uYWxseSBwcm92aWRlIGEgcGFyc2VyIHRoYXQgZm9ybWF0c1xuICogdGhlIHZhbHVlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlIFRoZSBkaXNwbGF5IG9yZGVyIGZvciB0aGUgY29sdW1uIChsb3dlciBtZWFucyBmaXJzdClcbiAqIEBwYXJhbSB7VUlGdW5jdGlvbkxpa2V9IFt2YWx1ZVBhcnNlckZuXSBPcHRpb25hbCBmb3JtYXR0ZXIgZXhlY3V0ZWQgcGVyIGNlbGxcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXRhYmxlY29sXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBPcmRlciB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWl0YWJsZWNvbCgxKVxuICogICBvcmRlck51bWJlcjogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXRhYmxlY29sKDIsICh2YWx1ZSkgPT4gYCQke3ZhbHVlPy50b0ZpeGVkKDIpfWApXG4gKiAgIHRvdGFsOiBudW1iZXI7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aXRhYmxlY29sXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBUYWJsZVxuICogICBNb2RlbC0+PnVpdGFibGVjb2w6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpdGFibGVjb2wtPj5Nb2RlbDogU3RvcmUgY29sdW1uIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBSZXRyaWV2ZSBjb2x1bW4gcHJvcHNcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBvcmRlciBhbmQgcGFyc2VyXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlRhYmxlOiBSZW5kZXIgY29sdW1uIGluIHNlcXVlbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXRhYmxlY29sKFxuICBzZXF1ZW5jZTogbnVtYmVyIHwgdHlwZW9mIFVJS2V5cy5GSVJTVCB8IHR5cGVvZiBVSUtleXMuTEFTVCA9IFVJS2V5cy5MQVNULFxuICB2YWx1ZVBhcnNlckZuPzogVUlGdW5jdGlvbkxpa2Vcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQYXJ0aWFsPFVJTGlzdFByb3BNZXRhZGF0YT4gPSB7XG4gICAgICBuYW1lOiBwcm9wZXJ0eUtleSxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHNlcXVlbmNlLFxuICAgICAgICAuLi4oIXZhbHVlUGFyc2VyRm4gPyB7fSA6IHsgdmFsdWVQYXJzZXJGbiB9KSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5VSUxJU1RQUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVjYWZUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIi4vRGVjYWZUcmFuc2xhdGVTZXJ2aWNlXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVSVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIHN0YXRpYyB0cmFuc2xhdGVTZXJ2aWNlOiBEZWNhZlRyYW5zbGF0ZVNlcnZpY2U7XG5cbiAgb3ZlcnJpZGUgZ2V0TWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICBpZiAoVUlWYWxpZGF0b3IudHJhbnNsYXRlU2VydmljZSlcbiAgICAgIHJldHVybiBVSVZhbGlkYXRvci50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZShtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZShtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBVSUV2ZW50SGFuZGxlcixcbiAgVUlFdmVudFByb3BlcnR5LFxuICBVSUZ1bmN0aW9uTGlrZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnksIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IERlY2FmRXZlbnRIYW5kbGVyIH0gZnJvbSBcIi4vRGVjYWZFdmVudEhhbmRsZXJcIjtcbmltcG9ydCB7IERlY2FmVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCIuL0RlY2FmVHJhbnNsYXRlU2VydmljZVwiO1xuaW1wb3J0IHsgaXNDbGFzc0NvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxudHlwZSBQcmltYXJ5S2V5VHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyBmb3IgYWxsIERlY2FmIFVJIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IEJhc2UgY2xhc3MgZm9yIGFsbCBEZWNhZiBVSSBjb21wb25lbnRzLCBwcm92aWRpbmcgY29tbW9uIHN0YXRlIG1hbmFnZW1lbnQsXG4gKiBsb2dnaW5nLCBsb2NhbGl6YXRpb24sIG5hdmlnYXRpb24gaG9va3MsIENSVUQgY29udGV4dCBtZXRhZGF0YSwgYW5kXG4gKiByZXBvc2l0b3J5IGludGVncmF0aW9uIHVzZWQgYnkgaGlnaGVyLWxldmVsIGRlY29yYXRvcnMgYW5kIHJlbmRlcmVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmQ29tcG9uZW50PE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGF0YSBtb2RlbCBvciBtb2RlbCBuYW1lIGZvciBjb21wb25lbnQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgVGhlIGRhdGEgbW9kZWwgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLiBUaGlzIGNhbiBiZSBwcm92aWRlZFxuICAgKiBhcyBhIE1vZGVsIGluc3RhbmNlLCBhIG1vZGVsIGNvbnN0cnVjdG9yLCBvciBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1vZGVsJ3MgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKiBXaGVuIHNldCwgdGhpcyBwcm9wZXJ0eSBwcm92aWRlcyB0aGUgY29tcG9uZW50IHdpdGggYWNjZXNzIHRvIHRoZSBtb2RlbCdzIHNjaGVtYSwgdmFsaWRhdGlvbiBydWxlcyxcbiAgICogYW5kIG1ldGFkYXRhIG5lZWRlZCBmb3IgcmVuZGVyaW5nIGFuZCBkYXRhIG9wZXJhdGlvbnMuXG4gICAqL1xuICBtb2RlbCE6IE0gfCBNb2RlbCB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSBjdXJyZW50IG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHByaW1hcnkga2V5IHZhbHVlIGZvciB0aGUgY3VycmVudCBtb2RlbCByZWNvcmQgYmVpbmcgZGlzcGxheWVkIG9yXG4gICAqIG1hbmlwdWxhdGVkIGJ5IHRoZSBjb21wb25lbnQuIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIGZvciBDUlVEIG9wZXJhdGlvbnMgdGhhdCB0YXJnZXRcbiAgICogc3BlY2lmaWMgcmVjb3Jkcywgc3VjaCBhcyByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucy4gVGhlIHZhbHVlIGNvcnJlc3BvbmRzIHRvXG4gICAqIHRoZSBmaWVsZCBkZXNpZ25hdGVkIGFzIHRoZSBwcmltYXJ5IGtleSBpbiB0aGUgbW9kZWwgZGVmaW5pdGlvbi5cbiAgICovXG4gIG1vZGVsSWQ/OiBQcmltYXJ5S2V5VHlwZSB8IFByaW1hcnlLZXlUeXBlW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmUtYnVpbHQgZmlsdGVyaW5nIGV4cHJlc3Npb24gYXBwbGllZCB0byByZXBvc2l0b3J5IHF1ZXJpZXMuXG4gICAqIEBzdW1tYXJ5IFN1cHBseSBhIGN1c3RvbSBgQXR0cmlidXRlT3B0aW9uYCB0byBjb250cm9sIGhvdyByZWNvcmRzIGFyZSBjb25zdHJhaW5lZC4gV2hlbiBvbWl0dGVkLFxuICAgKiB0aGUgZGlyZWN0aXZlIGRlcml2ZXMgYSBjb25kaXRpb24gZnJvbSBgZmlsdGVyQnlgIG9yIGBwa2AsIGNvbXBhcmluZyBpdCBhZ2FpbnN0IGBtb2RlbElkYC5cbiAgICovXG4gIGZpbHRlciE6IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1vZGVsIGZpZWxkIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBkZWZhdWx0IGNvbmRpdGlvbi5cbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHdoaWNoIGtleSBzaG91bGQgYmUgY29tcGFyZWQgdG8gYG1vZGVsSWRgIHdoZW4gYGZpbHRlcmAgaXMgbm90IHByb3ZpZGVkLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBwcmltYXJ5IGtleSBzbyBvdmVycmlkZXMgYXJlIG9ubHkgbmVlZGVkIGZvciBjdXN0b20gbG9va3Vwcy5cbiAgICovXG4gIGZpbHRlckJ5ITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIENSVUQgb3BlcmF0aW9uIHR5cGUgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBtb2RlbC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIG9wZXJhdGlvbiAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgdGhpcyBjb21wb25lbnQgaW5zdGFuY2VcbiAgICogc2hvdWxkIHBlcmZvcm0uIFRoaXMgZGV0ZXJtaW5lcyB0aGUgVUkgYmVoYXZpb3IsIGZvcm0gY29uZmlndXJhdGlvbiwgYW5kIGF2YWlsYWJsZSBhY3Rpb25zLlxuICAgKiBUaGUgb3BlcmF0aW9uIGFmZmVjdHMgZm9ybSB2YWxpZGF0aW9uLCBmaWVsZCBhdmFpbGFiaWxpdHksIGFuZCB0aGUgc3BlY2lmaWMgcmVwb3NpdG9yeVxuICAgKiBtZXRob2QgY2FsbGVkIGR1cmluZyBkYXRhIHN1Ym1pc3Npb24uXG4gICAqXG4gICAqIEB0eXBlIHtPcGVyYXRpb25LZXlzfVxuICAgKi9cbiAgb3BlcmF0aW9uPzogT3BlcmF0aW9uS2V5cztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJvdXRlciBpbnN0YW5jZSBmb3IgcHJvZ3JhbW1hdGljIG5hdmlnYXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIFJvdXRlciBzZXJ2aWNlIHVzZWQgZm9yIHByb2dyYW1tYXRpYyBuYXZpZ2F0aW9uIGJldHdlZW4gcm91dGVzXG4gICAqIGluIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBzZXJ2aWNlIGVuYWJsZXMgbmF2aWdhdGlvbiB0byBkaWZmZXJlbnQgdmlld3MgYW5kIG9wZXJhdGlvbnMsXG4gICAqIGhhbmRsZXMgcm91dGUgcGFyYW1ldGVycywgYW5kIG1hbmFnZXMgdGhlIGJyb3dzZXIncyBuYXZpZ2F0aW9uIGhpc3RvcnkuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHJvdXRlcj86IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5hbWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdHJpbmcgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIG5hbWUgb3IgbGFiZWwgdGhlIGNvbXBvbmVudFxuICAgKiBpbnN0YW5jZS4gVGhpcyBuYW1lIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGxvZ2dpbmcsIG9yIHRvIGlkZW50aWZ5IHNwZWNpZmljXG4gICAqIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aGluIGEgbGFyZ2VyIGFwcGxpY2F0aW9uIHN0cnVjdHVyZS4gSXQgc2VydmVzIGFzIGEgaHVtYW4tcmVhZGFibGVcbiAgICogaWRlbnRpZmllciB0aGF0IGhlbHBzIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNvbXBvbmVudCB0eXBlLlxuICAgKi9cbiAgbmFtZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcmVudCBjb21wb25lbnQgaWRlbnRpZmllciBmb3IgaGllcmFyY2hpY2FsIGNvbXBvbmVudCByZWxhdGlvbnNoaXBzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCBjb21wb25lbnQgaW4gYSBoaWVyYXJjaGljYWwgY29tcG9uZW50IHN0cnVjdHVyZS5cbiAgICogVGhpcyBwcm9wZXJ0eSBlc3RhYmxpc2hlcyBhIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb21wb25lbnRzLCBhbGxvd2luZyBmb3JcbiAgICogcHJvcGVyIG5lc3RpbmcgYW5kIG9yZ2FuaXphdGlvbiBvZiBjb21wb25lbnRzIHdpdGhpbiBhIGxheW91dC4gSXQgY2FuIGJlIHVzZWQgdG8gdHJhY2tcbiAgICogY29tcG9uZW50IGRlcGVuZGVuY2llcyBhbmQgZXN0YWJsaXNoIGNvbXBvbmVudCBoaWVyYXJjaGllcyBmb3IgcmVuZGVyaW5nIGFuZCBldmVudCBwcm9wYWdhdGlvbi5cbiAgICovXG4gIGNoaWxkT2YhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgaWRlbnRpZmllciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmb3IgZWFjaCBjb21wb25lbnQgaW5zdGFuY2UuXG4gICAqIFRoaXMgVUlEIGlzIHVzZWQgZm9yIERPTSBlbGVtZW50IGlkZW50aWZpY2F0aW9uLCBjb21wb25lbnQgdHJhY2tpbmcsIGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAqIEJ5IGRlZmF1bHQsIGl0IGdlbmVyYXRlcyBhIHJhbmRvbSAxNi1jaGFyYWN0ZXIgdmFsdWUsIGJ1dCBpdCBjYW4gYmUgZXhwbGljaXRseSBzZXQgdmlhIGlucHV0LlxuICAgKi9cbiAgdWlkPzogUHJpbWFyeUtleVR5cGU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBmaWVsZCBuYW1lIGZvciB0aGUgZGF0YSBtb2RlbC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIGZpZWxkIGluIHRoZSBtb2RlbCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGlkZW50aWZ5aW5nIHVuaXF1ZSByZWNvcmRzIGluIG9wZXJhdGlvbnMgbGlrZSB1cGRhdGUgYW5kIGRlbGV0ZS5cbiAgICogSWYgbm90IGV4cGxpY2l0bHkgc2V0LCBpdCBkZWZhdWx0cyB0byB0aGUgcmVwb3NpdG9yeSdzIGNvbmZpZ3VyZWQgcHJpbWFyeSBrZXkgb3IgJ2lkJy5cbjEgICAqL1xuICBwayE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0aW9uIHNlcnZpY2UgZm9yIGFwcGxpY2F0aW9uIGludGVybmF0aW9uYWxpemF0aW9uLlxuICAgKiBAc3VtbWFyeSBJbmplY3RlZCBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgdHJhbnNsYXRpb24gY2FwYWJpbGl0aWVzIGZvciBVSSB0ZXh0LlxuICAgKiBVc2VkIHRvIHRyYW5zbGF0ZSBidXR0b24gbGFiZWxzLCB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBhbmQgb3RoZXIgdGV4dCBjb250ZW50IGJhc2VkXG4gICAqIG9uIHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nLCBlbmFibGluZyBtdWx0aWxpbmd1YWwgc3VwcG9ydCB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgdHJhbnNsYXRlU2VydmljZSE6IERlY2FmVHJhbnNsYXRlU2VydmljZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBzZXJ2aWNlIGZvciBtYW51YWwgY2hhbmdlIGRldGVjdGlvbiBjb250cm9sLlxuICAgKiBAc3VtbWFyeSBJbmplY3RlZCBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgbWFudWFsIGNvbnRyb2wgb3ZlciBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlcy5cbiAgICogVGhpcyBpcyBlc3NlbnRpYWwgZm9yIGVuc3VyaW5nIHRoYXQgcHJvZ3JhbW1hdGljIERPTSBjaGFuZ2VzIChsaWtlIHNldHRpbmcgYWNjb3JkaW9uXG4gICAqIGF0dHJpYnV0ZXMpIGFyZSBwcm9wZXJseSByZWZsZWN0ZWQgaW4gdGhlIGNvbXBvbmVudCdzIHN0YXRlIGFuZCB0cmlnZ2VyIGFwcHJvcHJpYXRlXG4gICAqIHZpZXcgdXBkYXRlcyB3aGVuIG1vZGlmaWNhdGlvbnMgb2NjdXIgb3V0c2lkZSB0aGUgbm9ybWFsIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBmbG93LlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyBmaWVsZCB2aXNpYmlsaXR5IGJhc2VkIG9uIENSVUQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgQ2FuIGJlIGEgYm9vbGVhbiBvciBhbiBhcnJheSBvZiBvcGVyYXRpb24ga2V5cyB3aGVyZSB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICovXG4gIGhpZGRlbj86IGJvb2xlYW4gfCBDcnVkT3BlcmF0aW9uS2V5c1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGFiZWwgZm9yIHRoZSBmaWxlIHVwbG9hZCBmaWVsZC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSB1c2VyLWZyaWVuZGx5IGxhYmVsIGZvciB0aGUgZmlsZSB1cGxvYWQgaW5wdXQuXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlYWQtb25seS5cbiAgICovXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGFyayBtb2RlIHN1cHBvcnQgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSBzeXN0ZW0ncyBkYXJrIG1vZGVcbiAgICogcHJlZmVyZW5jZSB1c2luZyB0aGUgbWVkaWEgc2VydmljZSBhbmQgYXBwbHkgYXBwcm9wcmlhdGUgc3R5bGluZyBjbGFzc2VzLiBUaGlzIGZsYWdcbiAgICogY29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCByZXNwb25kIHRvIGRhcmsgbW9kZSBjaGFuZ2VzIGFuZCBhcHBseSB0aGVcbiAgICogZGFyayBwYWxldHRlIGNsYXNzIHRvIGl0cyBET00gZWxlbWVudC4gQnkgZGVmYXVsdCwgZGFyayBtb2RlIHN1cHBvcnQgaXMgZGlzYWJsZWQuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBlbmFibGVEYXJrTW9kZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIGRhcmsgbW9kZSBzdXBwb3J0IGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBXaGVuIGVuYWJsZWQsIHRoZSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgc3lzdGVtJ3MgZGFyayBtb2RlXG4gICAqIHByZWZlcmVuY2UgdXNpbmcgdGhlIG1lZGlhIHNlcnZpY2UgYW5kIGFwcGx5IGFwcHJvcHJpYXRlIHN0eWxpbmcgY2xhc3Nlcy4gVGhpcyBmbGFnXG4gICAqIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBzaG91bGQgcmVzcG9uZCB0byBkYXJrIG1vZGUgY2hhbmdlcyBhbmQgYXBwbHkgdGhlXG4gICAqIGRhcmsgcGFsZXR0ZSBjbGFzcyB0byBpdHMgRE9NIGVsZW1lbnQuIEJ5IGRlZmF1bHQsIGRhcmsgbW9kZSBzdXBwb3J0IGlzIGRpc2FibGVkLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNEYXJrTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBsb2NhbGUgaWRlbnRpZmllciBmb3IgY29tcG9uZW50IGludGVybmF0aW9uYWxpemF0aW9uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGxvY2FsZSBjb2RlIChlLmcuLCAnZW4tVVMnLCAncHQtQlInKSB1c2VkIGZvciB0cmFuc2xhdGluZyBVSSB0ZXh0XG4gICAqIGFuZCBmb3JtYXR0aW5nIGRhdGEgYWNjb3JkaW5nIHRvIHJlZ2lvbmFsIGNvbnZlbnRpb25zLiBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gb3ZlcnJpZGVcbiAgICogdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gbG9jYWxlIGZvciB0aGlzIHNwZWNpZmljIGNvbXBvbmVudCBpbnN0YW5jZSwgZW5hYmxpbmcgcGVyLWNvbXBvbmVudFxuICAgKiBsb2NhbGl6YXRpb24gd2hlbiBuZWVkZWQuXG4gICAqL1xuICBsb2NhbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciBsaXN0IGl0ZW0gcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBsaXN0IGl0ZW1zIHNob3VsZCBiZSByZW5kZXJlZCBpbiB0aGUgY29tcG9uZW50LlxuICAgKiBUaGlzIHByb3BlcnR5IGhvbGRzIGEgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIHRhZyBuYW1lXG4gICAqIGFuZCBvdGhlciBwcm9wZXJ0aWVzIG5lZWRlZCB0byByZW5kZXIgbGlzdCBpdGVtcyBjb3JyZWN0bHkuIFRoZSB0YWcgcHJvcGVydHlcbiAgICogaWRlbnRpZmllcyB3aGljaCBjb21wb25lbnQgc2hvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIGVhY2ggaXRlbSBpbiBhIGxpc3QuXG4gICAqIEFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgaW5jbHVkZWQgdG8gY3VzdG9taXplIHRoZSByZW5kZXJpbmcgYmVoYXZpb3IuXG4gICAqL1xuICBpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdGFnOiBcIlwiIH07XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEeW5hbWljIHByb3BlcnRpZXMgY29uZmlndXJhdGlvbiBmb3IgcnVudGltZSBjdXN0b21pemF0aW9uLlxuICAgKiBAc3VtbWFyeSBDb250YWlucyBrZXktdmFsdWUgcGFpcnMgb2YgZHluYW1pYyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBhdCBydW50aW1lLiBUaGlzIGZsZXhpYmxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFsbG93cyBmb3IgZHluYW1pYyBwcm9wZXJ0eSBhc3NpZ25tZW50IHdpdGhvdXRcbiAgICogcmVxdWlyaW5nIGV4cGxpY2l0IGlucHV0IGJpbmRpbmdzIGZvciBldmVyeSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIG9wdGlvbi4gUHJvcGVydGllcyBmcm9tXG4gICAqIHRoaXMgb2JqZWN0IGFyZSBwYXJzZWQgYW5kIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0aHJvdWdoIHRoZSBwYXJzZVByb3BzIG1ldGhvZCxcbiAgICogZW5hYmxpbmcgY3VzdG9taXphYmxlIGNvbXBvbmVudCBiZWhhdmlvciBiYXNlZCBvbiBleHRlcm5hbCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCYXNlIHJvdXRlIHBhdGggZm9yIGNvbXBvbmVudCBuYXZpZ2F0aW9uLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBiYXNlIHJvdXRlIHBhdGggdXNlZCBmb3IgbmF2aWdhdGlvbiBhY3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBjb21wb25lbnQuXG4gICAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBhcyBhIHByZWZpeCBmb3IgY29uc3RydWN0aW5nIG5hdmlnYXRpb24gVVJMcyB3aGVuIHRyYW5zaXRpb25pbmcgYmV0d2VlblxuICAgKiBkaWZmZXJlbnQgb3BlcmF0aW9ucyBvciB2aWV3cy4gVGhlIHJvdXRlIGhlbHBzIGVzdGFibGlzaCB0aGUgY29tcG9uZW50J3MgcG9zaXRpb24gaW4gdGhlXG4gICAqIGFwcGxpY2F0aW9uJ3Mgcm91dGluZyBoaWVyYXJjaHkuXG4gICAqL1xuICByb3V0ZT86IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIGJvcmRlcnMgYXJlIGRpc3BsYXllZCBhcm91bmQgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB2aXN1YWxseSBvdXRsaW5lZCB3aXRoIGJvcmRlcnMuXG4gICAqIFdoZW4gdHJ1ZSwgYm9yZGVycyBhcmUgc2hvd24gdG8gdmlzdWFsbHkgc2VwYXJhdGUgdGhlIGNvbXBvbmVudCBmcm9tIHN1cnJvdW5kaW5nIGNvbnRlbnQuXG4gICAqL1xuICBib3JkZXJzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgbmFtZSBpZGVudGlmaWVyIGZvciBsb2dnaW5nIGFuZCBsb2NhbGl6YXRpb24gY29udGV4dHMuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY29tcG9uZW50J3MgbmFtZSB3aGljaCBpcyB1c2VkIGFzIGEga2V5IGZvciBsb2dnaW5nIGNvbnRleHRzXG4gICAqIGFuZCBhcyBhIGJhc2UgZm9yIGxvY2FsZSByZXNvbHV0aW9uLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJvb3Qga2V5IGZvciBjb21wb25lbnQgbG9jYWxlIGNvbnRleHQgcmVzb2x1dGlvbi5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYmFzZSBrZXkgdXNlZCB0byByZXNvbHZlIGxvY2FsaXphdGlvbiBjb250ZXh0cyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqIElmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkLCBpdCBkZWZhdWx0cyB0byB0aGUgY29tcG9uZW50J3MgbmFtZS4gVGhpcyBrZXkgaXMgdXNlZCB0b1xuICAgKiBsb2FkIGFwcHJvcHJpYXRlIHRyYW5zbGF0aW9uIHJlc291cmNlcyBhbmQgbG9jYWxlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgbG9jYWxlUm9vdD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQ2FuIGJlIGEgc3RyaW5nLCBudW1iZXIsIGRhdGUsIG9yIGFycmF5IG9mIHN0cmluZyBvciBvYmplY3RzLlxuICAgKi9cbiAgdmFsdWU/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gQ1JVRCBvcGVyYXRpb24gY29uc3RhbnRzIGZvciB0ZW1wbGF0ZSB1c2FnZS5cbiAgICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgT3BlcmF0aW9uS2V5cyBlbnVtIHRvIHRoZSBjb21wb25lbnQgdGVtcGxhdGUsIGVuYWJsaW5nXG4gICAqIGNvbmRpdGlvbmFsIHJlbmRlcmluZyBhbmQgYmVoYXZpb3IgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVzLiBUaGlzIHByb3RlY3RlZFxuICAgKiByZWFkb25seSBwcm9wZXJ0eSBlbnN1cmVzIHRoYXQgdGVtcGxhdGUgbG9naWMgY2FuIGFjY2VzcyBvcGVyYXRpb24gY29uc3RhbnRzXG4gICAqIHdoaWxlIG1haW50YWluaW5nIGVuY2Fwc3VsYXRpb24gYW5kIHByZXZlbnRpbmcgYWNjaWRlbnRhbCBtb2RpZmljYXRpb24uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgT3BlcmF0aW9uS2V5cyA9IE9wZXJhdGlvbktleXM7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIExvY2F0aW9uIHNlcnZpY2UuXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBicm93c2VyJ3MgVVJMIGFuZCBoaXN0b3J5LlxuICAgKiBVbmxpa2UgdGhlIFJvdXRlciwgTG9jYXRpb24gYWxsb3dzIGZvciBsb3ctbGV2ZWwgbWFuaXB1bGF0aW9uIG9mIHRoZSBicm93c2VyJ3MgaGlzdG9yeSBzdGFja1xuICAgKiBhbmQgVVJMIHBhdGgsIHN1Y2ggYXMgcHJvZ3JhbW1hdGljYWxseSBuYXZpZ2F0aW5nIGJhY2sgb3IgZm9yd2FyZCwgb3IgdXBkYXRpbmcgdGhlIFVSTCB3aXRob3V0XG4gICAqIHRyaWdnZXJpbmcgYSByb3V0ZSBjaGFuZ2UuIFRoaXMgaXMgdXNlZnVsIGZvciBzY2VuYXJpb3Mgd2hlcmUgeW91IG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGVcbiAgICogYnJvd3NlciBoaXN0b3J5IG9yIFVSTCBvdXRzaWRlIG9mIEFuZ3VsYXIncyByb3V0aW5nIHN5c3RlbSwgc3VjaCBhcyBjbG9zaW5nIG1vZGFscywgaGFuZGxpbmdcbiAgICogcG9wc3RhdGUgZXZlbnRzLCBvciBzdXBwb3J0aW5nIGN1c3RvbSBuYXZpZ2F0aW9uIGxvZ2ljLlxuICAgKlxuICAgKi9cbiAgbG9jYXRpb24hOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGluc3RhbmNlIGZvciBkYXRhIGxheWVyIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIERlY2FmUmVwb3NpdG9yeSBjbGFzcywgaW5pdGlhbGl6ZWQgbGF6aWx5IGluIHRoZSByZXBvc2l0b3J5IGdldHRlci5cbiAgICogVGhlIHJlcG9zaXRvcnkgaXMgdXNlZCB0byBwZXJmb3JtIENSVUQgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUpIG9wZXJhdGlvbnMgb24gdGhlXG4gICAqIGRhdGEgbW9kZWwgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcgZGF0YSBiYXNlZCBvbiBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIF9yZXBvc2l0b3J5PzogSVJlcG9zaXRvcnk8TT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXphdGlvbiBzdGF0dXMgZmxhZyBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVHJhY2tzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkIGl0cyBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbiBhbmQgdG8gZGV0ZXJtaW5lIGlmXG4gICAqIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24gY2FuIGJlIHBlcmZvcm1lZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBldmVudHM6IFVJRXZlbnRQcm9wZXJ0eSA9IHt9O1xuXG4gIHByb3RlY3RlZCBoYW5kbGVyczogVUlFdmVudFByb3BlcnR5ID0ge307XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgcmVwb3NpdG9yeSgpOiBJUmVwb3NpdG9yeTxNPiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9zaXRvcnkgYXMgSVJlcG9zaXRvcnk8TT47XG4gIH1cblxuICBzZXQgcmVwb3NpdG9yeShyZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTxNPikge1xuICAgIHRoaXMuX3JlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5yZW5kZXIpXG4gICAgICAuaW5mbyhgcmVuZGVyIGZvciAke3RoaXMuY29tcG9uZW50TmFtZX0gd2l0aCAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMubG9nLmZvcih0aGlzLnJlZnJlc2gpLmluZm8oYFJlZnJlc2ggY2FsbGVkIHdpdGggYXJnczogJHthcmdzfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IGluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBgaW5pdGlhbGl6ZWRgIHByb3BlcnR5IHRvIGB0cnVlYCBvbmNlIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBBIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgb2YgdW5rbm93biB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbml0aWFsaXphdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2xhdGVzIGNvbnRlbnQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogTG9ncyB0aGUgdHJhbnNsYXRpb24gcmVxdWVzdCB3aXRoIHRoZSBjb21wb25lbnQgbmFtZSBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyAtIEEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB1c2VkIGZvciB0cmFuc2xhdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdHJhbnNsYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgdHJhbnNsYXRlKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy50cmFuc2xhdGUpXG4gICAgICAuaW5mbyhgdHJhbnNsYXRlIGZvciAke3RoaXMuY29tcG9uZW50TmFtZX0gd2l0aCAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICB9XG5cbiAgYXN5bmMgcHJldmlldyguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZy5mb3IodGhpcy5wcmV2aWV3KS5kZWJ1ZyhgUHJldmlldyBjYWxsZWQgd2l0aCBhcmdzOiAke2FyZ3N9YCk7XG4gIH1cblxuICAvLyBhc3luYyBwcm9jZXNzKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8YW55PiB7XG4gIC8vICAgdGhpcy5sb2cuZm9yKHRoaXMucHJvY2VzcykuZGVidWcoYFByb2Nlc3MgY2FsbGVkIHdpdGggYXJnczogJHthcmdzfWApO1xuICAvLyB9XG5cbiAgLy8gYXN5bmMgYmF0Y2hPcGVyYXRpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgLy8gICB0aGlzLmxvZ1xuICAvLyAgICAgLmZvcih0aGlzLmJhdGNoT3BlcmF0aW9uKVxuICAvLyAgICAgLmRlYnVnKGBCYXRjaE9wZXJhdGlvbiBjYWxsZWQgd2l0aCBhcmdzOiAke2FyZ3N9YCk7XG4gIC8vIH1cblxuICAvKipcbiAgICogU3VibWl0cyBkYXRhIG9yIHBlcmZvcm1zIGFuIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBBIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgb2YgYW55IHR5cGUgdG8gYmUgcGFzc2VkIHRvIHRoZSBzdWJtaXQgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIHN1Ym1pdCBvcGVyYXRpb24uXG4gICAqL1xuICBhc3luYyBzdWJtaXQoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnN1Ym1pdClcbiAgICAgIC5pbmZvKGBzdWJtaXQgZm9yICR7dGhpcy5jb21wb25lbnROYW1lfSB3aXRoICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vcm1hbGl6ZXMgaGFuZGxlciBkZWZpbml0aW9ucyBpbnRvIGV4ZWN1dGFibGUgZnVuY3Rpb25zLlxuICAgKiBAc3VtbWFyeSBJdGVyYXRlcyB0aHJvdWdoIGEgaGFuZGxlcnMgbWFwIGFuZCBlbnN1cmVzIGVhY2ggZW50cnkgaXMgc3RvcmVkIGFzIGEgY2FsbGFibGVcbiAgICogZnVuY3Rpb24gb24gdGhlIGNvbXBvbmVudC4gUGxhaW4gZnVuY3Rpb25zIGFyZSBzdG9yZWQgZGlyZWN0bHksIHdoaWxlIGhhbmRsZXIgY2xhc3NlcyBhcmVcbiAgICogaW5zdGFudGlhdGVkIHNvIHRoZWlyIGBoYW5kbGVgIG1ldGhvZCAob3IgYSBrZXllZCBvdmVycmlkZSkgYmVjb21lcyB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVyLlxuICAgKiBUaGlzIGFsbG93cyBkZWNvcmF0b3JzIHRvIGFjY2VwdCBlaXRoZXIgaW5saW5lIGZ1bmN0aW9ucyBvciBoYW5kbGVyIGNsYXNzZXMgdHJhbnNwYXJlbnRseS5cbiAgICogQHRlbXBsYXRlIFQgRXh0ZW5kcyBgRGVjYWZFdmVudEhhbmRsZXJgIHRvIGNvbnN0cmFpbiBoYW5kbGVyIGNsYXNzIHR5cGVzLlxuICAgKiBAcGFyYW0gaGFuZGxlcnMgLSBEaWN0aW9uYXJ5IG9mIGhhbmRsZXIgbmFtZXMgbWFwcGVkIHRvIGZ1bmN0aW9ucyBvciBoYW5kbGVyIGNvbnN0cnVjdG9ycy5cbiAgICogQHBhcmFtIGluc3RhbmNlIC0gT3B0aW9uYWwgdGFyZ2V0IGhhbmRsZXIgaW5zdGFuY2U7IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUhhbmRsZXJzPFQgZXh0ZW5kcyBEZWNhZkV2ZW50SGFuZGxlcj4oXG4gICAgaGFuZGxlcnM6IFVJRXZlbnRQcm9wZXJ0eSxcbiAgICBpbnN0YW5jZTogVFxuICApOiBVSUV2ZW50UHJvcGVydHkge1xuICAgIGNvbnN0IHJlc3VsdDogVUlFdmVudFByb3BlcnR5ID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlcnMpLmZvckVhY2goKFtrZXksIGZuXSkgPT4ge1xuICAgICAgaWYgKGlzQ2xhc3NDb25zdHJ1Y3RvcjxEZWNhZkV2ZW50SGFuZGxlcj4oZm4pKSB7XG4gICAgICAgIGNvbnN0IGNsYXp6ID0gbmV3IGZuKCkgYXMgRGVjYWZFdmVudEhhbmRsZXI7XG4gICAgICAgIGNvbnN0IGV2ZW50ID1cbiAgICAgICAgICBrZXkgaW4gY2xhenogPyBjbGF6eltrZXkgYXMga2V5b2YgRGVjYWZFdmVudEhhbmRsZXJdIDogY2xhenouaGFuZGxlO1xuICAgICAgICByZXN1bHRba2V5XSA9IGV2ZW50O1xuICAgICAgICBpbnN0YW5jZS5oYW5kbGVyc1trZXldID0gZXZlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IGZuO1xuICAgICAgICBpbnN0YW5jZS5oYW5kbGVyc1trZXldID0gZm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGV2ZW50IGNhbGxiYWNrcyBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYW4gZXZlbnRzIG1hcCBwcm9kdWNlZCBieSBkZWNvcmF0b3JzIHdoZXJlIGVhY2ggdmFsdWUgY2FuIGJlIGEgZmFjdG9yeVxuICAgKiByZXR1cm5pbmcgYSBmdW5jdGlvbiBvciBhIGNvbXBvbmVudCBjb25zdHJ1Y3Rvci4gV2hlbiBhIGNvbnN0cnVjdG9yIGlzIHJldHVybmVkLCB0aGUgbWV0aG9kXG4gICAqIG1hdGNoaW5nIHRoZSBldmVudCBrZXkgaXMgaW5zdGFudGlhdGVkIGFuZCBzdG9yZWQ7IG90aGVyd2lzZSB0aGUgcHJvZHVjZWQgZnVuY3Rpb24gaXNcbiAgICogYXNzaWduZWQgZGlyZWN0bHkuIFRoaXMgZW5hYmxlcyBmbGV4aWJsZSBldmVudCBiaW5kaW5nIGRlZmluaXRpb25zIGZvciBkZXJpdmVkIGNvbXBvbmVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIEV4dGVuZHMgYERlY2FmQ29tcG9uZW50PE1vZGVsPmAgdG8gc2NvcGUgYWNjZXB0YWJsZSBldmVudCBvd25lcnMuXG4gICAqIEBwYXJhbSBldmVudHMgLSBEaWN0aW9uYXJ5IG9mIGV2ZW50IG5hbWVzIG1hcHBlZCB0byBmdW5jdGlvbiBmYWN0b3JpZXMgb3IgY29tcG9uZW50IGNvbnN0cnVjdG9ycy5cbiAgICogQHBhcmFtIGluc3RhbmNlIC0gT3B0aW9uYWwgY29tcG9uZW50IGluc3RhbmNlIHRvIHJlY2VpdmUgdGhlIGV2ZW50czsgZGVmYXVsdHMgdG8gYHRoaXNgLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlRXZlbnRzPFQgZXh0ZW5kcyBEZWNhZkNvbXBvbmVudDxNb2RlbD4+KFxuICAgIGV2ZW50czogVUlFdmVudFByb3BlcnR5LFxuICAgIGluc3RhbmNlOiBUXG4gICk6IFVJRXZlbnRQcm9wZXJ0eSB7XG4gICAgY29uc3QgcmVzdWx0OiBVSUV2ZW50UHJvcGVydHkgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhldmVudHMpLmZvckVhY2goKFtrZXksIGZuXSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGtleSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBldnQgPSAoZm4gYXMgVUlGdW5jdGlvbkxpa2UpKCk7XG4gICAgICBpZiAoaXNDbGFzc0NvbnN0cnVjdG9yPFQ+KGV2dCkpIHtcbiAgICAgICAgY29uc3QgZm4gPSBuZXcgZXZ0KClba2V5IGFzIGtleW9mIFRdIGFzIFVJRXZlbnRIYW5kbGVyO1xuICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICByZXN1bHRbbmFtZV0gPSBmbjtcbiAgICAgICAgICBpbnN0YW5jZS5ldmVudHNbbmFtZV0gPSBmbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W25hbWVdID0gZm47XG4gICAgICAgIGluc3RhbmNlLmV2ZW50c1tuYW1lXSA9IGZuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVjYWZDb21wb25lbnQgfSBmcm9tIFwiLi9EZWNhZkNvbXBvbmVudFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQgaGFuZGxlclxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc3RydWN0dXJlIGZvciBoYW5kbGluZyBldmVudHMgaW4gdGhlIFVJIGRlY29yYXRvcnMgc3lzdGVtXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZm91bmRhdGlvbiBmb3IgbWFuYWdpbmcgYW5kIHByb2Nlc3NpbmcgZXZlbnRzIHRoYXQgb2NjdXJcbiAqIHdpdGhpbiB0aGUgVUkgY29tcG9uZW50cyBnZW5lcmF0ZWQgYnkgdGhlIGRlY29yYXRvcnMuXG4gKiBAY2xhc3MgRXZlbnRIYW5kbGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvdWlcbiAqL1xuZXhwb3J0IGNsYXNzIERlY2FmRXZlbnRIYW5kbGVyIGV4dGVuZHMgRGVjYWZDb21wb25lbnQ8TW9kZWw+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERlY2FmRXZlbnRIYW5kbGVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IEV2ZW50SGFuZGxlciBvYmplY3RcbiAgICogVGhpcyBjb25zdHJ1Y3RvciBjdXJyZW50bHkgZG9lc24ndCB0YWtlIGFueSBwYXJhbWV0ZXJzLCBidXQgaXQgY2FuIGJlXG4gICAqIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUgdG8gYWNjZXB0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpZiBuZWVkZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gZXZlbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBMb2dzIHRoZSBldmVudCBoYW5kbGluZyBwcm9jZXNzLCBpbmNsdWRpbmcgdGhlIGNvbXBvbmVudCBuYW1lIGFuZCB0aGUgYXJndW1lbnRzIHBhc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIGZvciB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgaGFuZGxlKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuaGFuZGxlKVxuICAgICAgLmluZm8oYGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50TmFtZX0gaGFuZGxpbmcgJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIGNsaWNrIGV2ZW50IHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogTG9ncyB0aGUgZXZlbnQgaGFuZGxpbmcgcHJvY2VzcywgaW5jbHVkaW5nIHRoZSBjb21wb25lbnQgbmFtZSBhbmQgdGhlIGFyZ3VtZW50cyBwYXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV2ZW50IGhhbmRsZXIuXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGhhbmRsZUNsaWNrKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuaGFuZGxlQ2xpY2spXG4gICAgICAuaW5mbyhcbiAgICAgICAgYGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50TmFtZX0gaGFuZGxpbmcgY2xpY2sgJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gY2xpY2sgZXZlbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBMb2dzIHRoZSBldmVudCBoYW5kbGluZyBwcm9jZXNzLCBpbmNsdWRpbmcgdGhlIGNvbXBvbmVudCBuYW1lIGFuZCB0aGUgYXJndW1lbnRzIHBhc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIGZvciB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgaGFuZGxlQWN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuaGFuZGxlQWN0aW9uKVxuICAgICAgLmluZm8oXG4gICAgICAgIGBjb21wb25lbnQgJHt0aGlzLmNvbXBvbmVudE5hbWV9IGhhbmRsaW5nIGFjdGlvbiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWBcbiAgICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWNhZlRyYW5zbGF0ZVNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIHRyYW5zbGF0ZShrZXk6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pik6IGFueSB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy50cmFuc2xhdGUpXG4gICAgICAuaW5mbyhcbiAgICAgICAgYE11c3QgdHJhbnNsYXRlICR7a2V5fSB3aXRoIHBhcmFtcyAke0pTT04uc3RyaW5naWZ5KHBhcmFtcyB8fCB7fSl9YFxuICAgICAgKTtcbiAgfVxuXG4gIGluc3RhbnQoa2V5OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnkge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuaW5zdGFudClcbiAgICAgIC5pbmZvKFxuICAgICAgICBgTXVzdCB0cmFuc2xhdGUgJHtrZXl9IHdpdGggcGFyYW1zICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zIHx8IHt9KX1gXG4gICAgICApO1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgdGhhdCBleHRlbmRzIHRoZSBNb2RlbCBwcm90b3R5cGUgd2l0aCByZW5kZXJpbmcgY2FwYWJpbGl0aWVzXG4gKiBAc3VtbWFyeSBBZGRzIHRoZSByZW5kZXIgbWV0aG9kIHRvIGFsbCBNb2RlbCBpbnN0YW5jZXMgZnJvbSBkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUmVuZGVyYWJsZSBpbnRlcmZhY2UgZm9yIHRoZSBNb2RlbCBjbGFzcyBieSBhZGRpbmcgYSByZW5kZXIgbWV0aG9kXG4gKiB0byBpdHMgcHJvdG90eXBlLiBUaGlzIGFsbG93cyBhbnkgTW9kZWwgaW5zdGFuY2UgdG8gYmUgcmVuZGVyZWQgdXNpbmcgdGhlIFJlbmRlcmluZ0VuZ2luZS5cbiAqIEBtb2R1bGUgbW9kZWwvb3ZlcnJpZGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvbW9kZWxcbiAqL1xuXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gXCIuLi91aS9SZW5kZXJpbmdcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uS2V5cywgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBnZXRVSUF0dHJpYnV0ZUtleSxcbiAgUmVuZGVyaW5nRXJyb3IsXG4gIFVJRWxlbWVudE1ldGFkYXRhLFxuICBVSUtleXMsXG4gIFVJTW9kZWxNZXRhZGF0YSxcbn0gZnJvbSBcIi4uL3VpL2luZGV4XCI7XG5pbXBvcnQgXCIuL21vZGVsXCI7XG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgdGhlIG1vZGVsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSByZW5kZXJpbmcgZW5naW5lXG4gKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgcmVuZGVyaW5nIHRvIHRoZSBSZW5kZXJpbmdFbmdpbmUgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGFcbiAqIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIHJlbmRlciBtZXRob2QgZnJvbSB0aGUgUmVuZGVyYWJsZSBpbnRlcmZhY2UgZm9yIGFsbCBNb2RlbCBpbnN0YW5jZXMuXG4gKiBJdCB1c2VzIHRoZSBSZW5kZXJpbmdFbmdpbmUgdG8gZGV0ZXJtaW5lIGhvdyB0byByZW5kZXIgdGhlIG1vZGVsIGJhc2VkIG9uIGl0cyBtZXRhZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgTSBUeXBlIG9mIHRoZSBtb2RlbCBiZWluZyByZW5kZXJlZFxuICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW5kZXJlZCBvdXRwdXQgaW4gdGhlIGZvcm1hdCBkZXRlcm1pbmVkIGJ5IHRoZSByZW5kZXJpbmcgZW5naW5lXG4gKi9cbk1vZGVsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPih0aGlzOiBNLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gUmVuZGVyaW5nRW5naW5lLnJlbmRlcih0aGlzLCAuLi5hcmdzKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnJlbmRlcmVkQnkgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5SRU5ERVJFRF9CWSkpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkudWlQcm9wZXJ0aWVzT2YgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBEZWNvcmF0aW9uS2V5cy5QUk9QRVJUSUVTKVxuICApO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXRhKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLnVpRGVjb3JhdGlvbk9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcDogc3RyaW5nLFxuICBrZXk/OiBzdHJpbmdcbik6IGFueSB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBEZWNvcmF0aW9uS2V5cy5QUk9QRVJUSUVTLCBwcm9wKVxuICApO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICgha2V5KSByZXR1cm4gbWV0YTtcbiAgcmV0dXJuIG1ldGFba2V5XTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpTW9kZWxPZiA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IFVJTW9kZWxNZXRhZGF0YSB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlVJTU9ERUwpKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpRWxlbWVudE9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcDogc3RyaW5nXG4pOiBVSUVsZW1lbnRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQobW9kZWwsIGdldFVJQXR0cmlidXRlS2V5KHByb3AsIFVJS2V5cy5FTEVNRU5UKSk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS51aUxpc3RNb2RlbE9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuKTogVUlNb2RlbE1ldGFkYXRhIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBVSUtleXMuVUlMSVNUTU9ERUwpKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpSGFuZGxlcnNGb3IgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4pOiBVSU1vZGVsTWV0YWRhdGEge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5IQU5ETEVSUykpO1xufTtcblxuKE1vZGVsIGFzIGFueSkudWlMYXlvdXRPZiA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IFVJTW9kZWxNZXRhZGF0YSB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlVJTEFZT1VUKSk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS51aUlzSGlkZGVuID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhTWV0YWRhdGEuZ2V0KG1vZGVsLCBnZXRVSUF0dHJpYnV0ZUtleShwcm9wLCBVSUtleXMuSElEREVOKSk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS51aUlzSGlkZGVuT24gPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBwcm9wOiBzdHJpbmcsXG4gIG9wPzogQ3J1ZE9wZXJhdGlvbktleXNcbik6IENydWRPcGVyYXRpb25LZXlzW10gfCBib29sZWFuIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChtb2RlbCwgZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcCwgVUlLZXlzLkhJRERFTikpO1xuICBpZiAoIW1ldGEpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFvcCkgcmV0dXJuIG1ldGEgYXMgQ3J1ZE9wZXJhdGlvbktleXNbXTtcbiAgcmV0dXJuIChtZXRhIGFzIENydWRPcGVyYXRpb25LZXlzW10pLmluY2x1ZGVzKG9wKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpVHlwZU9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcDogc3RyaW5nXG4pOiBVSU1vZGVsTWV0YWRhdGEge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUywgcHJvcClcbiAgKTtcbiAgaWYgKCFtZXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgYE5vIG1ldGFkYXRhIGZvdW5kIGZvciBwcm9wZXJ0eSAnJHtwcm9wfScgb24gbW9kZWwgJyR7bW9kZWwubmFtZX0nYFxuICAgICk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXRhKS5maWx0ZXIoKGspID0+XG4gICAgW1VJS2V5cy5QUk9QLCBVSUtleXMuRUxFTUVOVCwgVUlLZXlzLkNISUxEXS5pbmNsdWRlcyhrKVxuICApO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICBgTm8gVUkgdHlwZSBtZXRhZGF0YSBmb3VuZCBmb3IgcHJvcGVydHkgJyR7cHJvcH0nIG9uIG1vZGVsICcke21vZGVsLm5hbWV9J2BcbiAgICApO1xuICBpZiAoa2V5cy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgIGBPbmx5IG9uZSB0eXBlIG9mIGRlY29yYXRpb24gaXMgYWxsb3dlZC4gUGxlYXNlIGNob29zZSBiZXR3ZWVuIEB1aXByb3AsIEB1aWNoaWxkIG9yIEB1aWVsZW1lbnRgXG4gICAgKTtcbiAgcmV0dXJuIG1ldGFba2V5c1swXV07XG59O1xuLy9cbi8vIChNZXRhZGF0YSBhcyBhbnkpLnVpRWxlbWVudHMgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbi8vICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4vLyApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4vLyAgIGNvbnN0IHByb3BzID0gTWV0YWRhdGEudWlQcm9wZXJ0aWVzT2YobW9kZWwpO1xuLy8gICBpZiAoIXByb3BzKSByZXR1cm4gdW5kZWZpbmVkO1xuLy8gICByZXR1cm4gcHJvcHNcbi8vICAgICAubWFwKChwcm9wKSA9PiBNZXRhZGF0YS5nZXQobW9kZWwsIGdldFVJQXR0cmlidXRlS2V5KHByb3AsIFVJS2V5cy5FTEVNRU5UKSkpXG4vLyAgICAgLmZpbHRlcihCb29sZWFuKTtcbi8vIH0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLnVpTGlzdEl0ZW1zID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1ldGFkYXRhLFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCxcbiAgICBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKE1vZGVsKTtcbiIsImltcG9ydCB7IFVJS2V5cyB9IGZyb20gXCIuLi91aS9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIFVJSGFuZGxlck1ldGFkYXRhLFxuICBVSUxpc3RNb2RlbE1ldGFkYXRhLFxuICBVSU1vZGVsTWV0YWRhdGEsXG4gIFVJTGF5b3V0TWV0YWRhdGEsXG4gIElQYWdlZENvbXBvbmVudFByb3BlcnRpZXMsXG59IGZyb20gXCIuLi91aS90eXBlc1wiO1xuaW1wb3J0IHsgVUlNZWRpYUJyZWFrUG9pbnRzIH0gZnJvbSBcIi4uL3VpL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYXBwbHksIE1ldGFkYXRhLCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCB0YWdzIGEgY2xhc3MgYXMgYSBVSSBtb2RlbFxuICogQHN1bW1hcnkgQWRkcyByZW5kZXJpbmcgY2FwYWJpbGl0aWVzIHRvIGEgbW9kZWwgY2xhc3MgYnkgcHJvdmlkaW5nIGEgcmVuZGVyIG1ldGhvZFxuICogVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byB0aGUgY2xhc3MgdGhhdCBlbmFibGVzIGl0IHRvIGJlIHJlbmRlcmVkIGJ5IHRoZSBVSSByZW5kZXJpbmcgZW5naW5lLlxuICogVGhlIG1vZGVsIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZyBhbmQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gVGhlIEhUTUwgdGFnIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGlzIG1vZGVsIChkZWZhdWx0cyB0byBjbGFzcyBuYW1lKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSByZW5kZXJlZCBlbGVtZW50XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWltb2RlbFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2Ugd2l0aCBkZWZhdWx0IHRhZyAoY2xhc3MgbmFtZSlcbiAqIEB1aW1vZGVsKClcbiAqIGNsYXNzIFVzZXJQcm9maWxlIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gVXNhZ2Ugd2l0aCBjdXN0b20gdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgnZGl2JywgeyBjbGFzczogJ3VzZXItY2FyZCcgfSlcbiAqIGNsYXNzIFVzZXJDYXJkIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGNvbnN0cnVjdG9yXG4gKiAgIHBhcnRpY2lwYW50IGluc3RhbmNlXG4gKiAgIFN5c3RlbS0+PnVpbW9kZWw6ZG8oY29uc3RydWN0b3IpXG4gKiAgIHVpbW9kZWwtPj5jb25zdHJ1Y3RvcjogRXhlY3V0ZXMgdGhlIGNvbnN0cnVjdG9yXG4gKiAgIGNvbnN0cnVjdG9yLT4+dWltb2RlbDogcmV0dXJucyBpbnN0YW5jZVxuICogICB1aW1vZGVsLT4+aW5zdGFuY2U6IGFkZHMgdGhlIHJlbmRlciBtZXRob2RcbiAqICAgdWltb2RlbC0+PlN5c3RlbTogcmV0dXJucyBVSU1vZGVsIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW1vZGVsKHRhZz86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFVJTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnIHx8IG9yaWdpbmFsLm5hbWUsXG4gICAgICBwcm9wczogcHJvcHMsXG4gICAgfTtcbiAgICByZXR1cm4gbWV0YWRhdGEoXG4gICAgICBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5VSU1PREVMKSxcbiAgICAgIG1ldGFcbiAgICApKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIHdoaWNoIHJlbmRlcmluZyBlbmdpbmUgdG8gdXNlIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBBc3NvY2lhdGVzIGEgbW9kZWwgd2l0aCBhIHNwZWNpZmljIHJlbmRlcmluZyBlbmdpbmUgaW1wbGVtZW50YXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjbGFzcyxcbiAqIGVuYWJsaW5nIGRpZmZlcmVudCByZW5kZXJpbmcgc3RyYXRlZ2llcyBmb3IgZGlmZmVyZW50IG1vZGVscy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5naW5lIFRoZSBuYW1lIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHJlbmRlcmVkQnlcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNwZWNpZnkgYSBjdXN0b20gcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbFxuICogQHVpbW9kZWwoKVxuICogQHJlbmRlcmVkQnkoJ3JlYWN0JylcbiAqIGNsYXNzIFJlYWN0Q29tcG9uZW50IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCByZW5kZXJlZEJ5XG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj5yZW5kZXJlZEJ5OiBhcHBseSB0byBNb2RlbFxuICogICByZW5kZXJlZEJ5LT4+TW9kZWw6IGFkZHMgZW5naW5lIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIHNwZWNpZmllZCBlbmdpbmVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIHdpdGggY3VzdG9tIGVuZ2luZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyZWRCeShlbmdpbmU6IHN0cmluZykge1xuICByZXR1cm4gYXBwbHkoXG4gICAgbWV0YWRhdGEoTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBVSUtleXMuUkVOREVSRURfQlkpLCBlbmdpbmUpXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHRhZ3MgYSBtb2RlbCBhcyBhIGxpc3QgaXRlbSBmb3IgVUkgcmVuZGVyaW5nXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgbW9kZWwgc2hvdWxkIGJlIHJlbmRlcmVkIHdoZW4gZGlzcGxheWVkIGluIGEgbGlzdCBjb250ZXh0XG4gKiBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG1ldGFkYXRhIHRvIHRoZSBjbGFzcyB0aGF0IGVuYWJsZXMgaXQgdG8gYmUgcmVuZGVyZWQgYXMgYSBsaXN0IGl0ZW1cbiAqIGJ5IHRoZSBVSSByZW5kZXJpbmcgZW5naW5lLiBUaGUgbW9kZWwgd2lsbCBiZSByZW5kZXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiB3aGVuIGl0IGFwcGVhcnMgaW4gYSBsaXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSBUaGUgSFRNTCB0YWcgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoaXMgbW9kZWwgYXMgYSBsaXN0IGl0ZW0gKGRlZmF1bHRzIHRvIGNsYXNzIG5hbWUpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmVkIGxpc3QgaXRlbSBlbGVtZW50XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsaXN0bW9kZWxcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCB0YWcgKGNsYXNzIG5hbWUpXG4gKiBAdWltb2RlbCgpXG4gKiBAdWlsaXN0bW9kZWwoKVxuICogY2xhc3MgVG9kb0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiAvLyBVc2FnZSB3aXRoIGN1c3RvbSB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKClcbiAqIEB1aWxpc3Rtb2RlbCgnbGknLCB7IGNsYXNzOiAnbGlzdC1ncm91cC1pdGVtJyB9KVxuICogY2xhc3MgTGlzdEl0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0ZXh0OiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlsaXN0bW9kZWxcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIFN5c3RlbS0+PnVpbGlzdG1vZGVsOiBhcHBseSB0byBNb2RlbFxuICogICB1aWxpc3Rtb2RlbC0+Pk1vZGVsOiBhZGRzIGxpc3QgaXRlbSBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogdXNlcyBsaXN0IGl0ZW0gbWV0YWRhdGEgd2hlbiBpbiBsaXN0IGNvbnRleHRcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIHdpdGggbGlzdCBpdGVtIHN0eWxpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGlzdG1vZGVsKG5hbWU/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhOiBVSUxpc3RNb2RlbE1ldGFkYXRhID0ge1xuICAgICAgaXRlbToge1xuICAgICAgICB0YWc6IG5hbWUgfHwgb3JpZ2luYWwubmFtZSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlVJTElTVE1PREVMKSxcbiAgICAgIG1ldGFcbiAgICApKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgYWRkcyBldmVudCBoYW5kbGVycyB0byBhIFVJIG1vZGVsXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgZXZlbnQgaGFuZGxlcnMgdGhhdCBzaG91bGQgYmUgYXR0YWNoZWQgdG8gdGhlIHJlbmRlcmVkIG1vZGVsXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSBldmVudCBoYW5kbGVycyB0aGF0IHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogYXR0YWNoZWQgdG8gdGhlIHJlbmRlcmVkIFVJIGVsZW1lbnQuIFRoZSBoYW5kbGVycyBhcmUgcGFzc2VkIGFzIHByb3BlcnRpZXNcbiAqIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBPYmplY3QgY29udGFpbmluZyBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgb3RoZXIgcHJvcGVydGllc1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpaGFuZGxlcnNcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCBldmVudCBoYW5kbGVycyB0byBhIG1vZGVsXG4gKiBAdWltb2RlbCgnYnV0dG9uJylcbiAqIEB1aWhhbmRsZXJzKHtcbiAqICAgb25DbGljazogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQnKSxcbiAqICAgb25Nb3VzZU92ZXI6IChldmVudCkgPT4gY29uc29sZS5sb2coJ01vdXNlIG92ZXIgYnV0dG9uJyksXG4gKiAgIGRpc2FibGVkOiBmYWxzZVxuICogfSlcbiAqIGNsYXNzIENsaWNrYWJsZUJ1dHRvbiBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGxhYmVsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQWRkIGZvcm0gc3VibWlzc2lvbiBoYW5kbGVyc1xuICogQHVpbW9kZWwoJ2Zvcm0nKVxuICogQHVpaGFuZGxlcnMoe1xuICogICBvblN1Ym1pdDogKGV2ZW50KSA9PiB7XG4gKiAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAqICAgICBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQnKTtcbiAqICAgfSxcbiAqICAgb25SZXNldDogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnRm9ybSByZXNldCcpXG4gKiB9KVxuICogY2xhc3MgQ29udGFjdEZvcm0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBlbWFpbDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHVpaGFuZGxlcnNcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIFN5c3RlbS0+PnVpaGFuZGxlcnM6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpaGFuZGxlcnMtPj5Nb2RlbDogYWRkcyBoYW5kbGVyIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiByZXF1ZXN0cyByZW5kZXJpbmcgd2l0aCBoYW5kbGVyc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogcmVuZGVycyBlbGVtZW50IHdpdGggZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWRcbiAqICAgVUktPj5Nb2RlbDogdHJpZ2dlcnMgaGFuZGxlcnMgb24gZXZlbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWhhbmRsZXJzKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhOiBVSUhhbmRsZXJNZXRhZGF0YSA9IHtcbiAgICAgIGhhbmRsZXJzOiBwcm9wcyxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLkhBTkRMRVJTKSxcbiAgICAgIG1ldGFcbiAgICApKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgY3JlYXRlcyBhIGxheW91dCBjb250YWluZXIgd2l0aCBncmlkIHNwZWNpZmljYXRpb25zXG4gKiBAc3VtbWFyeSBDb21iaW5lcyBVSSBtb2RlbCBmdW5jdGlvbmFsaXR5IHdpdGggbGF5b3V0IGdyaWQgY29uZmlndXJhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgY3JlYXRlcyBhIFVJIG1vZGVsIHRoYXQgYWN0cyBhcyBhIGxheW91dCBjb250YWluZXIgd2l0aCBzcGVjaWZpZWRcbiAqIGNvbHVtbiBhbmQgcm93IGNvbmZpZ3VyYXRpb25zLiBJdCdzIGEgY29udmVuaWVuY2UgZGVjb3JhdG9yIHRoYXQgY29tYmluZXMuXG4gKiBAdWltb2RlbCB3aXRoIGxheW91dC1zcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciByZXNwb25zaXZlIGdyaWQgbGF5b3V0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIHRhZyB0byB1c2UgZm9yIHRoZSBsYXlvdXQgY29udGFpbmVyXG4gKiBAcGFyYW0ge251bWJlcnxib29sZWFufSBbY29sc01vZGU9MV0gTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQgbGF5b3V0IG9yIGEgYm9vbGVhbiBmb3IgZmxleCBtb2RlXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmdbXX0gW3Jvd3M9MV0gTnVtYmVyIG9mIHJvd3Mgb3IgYXJyYXkgb2Ygcm93IGRlZmluaXRpb25zXG4gKiBAcGFyYW0ge1VJTWVkaWFCcmVha1BvaW50c30gW2JyZWFrcG9pbnQ9J20nXSBNZWRpYSBicmVha3BvaW50IGZvciByZXNwb25zaXZlIGJlaGF2aW9yXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsYXlvdXRcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHNpbXBsZSAyLWNvbHVtbiBsYXlvdXRcbiAqIEB1aWxheW91dCgnZGl2JywgMiwgMylcbiAqIGNsYXNzIFR3b0NvbHVtbkxheW91dCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMSwgMSlcbiAqICAgaGVhZGVyOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgxLCAyKVxuICogICBsZWZ0Q29udGVudDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMiwgMilcbiAqICAgcmlnaHRDb250ZW50OiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQ3JlYXRlIGEgcmVzcG9uc2l2ZSBsYXlvdXQgd2l0aCBjdXN0b20gYnJlYWtwb2ludFxuICogQHVpbGF5b3V0KCdzZWN0aW9uJywgdHJ1ZSwgMiwgJ2wnKVxuICogY2xhc3MgUmVzcG9uc2l2ZUxheW91dCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMSwgMSlcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDIsIDEpXG4gKiAgIHN1YnRpdGxlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlsYXlvdXRcbiAqICAgcGFydGljaXBhbnQgdWltb2RlbFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgU3lzdGVtLT4+dWlsYXlvdXQ6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpbGF5b3V0LT4+dWltb2RlbDogY2FsbCB3aXRoIGxheW91dCBwcm9wc1xuICogICB1aW1vZGVsLT4+TW9kZWw6IGFkZHMgbW9kZWwgbWV0YWRhdGEgd2l0aCBsYXlvdXQgY29uZmlnXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiByZXF1ZXN0cyByZW5kZXJpbmcgYXMgbGF5b3V0IGNvbnRhaW5lclxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgZ3JpZCBsYXlvdXQgd2l0aCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsYXlvdXQoXG4gIHRhZzogc3RyaW5nLFxuICBjb2xzTW9kZTogbnVtYmVyIHwgYm9vbGVhbiA9IDEsXG4gIHJvd3M6IG51bWJlciB8IHN0cmluZ1tdID0gMSxcbiAgcHJvcHM6IGFueSA9IHt9XG4pIHtcbiAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgLi4uKHR5cGVvZiBjb2xzTW9kZSA9PT0gXCJib29sZWFuXCJcbiAgICAgID8ge1xuICAgICAgICAgIGZsZXhNb2RlOiBjb2xzTW9kZSxcbiAgICAgICAgICBjb2xzOiAxLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICBmbGV4TW9kZTogZmFsc2UsXG4gICAgICAgICAgY29sczogY29sc01vZGUsXG4gICAgICAgIH0pLFxuICAgIHJvd3MsXG4gICAgLi4uT2JqZWN0LmFzc2lnbih7IGJyZWFrcG9pbnQ6IFVJTWVkaWFCcmVha1BvaW50cy5MQVJHRSB9LCBwcm9wcyksXG4gIH0gYXMgVUlMYXlvdXRNZXRhZGF0YSk7XG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBtZXRhZGF0YShNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5VSUxBWU9VVCksIGNvbmZpZykob3JpZ2luYWwpO1xuICAgIHJldHVybiB1aW1vZGVsKHRhZywgY29uZmlnKShvcmlnaW5hbCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBjcmVhdGVzIGEgbXVsdGktc3RlcCBmb3JtIG1vZGVsIHdpdGggcGFnZSBuYXZpZ2F0aW9uXG4gKiBAc3VtbWFyeSBDb21iaW5lcyBVSSBtb2RlbCBmdW5jdGlvbmFsaXR5IHdpdGggc3RlcHBlZC93aXphcmQgZm9ybSBjb25maWd1cmF0aW9uXG4gKiBUaGlzIGRlY29yYXRvciBjcmVhdGVzIGEgVUkgbW9kZWwgdGhhdCBhY3RzIGFzIGEgbXVsdGktc3RlcCBjb250YWluZXIgd2l0aCBwYWdlIG5hdmlnYXRpb25cbiAqIGNhcGFiaWxpdGllcy4gSXQgaXMgZGVzaWduZWQgZm9yIHdpemFyZC1zdHlsZSBmb3JtcyBvciBtdWx0aS1wYWdlIHdvcmtmbG93cyB3aGVyZSB1c2Vyc1xuICogcHJvZ3Jlc3MgdGhyb3VnaCBzZXF1ZW50aWFsIHN0ZXBzLiBUaGUgZGVjb3JhdG9yIGNvbWJpbmVzIEB1aW1vZGVsIHdpdGggcGFnZS1zcGVjaWZpY1xuICogcHJvcGVydGllcyBhbmQgb3B0aW9uYWwgcGFnaW5hdGlvbiBjb250cm9scy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIC0gVGhlIEhUTUwgdGFnIHRvIHVzZSBmb3IgdGhlIHN0ZXBwZWQgZm9ybSBjb250YWluZXJcbiAqIEBwYXJhbSB7bnVtYmVyIHwgSVBhZ2VkQ29tcG9uZW50UHJvcGVydGllc1tdfSBbcGFnZXM9MV0gLSBOdW1iZXIgb2YgcGFnZXMgb3IgYW4gYXJyYXkgb2YgcGFnZSBkZWZpbml0aW9ucyB3aXRoIG1ldGFkYXRhXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYWdpbmF0ZWQ9ZmFsc2VdIC0gV2hldGhlciB0byBzaG93IHBhZ2luYXRpb24gY29udHJvbHMgKGUuZy4sIHByZXYvbmV4dCBidXR0b25zKVxuICogQHBhcmFtIHthbnl9IFtwcm9wcz17fV0gLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgY29udGFpbmVyIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXN0ZXBwZWRtb2RlbFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgc2ltcGxlIDMtc3RlcCB3aXphcmQgZm9ybVxuICogQHVpc3RlcHBlZG1vZGVsKCdkaXYnLCAzLCB0cnVlKVxuICogY2xhc3MgUmVnaXN0cmF0aW9uV2l6YXJkIGV4dGVuZHMgTW9kZWwge1xuICogICAvLyBQYWdlIDE6IFBlcnNvbmFsIEluZm9cbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDEpXG4gKiAgIGZpcnN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDEpXG4gKiAgIGxhc3ROYW1lOiBzdHJpbmc7XG4gKlxuICogICAvLyBQYWdlIDI6IENvbnRhY3QgSW5mb1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMilcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgyKVxuICogICBwaG9uZTogc3RyaW5nO1xuICpcbiAqICAgLy8gUGFnZSAzOiBDb25maXJtYXRpb25cbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDMpXG4gKiAgIGFjY2VwdFRlcm1zOiBib29sZWFuO1xuICogfVxuICpcbiAqIC8vIENyZWF0ZSBhIHdpemFyZCB3aXRoIGN1c3RvbSBwYWdlIGRlZmluaXRpb25zXG4gKiBAdWlzdGVwcGVkbW9kZWwoJ3NlY3Rpb24nLCBbXG4gKiAgIHsgdGl0bGU6ICdQZXJzb25hbCcsIGljb246ICd1c2VyJyB9LFxuICogICB7IHRpdGxlOiAnQ29udGFjdCcsIGljb246ICdlbWFpbCcgfSxcbiAqICAgeyB0aXRsZTogJ1JldmlldycsIGljb246ICdjaGVjaycgfVxuICogXSwgdHJ1ZSwgeyBjbGFzczogJ3dpemFyZC1jb250YWluZXInIH0pXG4gKiBjbGFzcyBPbmJvYXJkaW5nV2l6YXJkIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMSlcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgyKVxuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDMpXG4gKiAgIHByZWZlcmVuY2VzOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlzdGVwcGVkbW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWltb2RlbFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgUGFnaW5hdGlvbkNvbnRyb2xsZXJcbiAqICAgU3lzdGVtLT4+dWlzdGVwcGVkbW9kZWw6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpc3RlcHBlZG1vZGVsLT4+dWltb2RlbDogY2FsbCB3aXRoIHBhZ2UgY29uZmlnXG4gKiAgIHVpbW9kZWwtPj5Nb2RlbDogYWRkcyBtb2RlbCBtZXRhZGF0YSB3aXRoIHBhZ2VzIGFuZCBwYWdpbmF0aW9uXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiByZXF1ZXN0cyByZW5kZXJpbmcgYXMgc3RlcHBlZCBmb3JtXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlBhZ2luYXRpb25Db250cm9sbGVyOiBpbml0aWFsaXplIHBhZ2UgbmF2aWdhdGlvblxuICogICBQYWdpbmF0aW9uQ29udHJvbGxlci0+PlN5c3RlbTogcmVuZGVycyBjdXJyZW50IHBhZ2Ugd2l0aCBuYXZpZ2F0aW9uIGNvbnRyb2xzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXN0ZXBwZWRtb2RlbChcbiAgdGFnOiBzdHJpbmcsXG4gIHBhZ2VzOiBudW1iZXIgfCBJUGFnZWRDb21wb25lbnRQcm9wZXJ0aWVzW10gPSAxLFxuICBwYWdpbmF0ZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgcHJvcHM6IGFueSA9IHt9XG4pIHtcbiAgbGV0IHBhZ2VUaXRsZXM6IElQYWdlZENvbXBvbmVudFByb3BlcnRpZXNbXSA9IFtdO1xuICBpZiAodHlwZW9mIHBhZ2VzID09PSBcIm9iamVjdFwiKSB7XG4gICAgcGFnZVRpdGxlcyA9IHBhZ2VzIGFzIElQYWdlZENvbXBvbmVudFByb3BlcnRpZXNbXTtcbiAgICBwYWdlcyA9IHBhZ2VUaXRsZXMubGVuZ3RoO1xuICB9XG4gIHJldHVybiB1aW1vZGVsKHRhZywge1xuICAgIHBhZ2VzLFxuICAgIHBhZ2luYXRlZCxcbiAgICBwYWdlVGl0bGVzLFxuICAgIHByb3BzLFxuICB9KTtcbn1cbiIsImltcG9ydCBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxCdWlsZGVyIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgdWloYW5kbGVycyxcbiAgdWlsYXlvdXQsXG4gIHVpbGlzdG1vZGVsLFxuICB1aW1vZGVsLFxuICB1aXN0ZXBwZWRtb2RlbCxcbiAgcmVuZGVyZWRCeSxcbn0gZnJvbSBcIi4uL21vZGVsL2RlY29yYXRvcnNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIGludGVyZmFjZSBNb2RlbEJ1aWxkZXI8TT4ge1xuICAgIGRlY29yYXRlQ2xhc3MoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNb2RlbEJ1aWxkZXI8TT4ge1xuICAgIHVpbW9kZWwodGFnPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgcmVuZGVyZWRCeShlbmdpbmU6IHN0cmluZyk6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICB1aWxpc3Rtb2RlbChuYW1lPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgdWloYW5kbGVycyhwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgdWlsYXlvdXQoXG4gICAgICB0YWc6IHN0cmluZyxcbiAgICAgIGNvbHNNb2RlPzogbnVtYmVyIHwgYm9vbGVhbixcbiAgICAgIHJvd3M/OiBudW1iZXIgfCBzdHJpbmdbXSxcbiAgICAgIHByb3BzPzogYW55XG4gICAgKTogTW9kZWxCdWlsZGVyPE0+O1xuICAgIHVpc3RlcHBlZG1vZGVsKFxuICAgICAgdGFnOiBzdHJpbmcsXG4gICAgICBwYWdlcz86IG51bWJlciB8IGFueVtdLFxuICAgICAgcGFnaW5hdGVkPzogYm9vbGVhbixcbiAgICAgIHByb3BzPzogYW55XG4gICAgKTogTW9kZWxCdWlsZGVyPE0+O1xuICB9XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IE1vZGVsQnVpbGRlci5wcm90b3R5cGUgYXMgTW9kZWxCdWlsZGVyPGFueT4gJiB7XG4gIHVpbW9kZWw6ICh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG4gIHJlbmRlcmVkQnk6IChlbmdpbmU6IHN0cmluZykgPT4gTW9kZWxCdWlsZGVyPGFueT47XG4gIHVpbGlzdG1vZGVsOiAobmFtZT86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBNb2RlbEJ1aWxkZXI8YW55PjtcbiAgdWloYW5kbGVyczogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG4gIHVpbGF5b3V0OiAoXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgY29sc01vZGU/OiBudW1iZXIgfCBib29sZWFuLFxuICAgIHJvd3M/OiBudW1iZXIgfCBzdHJpbmdbXSxcbiAgICBwcm9wcz86IGFueVxuICApID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xuICB1aXN0ZXBwZWRtb2RlbDogKFxuICAgIHRhZzogc3RyaW5nLFxuICAgIHBhZ2VzPzogbnVtYmVyIHwgYW55W10sXG4gICAgcGFnaW5hdGVkPzogYm9vbGVhbixcbiAgICBwcm9wcz86IGFueVxuICApID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xufTtcblxuaWYgKCFwcm90b3R5cGUuZGVjb3JhdGVDbGFzcykge1xuICBwcm90b3R5cGUuZGVjb3JhdGVDbGFzcyA9IGZ1bmN0aW9uIChkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKSB7XG4gICAgaWYgKCEodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMpIHtcbiAgICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycyA9IFtdO1xuICAgIH1cbiAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5wcm90b3R5cGUudWltb2RlbCA9IGZ1bmN0aW9uICh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKHVpbW9kZWwodGFnLCBwcm9wcykpO1xufTtcblxucHJvdG90eXBlLnJlbmRlcmVkQnkgPSBmdW5jdGlvbiAoZW5naW5lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyhyZW5kZXJlZEJ5KGVuZ2luZSkpO1xufTtcblxucHJvdG90eXBlLnVpbGlzdG1vZGVsID0gZnVuY3Rpb24gKG5hbWU/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKHVpbGlzdG1vZGVsKG5hbWUsIHByb3BzKSk7XG59O1xuXG5wcm90b3R5cGUudWloYW5kbGVycyA9IGZ1bmN0aW9uIChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyh1aWhhbmRsZXJzKHByb3BzKSk7XG59O1xuXG5wcm90b3R5cGUudWlsYXlvdXQgPSBmdW5jdGlvbiAoXG4gIHRhZzogc3RyaW5nLFxuICBjb2xzTW9kZT86IG51bWJlciB8IGJvb2xlYW4sXG4gIHJvd3M/OiBudW1iZXIgfCBzdHJpbmdbXSxcbiAgcHJvcHM/OiBhbnlcbikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKHVpbGF5b3V0KHRhZywgY29sc01vZGUsIHJvd3MsIHByb3BzKSk7XG59O1xuXG5wcm90b3R5cGUudWlzdGVwcGVkbW9kZWwgPSBmdW5jdGlvbiAoXG4gIHRhZzogc3RyaW5nLFxuICBwYWdlcz86IG51bWJlciB8IGFueVtdLFxuICBwYWdpbmF0ZWQ/OiBib29sZWFuLFxuICBwcm9wcz86IGFueVxuKSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3ModWlzdGVwcGVkbW9kZWwodGFnLCBwYWdlcywgcGFnaW5hdGVkLCBwcm9wcykpO1xufTtcbiIsIi8qKlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzL2Rhc2hib2FyZC9jb25zdGFudHNcbiAqIEBzdW1tYXJ5IE1ldGFkYXRhIGtleXMgZm9yIHRoZSBkYXNoYm9hcmQtc2VsZWN0YWJsZS1jb21wb25lbnQgZGVjb3JhdG9yLlxuICogQGRlc2NyaXB0aW9uIE5hbWVzcGFjZWQga2V5cyB1c2VkIHRvIHN0b3JlIHBhbGV0dGUgbWV0YWRhdGEgb24gYVxuICogYEBkYXNoY29tcG9uZW50YC1kZWNvcmF0ZWQgY2xhc3MuIE1pcnJvcnMgdGhlIGBncmFwaGAgc3VibW9kdWxlJ3NcbiAqIGBHcmFwaEtleXNgIGNvbnZlbnRpb24gc28gdGhlIGRhc2hib2FyZCBtZXRhZGF0YSBmYW1pbHkgaXMgaXNvbGF0ZWQgZnJvbVxuICogdGhlIFVJIG1vZGVsIG1ldGFkYXRhIGtleXMuXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0YWRhdGEga2V5IGNvbnN0YW50cyBmb3IgZGFzaGJvYXJkIGNvbXBvbmVudHMuXG4gKiBAc3VtbWFyeSBDb2xsZWN0aW9uIG9mIHN0cmluZyBrZXlzIHVzZWQgYXMgbWV0YWRhdGEgbmFtZXNwYWNlcyBmb3JcbiAqIGRhc2hib2FyZC1zZWxlY3RhYmxlIGNvbXBvbmVudHMuIFRoZSBgQ09NUE9ORU5UYCBrZXkgY2FycmllcyB0aGUgcGFsZXR0ZVxuICogbWV0YWRhdGEgb2JqZWN0IGF0dGFjaGVkIGJ5IGBAZGFzaGNvbXBvbmVudCgpYC5cbiAqIEBlbnVtIERhc2hLZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL2NvbnN0YW50c1xuICovXG5leHBvcnQgZW51bSBEYXNoS2V5cyB7XG4gIC8qKiBOYW1lc3BhY2Ugcm9vdCBmb3IgYWxsIGRhc2hib2FyZCBtZXRhZGF0YS4gKi9cbiAgUk9PVCA9IFwiZGFzaGJvYXJkXCIsXG4gIC8qKiBLZXkgdW5kZXIgd2hpY2ggYEBkYXNoY29tcG9uZW50KClgIHBhbGV0dGUgbWV0YWRhdGEgaXMgc3RvcmVkLiAqL1xuICBDT01QT05FTlQgPSBgJHtEYXNoS2V5cy5ST09UfS5jb21wb25lbnRgLFxufVxuIiwiLyoqXG4gKiBAbW9kdWxlIHVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL3JlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBEYXNoYm9hcmQtc2VsZWN0YWJsZSBjb21wb25lbnQgcmVnaXN0cnkuXG4gKiBAZGVzY3JpcHRpb24gTW9kdWxlLWxldmVsIHJlZ2lzdHJ5IHRoYXQgdHJhY2tzIGV2ZXJ5IGBAZGFzaGNvbXBvbmVudGAtXG4gKiBkZWNvcmF0ZWQgY29uc3RydWN0b3IuIFRoZSBgQGRhc2hjb21wb25lbnRgIGRlY29yYXRvciBjYWxsc1xuICoge0BsaW5rIHJlZ2lzdGVyRGFzaENvbXBvbmVudH0gYXMgYSBzaWRlLWVmZmVjdDsgY29uc3VtZXJzIGRpc2NvdmVyIGFsbFxuICogZGVjb3JhdGVkIGNsYXNzZXMgdmlhIHtAbGluayBkYXNoQ29tcG9uZW50c30uXG4gKlxuICogVGhpcyBmb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgdGhlIGBncmFwaGAgc3VibW9kdWxlJ3Mgbm9kZSByZWdpc3RyeSBhbmRcbiAqIHRoZSBgSW5qZWN0YWJsZXNSZWdpc3RyeWAgaW4gYGluamVjdGFibGUtZGVjb3JhdG9yc2Ag4oCUIGEgcHJpdmF0ZSBgU2V0YFxuICogcmF0aGVyIHRoYW4gdGhlIGBNZXRhZGF0YWAgaW50ZXJuYWwgaGVscGVycy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogSW50ZXJuYWwgcmVnaXN0cnkgb2YgYWxsIGBAZGFzaGNvbXBvbmVudGAtZGVjb3JhdGVkIGNvbnN0cnVjdG9ycy5cbiAqL1xuY29uc3QgREFTSF9DT01QT05FTlRfUkVHSVNUUlkgPSBuZXcgU2V0PENvbnN0cnVjdG9yPigpO1xuXG4vKipcbiAqIEFwcGVuZHMgYSBjb25zdHJ1Y3RvciB0byB0aGUgZGFzaGJvYXJkIGNvbXBvbmVudCByZWdpc3RyeS4gQ2FsbGVkIGJ5IHRoZVxuICogYEBkYXNoY29tcG9uZW50YCBkZWNvcmF0b3IuIElkZW1wb3RlbnQg4oCUIHJlLWRlY29yYXRpbmcgdGhlIHNhbWUgY2xhc3MgZG9lc1xuICogbm90IGR1cGxpY2F0ZSB0aGUgZW50cnkuXG4gKiBAcGFyYW0gY3RvciBUaGUgYEBkYXNoY29tcG9uZW50YC1kZWNvcmF0ZWQgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRhc2hDb21wb25lbnQoY3RvcjogQ29uc3RydWN0b3IpOiB2b2lkIHtcbiAgREFTSF9DT01QT05FTlRfUkVHSVNUUlkuYWRkKGN0b3IpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYWxsIGBAZGFzaGNvbXBvbmVudGAtZGVjb3JhdGVkIGNvbnN0cnVjdG9ycy5cbiAqIEByZXR1cm5zIEEgZnJlc2ggYXJyYXkgb2YgY29uc3RydWN0b3JzIChtdXRhYmxlOyBkb2VzIG5vdCBleHBvc2UgdGhlIGludGVybmFsIHNldCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ29tcG9uZW50cygpOiBDb25zdHJ1Y3RvcltdIHtcbiAgcmV0dXJuIFsuLi5EQVNIX0NPTVBPTkVOVF9SRUdJU1RSWV07XG59XG5cbi8qKlxuICogQ2xlYXJzIHRoZSBkYXNoYm9hcmQgY29tcG9uZW50IHJlZ2lzdHJ5LiBJbnRlbmRlZCBmb3IgdGVzdHMgb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0RGFzaENvbXBvbmVudFJlZ2lzdHJ5KCk6IHZvaWQge1xuICBEQVNIX0NPTVBPTkVOVF9SRUdJU1RSWS5jbGVhcigpO1xufVxuIiwiLyoqXG4gKiBAbW9kdWxlIHVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL2RlY29yYXRvcnNcbiAqIEBzdW1tYXJ5IFRoZSBgQGRhc2hjb21wb25lbnQoKWAgY2xhc3MgZGVjb3JhdG9yLlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBtb2R1bGUgdGhhdCBtYXJrcyBkZWNhZiBtb2RlbCBjbGFzc2VzIGFzXG4gKiBkYXNoYm9hcmQtc2VsZWN0YWJsZSBwYWxldHRlIGVudHJpZXMuIEF0dGFjaGVzIHRoZSB7QGxpbmsgRGFzaENvbXBvbmVudE1ldGFkYXRhfVxuICogcGF5bG9hZCB1bmRlciB7QGxpbmsgRGFzaEtleXMuQ09NUE9ORU5UfSBhbmQgcmVnaXN0ZXJzIHRoZSBjbGFzcyBpbiB0aGVcbiAqIGRhc2hib2FyZCByZWdpc3RyeSBhcyBhIHNpZGUtZWZmZWN0LlxuICovXG5cbmltcG9ydCB7XG4gIGFwcGx5LFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyB1aW1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IERhc2hLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IERhc2hDb21wb25lbnRNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyByZWdpc3RlckRhc2hDb21wb25lbnQgfSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGFzcyBkZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGRhc2hib2FyZC1zZWxlY3RhYmxlLlxuICogQHN1bW1hcnkgQXR0YWNoZXMgcGFsZXR0ZSBtZXRhZGF0YSAodHJhbnNsYXRpb24gbGFiZWwga2V5LCBkZWZhdWx0IGdyaWRcbiAqIHNpemUsIGNvbmZpZ3VyYXRpb24gbW9kZWwgcmVmZXJlbmNlKSBhbmQgcmVnaXN0ZXJzIHRoZSBjb25zdHJ1Y3RvciBpbiB0aGVcbiAqIGRhc2hib2FyZCBjb21wb25lbnQgcmVnaXN0cnksIG1pcnJvcmluZyB0aGUgZ3JhcGggYEBub2RlKClgIGRlY29yYXRvci5cbiAqXG4gKiBVc2FnZTpcbiAqIGBgYHRzXG4gKiBAZGFzaGNvbXBvbmVudChcIm15LndpZGdldFwiLCB7XG4gKiAgIGxhYmVsOiBcIm15LndpZGdldC5sYWJlbFwiLFxuICogICBkZWZhdWx0U2l6ZTogeyBjb2xzOiAyLCByb3dzOiAxIH0sXG4gKiAgIG1vZGVsOiBNeVdpZGdldENvbmZpZ01vZGVsLFxuICogfSlcbiAqIEBtb2RlbCgpXG4gKiBleHBvcnQgY2xhc3MgTXlXaWRnZXQgZXh0ZW5kcyBNb2RlbCB7IC4uLiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gVGhlIGNvbXBvbmVudCB0YWcgKGRlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lKS5cbiAqIEBwYXJhbSB7RGFzaENvbXBvbmVudE1ldGFkYXRhfSBbZGFzaF0gUGFsZXR0ZSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZC1ob2MgcHJvcHMgZm9yIHRoZSBjb21wb25lbnQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKiBAZnVuY3Rpb24gZGFzaGNvbXBvbmVudFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhc2hjb21wb25lbnQoXG4gIHRhZz86IHN0cmluZyxcbiAgZGFzaD86IERhc2hDb21wb25lbnRNZXRhZGF0YSxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgZnVuY3Rpb24gZGFzaGNvbXBvbmVudChcbiAgICB0YWc/OiBzdHJpbmcsXG4gICAgZGFzaD86IERhc2hDb21wb25lbnRNZXRhZGF0YSxcbiAgICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogRGFzaENvbXBvbmVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiBkYXNoPy50YWcgfHwgdGFnLFxuICAgICAgLi4uZGFzaCxcbiAgICAgIGRlZmF1bHRTaXplOiBkYXNoPy5kZWZhdWx0U2l6ZSA/PyB7IGNvbHM6IDEsIHJvd3M6IDEgfSxcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiBpbm5lckRhc2hDb21wb25lbnQodGFyZ2V0OiBvYmplY3QpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5KFxuICAgICAgICB1aW1vZGVsKHRhZywgcHJvcHMpLFxuICAgICAgICBtZXRhZGF0YShEYXNoS2V5cy5DT01QT05FTlQsIG1ldGEpXG4gICAgICApKHRhcmdldCk7XG4gICAgICByZWdpc3RlckRhc2hDb21wb25lbnQodGFyZ2V0IGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihEYXNoS2V5cy5DT01QT05FTlQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGRhc2hjb21wb25lbnQsXG4gICAgICBhcmdzOiBbdGFnLCBkYXNoLCBwcm9wc10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsIi8qKlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzL2Rhc2hib2FyZC9yZWFkZXJcbiAqIEBzdW1tYXJ5IE1ldGFkYXRhIHJlYWRlcnMgZm9yIGBAZGFzaGNvbXBvbmVudCgpYC1kZWNvcmF0ZWQgY2xhc3Nlcy5cbiAqIEBkZXNjcmlwdGlvbiBSZWFkLXNpZGUgaGVscGVycyB0aGF0IHJlc29sdmUgdGhlIHBhbGV0dGUgbWV0YWRhdGEgYW5kIHRoZVxuICogbm9ybWFsaXplZCB7QGxpbmsgRGFzaENvbXBvbmVudERlZmluaXRpb259IGF0dGFjaGVkIGJ5IGBAZGFzaGNvbXBvbmVudCgpYC5cbiAqIEFjY2VwdCBlaXRoZXIgYSBjb25zdHJ1Y3RvciBvciBhbiBpbnN0YW5jZSwgYW5kIGFwcGx5IGRlZmF1bHRzIHNvIGNvbnN1bWVyc1xuICogbmV2ZXIgcmVzb2x2ZSB1bmRlZmluZWQgZm9vdHByaW50IHZhbHVlcy5cbiAqL1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IERhc2hLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERhc2hDb21wb25lbnREZWZpbml0aW9uLFxuICBEYXNoQ29tcG9uZW50TWV0YWRhdGEsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGNvbnN0cnVjdG9yLW9yLWluc3RhbmNlIGlucHV0IHRvIGEgY29uc3RydWN0b3IuXG4gKiBGYWxscyBiYWNrIHRvIHRoZSBpbnN0YW5jZSdzIG93biBjb25zdHJ1Y3RvciBhbmQgZmluYWxseSB0byB0aGUgcmF3IHZhbHVlXG4gKiB3aGVuIHtAbGluayBNZXRhZGF0YS5jb25zdHJ9IGNhbm5vdCByZXNvbHZlIGEgdXNhYmxlIGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIG1vZGVsIFRoZSBkZWNvcmF0ZWQgY2xhc3Mgb3IgYW4gaW5zdGFuY2Ugb2YgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlbDxNPihtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBNKTogQ29uc3RydWN0b3I8TT4ge1xuICBjb25zdCByZXNvbHZlZCA9IE1ldGFkYXRhLmNvbnN0cihtb2RlbCBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPE0+O1xuICBjb25zdCBmYWxsYmFjayA9IChtb2RlbCBhcyB7IGNvbnN0cnVjdG9yPzogQ29uc3RydWN0b3I8TT4gfSkuY29uc3RydWN0b3I7XG4gIGlmICh0eXBlb2YgZmFsbGJhY2sgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbGxiYWNrIGFzIENvbnN0cnVjdG9yPE0+O1xuICByZXR1cm4gbW9kZWwgYXMgQ29uc3RydWN0b3I8TT47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHBhbGV0dGUgbWV0YWRhdGEgYXR0YWNoZWQgYnkgYEBkYXNoY29tcG9uZW50KClgLlxuICogQHN1bW1hcnkgUmVzb2x2ZXMgdGhlIG1ldGFkYXRhIG9iamVjdCBzdG9yZWQgb24gdGhlIGNsYXNzLCBhY2NlcHRpbmcgZWl0aGVyXG4gKiB0aGUgY29uc3RydWN0b3Igb3IgYW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yIHwgb2JqZWN0fSBtb2RlbCBUaGUgZGVjb3JhdGVkIGNsYXNzIG9yIGFuIGluc3RhbmNlIG9mIGl0LlxuICogQHJldHVybnMgVGhlIHBhbGV0dGUgbWV0YWRhdGEsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW4tZGVjb3JhdGVkLlxuICogQGZ1bmN0aW9uIGRhc2hDb21wb25lbnRNZXRhZGF0YU9mXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL3JlYWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZGFzaENvbXBvbmVudE1ldGFkYXRhT2Y8TT4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IE1cbik6IERhc2hDb21wb25lbnRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKG1vZGVsKTtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChyZXNvbHZlZCwgRGFzaEtleXMuQ09NUE9ORU5UKSBhc1xuICAgIHwgRGFzaENvbXBvbmVudE1ldGFkYXRhXG4gICAgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIGEgbm9ybWFsaXplZCBkZWZpbml0aW9uIGZvciBhIGRhc2hib2FyZCBjb21wb25lbnQuXG4gKiBAc3VtbWFyeSBBcHBsaWVzIGRlZmF1bHRzICh0YWcgZnJvbSBjbGFzcyBuYW1lLCBzaXplIGB7Y29sczoxLCByb3dzOjF9YClcbiAqIHNvIGNvbnN1bWVycyBuZXZlciByZXNvbHZlIHVuZGVmaW5lZCBmb290cHJpbnQgdmFsdWVzLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvciB8IG9iamVjdH0gbW9kZWwgVGhlIGRlY29yYXRlZCBjbGFzcyBvciBhbiBpbnN0YW5jZSBvZiBpdC5cbiAqIEByZXR1cm5zIEEgbm9ybWFsaXplZCB7QGxpbmsgRGFzaENvbXBvbmVudERlZmluaXRpb259LlxuICogQGZ1bmN0aW9uIGRhc2hDb21wb25lbnREZWZpbml0aW9uT2ZcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy9kYXNoYm9hcmQvcmVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ29tcG9uZW50RGVmaW5pdGlvbk9mPE0+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBNXG4pOiBEYXNoQ29tcG9uZW50RGVmaW5pdGlvbiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKG1vZGVsKTtcbiAgY29uc3QgbWV0YSA9IGRhc2hDb21wb25lbnRNZXRhZGF0YU9mKHJlc29sdmVkKSB8fCB7fTtcbiAgY29uc3QgdGFnID0gbWV0YS50YWcgfHwgcmVzb2x2ZWQubmFtZTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiByZXNvbHZlZC5uYW1lLFxuICAgIHRhZyxcbiAgICBsYWJlbDogbWV0YS5sYWJlbCxcbiAgICBkZWZhdWx0U2l6ZTogbWV0YS5kZWZhdWx0U2l6ZSA/PyB7IGNvbHM6IDEsIHJvd3M6IDEgfSxcbiAgICBtb2RlbDogbWV0YS5tb2RlbCxcbiAgICBwcm9wczogbWV0YS5wcm9wcyxcbiAgICBtZXRhZGF0YTogbWV0YS5tZXRhZGF0YSxcbiAgfTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFVJIGRlY29yYXRvcnMgbW9kdWxlIGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9uc1xuICogQHN1bW1hcnkgQSBjb2xsZWN0aW9uIG9mIGRlY29yYXRvcnMgYW5kIHV0aWxpdGllcyBmb3IgYnVpbGRpbmcgVUkgY29tcG9uZW50cyBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIGJvdGggdGhlIG1vZGVsIGFuZCBVSSBzdWJtb2R1bGVzLCBwcm92aWRpbmcgZGVjb3JhdG9ycyBmb3JcbiAqIHJlbmRlcmluZywgY29tcG9uZW50IGRlZmluaXRpb24sIGFuZCBVSSBzdGF0ZSBtYW5hZ2VtZW50LlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzXG4gKi9cblxuaW1wb3J0IFwiLi9vdmVycmlkZXNcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdmVycmlkZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91aVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGFzaGJvYXJkXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIHN0cmluZ1xuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbiBmb3IgcmVmZXJlbmNlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbW1pdCBoYXNoIG9mIHRoZSBtb2R1bGUgYnVpbGQuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgZ2l0IGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS4gVGhlIGJ1aWxkIHJlcGxhY2VzXG4gKiB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvbW1pdCBoYXNoIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBDT01NSVRcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbXZlciB2ZXJzaW9uIGFuZCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuXG4gKiBUaGUgYnVpbGQgcmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBgPHZlcnNpb24+LTxjb21taXQ+YCB2YWx1ZSBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgRlVMTF9WRVJTSU9OXG4gKi9cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsiVUlNZWRpYUJyZWFrUG9pbnRzIiwiVUlLZXlzIiwiUkVGTEVDVCIsIlVJTU9ERUwiLCJSRU5ERVJFRF9CWSIsIkVMRU1FTlQiLCJQUk9QIiwiQ0hJTEQiLCJOQU1FIiwiTkFNRV9QUkVGSVgiLCJWQUxJREFUSU9OX01FU1NBR0UiLCJVSUxJU1RNT0RFTCIsIlVJTElTVFBST1AiLCJVSUxBWU9VVCIsIlVJTEFZT1VUUFJPUCIsIkhBTkRMRVJTIiwiVFlQRSIsIlNVQl9UWVBFIiwiSElEREVOIiwiSElERV9GT1IiLCJTSE9XX0ZPUiIsIlJFTkRFUl9JRiIsIkZPUk1BVCIsIk9SREVSIiwiUEFHRSIsIkVWRU5UUyIsIkZJUlNUIiwiTEFTVCIsIlJFQURfT05MWSIsIlNFUVVFTkNFIiwiUkVRVUlSRUQiLCJWYWxpZGF0aW9uS2V5cyIsIk1JTiIsIk1JTl9MRU5HVEgiLCJNQVgiLCJNQVhfTEVOR1RIIiwiUEFUVEVSTiIsIlVSTCIsIlNURVAiLCJEQVRFIiwiRU1BSUwiLCJQQVNTV09SRCIsIkVRVUFMUyIsIkRJRkYiLCJMRVNTX1RIQU4iLCJMRVNTX1RIQU5fT1JfRVFVQUwiLCJHUkVBVEVSX1RIQU4iLCJHUkVBVEVSX1RIQU5fT1JfRVFVQUwiLCJWYWxpZGF0YWJsZUJ5VHlwZSIsIkVtYWlsVmFsaWRhdG9yIiwiVVJMVmFsaWRhdG9yIiwiRGF0ZVZhbGlkYXRvciIsIlBhc3N3b3JkVmFsaWRhdG9yIiwiVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSIsIlJlcXVpcmVkVmFsaWRhdG9yIiwiTWluVmFsaWRhdG9yIiwiTWF4VmFsaWRhdG9yIiwiU3RlcFZhbGlkYXRvciIsIk1pbkxlbmd0aFZhbGlkYXRvciIsIk1heExlbmd0aFZhbGlkYXRvciIsIlBhdHRlcm5WYWxpZGF0b3IiLCJFcXVhbHNWYWxpZGF0b3IiLCJEaWZmVmFsaWRhdG9yIiwiTGVzc1RoYW5WYWxpZGF0b3IiLCJMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IiLCJHcmVhdGVyVGhhblZhbGlkYXRvciIsIkdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvciIsIkhUTUw1RGF0ZUZvcm1hdCIsIkhUTUw1SW5wdXRUeXBlcyIsIkJVVFRPTiIsIkNIRUNLQk9YIiwiQ09MT1IiLCJEQVRFVElNRV9MT0NBTCIsIkZJTEUiLCJJTUFHRSIsIk1PTlRIIiwiTlVNQkVSIiwiUkFESU8iLCJSQU5HRSIsIlJFU0VUIiwiU0VBUkNIIiwiU1VCTUlUIiwiVEVMIiwiVEVYVCIsIlRFWFRBUkVBIiwiU0VMRUNUIiwiVElNRSIsIldFRUsiLCJIVE1MNUNoZWNrVHlwZXMiLCJDb21wb25lbnRFdmVudE5hbWVzIiwiUmVuZGVyIiwiQmFja0J1dHRvbkNsaWNrRXZlbnQiLCJSZWZyZXNoIiwiQ2xpY2siLCJDaGFuZ2UiLCJTdWJtaXQiLCJWYWxpZGF0aW9uRXJyb3IiLCJUaGVtZUNoYW5nZSIsIkZvcm1Hcm91cExvYWRlZCIsIlRyYW5zYWN0aW9uSG9va3MiLCJCZWZvcmVSZWFkIiwiQWZ0ZXJSZWFkIiwiQmVmb3JlQ3JlYXRlIiwiQWZ0ZXJDcmVhdGUiLCJCZWZvcmVVcGRhdGUiLCJBZnRlclVwZGF0ZSIsIkJlZm9yZURlbGV0ZSIsIkFmdGVyRGVsZXRlIiwiRWxlbWVudFNpemVzIiwieHNtYWxsIiwic21hbGwiLCJtZWRpdW0iLCJkZWZhdWx0IiwibGFyZ2UiLCJ4TGFyZ2UiLCJhdXRvIiwiZXhwYW5kIiwiYmxvY2siLCJoYWxmIiwiZnVsbCIsIkVsZW1lbnRQb3NpdGlvbnMiLCJsZWZ0IiwiY2VudGVyIiwicmlnaHQiLCJ0b3AiLCJib3R0b20iLCJMYXlvdXRHcmlkR2FwcyIsImNvbGxhcHNlIiwibm9uZSIsIkFjdGlvblJvbGVzIiwiY2FuY2VsIiwiY29uZmlybSIsInN1Ym1pdCIsImNsZWFyIiwiYmFjayIsIk9wZXJhdGlvbktleXMiLCJDUkVBVEUiLCJSRUFEIiwiVVBEQVRFIiwiREVMRVRFIiwiV2luZG93Q29sb3JTY2hlbWVzIiwibGlnaHQiLCJkYXJrIiwidW5kZWZpbmVkIiwiUmVuZGVyaW5nRXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiY29uc3RydWN0b3IiLCJtc2ciLCJzdXBlciIsIm5hbWUiLCJpc0NsYXNzQ29uc3RydWN0b3IiLCJmbiIsInRlc3QiLCJTdHJpbmciLCJnZXRVSUF0dHJpYnV0ZUtleSIsInByb3AiLCJrZXkiLCJNZXRhZGF0YSIsIkRlY29yYXRpb25LZXlzIiwiUFJPUEVSVElFUyIsImZvcm1hdEJ5VHlwZSIsInR5cGUiLCJ2YWx1ZSIsImFyZ3MiLCJmb3JtYXQiLCJzaGlmdCIsImZvcm1hdERhdGUiLCJEYXRlIiwicGFyc2VWYWx1ZUJ5VHlwZSIsImZpZWxkUHJvcHMiLCJyZXN1bHQiLCJBcnJheSIsInBhcnNlZCIsImlzQXJyYXkiLCJtYXAiLCJ2IiwiUmVzZXJ2ZWRNb2RlbHMiLCJTVFJJTkciLCJ0b0xvd2VyQ2FzZSIsImpvaW4iLCJwYXJzZVRvTnVtYmVyIiwidHJpbSIsImxlbmd0aCIsInBhcnNlRGF0ZSIsIk9CSkVDVCIsIkpTT04iLCJzdHJpbmdpZnkiLCJCT09MRUFOIiwiZXNjYXBlSHRtbCIsImlzTmFOIiwiTnVtYmVyIiwidGFnc1RvUmVwbGFjZSIsInJlcGxhY2UiLCJ0YWciLCJyZXZlcnRIdG1sIiwiZ2VuZXJhdGVVSU1vZGVsSUQiLCJtb2RlbCIsImlkIiwibm93IiwicGsiLCJNb2RlbCIsImUiLCJSZW5kZXJpbmdFbmdpbmUiLCJ0aGlzIiwiY2FjaGUiLCJmbGF2b3VyIiwiaW5pdGlhbGl6ZWQiLCJyZWdpc3RlciIsImNvbnNvbGUiLCJsb2ciLCJ0cmFuc2xhdGUiLCJ0b1ZpZXciLCJCSUdJTlQiLCJnZXRDbGFzc0RlY29yYXRvcnNNZXRhZGF0YSIsInVpTW9kZWxPZiIsInVpTGlzdE1vZGVsT2YiLCJ1aUhhbmRsZXJzRm9yIiwidWlMYXlvdXRPZiIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0Q2hpbGRyZW5CeU9yZGVyIiwiY2hpbGRyZW4iLCJzb3J0IiwiYSIsImIiLCJhT3JkZXIiLCJwcm9wcyIsIm9yZGVyIiwiYk9yZGVyIiwid2VpZ2h0IiwiUHJpbWl0aXZlcyIsImluZGV4T2YiLCJhV2VpZ2h0IiwiYldlaWdodCIsImlzQ3VzdG9tVmFsaWRhdG9yIiwiT2JqZWN0IiwidmFsdWVzIiwiaW5jbHVkZXMiLCJpc1ZhbGlkYXRhYmxlQnlUeXBlIiwia2V5cyIsImlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSIsInRvQXR0cmlidXRlVmFsdWUiLCJFcnJvciIsInRvRmllbGREZWZpbml0aW9uIiwiZ2xvYmFsUHJvcHMiLCJnZW5lcmF0ZUlkIiwiaW5oZXJpdFByb3BzIiwiZ2xvYmFsUHJvcHNXaXRob3V0SW5oZXJpdHMiLCJjbGFzc0RlY29yYXRvcnMiLCJjbGFzc0RlY29yYXRvciIsImFzc2lnbiIsIml0ZW0iLCJoYW5kbGVycyIsInVpRGVjb3JhdG9ycyIsInVpUHJvcGVydGllc09mIiwiY2hpbGRQcm9wcyIsIm1hcHBlciIsImdldFBhdGgiLCJwYXJlbnQiLCJ2YWxpZGF0aW9uRGVjb3JhdG9ycyIsImdldCIsImRlY3MiLCJ1aURlY29yYXRpb25PZiIsInVpVHlwZU9mIiwiTm90Rm91bmRFcnJvciIsImhhc0hpZGVPbkRlY29yYXRvciIsInVpSXNIaWRkZW4iLCJoYXNVaUVsZW1lbnREZWNvcmF0b3IiLCJ1aUVsZW1lbnRPZiIsInNvcnRlZCIsImVudHJpZXMiLCJrIiwiZm9yRWFjaCIsImRlYyIsIm1vZGVsTmFtZSIsImlzUHJvcGVydHlNb2RlbCIsImlzTW9kZWwiLCJidWlsZCIsIkNsYXp6Iiwic3VibW9kZWwiLCJjb25zdHJ1Y3RhYmxlIiwiY2xhenpOYW1lIiwiY2hpbGRyZW5HbG9iYWxQcm9wcyIsImNoaWxkT2YiLCJjaGlsZERlZmluaXRpb24iLCJwdXNoIiwiZGVjUHJvcHMiLCJyZW5kZXIiLCJ1aVByb3BzIiwidmlzaWJpbGl0eVByb3BzIiwiaGlkZUZvciIsInNob3dGb3IiLCJwYXRoIiwidmFsaWRhdGlvbkRlY3MiLCJtZXNzYWdlIiwiYmFzaWNUeXBlIiwiY2hpbGQiLCJmaW5kIiwiYyIsImVuZHNXaXRoIiwicm93IiwiY29sIiwiY3VycmVudE5hbWVzcGFjZXMiLCJTZXQiLCJuYW1lc3BhY2VzIiwibmFtZXNwYWNlIiwib3BlcmF0aW9uIiwiaGlkZGVuT24iLCJoaWRkZW4iLCJzb21lIiwicmVuZGVyZXJJZCIsImVuZ2luZSIsImN1cnJlbnQiLCJnZXRPckJvb3QiLCJvYmoiLCJpbml0aWFsaXplIiwiZnJvbU9iamVjdCIsInJlbmRlcmVkQnkiLCJoaWRlT24iLCJvcGVyYXRpb25zIiwib2JqZWN0IiwicHJvcGVydHlLZXkiLCJwcm9wTWV0YWRhdGEiLCJyZW5kZXJJZiIsInVpb3JkZXIiLCJ1aWVsZW1lbnQiLCJzZXJpYWxpemUiLCJvcmlnaW5hbCIsIm1ldGFkYXRhIiwidWlwcm9wIiwicHJvcE5hbWUiLCJ0YXJnZXQiLCJ1aWNoaWxkIiwiY2xhenoiLCJjdXN0b21UeXBlcyIsIm11bHRpcGxlIiwidWlsaXN0cHJvcCIsInVpbGF5b3V0cHJvcCIsInVpcGFnZXByb3AiLCJwYWdlIiwidWlvbiIsImV2ZW50IiwiaGFuZGxlciIsInVpb25jbGljayIsInVpb25yZW5kZXIiLCJ1aXRhYmxlY29sIiwic2VxdWVuY2UiLCJ2YWx1ZVBhcnNlckZuIiwiVUlWYWxpZGF0b3IiLCJWYWxpZGF0b3IiLCJnZXRNZXNzYWdlIiwidHJhbnNsYXRlU2VydmljZSIsIkRlY2FmQ29tcG9uZW50IiwiTG9nZ2VkQ2xhc3MiLCJlbmFibGVEYXJrTW9kZSIsImlzRGFya01vZGUiLCJyb3V0ZSIsImJvcmRlcnMiLCJldmVudHMiLCJyZXBvc2l0b3J5IiwiX3JlcG9zaXRvcnkiLCJmb3IiLCJpbmZvIiwiY29tcG9uZW50TmFtZSIsInJlZnJlc2giLCJwcmV2aWV3IiwiZGVidWciLCJwYXJzZUhhbmRsZXJzIiwiaW5zdGFuY2UiLCJoYW5kbGUiLCJwYXJzZUV2ZW50cyIsImV2dCIsIkRlY2FmRXZlbnRIYW5kbGVyIiwiaGFuZGxlQ2xpY2siLCJoYW5kbGVBY3Rpb24iLCJEZWNhZlRyYW5zbGF0ZVNlcnZpY2UiLCJwYXJhbXMiLCJpbnN0YW50IiwicHJvdG90eXBlIiwiYmluZCIsIm1ldGEiLCJ1aUlzSGlkZGVuT24iLCJvcCIsInVpTGlzdEl0ZW1zIiwidWltb2RlbCIsImFwcGx5IiwidWlsaXN0bW9kZWwiLCJ1aWhhbmRsZXJzIiwidWlsYXlvdXQiLCJjb2xzTW9kZSIsInJvd3MiLCJjb25maWciLCJmbGV4TW9kZSIsImNvbHMiLCJicmVha3BvaW50IiwiTEFSR0UiLCJ1aXN0ZXBwZWRtb2RlbCIsInBhZ2VzIiwicGFnaW5hdGVkIiwicGFnZVRpdGxlcyIsIk1vZGVsQnVpbGRlciIsImRlY29yYXRlQ2xhc3MiLCJkZWNvcmF0b3IiLCJfY2xhc3NEZWNvcmF0b3JzIiwiRGFzaEtleXMiLCJEQVNIX0NPTVBPTkVOVF9SRUdJU1RSWSIsInJlZ2lzdGVyRGFzaENvbXBvbmVudCIsImN0b3IiLCJhZGQiLCJkYXNoQ29tcG9uZW50cyIsInJlc2V0RGFzaENvbXBvbmVudFJlZ2lzdHJ5IiwiZGFzaGNvbXBvbmVudCIsImRhc2giLCJkZWZhdWx0U2l6ZSIsImlubmVyRGFzaENvbXBvbmVudCIsIkNPTVBPTkVOVCIsIkRlY29yYXRpb24iLCJkZWZpbmUiLCJyZXNvbHZlTW9kZWwiLCJyZXNvbHZlZCIsImNvbnN0ciIsImZhbGxiYWNrIiwiZGFzaENvbXBvbmVudE1ldGFkYXRhT2YiLCJkYXNoQ29tcG9uZW50RGVmaW5pdGlvbk9mIiwibGFiZWwiLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7OztJQWlDWUEsUUFBQUEsMEJBQUFBO0tBQVosU0FBWUE7UUFDVkEsbUJBQUEsV0FBQTtRQUNBQSxtQkFBQSxZQUFBO1FBQ0FBLG1CQUFBLFdBQUE7UUFDQUEsbUJBQUEsWUFBQTtBQUNELE1BTEQsQ0FBWUEsUUFBQUEsdUJBQUFBLDZCQUFrQixDQUFBO0lBb0R2QixNQUFNQyxTQUFTO1FBQ3BCQyxTQUFTO1FBQ1RDLFNBQVM7UUFDVEMsYUFBYTtRQUNiQyxTQUFTO1FBQ1RDLE1BQU07UUFDTkMsT0FBTztRQUNQQyxNQUFNO1FBQ05DLGFBQWE7UUFDYkMsb0JBQW9CO1FBRXBCQyxhQUFhO1FBQ2JDLFlBQVk7UUFDWkMsVUFBVTtRQUNWQyxjQUFjO1FBQ2RDLFVBQVU7UUFFVkMsTUFBTTtRQUNOQyxVQUFVO1FBRVZDLFFBQVE7UUFDUkMsVUFBVTtRQUNWQyxVQUFVO1FBQ1ZDLFdBQVc7UUFDWEMsUUFBUTtRQUNSQyxPQUFPO1FBQ1BDLE1BQU07UUFDTkMsUUFBUTtRQUVSQyxPQUFPO1FBQ1BDLE1BQU07UUFFTkMsV0FBVztRQUNYQyxVQUFVO1FBQ1ZDLFVBQVVDLG9CQUFBQSxlQUFlRDtRQUN6QkUsS0FBS0Qsb0JBQUFBLGVBQWVDO1FBQ3BCQyxZQUFZRixvQkFBQUEsZUFBZUU7UUFDM0JDLEtBQUtILG9CQUFBQSxlQUFlRztRQUNwQkMsWUFBWUosb0JBQUFBLGVBQWVJO1FBQzNCQyxTQUFTTCxvQkFBQUEsZUFBZUs7UUFDeEJDLEtBQUtOLG9CQUFBQSxlQUFlTTtRQUNwQkMsTUFBTVAsb0JBQUFBLGVBQWVPO1FBQ3JCQyxNQUFNUixvQkFBQUEsZUFBZVE7UUFDckJDLE9BQU9ULG9CQUFBQSxlQUFlUztRQUN0QkMsVUFBVVYsb0JBQUFBLGVBQWVVO1FBQ3pCQyxRQUFR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