footprintjs 9.48.2 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -60,9 +60,9 @@
60
60
  */
61
61
  Object.defineProperty(exports, "__esModule", { value: true });
62
62
  exports.MapperTaint = exports.classBodies = exports.needsPath = exports.useWalkLimit = exports.WALK_LIMIT = exports.markStagedWrite = exports.scrubOf = exports.inheritByIdentity = exports.decideWrite = exports.RedactionRule = exports.userKeyOf = exports.CLEAR = exports.SCOPE_PLACEHOLDER = void 0;
63
+ const paths_1 = require("foottrace/paths");
63
64
  const devMode_js_1 = require("../devMode.js");
64
65
  const errorInfo_js_1 = require("../errors/errorInfo.js");
65
- const pathOps_js_1 = require("./pathOps.js");
66
66
  const runAddress_js_1 = require("./runAddress.js");
67
67
  /**
68
68
  * What the SCOPE CHANNEL carries where a value was scrubbed: a scope recorder's read, write and
@@ -680,7 +680,7 @@ class RedactionRule {
680
680
  if (paths === undefined)
681
681
  return false;
682
682
  for (const path of paths) {
683
- if (Object.prototype.hasOwnProperty.call(value, path) || (path.includes('.') && (0, pathOps_js_1.nativeHas)(value, path))) {
683
+ if (Object.prototype.hasOwnProperty.call(value, path) || (path.includes('.') && (0, paths_1.nativeHas)(value, path))) {
684
684
  return true;
685
685
  }
686
686
  }
@@ -1411,4 +1411,4 @@ class MapperTaint {
1411
1411
  }
1412
1412
  }
1413
1413
  exports.MapperTaint = MapperTaint;
1414
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBERzs7O0FBRUgsOENBQTBDO0FBRTFDLHlEQUFzRTtBQUV0RSw2Q0FBeUM7QUFFekMsbURBQWdEO0FBRWhEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDVSxRQUFBLGlCQUFpQixHQUFHLFlBQVksQ0FBQztBQTJFakMsUUFBQSxLQUFLLEdBQXFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFXLENBQUMsQ0FBQztBQUVqRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixTQUFTLENBQUMsSUFBdUIsRUFBRSxHQUFXO0lBQzVELE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDMUQsQ0FBQztBQUZELDhCQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQTRDLEVBQUUsR0FBVztJQUMvRSxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0csQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBdUM7SUFD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QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0Y7QUFoTkQsa0NBZ05DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWRhY3Rpb24udHMg4oCUIFRoZSBPTkUgb3duZXIgb2Ygd2hhdCBhIHJlZGFjdGlvbiBwb2xpY3kgc2F5cyBhYm91dCBhIHZhbHVlLlxuICpcbiAqIFRIRSBMQVcgKG93bmVyIHJ1bGluZyAoYSkpLiBBIHJlZGFjdGlvbiBwb2xpY3kgY292ZXJzIEVWRVJZVEhJTkcgdGhlIGxpYnJhcnlcbiAqIHJldGFpbnMgb3Igc2VydmVzIOKAlCB0aGUgY29tbWl0IGxvZyAoYm90aCBlbmNvZGluZ3MpLCB0aGUgcmVkYWN0ZWQgbWlycm9yLFxuICogdHJhY2tlZCByZWFkcy93cml0ZXMsIGV2ZXJ5IHJlY29yZGVyIGV2ZW50IChpbmxpbmUgYW5kIGRlZmVycmVkKSBhbmQgdGhlXG4gKiByZWNvcmRlciByb3dzIGJ1aWx0IGZyb20gdGhlbSwgdGhlIG5hcnJhdGl2ZSwgc25hcHNob3RzLCBkaWFnbm9zdGljcywgcGF1c2VcbiAqIHBheWxvYWRzLCBib3VuZGFyeSByZWNvcmRzIGFuZCBsb2cgbGluZXMg4oCUIGFuZCBORVZFUiB0aGUgbGl2ZSBoZWFwIG9yIHRoZVxuICogcmVzdW1lIGNoZWNrcG9pbnQuIFR3byB2YWx1ZXMgYXJlIHRoZSBjYWxsZXIncyBvd24gYW5kIHN0YXkgcmVhbDogdGhlXG4gKiBgcnVuKClgIHJlamVjdGlvbiAodGhlIHRocm93biB2YWx1ZSBpdHNlbGYpIGFuZCB0aGUgbGl2ZSBmb3JrIHJlc3VsdC5cbiAqXG4gKiBBIHBvbGljeSBzZWxlY3RzIGJ5IE5BTUUg4oCUIGEga2V5LCBhIGRvdHRlZCBwYXRoLCBhIGZpZWxkIOKAlCBuZXZlciBieVxuICogc2Nhbm5pbmcgY29udGVudC4gV2hhdCBjYXJyaWVzIGEgbmFtZTpcbiAqICAgLSBzdGF0ZSDigJQgaXRzIHVzZXItbGV2ZWwgcGF0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUudmVyZGljdH0pO1xuICogICAtIGEgcmVjb3JkIGhhbmRlZCBvdXQgd2hvbGUg4oCUIHJvb3QgaW5wdXQvb3V0cHV0LCBhIHN1YmZsb3cncyBtYXBwZWQgc2VlZFxuICogICAgIGFuZCBleGl0IHN0YXRlLCBhIHBhdXNlIHBheWxvYWQsIGEgdGhyb3duIHZhbHVlIOKAlCBpdHMga2V5cyBhdCBldmVyeVxuICogICAgIGRlcHRoICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeX0pO1xuICogICAtIGEgZGlhZ25vc3RpYyBlbnRyeSDigJQgYCRkZWJ1Z2AvYCRlcnJvcmAvYCRtZXRyaWNgL2AkZXZhbGAvYCRsb2dgIGFuZCB0aGVcbiAqICAgICBlbmdpbmUncyBvd24g4oCUIHRoZSByZWNvcmQgYHsgW25hbWVdOiB2YWx1ZSB9YDogaXRzIG5hbWUgSVMgYSBzdGF0ZSBrZXlcbiAqICAgICAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluRGlhZ25vc3RpY30pLiBgcG9saWN5LmRpYWdub3N0aWNzYCBhZGRzXG4gKiAgICAgZGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycyBvbiB0b3A7IGZsb3ctbWVzc2FnZSB0ZXh0IGhhcyBubyBuYW1lIG9mIGl0c1xuICogICAgIG93biwgc28gb25seSB0aGV5IHNlbGVjdCBpdDtcbiAqICAgLSBhIHN1YmZsb3cgbWFwcGVyJ3MgY29weSDigJQgYSBrZXkgYW4gYGlucHV0TWFwcGVyYC9gb3V0cHV0TWFwcGVyYCAob3IgYVxuICogICAgIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zIHNlbGVjdG9yKSB3cm90ZSBpbmhlcml0cyB0aGUgcmVkYWN0aW9uIG9mIHRoZVxuICogICAgIHNlbGVjdGVkIHZhbHVlIGl0IGNvcGllZCAoe0BsaW5rIE1hcHBlclRhaW50fSkuXG4gKiBBIG1hcmsgaXMgYSBOQU1FLCBydW4td2lkZSwgdW50aWwgdGhlIGtleSBpcyBkZWxldGVkOyBhIHBhdXNlIGNhcnJpZXMgdGhlXG4gKiBtYXJrcyDigJQgbmFtZXMgb25seSDigJQgdG8gdGhlIHJlc3VtZWQgcnVuICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5tYXJrc0ZvckNoZWNrcG9pbnR9KS5cbiAqIEEgdmFsdWUgd2l0aCBubyBuYW1lIOKAlCBhIHNjYWxhciByb290IGlucHV0L291dHB1dCBvciBwYXVzZSBwYXlsb2FkLCBmcmVlXG4gKiBlcnJvciB0ZXh0IOKAlCBpcyBzZWxlY3RlZCBieSBub3RoaW5nLiBgZW1pdFBhdHRlcm5zYCBpcyB0aGUgb25lIHNlcGFyYXRlXG4gKiBzY3J1YjogYSBgJGVtaXRgIHBheWxvYWQgaXMgc2VsZWN0ZWQgYnkgaXRzIGV2ZW50IG5hbWUuXG4gKlxuICogSE9XIE9ORSBPV05FUiBLRUVQUyBJVC4gRXZlcnkgc3RhZ2VkIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgcGFzc2VzXG4gKiB0aHJvdWdoIGBTdGFnZUNvbnRleHRgLCBzbyBgU3RhZ2VDb250ZXh0YCBhc2tzIFRISVMgcnVsZSDigJQgbm90IHRoZSBjYWxsZXIg4oCUXG4gKiB3aGF0IHRoZSBwb2xpY3kgc2F5cyBhYm91dCB0aGUgcGF0aCBpdCBpcyBhYm91dCB0byByZXRhaW4uIEEgYFNjb3BlRmFjYWRlYFxuICogd3JpdGUsIGEgc3ViZmxvdyBgaW5wdXRNYXBwZXJgIHNlZWQsIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2sgYW5kIGFcbiAqIHJlc3VtZSByZS1zZWVkIGFyZSB0aGVuIGFsbCB0aGUgc2FtZSBjYXNlOiB0aGUgZnVubmVsIGRlY2lkZXMsIHRoZSBjYWxsZXJcbiAqIGNhbm5vdCBmb3JnZXQgdG8uIFRoZSBmYWNhZGUgdXNlcyB0aGUgc2FtZSBydWxlIGZvciB0aGUgdmFsdWVzIGl0IGhhbmRzIHRvXG4gKiByZWNvcmRlcnM7IGBTdWJmbG93RXhlY3V0b3JgIHVzZXMgaXQgZm9yIHRoZSBuYXJyYXRlZCBzZWVkIGFuZFxuICogYEZsb3djaGFydFRyYXZlcnNlci5leGVjdXRlYCBmb3Igcm9vdCBpbnB1dC9vdXRwdXQgYmVmb3JlIGRpc3BhdGNoLiBCZWZvcmUgOS4xOS4wXG4gKiB0aGUgZmFjYWRlIGhlbGQgdGhlIHZlcmRpY3QgYWxvbmUsIGFuZCBldmVyeSBwYXRoIHRoYXQgd3JvdGUgb3IgcmVhZCBwYXN0XG4gKiB0aGUgZmFjYWRlIOKAlCBmaXZlIG9mIHRoZW0g4oCUIHJldGFpbmVkIHBsYWludGV4dCB1bmRlciBhIHBvbGljeS5cbiAqXG4gKiBPTkUgVkVSRElDVCBPV05FUiwgT05FIEVOQ09ESU5HIE9XTkVSIChDNCkuIFRoaXMgZmlsZSBERUNJREVTIOKAlCB0aGUgcnVsZSxcbiAqIGFuZCBmb3IgYSBzdGFnZWQgd3JpdGUge0BsaW5rIGRlY2lkZVdyaXRlfSAodGhlIHZlcmRpY3QpLFxuICoge0BsaW5rIGluaGVyaXRCeUlkZW50aXR5fSBhbmQge0BsaW5rIG1hcmtTdGFnZWRXcml0ZX0gKHRoZSBtYXJrcykg4oCUIGFuZCBpc1xuICogdGhlIGVuZ2luZSdzIChMNCwgYmVzaWRlIHRoZSBydW4gcG9saWN5IHRoYXQgY2FycmllcyB0aGUgcnVsZSkuIFRoZSBCWVRFUyBvZiBhXG4gKiB2ZXJkaWN0IGFyZSB0aGUgcmVjb3JkJ3M6IHRoZSBmcmFtZSBoYW5kcyBpdHMgc2NydWIgKGB3aG9sZWAsIG9yIHRoZVxuICogYGZpZWxkc2AgaW5zaWRlIHRoZSB2YWx1ZSDigJQge0BsaW5rIHNjcnViT2Z9KSB0byBgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCBhbmRcbiAqIHRoZSByZWNvcmQncyBvd24gc2NydWIgKGBtZW1vcnkvc2NydWIudHNgLCBMMikgd3JpdGVzIHRoZSBsb2cncyBwbGFjZWhvbGRlclxuICogYXQgY29tbWl0LiBCZWZvcmUgQzQgdGhlIHNjcnViIGxpdmVkIGhlcmUgdG9vLCBzbyB0aGUgcmVjb3JkIGltcG9ydGVkIHRoZVxuICogZW5naW5lJ3MgcG9saWN5IG1vZHVsZSB0byB3cml0ZSBhIHN0cmluZy5cbiAqXG4gKiBUV08gUExBQ0VIT0xERVJTLCBCT1RIIEhJU1RPUklDQUwsIE9ORSBQRVIgT1dORVI6IHRoZSBjb21taXQgbG9nIGFuZCB0aGVcbiAqIG1pcnJvciBjYXJyeSBgJ1JFREFDVEVEJ2AgKGBMT0dfUExBQ0VIT0xERVJgLCBgbWVtb3J5L3BsYWNlaG9sZGVycy50c2Ag4oCUIGFcbiAqIHJlY29yZCBieXRlLCB3cml0dGVuIGJ5IGBtZW1vcnkvc2NydWIudHNgKTsgZXZlcnkgc2NvcGUtdGllciB2aWV3IOKAlCBzY29wZVxuICogcmVjb3JkZXIgZXZlbnRzLCBgc3RhZ2VSZWFkc2AvYHN0YWdlV3JpdGVzYCwgbmFycmF0aXZlIOKAlCBjYXJyaWVzXG4gKiBgJ1tSRURBQ1RFRF0nYCAoe0BsaW5rIFNDT1BFX1BMQUNFSE9MREVSfSwgYmVsb3cg4oCUIHRoZSB2ZXJkaWN0J3Mgb3duKS5cbiAqIE5laXRoZXIgc3RyaW5nIGNoYW5nZWQgaW4gOS4xOS4wIG9yIHNpbmNlOyBlYWNoIGlzIHNwZWxsZWQgb25jZSBpbiBgc3JjL2AuXG4gKi9cblxuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uTWFya3MgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBuYXRpdmVIYXMgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBXcml0ZVNjcnViLCBXcml0ZVZlcmIgfSBmcm9tICcuL1JlY29yZEZyYW1lLmpzJztcbmltcG9ydCB7IFJVTl9OQU1FU1BBQ0UgfSBmcm9tICcuL3J1bkFkZHJlc3MuanMnO1xuXG4vKipcbiAqIFdoYXQgdGhlIFNDT1BFIENIQU5ORUwgY2FycmllcyB3aGVyZSBhIHZhbHVlIHdhcyBzY3J1YmJlZDogYSBzY29wZSByZWNvcmRlcidzIHJlYWQsIHdyaXRlIGFuZFxuICogY29tbWl0IGV2ZW50cywgdGhlIGBzdGFnZVJlYWRzYCAvIGBzdGFnZVdyaXRlc2AgcmV0ZW50aW9uLCB0aGUgbmFycmF0aXZlLCBhIGRlY2lzaW9uJ3MgZXZpZGVuY2UsIGFuXG4gKiBlbWl0IHBheWxvYWQgbWF0Y2hlZCBieSBgZW1pdFBhdHRlcm5zYCwgYSBwYXVzZSBwYXlsb2FkJ3Mgc2VydmVkIGZvcm0gYW5kIGEgc3ViZmxvdydzIG5hcnJhdGVkIHNlZWRcbiAqIChgb25TdWJmbG93RW50cnlgKSDigJQgZXZlcnkgdmFsdWUgdGhpcyB2ZXJkaWN0IHNlcnZlcywgdW5sZXNzIGl0cyBjYWxsZXIgcGFzc2VzIHRoZSBsb2cncyBzdHJpbmcuXG4gKlxuICogSXRzIHR3aW4gaXMgdGhlIFJFQ09SRCdzIGBMT0dfUExBQ0VIT0xERVJgIChgJ1JFREFDVEVEJ2AsIGBtZW1vcnkvcGxhY2Vob2xkZXJzLnRzYCk6IHRoZSBjb21taXQgbG9nLFxuICogdGhlIHJlZGFjdGVkIG1pcnJvciBhbmQgZXZlcnl0aGluZyBzZXJ2ZWQgZnJvbSB0aGVtLiBTbyBOT1QgZXZlcnkgcmVjb3JkZXIgZXZlbnQgY2FycmllcyB0aGlzIG9uZTpcbiAqIGBvblN1YmZsb3dFeGl0Lm91dHB1dFN0YXRlYCBzZXJ2ZXMgdGhlIHN1YmZsb3cncyByZWRhY3RlZCBtaXJyb3Igd2hlbiBhIHBvbGljeSBrZWVwcyBvbmUsIGFuZCBzb1xuICogY2FycmllcyB0aGUgbG9nJ3Mgc3RyaW5nICh3aXRob3V0IGEgbWlycm9yIOKAlCBwZXItY2FsbCBtYXJrcyBhbG9uZSDigJQgaXQgaXMgdGhlIHN1YmZsb3cncyBoZWFwXG4gKiByZXRhaW5lZCB1bmRlciB0aGUgcnVsZSwgd2l0aCB0aGlzIG9uZSkuIEJvdGggc3RyaW5ncyBhcmUgaGlzdG9yaWNhbCBhbmQgbmVpdGhlciBjaGFuZ2VkIHdoZW4gaXRcbiAqIG1vdmVkOiB0aGlzIG9uZSB3YXMgdGhlIGNvbnN0YW50IGBSRURBQ1RFRGAgaW4gdGhpcyBmaWxlIHVudGlsIEY0YSwgdGhlbiBgcGxhY2Vob2xkZXJzLnRzIMK3XG4gKiBTQ09QRV9QTEFDRUhPTERFUmAsIGFuZCBzaW5jZSBDNCBpdCBsaXZlcyBoZXJlIGFnYWluLCBiZXNpZGUgdGhlIHZlcmRpY3QgdGhhdCB3cml0ZXMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBTQ09QRV9QTEFDRUhPTERFUiA9ICdbUkVEQUNURURdJztcblxuLyoqXG4gKiBEZWNsYXJhdGl2ZSBrZXkvcGF0aCByZWRhY3Rpb24gZm9yIHJlY29yZGVkIHN0YXRlIGFuZCBib3VuZGFyeSByZWNvcmRzLlxuICpcbiAqIENvbmZpZ3VyZSBhdCB0aGUgc2NvcGUgY2xhc3MgbGV2ZWwgKHN0YXRpYyBwcm9wZXJ0eSkgb3IgcGFzcyB0b1xuICogRmxvd0NoYXJ0RXhlY3V0b3IgdG8gYXBwbHkgYWNyb3NzIGFsbCBzdGFnZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkYWN0aW9uUG9saWN5IHtcbiAgLyoqIEV4YWN0IGtleSBuYW1lcyB0byBhbHdheXMgcmVkYWN0IChlLmcuIFsnc3NuJywgJ2NyZWRpdENhcmQnXSkuICovXG4gIGtleXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJlZ2V4IHBhdHRlcm5zIOKAlCBhbnkga2V5IG1hdGNoaW5nIGEgcGF0dGVybiBpcyBhdXRvLXJlZGFjdGVkLlxuICAgKlxuICAgKiBQYXR0ZXJuIG1hdGNoaW5nIGlzIHNraXBwZWQgZm9yIGtleXMgdGhhdCBleGNlZWQgYW4gaW50ZXJuYWwgbGVuZ3RoIGNhcFxuICAgKiAoZGVzaWduZWQgdG8gcHJldmVudCBSZURvUyBvbiBwYXRob2xvZ2ljYWwgcGF0dGVybnMpLiBGb3IgdmVyeSBsb25nIGtleVxuICAgKiBuYW1lcywgdXNlIGBrZXlzYCAoZXhhY3QgbWF0Y2gpIGluc3RlYWQgb2YgcGF0dGVybnMuXG4gICAqL1xuICBwYXR0ZXJucz86IFJlZ0V4cFtdO1xuICAvKiogRmllbGQtbGV2ZWwgcmVkYWN0aW9uIHdpdGhpbiBvYmplY3RzIOKAlCBrZXkg4oaSIGFycmF5IG9mIGZpZWxkcyB0byBzY3J1Yi5cbiAgICogIFN1cHBvcnRzIGRvdC1ub3RhdGlvbiBmb3IgbmVzdGVkIHBhdGhzIChlLmcuICdhZGRyZXNzLnppcCcpLiAqL1xuICBmaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIC8qKlxuICAgKiBEaWFnbm9zdGljLW9ubHkgc2VsZWN0b3JzLCBJTiBBRERJVElPTiB0byB0aGUgc3RhdGUgc2VsZWN0b3JzIGFib3ZlICh3aGljaFxuICAgKiBhbHJlYWR5IGNvdmVyIGEgZGlhZ25vc3RpYyBlbnRyeSBieSBpdHMgbmFtZTogYGtleXM6IFsndG9rZW4nXWAgbWFza3NcbiAgICogYCRkZWJ1ZygndG9rZW4nLCDigKYpYCkuIFVzZSB0aGVzZSBmb3IgbmFtZXMgeW91IG1hc2sgaW4gZGlhZ25vc3RpY3MgYnV0XG4gICAqIG5vdCBpbiBzdGF0ZS4gUGF0aHMgc3RhcnQgd2l0aCBsb2dzL2Vycm9ycy9tZXRyaWNzL2V2YWxzLCBlLmcuXG4gICAqIGBsb2dzLnByb2ZpbGUudG9rZW5gLiBPbmx5IGZsb3dNZXNzYWdlcy5kZXNjcmlwdGlvbiBhbmRcbiAgICogZmxvd01lc3NhZ2VzLnJhdGlvbmFsZSBhcmUgcGF5bG9hZHM7IGZsb3cgdG9wb2xvZ3kvdGltaW5nIG1ldGFkYXRhIHN0YXlzXG4gICAqIGludGFjdC4gQXBwbGllZCBiZWZvcmUgcmV0ZW50aW9uLCBub3QgcmV0cm9hY3RpdmVseSB0byBleGlzdGluZyBiYWdzLlxuICAgKi9cbiAgZGlhZ25vc3RpY3M/OiBQaWNrPFJlZGFjdGlvblBvbGljeSwgJ2tleXMnIHwgJ3BhdHRlcm5zJyB8ICdmaWVsZHMnPjtcbiAgLyoqXG4gICAqIFJlZ2V4IHBhdHRlcm5zIG1hdGNoZWQgYWdhaW5zdCBgRW1pdEV2ZW50Lm5hbWVgIGZvciBgc2NvcGUuJGVtaXQoLi4uKWBcbiAgICogY2FsbHMuIEFueSBlbWl0IGV2ZW50IHdob3NlIG5hbWUgbWF0Y2hlcyBoYXMgaXRzIHBheWxvYWQgcmVwbGFjZWQgd2l0aFxuICAgKiB0aGUgc3RyaW5nIGAnW1JFREFDVEVEXSdgIGJlZm9yZSBkaXNwYXRjaCB0byByZWNvcmRlcnMuXG4gICAqIEdsb2JhbC9zdGlja3kgcGF0dGVybnMgc3RhcnQgYXQgaW5kZXggemVybyBvbiBldmVyeSB0ZXN0OyB0aGVpciBmbGFnc1xuICAgKiByZXRhaW4gdGhlaXIgdXN1YWwgbWVhbmluZy4gVGhpcyBkb2VzIG5vdCBzY3J1YiBkaWFnbm9zdGljIHNpZGUgYmFncy5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgdHNcbiAgICogeyBlbWl0UGF0dGVybnM6IFsvXFwuYXV0aFxcLi8sIC9cXC5iaWxsaW5nXFwuL10gfVxuICAgKiAvLyBIaWRlcyBwYXlsb2FkcyBvZiBldmVudHMgbGlrZSAnbXlhcHAuYXV0aC5jaGVjaycgYW5kICdteWFwcC5iaWxsaW5nLnNwZW5kJ1xuICAgKiBgYGBcbiAgICovXG4gIGVtaXRQYXR0ZXJucz86IFJlZ0V4cFtdO1xufVxuXG4vKipcbiAqIFN0YXRlIHJlZGFjdGlvbiByZXBvcnQuIE5ldmVyIGluY2x1ZGVzIHZhbHVlczsgZW1pdCBhbmQgZGlhZ25vc3RpY1xuICogc2VsZWN0b3JzL2FjdGl2aXR5IGFyZSBub3QgcmVwcmVzZW50ZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25SZXBvcnQge1xuICAvKiogS2V5cyBmdWxseSByZWRhY3RlZCAoZXhhY3QgbWF0Y2ggb3IgcGF0dGVybiBtYXRjaCkuICovXG4gIHJlZGFjdGVkS2V5czogc3RyaW5nW107XG4gIC8qKiBLZXlzIHdpdGggZmllbGQtbGV2ZWwgcmVkYWN0aW9uIOKGkiB3aGljaCBmaWVsZHMgd2VyZSBzY3J1YmJlZC4gKi9cbiAgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIC8qKiBQYXR0ZXJuIHNvdXJjZXMgdGhhdCB3ZXJlIGFjdGl2ZSAoZS5nLiBbJ3Bhc3N3b3JkfHNlY3JldCddKS4gKi9cbiAgcGF0dGVybnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHBvbGljeSBzYXlzIGFib3V0IHRoZSB2YWx1ZSBhdCBvbmUgdXNlci1sZXZlbCBwYXRoLlxuICpcbiAqIC0gYCdjbGVhcidgICDigJQgbm90aGluZyB0byBzY3J1YjsgcmV0YWluIGFuZCBzZXJ2ZSB0aGUgdmFsdWUgYXMgaXQgaXMuXG4gKiAtIGAnd2hvbGUnYCAg4oCUIHRoZSBlbnRpcmUgdmFsdWUgaXMgc2VjcmV0LiBga2V5YCBpcyB0aGUgcG9saWN5IG9yIG1hcmtlZFxuICogICBrZXkgdGhhdCBkZWNpZGVkIGl0ICh0aGUgcGF0aCBpdHNlbGYgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMpLlxuICogLSBgJ2ZpZWxkcydgIOKAlCB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IHdob3NlIGBwYXRoc2AgKGRvdC1wYXRocyBJTlNJREUgdGhlXG4gKiAgIHZhbHVlLCByZWxhdGl2ZSB0byBpdCkgYXJlIHNlY3JldDsgZXZlcnl0aGluZyBlbHNlIGluIGl0IGlzIG5vdC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVkYWN0aW9uVmVyZGljdCA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnY2xlYXInIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICd3aG9sZSc7IHJlYWRvbmx5IGtleTogc3RyaW5nIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdmaWVsZHMnOyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBjb25zdCBDTEVBUjogUmVkYWN0aW9uVmVyZGljdCA9IE9iamVjdC5mcmVlemUoeyBraW5kOiAnY2xlYXInIH0gYXMgY29uc3QpO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIE5BTUUgb2YgYGtleWAgdW5kZXIgYHBhdGhgIOKAlCB0aGUga2V5IGl0c2VsZiBhdCB0aGUgdG9wIGxldmVsLCBlbHNlIHRoZSBzZWdtZW50c1xuICogam9pbmVkIGJ5IGEgZG90IChgWydwcm9maWxlJ10gKyAnYXV0aCdgIOKGkiBgJ3Byb2ZpbGUuYXV0aCdgKTogd2hhdCBhIHZlcmRpY3QgZGVjaWRlcyBvbiwgYSBtYXJrXG4gKiBob2xkcywgYW5kIHRoZSBmcmFtZSBrZXlzIGEgc3RhZ2UncyByZXRhaW5lZCByZWFkcyBhbmQgd3JpdGVzIGJ5IChgU3RhZ2VDb250ZXh0YCkuIEEgbmFtZSwgbm90IGFuXG4gKiBhZGRyZXNzIOKAlCBhIGtleSBtYXkgY29udGFpbiBhIGRvdCDigJQgc28gaXQgbmV2ZXIgZ29lcyBpbnRvIGEgdHJhY2UgcGF0aC4gTm8gYWxsb2NhdGlvbiBmb3IgdGhlXG4gKiBjb21tb24gdG9wLWxldmVsIGtleS4gKFRoZSByZWNvcmQgc3BlbGxzIHRoZSBzYW1lIG5hbWUgZm9yIGByZWFkS2V5c2AsIGBSZWNvcmRGcmFtZSDCtyBub3RlUmVhZGAuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlcktleU9mKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG59XG5cbi8qKlxuICogTWF4aW11bSBrZXkgbGVuZ3RoIChjaGFyYWN0ZXJzKSB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgcmVnZXggcmVkYWN0aW9uXG4gKiBwYXR0ZXJucy4gS2V5cyBsb25nZXIgdGhhbiB0aGlzIGFyZSBza2lwcGVkIGZvciBwYXR0ZXJuIG1hdGNoaW5nIHRvIHByZXZlbnRcbiAqIFJlRG9TOiBhIHBhdGhvbG9naWNhbCByZWdleCB0ZXN0ZWQgYWdhaW5zdCBhbiB1bmJvdW5kZWRseSBsb25nIGtleSBzdHJpbmdcbiAqIGNhbiBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLiAyNTYgY2hhcmFjdGVycyBjb21mb3J0YWJseSBleGNlZWRzIGFueVxuICogcmVhbGlzdGljIHNjb3BlLXN0YXRlIGtleSBuYW1lLlxuICovXG5jb25zdCBNQVhfUEFUVEVSTl9LRVlfTEVOID0gMjU2O1xuXG4vKipcbiAqIFRoZSBmaWVsZHMgYSBwb2xpY3kgZGVjbGFyZXMgdW5kZXIgYGtleWAg4oCUIG9ubHkgd2hlbiBgZmllbGRzYCBPV05TIGBrZXlgLlxuICogVGhlIGtleSBpcyBhIG5hbWUgZnJvbSBkYXRhIChhIHN0YXRlIGtleSwgYSBuZXN0ZWQga2V5IG9mIGEgcmVjb3JkIGhhbmRlZFxuICogb3V0IHdob2xlKSwgYW5kIGEgcGxhaW4tb2JqZWN0IGxvb2t1cCByZWFkcyB0aGUgcHJvdG90eXBlIGNoYWluOlxuICogYGZpZWxkc1snY29uc3RydWN0b3InXWAgaXMgYE9iamVjdGAsIGBmaWVsZHNbJ19fcHJvdG9fXyddYCBpc1xuICogYE9iamVjdC5wcm90b3R5cGVgLiBUaGUgd2FsayB0aGVuIGl0ZXJhdGVkIHRoZW0sIHNvIGFueSBgZmllbGRzYCBwb2xpY3lcbiAqIGZhaWxlZCB0aGUgcnVuIHdpdGggYSBUeXBlRXJyb3Igb24gZGF0YSBob2xkaW5nIHN1Y2ggYSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVkRmllbGRzKGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkgPyBmaWVsZHNba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFBvbGljeSBwYXR0ZXJucyBhcmUgcHJlZGljYXRlcywgbm90IGN1cnNvcnMgb3ZlciBzdWNjZXNzaXZlIGtleXMvZXZlbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4odmFsdWU6IHN0cmluZywgcGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcGF0dGVybnMpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgLy8gT25seSB0aGVzZSBmbGFncyBjb25zdW1lIGxhc3RJbmRleC4gT3JkaW5hcnkgKGluY2x1ZGluZyBmcm96ZW4pXG4gICAgLy8gcmVnZXhlcyBuZWVkIG5vIHdyaXRhYmxlIGN1cnNvciB0byBtYXRjaC4gS2VlcCBhbGwgb3JpZ2luYWwgZmxhZ3MuXG4gICAgaWYgKHBhdHRlcm4uZ2xvYmFsIHx8IHBhdHRlcm4uc3RpY2t5KSBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgaWYgKHBhdHRlcm4udGVzdCh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZGFjdGlvblJ1bGUge1xuICBwcml2YXRlIHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRpYWdub3N0aWNSdWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkO1xuICAvKiogV2hldGhlciBgcG9saWN5YCBuYW1lcyBhbnl0aGluZyBhIHN0YXRlIHZlcmRpY3QgY2FuIGFjdCBvbiDigJQgY29tcHV0ZWRcbiAgICogIG9uY2UgcGVyIGBzZXRQb2xpY3lgIHNvIHtAbGluayBpc0luZXJ0fSBpcyBhIHR3by1maWVsZCBjaGVjay4gKi9cbiAgcHJpdmF0ZSBwb2xpY3lBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIFRoZSBwb2xpY3kncyBwYXR0ZXJucyB0aGF0IGNhbiBkZXBlbmQgb24gYSB3aG9sZSBkb3R0ZWQgcGF0aCAoe0BsaW5rIG5lZWRzUGF0aH0pIOKAlCBwZXIgYHNldFBvbGljeWAuICovXG4gIHByaXZhdGUgcGF0aFBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSA9IFtdO1xuICBwcml2YXRlIHdhbGtMaW1pdFdhcm5lZCA9IGZhbHNlO1xuICAvKipcbiAgICogS2V5cyBtYXJrZWQgc2VjcmV0IGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuIOKAlCBieSBhIHBlci1jYWxsXG4gICAqIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAsIG9yIGJ5IGFueSB3cml0ZSB0aGUgcG9saWN5IHJlZGFjdGVkIHdob2xlLlxuICAgKiBPTkUgc2V0IHBlciBydW4sIHNoYXJlZCBieSBldmVyeSBzY29wZSBhbmQgY29udGV4dCAodGhlIGV4ZWN1dG9yIGJ1aWxkc1xuICAgKiB0aGUgcnVsZSBvbmNlIHBlciBydW4gYW5kIGluc3RhbGxzIGl0IG9uIHRoZSBydW50aW1lIHJvb3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWQ6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogRmllbGRzIGEgc3ViZmxvdyBtYXBwZXIgaGFuZGVkIHRvIGEgTkVXIGtleSBhbG9uZyB3aXRoIHRoZSB2YWx1ZSB0aGV5XG4gICAqIGJlbG9uZyB0byDigJQgdGFyZ2V0IGtleSDihpIgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRocyAoYW4gb2JqZWN0IGNvcGllZFxuICAgKiBieSByZWZlcmVuY2UgZnJvbSBhIGBmaWVsZHNgLXNlbGVjdGVkIGtleTsge0BsaW5rIE1hcHBlclRhaW50fSkuXG4gICAqIFJ1bi13aWRlLCBieSBuYW1lLCBsaWtlIHtAbGluayBtYXJrZWR9LlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0ZWQ6IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoaXMgcnVuJ3MgdGhyb3duIHZhbHVlcyBzZXJ2ZWQgbWFza2VkICh0aGVpciB0ZXh0IHNlbGVjdGVkLCBvciBhIHNlbGVjdGVkIGtleSBpbnNpZGUgdGhlbSkg4oaSIHRoZWlyIHNlcnZlZCBmb3JtLiAqL1xuICBwcml2YXRlIG1hc2tlZEVycm9yczogTWFwPHVua25vd24sIFN0cnVjdHVyZWRFcnJvckluZm8+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHBvbGljeT86IFJlZGFjdGlvblBvbGljeSwgbWFya2VkPzogU2V0PHN0cmluZz4pIHtcbiAgICB0aGlzLm1hcmtlZCA9IG1hcmtlZCA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgZ2V0UG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgc2V0UG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSBwb2xpY3k/LmRpYWdub3N0aWNzO1xuICAgIHRoaXMuZGlhZ25vc3RpY1J1bGUgPSBkaWFnbm9zdGljc1xuICAgICAgPyBuZXcgUmVkYWN0aW9uUnVsZSh7IGtleXM6IGRpYWdub3N0aWNzLmtleXMsIHBhdHRlcm5zOiBkaWFnbm9zdGljcy5wYXR0ZXJucywgZmllbGRzOiBkaWFnbm9zdGljcy5maWVsZHMgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucGF0aFBhdHRlcm5zID0gKHBvbGljeT8ucGF0dGVybnMgPz8gW10pLmZpbHRlcihuZWVkc1BhdGgpO1xuICAgIHRoaXMucG9saWN5QWN0aXZlID1cbiAgICAgIHBvbGljeSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoKHBvbGljeS5rZXlzPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIChwb2xpY3kucGF0dGVybnM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICAgT2JqZWN0LmtleXMocG9saWN5LmZpZWxkcyA/PyB7fSkubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoaXMgcnVsZSBoYXMgbm90aGluZyB0byBzYXkgYWJvdXQgQU5ZIHBhdGgg4oCUIG5vIGtleSwgcGF0dGVyblxuICAgKiBvciBmaWVsZCBpbiB0aGUgcG9saWN5IGFuZCBubyBrZXkgbWFya2VkIHNvIGZhci4gVGhlIG5vLXBvbGljeSBmYXN0XG4gICAqIHBhdGg6IGBTdGFnZUNvbnRleHRgIHNraXBzIHRoZSB2ZXJkaWN0IChhbmQgaXRzIHBhdGggYWxsb2NhdGlvbikgb25cbiAgICogZXZlcnkgdHJhY2tlZCByZWFkIGFuZCBzdGFnZWQgd3JpdGUgd2hpbGUgdGhpcyBob2xkcy4gQSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIG1hcmtzIGEga2V5IGFuZCBlbmRzIGl0LlxuICAgKi9cbiAgaXNJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiAhdGhpcy5wb2xpY3lBY3RpdmUgJiYgdGhpcy5pbmhlcml0ZWQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmVkIG1hcmtlZC1rZXlzIHNldCDigJQgZm9yIHRoZSBgQGludGVybmFsYCBzaGFyaW5nIHByb3RvY29sIGFuZCBgZGVjaWRlKClgLiAqL1xuICBtYXJrZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQ7XG4gIH1cblxuICB1c2VNYXJrZWRLZXlzKHNoYXJlZDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIG1hcmsoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgfVxuXG4gIC8qKiBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIG1hcmsgYW5kIGFueSBmaWVsZHMgYSBtYXBwZXIgZ2F2ZSBpdDsgYSBwb2xpY3kgdmVyZGljdCBzdXJ2aXZlcyBpdC4gKi9cbiAgdW5tYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuaW5oZXJpdGVkPy5kZWxldGUoa2V5KSAmJiB0aGlzLmluaGVyaXRlZC5zaXplID09PSAwKSB0aGlzLmluaGVyaXRlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBLZXktbGV2ZWwgdmVyZGljdDogbWFya2VkLCBsaXN0ZWQgaW4gYHBvbGljeS5rZXlzYCwgb3IgbWF0Y2hpbmcgYSBwYXR0ZXJuLiAqL1xuICBpc0tleVJlZGFjdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWFya2VkLmhhcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucG9saWN5LmtleXM/LmluY2x1ZGVzKGtleSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wb2xpY3kucGF0dGVybnM7XG4gICAgaWYgKCFwYXR0ZXJucyB8fCBwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAoa2V5Lmxlbmd0aCA+IE1BWF9QQVRURVJOX0tFWV9MRU4pIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIFJlZGFjdGlvblBvbGljeToga2V5ICcke2tleS5zbGljZSgwLCA0MCl9Li4uJyAoJHtrZXkubGVuZ3RofSBjaGFycykgZXhjZWVkcyBgICtcbiAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAnVXNlIHBvbGljeS5rZXlzIGZvciBleGFjdCBtYXRjaGluZyBvZiBsb25nIGtleSBuYW1lcy4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlc1BhdHRlcm4oa2V5LCBwYXR0ZXJucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGFuIGVtaXR0ZWQgcGF5bG9hZCBCRUZPUkUgZGlzcGF0Y2gvY2FwdHVyZS4gRW1pdCBuYW1lcyBhcmUgbm90XG4gICAqIHN0YXRlIHBhdGhzOiBubyBrZXktbGVuZ3RoIGNhcCwgbWFya3Mgb3IgZmllbGQgc2NydWIgYXBwbGllcyBoZXJlLlxuICAgKiBBIGNsZWFyIHBheWxvYWQga2VlcHMgaXRzIGlkZW50aXR5OyBkaWFnbm9zdGljIGJhZ3MgYXJlIHVudG91Y2hlZC5cbiAgICovXG4gIHJldGFpbkVtaXQobmFtZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKG5hbWUsIHRoaXMucG9saWN5Py5lbWl0UGF0dGVybnMpID8gU0NPUEVfUExBQ0VIT0xERVIgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhIE5BTUVEIGRpYWdub3N0aWMgZW50cnkg4oCUIGBhZGRyZXNzYCBpcyBgW2NoYW5uZWwsIC4uLnBhdGgsIG5hbWVdYFxuICAgKiAoYCRkZWJ1ZygndG9rZW4nLCB2KWAg4oaSIGBbJ2xvZ3MnLCAndG9rZW4nXWA7IGAkbG9nKHYpYCDihpIgYFsnbG9ncycsXG4gICAqICdtZXNzYWdlcyddYCkuIFRIRSBNQVBQSU5HOiB0aGUgZW50cnkgaXMgdGhlIHJlY29yZCBgeyBbbmFtZV06IHZhbHVlIH1gXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUsIHNvIGl0IGlzIHJldGFpbmVkIGFzIGEgYm91bmRhcnkgcmVjb3JkIGhvbGRpbmcgdGhlXG4gICAqIHN0YXRlIGtleSBgbmFtZWAgd291bGQgYmUg4oCUIHRoZSBzdGF0ZSB2ZXJkaWN0IGF0IGBbLi4ucGF0aCwgbmFtZV1gIChrZXlzLFxuICAgKiBwYXR0ZXJucyBhbmQgbWFya3MgYXQgZXZlcnkgZG90dGVkIHByZWZpeCBhbmQgYXQgdGhlIG5hbWUgaXRzZWxmOyB0aGUgdG9wXG4gICAqIGtleSdzIGBmaWVsZHNgKSwgdGhlbiBldmVyeSBuZXN0ZWQgb3duIGtleSB3aG9zZSBuYW1lIG9yIGRvdHRlZCBwYXRoIGlzXG4gICAqIHNlbGVjdGVkICh7QGxpbmsgcmV0YWluQm91bmRhcnl9J3Mgd2FsaykuIFRoZSBjaGFubmVsIHRha2VzIG5vIHBhcnQ6XG4gICAqIGBsb2dzLnRva2VuYCwgYGVycm9ycy50b2tlbmAgYW5kIGBtZXRyaWNzLnRva2VuYCBhcmUgYWxsIHRoZSBzdGF0ZSBrZXlcbiAgICogYHRva2VuYC4gYHBvbGljeS5kaWFnbm9zdGljc2AgKGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIHJvb3RlZCBhdCB0aGVcbiAgICogY2hhbm5lbCkgYXBwbGllcyBvbiB0b3AuIENsZWFyIHZhbHVlcyBrZWVwIHRoZWlyIGlkZW50aXR5LlxuICAgKi9cbiAgcmV0YWluRGlhZ25vc3RpYyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5pc0luZXJ0KCkgPyB2YWx1ZSA6IHRoaXMucmV0YWluTmFtZWQoYWRkcmVzcy5zbGljZSgxKSwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gdGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywga2VwdCkgOiBrZXB0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBmbG93LW1lc3NhZ2UgdGV4dCAoYGZsb3dNZXNzYWdlcy5kZXNjcmlwdGlvbmAgLyBgLnJhdGlvbmFsZWApOiB0ZXh0XG4gICAqIHRoZSBlbmdpbmUgY29tcG9zZXMgaGFzIG5vIG5hbWUgb2YgaXRzIG93biwgc28gbm8gc3RhdGUgc2VsZWN0b3IgcmVhY2hlc1xuICAgKiBpdCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0LlxuICAgKi9cbiAgcmV0YWluRmxvd1RleHQoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY1J1bGUgPyAodGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywgdGV4dCkgYXMgc3RyaW5nKSA6IHRleHQ7XG4gIH1cblxuICAvKioge0BsaW5rIHJldGFpbkRpYWdub3N0aWN9J3Mgc3RhdGUgaGFsZjogdGhlIHZhbHVlIG5hbWVkIGJ5IGBwYXRoYCAoaXRzIGxhc3Qgc2VnbWVudCksIHNlcnZlZCB3aG9sZS4gKi9cbiAgcHJpdmF0ZSByZXRhaW5OYW1lZChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBuYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPVxuICAgICAgcGF0aC5sZW5ndGggPiAxICYmIHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSA/IHsga2luZDogJ3dob2xlJywga2V5OiBuYW1lIH0gOiB0aGlzLnZlcmRpY3QocGF0aCk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IGtlcHQgPSBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICBpZiAoa2VwdCA9PT0gbnVsbCB8fCB0eXBlb2Yga2VwdCAhPT0gJ29iamVjdCcpIHJldHVybiBrZXB0O1xuICAgIGNvbnN0IGJhc2UgPSBwYXRoLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKGtlcHQsIGJhc2UsIHRoaXMuZG90dGVkVGFyZ2V0cyhiYXNlKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlcnZlZCBmb3JtIG9mIGEgdGhyb3duIHZhbHVlLCBkZWNpZGVkIE9OQ0UgYXQgaXRzIGVycm9yIHNpdGUgZnJvbSB0aGVcbiAgICogdGV4dCB0aGUgZGlhZ25vc3RpYyBjb2xsZWN0b3IgcmV0YWluZWQgZm9yIGBlcnJvcnMuc3RhZ2VFeGVjdXRpb25FcnJvcmBcbiAgICogKGBrZXB0YCkgYW5kIGZyb20gdGhlIHZhbHVlIGl0c2VsZiDigJQgYSByZWNvcmQgaGFuZGVkIG91dCB3aG9sZSwgbWFza2VkXG4gICAqIHdoZW4gb25lIG9mIGl0cyBvd24ga2V5cywgYXQgYW55IGRlcHRoLCBjYXJyaWVzIGEgc2VsZWN0ZWQgbmFtZS5cbiAgICogVW5tYXNrZWQ6IHRvZGF5J3Mgc3RydWN0dXJlZCBpbmZvLiBNYXNrZWQ6IHRoZSBlcnJvcidzIGBuYW1lYC9gY29kZWAga2VwdCxcbiAgICogbm8gYGlzc3Vlc2AgKHRoZXkgcXVvdGUgdGhlIGlucHV0KSBhbmQgbm8gYHJhd2AgZXJyb3IgKGl0IGhvbGRzIHRoZSB0ZXh0XG4gICAqIGFuZCB0aGUga2V5cyk7IHRoZSBtZXNzYWdlIGlzIHRoZSBwbGFjZWhvbGRlciB3aGVuIHRoZSB0ZXh0IHdhcyBzZWxlY3RlZCxcbiAgICogdGhlIHRleHQgaXRzZWxmIHdoZW4gb25seSBhIGtleSB3YXMg4oCUIHJlbWVtYmVyZWQgc28gYG9uUnVuRmFpbGVkYCwgdGhlXG4gICAqIGxvZ2dlciBhbmQgYSBmb3JrIGVudmVsb3BlIHNlcnZlIHRoZSBzYW1lIGZvcm0gKHtAbGluayBzZXJ2ZWRFcnJvcn0pLiBUaGVcbiAgICogdGhyb3duIHZhbHVlIGl0c2VsZiBzdGF5cyByZWFsLlxuICAgKi9cbiAgcmV0YWluU3RhZ2VFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAga2VwdDogdW5rbm93bixcbiAgKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB9IHtcbiAgICBjb25zdCBpbmZvID0gZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gICAgY29uc3QgdGV4dFNlbGVjdGVkID0ga2VwdCAhPT0gdGV4dDtcbiAgICBpZiAoIXRleHRTZWxlY3RlZCAmJiAhdGhpcy5jYXJyaWVzU2VsZWN0ZWRLZXkoZXJyb3IpKSByZXR1cm4geyBtZXNzYWdlOiB0ZXh0LCBzdHJ1Y3R1cmVkRXJyb3I6IGluZm8gfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGV4dFNlbGVjdGVkID8gU3RyaW5nKGtlcHQpIDogdGV4dDtcbiAgICBjb25zdCBtYXNrZWQ6IFN0cnVjdHVyZWRFcnJvckluZm8gPSB7XG4gICAgICBtZXNzYWdlOiB0ZXh0U2VsZWN0ZWQgPyBtZXNzYWdlIDogaW5mby5tZXNzYWdlLFxuICAgICAgLi4uKGluZm8ubmFtZSAhPT0gdW5kZWZpbmVkICYmIHsgbmFtZTogaW5mby5uYW1lIH0pLFxuICAgICAgLi4uKGluZm8uY29kZSAhPT0gdW5kZWZpbmVkICYmIHsgY29kZTogaW5mby5jb2RlIH0pLFxuICAgICAgcmF3OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICAodGhpcy5tYXNrZWRFcnJvcnMgPz89IG5ldyBNYXAoKSkuc2V0KGVycm9yLCBtYXNrZWQpO1xuICAgIHJldHVybiB7IG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvcjogbWFza2VkIH07XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHRocm93biB2YWx1ZSBjYXJyeSBhIHNlbGVjdGVkIG5hbWUg4oCUIGFuIG93biBrZXksIGF0IGFueSBkZXB0aCwgdGhhdFxuICAgKiB0aGUgcG9saWN5IG9yIGEgbWFyayBzZWxlY3RzPyBUb3RhbDogYSB2YWx1ZSB3aG9zZSBrZXlzIGNhbm5vdCBiZSByZWFkIGlzXG4gICAqIHNlcnZlZCBtYXNrZWQgKHRoZSBzYWZlIHNpZGUpLCBuZXZlciBhIHNlY29uZCB0aHJvdyBmcm9tIGFuIGVycm9yIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGNhcnJpZXNTZWxlY3RlZEtleSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRocm93bkNhcnJpZXModmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZXlzIHRoYXQgY2Fubm90IGJlIHJlYWQgKGEgdGhyb3dpbmcgZ2V0dGVyLCBhIHJldm9rZWQgUHJveHkpIG9yIGEgd2FsayBwYXN0IGl0c1xuICAgICAgLy8gbGltaXQ6IHNlcnZlZCBpbiB0aGUgbWFza2VkIGZvcm0g4oCUIGl0cyB0ZXh0IGtlcHQsIG5vIGByYXdgLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSB0aHJvd24gdmFsdWUgYW5kIHdoYXQgYSBsb2dnZXIgb3IgYSBzZXJpYWxpemVyIHByaW50cyB3aXRoIGl0OiBpdHMgb3duXG4gICAqIGtleXMgYXQgZXZlcnkgZGVwdGgsIGFuZCBpdHMgYGNhdXNlYCAvIGFuIGBBZ2dyZWdhdGVFcnJvcmAncyBgZXJyb3JzYCDigJQgb3duXG4gICAqIE5PTi1lbnVtZXJhYmxlIGtleXMgbm8ga2V5IHdhbGsgc2VlcyDigJQgZWFjaCB3YWxrZWQgdGhlIHNhbWUgd2F5IChhIGN5Y2xlXG4gICAqIGFtb25nIHRoZW0gaXMgZm9sbG93ZWQgb25jZSkuXG4gICAqL1xuICBwcml2YXRlIHRocm93bkNhcnJpZXModmFsdWU6IG9iamVjdCwgc2VlbjogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmIChzZWxlY3RzQnlQYXRoKHZhbHVlLCB1bmRlZmluZWQsIHRoaXMuZG90dGVkVGFyZ2V0cyh1bmRlZmluZWQpLCB0aGlzLm5hbWVzV2FsayhmYWxzZSksIG5ldyBNYXAoKSwgMCkuc2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvd24gPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkgPyAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXJyb3JzID0gb3duKCdlcnJvcnMnKTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgW293bignY2F1c2UnKSwgLi4uKEFycmF5LmlzQXJyYXkoZXJyb3JzKSA/IGVycm9ycyA6IFtdKV0pIHtcbiAgICAgIGlmIChwYXJ0ICE9PSBudWxsICYmIHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0JyAmJiB0aGlzLnRocm93bkNhcnJpZXMocGFydCwgc2VlbikpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleS1sZXZlbCBydWxlcyBhcyB0aGUgcGF0aCB3YWxrIGFza3MgdGhlbSAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhXG4gICAqIG5lc3RlZCBrZXkgaXMgc2VsZWN0ZWQgYnkgaXRzIG93biBOQU1FIChtYXJrcywga2V5cywgcGF0dGVybnMpLCBhbmQg4oCUIHVuZGVyXG4gICAqIHBhdHRlcm5zIG9ubHkg4oCUIGJ5IGl0cyBkb3R0ZWQgcGF0aDsgYSBkZWNsYXJlZCAob3IgaW5oZXJpdGVkKSBmaWVsZCBiZWxvdyBhXG4gICAqIGtleSBvZiBpdHMgbmFtZSBpcyBhIHRhcmdldC4gRG90dGVkIGtleXMgYW5kIG1hcmtzIGFyZSBUQVJHRVRTIGZyb20gdGhlXG4gICAqIHdhbGsncyByb290ICh7QGxpbmsgZG90dGVkVGFyZ2V0c30pLCBzbyB3aXRob3V0IHBhdHRlcm5zIG5vIGRlY2lzaW9uXG4gICAqIGRlcGVuZHMgb24gdGhlIHBhdGggYW5kIHRoZSB3YWxrIHNoYXJlcyB0aGVtIHBlciBvYmplY3QgKGxpbmVhciBvbiBhIERBRykuXG4gICAqIGByb290RGVjaWRlZGA6IHRoZSByb290J3Mgb3duIGtleXMgd2VyZSBhbHJlYWR5IGRlY2lkZWQgKGByZXRhaW5SZWNvcmRgKS5cbiAgICovXG4gIHByaXZhdGUgbmFtZXNXYWxrKHJvb3REZWNpZGVkOiBib29sZWFuKTogV2FsayB7XG4gICAgY29uc3QgYnlQYXRoID0gdGhpcy5wYXRoUGF0dGVybnM7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzOiB7XG4gICAgICAgIG1hc2tzOiAobmFtZSkgPT4gdGhpcy5pc0tleVJlZGFjdGVkKG5hbWUpLFxuICAgICAgICAuLi4oYnlQYXRoLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICAgIHBhdGhNYXNrczogKHBhdGg6IHN0cmluZykgPT4gcGF0aC5sZW5ndGggPD0gTUFYX1BBVFRFUk5fS0VZX0xFTiAmJiBtYXRjaGVzUGF0dGVybihwYXRoLCBieVBhdGgpLFxuICAgICAgICB9KSxcbiAgICAgICAgZmllbGRzOiAobmFtZSkgPT4gdGhpcy5maWVsZHNPZihuYW1lKSxcbiAgICAgIH0sXG4gICAgICByb290RGVjaWRlZCxcbiAgICAgIC4uLihieVBhdGgubGVuZ3RoID09PSAwICYmIHsgbWVtbzogbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4oKSB9KSxcbiAgICAgIGJ1ZGdldDogd2Fsa0xpbWl0LFxuICAgICAgb25MaW1pdDogKCkgPT4gdGhpcy53YXJuV2Fsa0xpbWl0KGJ5UGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBPbmNlIHBlciBydWxlLCBpbiBkZXYgbW9kZTogYSBwYXRoIHdhbGsgcGFzc2VkIGl0cyBsaW1pdCBhbmQgc2VydmVkIGl0cyByZW1haW5kZXIgYXMgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBwcml2YXRlIHdhcm5XYWxrTGltaXQocGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2Fsa0xpbWl0V2FybmVkIHx8ICFpc0Rldk1vZGUoKSkgcmV0dXJuO1xuICAgIHRoaXMud2Fsa0xpbWl0V2FybmVkID0gdHJ1ZTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGEgdmFsdWUgd2l0aCBtb3JlIHRoYW4gJHt3YWxrTGltaXR9IHBhdGhzIHVuZGVyIHRoZSBwYXRoIHBhdHRlcm4ocykgYCArXG4gICAgICAgIGAke3BhdHRlcm5zLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9IOKAlCB0aGUgcGF0aHMgcGFzdCB0aGF0IHdlcmUgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gYCArXG4gICAgICAgICdBIHBhdHRlcm4gdGhhdCBuYW1lcyBhIEtFWSAobm8gZG90LCBubyBsb29rYXJvdW5kKSBpcyBkZWNpZGVkIHBlciBvYmplY3Q7IHByZWZlciBvbmUsIG9yIGtleXMvZmllbGRzLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZG90dGVkIGtleXMgYW5kIG1hcmtzIHRoYXQgbmFtZSBhIHBhdGggdW5kZXIgYGJhc2VgICh0aGUgd2FsaydzIHJvb3Q6XG4gICAqIGB1bmRlZmluZWRgIGZvciBhIHJlY29yZCdzIG93biBrZXlzLCBhbiBlbnRyeSdzIG5hbWUgZm9yIGEgZGlhZ25vc3RpYyksXG4gICAqIGFzIHRhcmdldHMgcmVsYXRpdmUgdG8gaXQg4oCUIGEgZG90dGVkIHJ1bGUgaXMgZXhhY3QgdG8gaXRzIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGRvdHRlZFRhcmdldHMoYmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGFyZ2V0W10ge1xuICAgIGNvbnN0IHByZWZpeCA9IGJhc2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYCR7YmFzZX0uYDtcbiAgICBjb25zdCBvdXQ6IFRhcmdldFtdID0gW107XG4gICAgY29uc3QgYWRkID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcuJykgfHwgIW5hbWUuc3RhcnRzV2l0aChwcmVmaXgpIHx8IG5hbWUubGVuZ3RoID09PSBwcmVmaXgubGVuZ3RoKSByZXR1cm47XG4gICAgICBvdXQucHVzaChuYW1lLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJykpO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMubWFya2VkKSBhZGQobmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucG9saWN5Py5rZXlzID8/IFtdKSBhZGQobmFtZSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGFueSBvYnNlcnZlciBpcyBzZXJ2ZWQgZm9yIGEgdGhyb3duIHZhbHVlIOKAlCByZXRyeSwgdGhyb3R0bGUsIHJ1blxuICAgKiBmYWlsdXJlLCBhIGZvcmsgZW52ZWxvcGUsIHRoZSBsb2dnZXI6IGl0cyByZW1lbWJlcmVkIHN0YWdlIGZvcm0sIGVsc2UgdGhlXG4gICAqIHNhbWUgZGVjaXNpb24gbWFkZSBub3cgKGFuZCByZW1lbWJlcmVkKSwgZWxzZSBpdHMgc3RydWN0dXJlZCBpbmZvLlxuICAgKi9cbiAgc2VydmVkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHtcbiAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9yKGVycm9yKTtcbiAgICAvLyBFYWNoIGV2ZW50IGdldHMgaXRzIG93biBvYmplY3QsIGFzIGV4dHJhY3RFcnJvckluZm8gZ2l2ZXMgaXQgb25lLlxuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgbG9nZ2VyIGlzIGhhbmRlZDogdGhlIHRocm93biB2YWx1ZSBpdHNlbGYgdW5sZXNzIHRoZSBwb2xpY3kgbWFza2VkIGl0cyB0ZXh0LiAqL1xuICBsb2dnYWJsZUVycm9yKGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBlcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgbWFza2VkRXJyb3IoZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICAgIGlmIChrbm93biB8fCB0aGlzLmlzRGlhZ25vc3RpY0luZXJ0KCkpIHJldHVybiBrbm93bjtcbiAgICBjb25zdCB0ZXh0ID0gdGhyb3duVGV4dChlcnJvcik7XG4gICAgdGhpcy5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCB0aGlzLnJldGFpbkRpYWdub3N0aWMoWydlcnJvcnMnLCAnc3RhZ2VFeGVjdXRpb25FcnJvciddLCB0ZXh0KSk7XG4gICAgcmV0dXJuIHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGhpbmcgY2FuIG1hc2sgYSBkaWFnbm9zdGljIGVudHJ5IG9yIGEgdGhyb3duIHZhbHVlIOKAlCBubyBzdGF0ZSBzZWxlY3RvcixcbiAgICogbm8gbWFyaywgbm8gZGlhZ25vc3RpYyBzZWxlY3RvcjogdGhlIGNvbGxlY3RvcnMnIGFuZCB0aGUgZXJyb3IgcGF0aHMnIGZhc3RcbiAgICogcGF0aCAoYSBuby1wb2xpY3kgcnVuIG5ldmVyIHJlYWRzIGEgcGF5bG9hZCwgaW5jbHVkaW5nIGJvcnJvd2VkIGdldHRlcnMpLlxuICAgKi9cbiAgaXNEaWFnbm9zdGljSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmVydCgpICYmIHRoaXMuaXNGbG93VGV4dEluZXJ0KCk7XG4gIH1cblxuICAvKiogTm90aGluZyBjYW4gbWFzayBmbG93LW1lc3NhZ2UgdGV4dCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0ICh7QGxpbmsgcmV0YWluRmxvd1RleHR9KS4gKi9cbiAgaXNGbG93VGV4dEluZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kaWFnbm9zdGljUnVsZSB8fCB0aGlzLmRpYWdub3N0aWNSdWxlLmlzSW5lcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBmb3IgYSB1c2VyLWxldmVsIHBhdGgg4oCUIGBbJ3Byb2ZpbGUnXWAgZm9yIGEgc2NvcGUga2V5LFxuICAgKiBgWydwcm9maWxlJywgJ2F1dGgnXWAgZm9yIGEgbmVzdGVkIHdyaXRlIHN1Y2ggYXMgYSBzdWJmbG93IHNlZWQuXG4gICAqXG4gICAqIEV2ZXJ5IGRvdHRlZCBwcmVmaXggaXMgdGVzdGVkIGF0IGtleSBsZXZlbCAoYHByb2ZpbGVgLCB0aGVuXG4gICAqIGBwcm9maWxlLmF1dGhgKSwgc28gYSBwb2xpY3kgdGhhdCBuYW1lcyBhIGtleSBjb3ZlcnMgZXZlcnl0aGluZyB3cml0dGVuXG4gICAqIGJlbmVhdGggaXQuIGBmaWVsZHNgIGFyZSBkZWNsYXJlZCByZWxhdGl2ZSB0byB0aGUgVE9QIGtleTsgZm9yIGEgbmVzdGVkXG4gICAqIHBhdGggdGhleSBhcmUgcmUtYmFzZWQgb250byB0aGUgdmFsdWUgYmVpbmcgd3JpdHRlbiwgYW5kIGEgZmllbGQgdGhhdFxuICAgKiBuYW1lcyB0aGUgd3JpdHRlbiBwYXRoIGV4YWN0bHkgbWFrZXMgdGhlIHdob2xlIHZhbHVlIHNlY3JldC5cbiAgICovXG4gIHZlcmRpY3QocGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLnZlcmRpY3RPZktleShwYXRoWzBdKTtcbiAgICBsZXQgZG90dGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3R0ZWQgPSBpID09PSAwID8gcGF0aFswXSA6IGAke2RvdHRlZH0uJHtwYXRoW2ldfWA7XG4gICAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGRvdHRlZCkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2YocGF0aFswXSk7XG4gICAgaWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIENMRUFSO1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGZpZWxkcyB9O1xuICAgIGNvbnN0IHJlbCA9IHBhdGguc2xpY2UoMSkuam9pbignLicpO1xuICAgIGNvbnN0IGluc2lkZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgLy8gVGhlIHdyaXR0ZW4gcGF0aCBJUyBhIHNlY3JldCBmaWVsZDogdGhlIHdob2xlIHZhbHVlIGlzIHNlY3JldCwgYW5kXG4gICAgICAvLyB0aGUga2V5IHRoYXQgZGVjaWRlZCBpdCBpcyB0aGF0IGRvdHRlZCBwYXRoIOKAlCBuZXZlciB0aGUgdG9wIGtleSxcbiAgICAgIC8vIHdob3NlIHNpYmxpbmdzIHN0YXkgY2xlYXIuXG4gICAgICBpZiAoZmllbGQgPT09IHJlbCkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiBkb3R0ZWQgfTtcbiAgICAgIGlmIChmaWVsZC5zdGFydHNXaXRoKGAke3JlbH0uYCkpIGluc2lkZS5wdXNoKGZpZWxkLnNsaWNlKHJlbC5sZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGUubGVuZ3RoID4gMCA/IHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGluc2lkZSB9IDogQ0xFQVI7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGBrZXlgIHdyaXR0ZW4gb3IgcmVhZCB1bmRlciBgcGF0aGAg4oCUIHRoZSBjb21tb25cbiAgICogc2luZ2xlLXNlZ21lbnQgY2FzZSAoYHBhdGhgIGVtcHR5OiBldmVyeSBmYWNhZGUgd3JpdGUgYW5kIHJlYWQpIGRlY2lkZXNcbiAgICogb24gdGhlIGtleSBzdHJpbmcgYWxvbmUsIG5vIGFycmF5IGFsbG9jYXRlZC5cbiAgICovXG4gIHZlcmRpY3RBdChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPT09IDAgPyB0aGlzLnZlcmRpY3RPZktleShrZXkpIDogdGhpcy52ZXJkaWN0KFsuLi5wYXRoLCBrZXldKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlLXNlZ21lbnQgdmVyZGljdDoga2V5LWxldmVsIGhpdCDihpIgd2hvbGU7IGRlY2xhcmVkIG9yIGluaGVyaXRlZCBmaWVsZHMg4oaSIGZpZWxkcy4gKi9cbiAgcHJpdmF0ZSB2ZXJkaWN0T2ZLZXkoa2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGtleSkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2Yoa2V5KTtcbiAgICByZXR1cm4gZmllbGRzICE9PSB1bmRlZmluZWQgJiYgZmllbGRzLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXksIHBhdGhzOiBmaWVsZHMgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqIFRoZSBzZWNyZXQgZmllbGRzIG9mIGEgdG9wIGtleTogdGhlIHBvbGljeSdzLCBwbHVzIGFueSBhIG1hcHBlciBoYW5kZWQgaXQgKHtAbGluayBNYXBwZXJUYWludH0pLiAqL1xuICBwcml2YXRlIGZpZWxkc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRlY2xhcmVkID0gZGVjbGFyZWRGaWVsZHModGhpcy5wb2xpY3k/LmZpZWxkcywga2V5KTtcbiAgICBjb25zdCBpbmhlcml0ZWQgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KGtleSk7XG4gICAgaWYgKGluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjbGFyZWQ7XG4gICAgcmV0dXJuIGRlY2xhcmVkID09PSB1bmRlZmluZWQgPyBpbmhlcml0ZWQgOiBbLi4ubmV3IFNldChbLi4uZGVjbGFyZWQsIC4uLmluaGVyaXRlZF0pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgbWFya3MgYW5kIHRoZSBmaWVsZHMgbWFwcGVycyBoYW5kZWQgdG8gbmV3IGtleXMsIGFzIE5BTUVTIOKAlCB3aGF0XG4gICAqIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4gKGBGbG93Y2hhcnRDaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzYCkuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vbmUgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyaykuXG4gICAqL1xuICBtYXJrc0ZvckNoZWNrcG9pbnQoKTogUmVkYWN0aW9uTWFya3MgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLm1hcmtlZC5zaXplID09PSAwICYmIHRoaXMuaW5oZXJpdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IFsuLi50aGlzLm1hcmtlZF0sXG4gICAgICAuLi4odGhpcy5pbmhlcml0ZWQgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGZpZWxkczogT2JqZWN0LmZyb21FbnRyaWVzKFsuLi50aGlzLmluaGVyaXRlZF0ubWFwKChba2V5LCBwYXRoc10pID0+IFtrZXksIFsuLi5wYXRoc11dKSksXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFNlZWQgYSByZXN1bWVkIHJ1bidzIHJ1bGUgd2l0aCB0aGUgbWFya3MgaXRzIHBhdXNlIGNhcnJpZWQgKHtAbGluayBtYXJrc0ZvckNoZWNrcG9pbnR9KS4gKi9cbiAgcmVzdG9yZU1hcmtzKG1hcmtzOiBSZWRhY3Rpb25NYXJrcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG1hcmtzLmtleXMpIHRoaXMubWFya2VkLmFkZChrZXkpO1xuICAgIGZvciAoY29uc3QgW2tleSwgcGF0aHNdIG9mIE9iamVjdC5lbnRyaWVzKG1hcmtzLmZpZWxkcyA/PyB7fSkpIHRoaXMuaW5oZXJpdEZpZWxkcyhrZXksIHBhdGhzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHN1YmZsb3cgbWFwcGVyJ3MgY29weSBpbmhlcml0cyB0aGUgZmllbGRzIG9mIHRoZSB2YWx1ZSBpdCBjb3BpZWQ6XG4gICAqIGB0YXJnZXRgIGlzIGEga2V5IHRoZSBtYXBwZXIgd3JvdGU7IGBwYXRoc2AgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRoc1xuICAgKiAoZGVjbGFyZWQgb3IgdGhlbXNlbHZlcyBpbmhlcml0ZWQpLiBSdW4td2lkZSwgYnkgbmFtZSwgbGlrZSBhIG1hcmsuXG4gICAqL1xuICBpbmhlcml0RmllbGRzKHRhcmdldDogc3RyaW5nLCBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMuaW5oZXJpdGVkPy5nZXQodGFyZ2V0KSA/PyBbXTtcbiAgICAodGhpcy5pbmhlcml0ZWQgPz89IG5ldyBNYXAoKSkuc2V0KHRhcmdldCwgWy4uLm5ldyBTZXQoWy4uLnByaW9yLCAuLi5wYXRoc10pXSk7XG4gIH1cblxuICAvKiogVGhlIHZlcmRpY3Qgb2YgYSBrZXkgYSBtYXBwZXIgcmVhZCDigJQgYHJ1bnNgICh0aGUgcnVuIG5hbWVzcGFjZXMsIGBSVU5fTkFNRVNQQUNFYCkgaXMgc2VsZWN0ZWQgd2hlbiBhbnkgbmFtZXNwYWNlZCBrZXkgaXMuICovXG4gIHZlcmRpY3RPZlJlYWQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMudmVyZGljdE9mS2V5KGtleSk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCBrZXkgIT09IFJVTl9OQU1FU1BBQ0UgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHZlcmRpY3Q7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3BhY2Ugb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChzcGFjZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3BhY2UgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgaW5uZXIgb2YgT2JqZWN0LmtleXMoc3BhY2UpKSB7XG4gICAgICAgIGlmICh0aGlzLnZlcmRpY3RPZktleShpbm5lcikua2luZCAhPT0gJ2NsZWFyJykgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5IH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCAvIHNlcnZlZCBmb3JtIG9mIGEgdmFsdWUgYXQgYSBwYXRoOiB0aGUgcGxhY2Vob2xkZXIsIGFcbiAgICogc2NydWJiZWQgQ0xPTkUsIG9yIHRoZSB2YWx1ZSBpdHNlbGYgKHNhbWUgcmVmZXJlbmNlIOKAlCByZWNvcmRlcnMgcmVjZWl2ZVxuICAgKiBib3Jyb3dlZCBsaXZlIHJlZmVyZW5jZXMgZm9yIGNsZWFyIHZhbHVlcywgYXMgdGhleSBhbHdheXMgaGF2ZSkuXG4gICAqIGBwbGFjZWhvbGRlcmAgZGVmYXVsdHMgdG8gdGhlIHNjb3BlLXRpZXIgYCdbUkVEQUNURURdJ2A7IHRoZSBtaXJyb3Igc2VlZFxuICAgKiBwYXNzZXMgdGhlIGxvZydzIGAnUkVEQUNURUQnYC5cbiAgICovXG4gIHJldGFpbihwYXRoOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24sIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IHVua25vd24ge1xuICAgIHJldHVybiBSZWRhY3Rpb25SdWxlLmFwcGx5KHRoaXMudmVyZGljdChwYXRoKSwgdmFsdWUsIHBsYWNlaG9sZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIFNUQVRFIHJlY29yZCAoc3RhdGUgcmVhZCwgbWlycm9yIHNlZWQpOiBlYWNoIG93blxuICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXkgdGhyb3VnaCB7QGxpbmsgcmV0YWlufS4gRmllbGRzIGFyZSBwYXRocyBpbnNpZGUgdGhhdFxuICAgKiBrZXllZCB2YWx1ZS4gU2NhbGFycyBhbmQgcm9vdCBhcnJheXMgcGFzcyB0aHJvdWdoLiBCb3VuZGFyeSByZWNvcmRzIGFkZFxuICAgKiB0aGUgbmVzdGVkLWtleSB3YWxrOiB7QGxpbmsgcmV0YWluQm91bmRhcnl9LlxuICAgKiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCB3aGVuIHVuY2hhbmdlZC4gQW4gaW5lcnQgcnVsZSBkb2VzIG5vdCBlbnVtZXJhdGVcbiAgICogdGhlIHZhbHVlLCBzbyBldmVuIGFuIGFjY2Vzc29yIGlzIHVudG91Y2hlZCBvbiB0aGUgbm8tcG9saWN5IGZhc3QgcGF0aC5cbiAgICovXG4gIHJldGFpblJlY29yZDxUPihyZWNvcmQ6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCByZWNvcmQgPT09IG51bGwgfHwgdHlwZW9mIHJlY29yZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShyZWNvcmQpKSByZXR1cm4gcmVjb3JkO1xuICAgIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpbihba2V5XSwgdmFsdWUsIHBsYWNlaG9sZGVyKTtcbiAgICAgIGlmIChrZXB0ID09PSB2YWx1ZSkgY29udGludWU7XG4gICAgICBvdXQgPz89IHsgLi4uKHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICAgIG91dFtrZXldID0ga2VwdDtcbiAgICB9XG4gICAgcmV0dXJuIChvdXQgPz8gcmVjb3JkKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgQk9VTkRBUlkgcmVjb3JkIOKAlCByb290IGlucHV0L291dHB1dCBhbmQgYSBzdWJmbG93J3NcbiAgICogbWFwcGVkIHNlZWQsIGJlZm9yZSBhbnkgb2JzZXJ2ZXIgc2VlcyBpdC4ge0BsaW5rIHJldGFpblJlY29yZH0gZGVjaWRlcyBlYWNoXG4gICAqIHRvcCBrZXk7IHRoZW4gZXZlcnkgTkVTVEVEIG93biBrZXkgaXMgYSBrZXkgdG9vOiBzZWNyZXQgd2hlbiBpdHMgb3duIG5hbWVcbiAgICogb3IgaXRzIGRvdHRlZCBwYXRoIGlzIHJlZGFjdGVkIGF0IGtleSBsZXZlbCAoYGtleXM6IFsnc2VjcmV0J11gIGNvdmVyc1xuICAgKiBgeyB3cmFwcGVyOiB7IHNlY3JldCB9IH1gOyBhIHJvb3QgYXJyYXkncyBlbGVtZW50cyBhcmUgd2Fsa2VkIHRoZSBzYW1lXG4gICAqIHdheSksIGFuZCBpdHMgZGVjbGFyZWQgYGZpZWxkc2Agc2NydWJiZWQgaW5zaWRlIGl0IChgZmllbGRzOiB7IHByb2ZpbGU6XG4gICAqIFsndG9rZW4nXSB9YCBjb3ZlcnMgYHsgd3JhcHBlcjogeyBwcm9maWxlOiB7IHRva2VuIH0gfSB9YCkuIERlY2lkZWQgcGVyXG4gICAqIFBBVEgsIGNvcHktb24td3JpdGUgcGVyIHBhdGggKHtAbGluayBzZXJ2ZWRCeVBhdGh9KTogYW4gb2JqZWN0IHNoYXJlZCBieVxuICAgKiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBvbmUgYSBwYXRoIHJ1bGUgbmFtZXMgYW5kIHNlcnZlZCBhcyBpdCBpcyBhdFxuICAgKiB0aGUgb3RoZXI7IGEgY3ljbGUgZWRnZSBsYW5kcyBvbiB0aGUgc2VydmVkIGNvcHksIG5ldmVyIG9uIGFuIHVuc2NydWJiZWRcbiAgICogb3JpZ2luYWw7IHRoZSBsaXZlIHZhbHVlIGlzIG5ldmVyIHRvdWNoZWQuIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHdoZW5cbiAgICogbm90aGluZyBuZXN0ZWQgaXMgc2VjcmV0LCBhbmQgYW4gaW5lcnQgcnVsZSBlbnVtZXJhdGVzIG5vdGhpbmcuIFN0YXRlXG4gICAqIGtlZXBzIGl0cyBvd24gcGF0aCB2ZXJkaWN0cyAoe0BsaW5rIHZlcmRpY3R9KTsgdGhpcyB3YWxrIGlzIGZvciByZWNvcmRzXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUuXG4gICAqL1xuICByZXRhaW5Cb3VuZGFyeTxUPihyZWNvcmQ6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIC8vIEEgbWFza2VkIHN0YWdlIGVycm9yIGluc2lkZSB0aGUgcmVjb3JkIChhIGZvcmsgZW52ZWxvcGUncyBgcmVzdWx0YCkgaXNcbiAgICAvLyBzZXJ2ZWQgaW4gaXRzIG1hc2tlZCBmb3JtOiBhbiBFcnJvcidzIG1lc3NhZ2UgaXMgbm9uLWVudW1lcmFibGUgYW5kIGFcbiAgICAvLyB0aHJvd24gc3RyaW5nIGlzIGEgcGxhaW4gdmFsdWUsIHNvIG5vIGtleSB3YWxrIHNlZXMgZWl0aGVyLlxuICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMubWFza2VkRXJyb3JzPy5zaXplID8gKHRoaXMud2l0aFNlcnZlZEVycm9ycyhyZWNvcmQpIGFzIFQpIDogcmVjb3JkO1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCBzZXJ2ZWQgPT09IG51bGwgfHwgdHlwZW9mIHNlcnZlZCAhPT0gJ29iamVjdCcpIHJldHVybiBzZXJ2ZWQ7XG4gICAgY29uc3QgdG9wID0gdGhpcy5yZXRhaW5SZWNvcmQoc2VydmVkLCBwbGFjZWhvbGRlcikgYXMgdW5rbm93biBhcyBvYmplY3Q7XG4gICAgLy8gQmVsb3cgdGhlIHRvcCBrZXlzLCBvbmUgZGVjaXNpb24gcGVyIFBBVEggKHRoZSB3aG9sZSByZWNvcmQgaXMgdGhlIHdhbGsncyByb290LCBzbyBhIGN5Y2xlXG4gICAgLy8gYmFjayB0byBpdCBsYW5kcyBvbiB0aGUgc2VydmVkIGNvcHkpLlxuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgodG9wLCB1bmRlZmluZWQsIHRoaXMuZG90dGVkVGFyZ2V0cyh1bmRlZmluZWQpLCB0aGlzLm5hbWVzV2Fsayh0cnVlKSwgcGxhY2Vob2xkZXIpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ29weS1vbi13cml0ZSBvdmVyIGNvbnRhaW5lcnM6IGV2ZXJ5IHJlbWVtYmVyZWQgbWFza2VkIGVycm9yIGJlY29tZXMgaXRzXG4gICAqIHNlcnZlZCBmb3JtIOKAlCBhbiBvYmplY3QgZXJyb3IgaXRzIG1hc2tlZCBzdHJ1Y3R1cmVkIGluZm8sIGEgdGhyb3duXG4gICAqIHN0cmluZy9udW1iZXIgaXRzIG1hc2tlZCB0ZXh0ICh0aGUgdmFsdWUga2VlcHMgYmVpbmcgYSBzY2FsYXIpLiBBIHNjYWxhciBpc1xuICAgKiBtYXRjaGVkIGJ5IFZBTFVFLCBzbyBhbiB1bnJlbGF0ZWQgZmllbGQgdGhhdCBoYXBwZW5zIHRvIGVxdWFsIGEgbWFza2VkXG4gICAqIHRocm93biBzdHJpbmcgaXMgbWFza2VkIHRvbzogb3Zlci1tYXNraW5nIGlzIHRoZSBzYWZlIGRpcmVjdGlvbi5cbiAgICogYHVuZGVmaW5lZGAvYG51bGxgL2Jvb2xlYW5zIGFyZSBuZXZlciBzd2FwcGVkIOKAlCB0aGV5IGNhcnJ5IG5vIHRleHQsIGFuZFxuICAgKiBzd2FwcGluZyB0aGVtIHdvdWxkIHJld3JpdGUgb3JkaW5hcnkgZGF0YSBzaGFwZXMuXG4gICAqXG4gICAqIENZQ0xFLVNBRkUgKHJldmlldyBmaW5kaW5nIDIpLiBUaGUgY29udGFpbmVycyB0aGF0IGNhbiBSRUFDSCBhIG1hc2tlZFxuICAgKiBlcnJvciBhcmUgZm91bmQgZmlyc3QgKHtAbGluayByZWFjaGluZ01hc2tlZEVycm9yc30g4oCUIHRoZSB3aG9sZSByZWFjaGFibGVcbiAgICogZ3JhcGgsIGN5Y2xlcyBpbmNsdWRlZCk7IGVhY2ggb2YgdGhlbSBpcyBjb3BpZWQsIGl0cyBjb3B5IGFsbG9jYXRlZCBhbmRcbiAgICogcmVtZW1iZXJlZCBCRUZPUkUgaXRzIGNoaWxkcmVuIGFyZSBmaWxsZWQsIHNvIGFuIGVkZ2UgYmFjayB0byBpdCDigJQgYSBjeWNsZVxuICAgKiDigJQgbGFuZHMgb24gdGhlIGNvcHksIG5ldmVyIG9uIHRoZSBvcmlnaW5hbCB0aGF0IHN0aWxsIGhvbGRzIHRoZSByYXcgZXJyb3IuXG4gICAqIEV2ZXJ5IG90aGVyIGNvbnRhaW5lciBrZWVwcyBpdHMgaWRlbnRpdHkuXG4gICAqL1xuICBwcml2YXRlIHdpdGhTZXJ2ZWRFcnJvcnModmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBsZWFmID0gdGhpcy5zZXJ2ZWRMZWFmKHZhbHVlKTtcbiAgICBpZiAobGVhZiAhPT0gS0VFUCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbGVhZiA9PT0gS0VFUCA/IHZhbHVlIDogbGVhZjtcbiAgICBjb25zdCByZWFjaGluZyA9IHRoaXMucmVhY2hpbmdNYXNrZWRFcnJvcnModmFsdWUpO1xuICAgIGlmICghcmVhY2hpbmcuaGFzKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IGNvcGllcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBjb25zdCBjb3B5T2YgPSAobm9kZTogb2JqZWN0KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgY29uc3Qga25vd24gPSBjb3BpZXMuZ2V0KG5vZGUpO1xuICAgICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcbiAgICAgIGNvbnN0IGNvcHkgPSAoQXJyYXkuaXNBcnJheShub2RlKSA/IG5vZGUuc2xpY2UoKSA6IHsgLi4ubm9kZSB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvcGllcy5zZXQobm9kZSwgY29weSk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSB0aGlzLnNlcnZlZExlYWYoY2hpbGQpO1xuICAgICAgICBpZiAoc2VydmVkICE9PSBLRUVQKSBjb3B5W2tleV0gPSBzZXJ2ZWQ7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgcmVhY2hpbmcuaGFzKGNoaWxkKSkgY29weVtrZXldID0gY29weU9mKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3B5O1xuICAgIH07XG4gICAgcmV0dXJuIGNvcHlPZih2YWx1ZSk7XG4gIH1cblxuICAvKiogQSBtYXNrZWQgZXJyb3IncyBzZXJ2ZWQgZm9ybSDigJQgYEtFRVBgIGZvciBhbnl0aGluZyBlbHNlIChhIHNjYWxhciBuZXZlciBzd2FwcGVkLCBhIGNvbnRhaW5lcikuICovXG4gIHByaXZhdGUgc2VydmVkTGVhZih2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gS0VFUDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcnM/LmdldCh2YWx1ZSk7XG4gICAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IEtFRVA7XG4gICAgfVxuICAgIGNvbnN0IHN3YXBwYWJsZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnO1xuICAgIGNvbnN0IG1hc2tlZCA9IHN3YXBwYWJsZSA/IHRoaXMubWFza2VkRXJyb3JzPy5nZXQodmFsdWUpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBtYXNrZWQgPyBtYXNrZWQubWVzc2FnZSA6IEtFRVA7XG4gIH1cblxuICAvKiogRXZlcnkgY29udGFpbmVyIHVuZGVyIGByb290YCAoaXRzZWxmIGluY2x1ZGVkKSBmcm9tIHdoaWNoIHNvbWUgcGF0aCByZWFjaGVzIGEgbWFza2VkIGVycm9yLiAqL1xuICBwcml2YXRlIHJlYWNoaW5nTWFza2VkRXJyb3JzKHJvb3Q6IG9iamVjdCk6IFNldDxvYmplY3Q+IHtcbiAgICBjb25zdCBwYXJlbnRzID0gbmV3IE1hcDxvYmplY3QsIG9iamVjdFtdPigpO1xuICAgIGNvbnN0IGhvbGRlcnM6IG9iamVjdFtdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8b2JqZWN0Pihbcm9vdF0pO1xuICAgIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhub2RlKSkge1xuICAgICAgICBpZiAodGhpcy5zZXJ2ZWRMZWFmKGNoaWxkKSAhPT0gS0VFUCkge1xuICAgICAgICAgIGhvbGRlcnMucHVzaChub2RlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9mID0gcGFyZW50cy5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAob2YgPT09IHVuZGVmaW5lZCkgcGFyZW50cy5zZXQoY2hpbGQsIFtub2RlXSk7XG4gICAgICAgIGVsc2Ugb2YucHVzaChub2RlKTtcbiAgICAgICAgaWYgKCFzZWVuLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChjaGlsZCk7XG4gICAgICAgICAgc3RhY2sucHVzaChjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVhY2hpbmcgPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgICB3aGlsZSAoaG9sZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gaG9sZGVycy5wb3AoKSE7XG4gICAgICBpZiAocmVhY2hpbmcuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICAgIHJlYWNoaW5nLmFkZChub2RlKTtcbiAgICAgIGhvbGRlcnMucHVzaCguLi4ocGFyZW50cy5nZXQobm9kZSkgPz8gW10pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYWNoaW5nO1xuICB9XG5cbiAgLyoqIERvZXMgYHZhbHVlYCBob2xkIG9uZSBvZiBgcGF0aHNgIOKAlCBhbiBvd24ga2V5IG9mIHRoYXQgbmFtZSwgb3IgYSBkb3R0ZWQgcGF0aCBpbnNpZGUgaXQ/ICovXG4gIHN0YXRpYyBob2xkc1BhdGhzKHZhbHVlOiBvYmplY3QsIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmIChwYXRocyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBwYXRoKSB8fCAocGF0aC5pbmNsdWRlcygnLicpICYmIG5hdGl2ZUhhcyh2YWx1ZSwgcGF0aCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSB3aG9sZSBTVEFURSDigJQge0BsaW5rIHJldGFpblJlY29yZH0gb3ZlciB0aGUgcm9vdFxuICAgKiBrZXlzIEFORCBvdmVyIGV2ZXJ5IHJ1biBuYW1lc3BhY2UgdW5kZXIgYHJ1bnNgIChmb3JrIGNoaWxkcmVuIHdyaXRlXG4gICAqIHRoZXJlOyBhIGNoZWNrcG9pbnQncyBgc2hhcmVkU3RhdGVgIGNhcnJpZXMgaXQgYmFjayBhcyBhIHNlZWQpLiBUaGlzIGlzXG4gICAqIHdoYXQgc2VlZHMgdGhlIHJlZGFjdGVkIG1pcnJvcjogdGhlIHN0b3JlJ3Mgc3RhcnRpbmcgc3RhdGUsIHNjcnViYmVkXG4gICAqIHdpdGggdGhlIGxvZydzIHBsYWNlaG9sZGVyLCBzbyBhIHBvbGljeSBrZXkgdGhhdCBhcnJpdmVzIGJ5IHNlZWQgYW5kIGlzXG4gICAqIG5ldmVyIHJlLXdyaXR0ZW4gaXMgc3RpbGwgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci5cbiAgICovXG4gIHJldGFpblN0YXRlPFQ+KHN0YXRlOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5yZXRhaW5SZWNvcmQoc3RhdGUsIHBsYWNlaG9sZGVyKTtcbiAgICBpZiAoa2VwdCA9PT0gbnVsbCB8fCB0eXBlb2Yga2VwdCAhPT0gJ29iamVjdCcpIHJldHVybiBrZXB0O1xuICAgIGNvbnN0IHJ1bnMgPSAoa2VwdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbUlVOX05BTUVTUEFDRV07XG4gICAgaWYgKHJ1bnMgPT09IG51bGwgfHwgdHlwZW9mIHJ1bnMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocnVucykpIHJldHVybiBrZXB0O1xuICAgIGxldCBzY3J1YmJlZFJ1bnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3J1bklkLCByZWNvcmRdIG9mIE9iamVjdC5lbnRyaWVzKHJ1bnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICBjb25zdCBrZXB0UnVuID0gdGhpcy5yZXRhaW5SZWNvcmQocmVjb3JkLCBwbGFjZWhvbGRlcik7XG4gICAgICBpZiAoa2VwdFJ1biA9PT0gcmVjb3JkKSBjb250aW51ZTtcbiAgICAgIHNjcnViYmVkUnVucyA/Pz0geyAuLi4ocnVucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICAgIHNjcnViYmVkUnVuc1tydW5JZF0gPSBrZXB0UnVuO1xuICAgIH1cbiAgICByZXR1cm4gc2NydWJiZWRSdW5zID09PSB1bmRlZmluZWQgPyBrZXB0IDogKHsgLi4uKGtlcHQgYXMgb2JqZWN0KSwgW1JVTl9OQU1FU1BBQ0VdOiBzY3J1YmJlZFJ1bnMgfSBhcyBUKTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhIHZlcmRpY3QgdG8gYSB2YWx1ZSDigJQgc2VlIHtAbGluayByZXRhaW59LiAqL1xuICBzdGF0aWMgYXBwbHkodmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCwgdmFsdWU6IHVua25vd24sIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgcmV0dXJuIFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMsIHBsYWNlaG9sZGVyKSA/PyB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQSBkZWVwIGNsb25lIG9mIGB2YWx1ZWAgd2l0aCB0aGUgZ2l2ZW4gZG90LXBhdGhzIHJlcGxhY2VkIGJ5IHRoZVxuICAgKiBwbGFjZWhvbGRlciDigJQgYHVuZGVmaW5lZGAgd2hlbiBgdmFsdWVgIGlzIG5vdCBhbiBvYmplY3QgKHRoZXJlIGlzIG5vdGhpbmdcbiAgICogdG8gc2NydWIgaW4gYSBzY2FsYXI7IHRoZSBjYWxsZXIga2VlcHMgdGhlIHZhbHVlKS4gVGhlIGNsb25lIHJlZnVzZXMgYW5cbiAgICogdW5jbG9uZWFibGUgdmFsdWUuIEEgcGF0aCBuYW1lcyBhIGxpdGVyYWwga2V5IChgJ2EuYidgIGFzIG9uZSBwcm9wZXJ0eSlcbiAgICogYW5kLCB3aGVuIGRvdHRlZCwgdGhlIG5lc3RlZCBwYXRoOyBlYWNoIGlzIHNjcnViYmVkIHdoZXJlIGl0IGV4aXN0cywgcGVyXG4gICAqIFBBVEgg4oCUIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWRcbiAgICogb25lIG9ubHkgKHtAbGluayBzZXJ2ZWRCeVBhdGh9KS4gUGF0aHMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIGlnbm9yZWQg4oCUXG4gICAqIHNjcnViYmluZyBuZXZlciBpbnZlbnRzIGEgZmllbGQuXG4gICAqL1xuICBzdGF0aWMgc2NydWJGaWVsZHMoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUixcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBjbG9uZSBkZXRhY2hlcyB0aGUgcmV0YWluZWQgdmFsdWUgKGFuZCByZWZ1c2VzIGFuIHVuY2xvbmVhYmxlIG9uZSk7IHRoZSBzY3J1YiBvbiBpdCBpc1xuICAgIC8vIGRlY2lkZWQgcGVyIFBBVEgsIHNvIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWQgb25lIG9ubHkuXG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkgYXMgb2JqZWN0O1xuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgoXG4gICAgICBjb3B5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFyZ2V0c09mKHBhdGhzKSxcbiAgICAgIHsgcm9vdERlY2lkZWQ6IGZhbHNlLCBtZW1vOiBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PigpLCBidWRnZXQ6IHdhbGtMaW1pdCB9LFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIC8vIEtleWVkIGJ5IGEgTWFwLCB0aGVuIG1hZGUgb3duIGRhdGEga2V5cyBieSBgZnJvbUVudHJpZXNgOiBhIGtleSBhIG1hcHBlclxuICAgIC8vIHdyb3RlIGlzIGEgbmFtZSBmcm9tIGRhdGEsIGFuZCBvbiBhIHBsYWluIG9iamVjdCBgdG9TdHJpbmdgIHdvdWxkIHJlYWRcbiAgICAvLyB0aGUgaW5oZXJpdGVkIG1ldGhvZCBhbmQgYF9fcHJvdG9fX2Agd291bGQgY2FsbCB0aGUgcHJvdG90eXBlIHNldHRlci5cbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucG9saWN5Py5maWVsZHMgPz8ge30pKSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnMuc2V0KGtleSwgWy4uLmZpZWxkc10pO1xuICAgIH1cbiAgICAvLyBGaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleSBhcmUgc2NydWJiZWQgdW5kZXIgdGhhdCBrZXkgdG9vLlxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLmluaGVyaXRlZCA/PyBbXSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zLnNldChrZXksIFsuLi5uZXcgU2V0KFsuLi4oZmllbGRSZWRhY3Rpb25zLmdldChrZXkpID8/IFtdKSwgLi4uZmllbGRzXSldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMubWFya2VkXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9uczogT2JqZWN0LmZyb21FbnRyaWVzKGZpZWxkUmVkYWN0aW9ucyksXG4gICAgICBwYXR0ZXJuczogKHRoaXMucG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgVGhlIHdyaXRlIGRlY2lzaW9uIOKAlCBvbmUgcGVyIHN0YWdlZCB3cml0ZSAoQzQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIFdoYXQgdGhlIHJ1bidzIHJ1bGUgc2F5cyBhYm91dCBvbmUgc3RhZ2VkIHdyaXRlLCBhbmQgd2hhdCB0aGUgd3JpdGUgbGVhdmVzIG9uIHRoZSBydWxlLiBFdmVyeSBzdGFnZWRcbi8vIHdyaXRlIHBhc3NlcyBgU3RhZ2VDb250ZXh0IMK3IHN0YWdlV3JpdGVgICh0aGUgb25lIGZ1bm5lbDogZmFjYWRlIHdyaXRlcywgYSBzdWJmbG93IHNlZWQsIGFuXG4vLyBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkKSwgd2hpY2ggcnVucyB0aGUgZm91ciBzdGVwcyBpbiB0aGUgb3JkZXIgdGhlIHJlY29yZCBuZWVkczpcbi8vXG4vLyAgIDEuIFZFUkRJQ1QgIGBkZWNpZGVXcml0ZWAg4oCUIGFuIGV4cGxpY2l0IHBlci1jYWxsIGZsYWcsIGVsc2UgdGhlIHJ1bGUgdGhhdCBpcyBBQ1RJVkUgYXMgdGhlIHdyaXRlIGJlZ2lucy5cbi8vICAgMi4gSURFTlRJVFkgYGluaGVyaXRCeUlkZW50aXR5YCDigJQgd2l0aCB0aGUgZnJhbWUncyBzZWxlY3RlZCByZWFkcyBBUyBUSEVZIFNUQU5EIGFmdGVyIHN0ZXAgMTogYSBwb2xpY3lcbi8vICAgICAgICAgICAgICAgcGF0dGVybiBpcyB1c2VyIGNvZGUsIGFuZCBpdCBjYW4gcmVhZCBvbiB0aGUgdmVyeSBmcmFtZSB0aGF0IGlzIHdyaXRpbmcuXG4vLyAgIDMuIEJZVEVTICAgIHRoZSBjYWxsZXI6IGBSZWNvcmRGcmFtZSDCtyB3cml0ZShwYXRoLCB2YWx1ZSwgdmVyYiwgc2NydWJPZih2ZXJkaWN0KSlgLiBUaGUgcmVjb3JkIHdyaXRlc1xuLy8gICAgICAgICAgICAgICB0aGVtOyBpdCBuZXZlciBkZWNpZGVzIHRoZW0uXG4vLyAgIDQuIE1BUktTICAgIGBtYXJrU3RhZ2VkV3JpdGVgIOKAlCBvbmx5IG9uY2UgdGhlIHdyaXRlIHN0YWdlZDogYSB3cml0ZSB0aGF0IGZhaWxzIHRvIHN0YWdlIG1hcmtzIG5vdGhpbmcuXG4vL1xuLy8gU3RlcHMgMeKAkzIgYW5kIHN0ZXAgNCBhcmUgY2FsbHMgYXJvdW5kIHRoZSB3cml0ZSwgbm90IG9uZSBjYWxsIGJlZm9yZSBpdCwgYW5kIGVhY2ggcmVhZHMgdGhlIHJ1bGUgd2hlblxuLy8gaXQgYWN0cyDigJQgYXMgdGhlIGZ1bm5lbCBhbHdheXMgZGlkLCBzbyB1c2VyIGNvZGUgdGhhdCBydW5zIERVUklORyBhIHdyaXRlIChhIGdldHRlciBvbiB0aGUgdmFsdWUsIGFcbi8vIHBhdHRlcm4ncyBgdGVzdGApIGZpbmRzIHRoZSBzYW1lIHJ1bGUsIGFuZCBsZWF2ZXMgdGhlIHNhbWUgbWFya3MsIGFzIGJlZm9yZSBDNC5cblxuLyoqXG4gKiBTdGVwIDEg4oCUIFRIRSBWRVJESUNUIGZvciBvbmUgc3RhZ2VkIHdyaXRlOiBhbiBleHBsaWNpdCBwZXItY2FsbCBmbGFnIChgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgKVxuICogbWFrZXMgdGhlIHZhbHVlIHNlY3JldCB3aG9sZSB1bmRlciBpdHMgdXNlci1sZXZlbCBrZXk7IGVsc2UgdGhlIGBhY3RpdmVgIHJ1bGUgZGVjaWRlcyBmcm9tIHRoZVxuICogdXNlci1sZXZlbCBwYXRoOyB3aXRoIG5vbmUgKG5vIHJ1bGUsIG9yIGFuIGluZXJ0IG9uZSDigJQgdGhlIGNhbGxlciBwYXNzZXMgYHVuZGVmaW5lZGApLCBjbGVhciwgd2l0aCBub1xuICogdmVyZGljdCBjYWxsIGFuZCBubyBwYXRoIGFsbG9jYXRpb24gKHRoZSBuby1wb2xpY3kgZmFzdCBwYXRoKS4gTWFya3Mgbm90aGluZy5cbiAqXG4gKiBgYGB0c1xuICogZGVjaWRlV3JpdGUobmV3IFJlZGFjdGlvblJ1bGUoeyBmaWVsZHM6IHsgY2FyZDogWydudW1iZXInXSB9IH0pLCBbXSwgJ2NhcmQnLCBmYWxzZSk7IC8vIHsga2luZDogJ2ZpZWxkcycsIGtleTogJ2NhcmQnLCBwYXRoczogWydudW1iZXInXSB9XG4gKiBkZWNpZGVXcml0ZSh1bmRlZmluZWQsIFsncHJvZmlsZSddLCAnYXV0aCcsIHRydWUpOyAvLyB7IGtpbmQ6ICd3aG9sZScsIGtleTogJ3Byb2ZpbGUuYXV0aCcgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNpZGVXcml0ZShcbiAgYWN0aXZlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICBwYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2V5OiBzdHJpbmcsXG4gIGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gIGlmIChleHBsaWNpdCkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiB1c2VyS2V5T2YocGF0aCwga2V5KSB9O1xuICByZXR1cm4gYWN0aXZlICE9PSB1bmRlZmluZWQgPyBhY3RpdmUudmVyZGljdEF0KHBhdGgsIGtleSkgOiBDTEVBUjtcbn1cblxuLyoqXG4gKiBTdGVwIDIg4oCUIElERU5USVRZOiBhbiBPQkpFQ1QgdGhlIHN0YWdlIHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lIChgc2VsZWN0ZWRgIOKAlCB0aGUgZnJhbWUncyBzZWxlY3RlZFxuICogcmVhZHMsIGZpbGxlZCBieSBpdHMgdHJhY2tlZCByZWFkcyksIHdyaXR0ZW4gdW5kZXIgYW5vdGhlciBuYW1lIChgcy5wZXJzb24gPSBzLnByb2ZpbGVgKSwga2VlcHMgdGhhdFxuICogcmVhZCdzIHJ1bGUsIG1hdGNoZWQgYnkgaWRlbnRpdHk6IGEgd2hvbGUgcmVhZCBtYXJrcyB0aGUgbmV3IGtleSwgYSBgZmllbGRzYCByZWFkIGhhbmRzIGl0IHRoZSBmaWVsZHNcbiAqIChyZS1iYXNlZCB1bmRlciB0aGUgd3JpdHRlbiBwYXRoKSwgYW5kIHRoZSB2ZXJkaWN0IGlzIGFza2VkIGFnYWluLiBBIG5ldyBvYmplY3QsIGEgcHJpbWl0aXZlLCBvciBhXG4gKiB3cml0ZSBhbHJlYWR5IHdob2xlIGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gbmFtZSBvbmx5IOKAlCBgdmVyZGljdGAgY29tZXMgYmFjayBhcyBpdCBpcy4gRGVjaWRlZCBCRUZPUkVcbiAqIHRoZSB3cml0ZSwgYmVjYXVzZSB0aGUgdmVyZGljdCBuZWVkcyBpdDogYW4gaW5oZXJpdGFuY2Ugc3RheXMgZXZlbiBpZiB0aGUgd3JpdGUgdGhlbiBmYWlscyB0byBzdGFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaGVyaXRCeUlkZW50aXR5KFxuICBhY3RpdmU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gIHNlbGVjdGVkOiBXZWFrTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD4gfCB1bmRlZmluZWQsXG4gIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgY29uc3QgcmVhZCA9XG4gICAgYWN0aXZlICE9PSB1bmRlZmluZWQgJiYgdmVyZGljdC5raW5kICE9PSAnd2hvbGUnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgID8gc2VsZWN0ZWQ/LmdldCh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAocmVhZCA9PT0gdW5kZWZpbmVkIHx8IGFjdGl2ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmVyZGljdDtcbiAgaWYgKHJlYWQua2luZCA9PT0gJ3dob2xlJykgYWN0aXZlLm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICBlbHNlIGlmIChyZWFkLmtpbmQgPT09ICdmaWVsZHMnKSB7XG4gICAgY29uc3QgYXQgPSBbLi4ucGF0aC5zbGljZSgxKSwgLi4uKHBhdGgubGVuZ3RoID4gMCA/IFtrZXldIDogW10pXTtcbiAgICBhY3RpdmUuaW5oZXJpdEZpZWxkcyhcbiAgICAgIHBhdGhbMF0gPz8ga2V5LFxuICAgICAgcmVhZC5wYXRocy5tYXAoKGZpZWxkKSA9PiBbLi4uYXQsIGZpZWxkXS5qb2luKCcuJykpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGFjdGl2ZS52ZXJkaWN0QXQocGF0aCwga2V5KTtcbn1cblxuLyoqIFRoZSBzY3J1YiBvZiBhIHdob2xlIHZlcmRpY3Qg4oCUIG9uZSBmcm96ZW4gb2JqZWN0IGZvciBldmVyeSB3cml0ZSBpdCBjb3ZlcnMuICovXG5jb25zdCBXSE9MRV9TQ1JVQjogV3JpdGVTY3J1YiA9IE9iamVjdC5mcmVlemUoeyB3aG9sZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBTdGVwIDMncyBpbnB1dCDigJQgYSB2ZXJkaWN0J3MgQllURVMgZm9yIHRoZSByZWNvcmQgKGBSZWNvcmRGcmFtZSDCtyB3cml0ZWApOiBub3RoaW5nIHdoZW4gY2xlYXIsIHRoZVxuICogd2hvbGUgdmFsdWUsIG9yIHRoZSBmaWVsZHMgaW5zaWRlIGl0LiBObyBhbGxvY2F0aW9uIG9uIHRoZSBkZWZhdWx0IHBhdGggKGNsZWFyKSBvciBmb3IgYSB3aG9sZSB2ZXJkaWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NydWJPZih2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0KTogV3JpdGVTY3J1YiB8IHVuZGVmaW5lZCB7XG4gIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBXSE9MRV9TQ1JVQjtcbiAgcmV0dXJuIHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycgPyB7IGZpZWxkczogdmVyZGljdC5wYXRocyB9IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0ZXAgNCDigJQgdGhlIE1BUktTIGEgc3RhZ2VkIHdyaXRlIGxlYXZlczsgY2FsbCBpdCBvbmx5IG9uY2UgdGhlIHdyaXRlIHN0YWdlZCwgc28gYSB3cml0ZSB0aGF0IGZhaWxzIHRvXG4gKiBzdGFnZSBtYXJrcyBub3RoaW5nLiBBIGRlbGV0ZSBjbGVhcnMgaXRzIGtleSdzIG1hcmsgKGFuZCBhbnkgZmllbGRzIGEgbWFwcGVyIGhhbmRlZCBpdCkgb24gYGFjdGl2ZWAsXG4gKiB0aGUgcnVsZSB0aGF0IHdhcyBhY3RpdmUgYXMgdGhlIHdyaXRlIEJFR0FOIOKAlCBub25lIHdoZW4gaXQgd2FzIGluZXJ0LCBldmVuIGlmIHVzZXIgY29kZSBtYXJrZWQgdGhlIGtleVxuICogZHVyaW5nIHRoZSB3cml0ZS4gQSB3aG9sZSB2ZXJkaWN0IG1hcmtzIGl0cyBrZXkg4oCUIHRoZSBrZXkgdGhhdCBERUNJREVEIGl0IChgdmVyZGljdC5rZXlgOiBhbiBhbmNlc3RvclxuICogZm9yIGEgbmVzdGVkIHdyaXRlIHVuZGVyIGEgd2hvbGUtc2VsZWN0ZWQga2V5KSDigJQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4gb24gYHJ1bGVgLCB0aGUgcnVuJ3MgcnVsZSBhc1xuICogaXQgc3RhbmRzIE5PVyAodXNlciBjb2RlIGR1cmluZyB0aGUgd3JpdGUgbWF5IGhhdmUgaW5zdGFsbGVkIG9uZTsgYW4gZXhwbGljaXQgbWFyayBpcyB3aGF0IG1ha2VzIGFuXG4gKiBpbmVydCBydWxlIGFjdGl2ZSkuIEEgbWFyayBpcyBhIHJ1bi13aWRlIE5BTUU6IGl0IHN0YXlzIHdoZW4gdGhlIHN0YWdlJ3MgY29tbWl0IGZhaWxzIG9yIGEgcmV0cnlcbiAqIGRpc2NhcmRzIHRoZSBhdHRlbXB0IOKAlCB0aGUgc2FmZSBzaWRlOyBvbmx5IGEgc3RhZ2VkIGRlbGV0ZSByZW1vdmVzIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtTdGFnZWRXcml0ZShcbiAgYWN0aXZlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICBydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICBwYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2V5OiBzdHJpbmcsXG4gIHZlcmI6IFdyaXRlVmVyYixcbik6IHZvaWQge1xuICBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGFjdGl2ZT8udW5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgZWxzZSBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSBydWxlPy5tYXJrKHZlcmRpY3Qua2V5KTtcbn1cblxuLy8g4pSA4pSA4pSAIFRoZSBwYXRoIHdhbGsg4oCUIG9uZSBkZWNpc2lvbiBwZXIgUEFUSCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyBBIHJ1bGUgdGhhdCBuYW1lcyBhIFBBVEggKGEgZG90dGVkIGtleSwgYSBwYXR0ZXJuLCBhIGZpZWxkKSBtdXN0IGJlIGV4YWN0XG4vLyBldmVuIHdoZW4gb25lIG9iamVjdCBpcyByZWFjaGFibGUgYXQgdHdvIHBhdGhzOiB0aGUgZGVjaXNpb24gaXMgbWFkZSBwZXJcbi8vIHBhdGgsIG5ldmVyIHBlciBvYmplY3QsIGFuZCBhIGNvcHkgaXMgbWFkZSBwZXIgcGF0aCAoY29weS1vbi13cml0ZSkg4oCUIG5ldmVyXG4vLyBhIHNjcnViIGluIHBsYWNlIG9uIGEgbm9kZSBhbm90aGVyIHBhdGggc3RpbGwgc2hvd3MuIEEga2V5LU5BTUUgcnVsZSBpcyB0aGVcbi8vIHNhbWUgYXQgZXZlcnkgcGF0aCwgc28gYSBzaGFyZWQgbm9kZSBpdCBtYXNrcyBpcyBtYXNrZWQgZXZlcnl3aGVyZSDigJQgdGhlXG4vLyBzYWZlIHNpZGUuIEEgY3ljbGUgZWRnZSBpcyBub3QgZm9sbG93ZWQ6IGl0IGlzIHBvaW50ZWQgYXQgdGhlIGFuY2VzdG9yJ3Ncbi8vIHNlcnZlZCBjb3B5LlxuLy9cbi8vIExJTkVBUiBPTiBBIERBRy4gRG90dGVkIGtleXMgYW5kIG1hcmtzIGFyZSB3YWxrZWQgYXMgVEFSR0VUUyAocGF0aC1yZWxhdGl2ZVxuLy8gc3RhdGUsIGxpa2UgZmllbGRzKSwgYW5kIGEgcGF0dGVybiB0aGF0IGNhbiBvbmx5IG1hdGNoIHdpdGhpbiBhIGtleSBOQU1FXG4vLyAoe0BsaW5rIG5lZWRzUGF0aH0g4oCUIHRoZSBjb21tb24gY2FzZSwgYC9wYXNzd29yZC9pYCkgaXMgZGVjaWRlZCBieSB0aGUgbmFtZSxcbi8vIHNvIGEgZGVjaXNpb24gZGVwZW5kcyBvbmx5IG9uIHRoZSBvYmplY3QgYW5kIHRoZSB0YXJnZXRzIHN0aWxsIGxpdmUgYXQgaXQg4oCUXG4vLyBtZW1vaXplZCBwZXIgKG9iamVjdCwgdGFyZ2V0cyk6IGFuIG9iamVjdCBzaGFyZWQgYnkgbWFueSBwYXRocyAoYW4gYWdlbnQnc1xuLy8gbGlua2VkIGhpc3RvcnkpIGlzIGRlY2lkZWQgb25jZSwgYW5kIGl0cyBzZXJ2ZWQgY29weSBpcyBzaGFyZWQgdG9vLiBPbmx5IGFcbi8vIGdlbnVpbmVseSBQQVRILWRlcGVuZGVudCBwYXR0ZXJuIChgL15hXFwuYiQvYCkgd2Fsa3MgcGF0aHM7IHBhc3Rcbi8vIHtAbGluayBXQUxLX0xJTUlUfSBwYXRoIHZpc2l0cyBzdWNoIGEgd2FsayBzZXJ2ZXMgdGhlIHVudmlzaXRlZCByZW1haW5kZXIgYXNcbi8vIHRoZSBwbGFjZWhvbGRlciAodGhlIHNhZmUgc2lkZSksIHdhcm5zIG9uY2UgaW4gZGV2IG1vZGUsIGFuZCBuZXZlciBmYWlscy5cblxuLyoqIEEgZmllbGQgc3RpbGwgdG8gcmVhY2ggYmVsb3cgYSBub2RlOiB0aGUgcGF0aCBzZWdtZW50cyBsZWZ0IHRvIHdhbGsuICovXG50eXBlIFRhcmdldCA9IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4vKiogSG93IGEgd2FsayBkZWNpZGVzIGFuIGVkZ2UuICovXG5pbnRlcmZhY2UgV2FsayB7XG4gIC8qKiBLZXktbGV2ZWwgcnVsZXMgYXQgZXZlcnkgbmVzdGVkIGtleSDigJQgYWJzZW50IGZvciBhIGJhcmUgZmllbGQgc2NydWIgKHRhcmdldHMgb25seSkuICovXG4gIHJlYWRvbmx5IG5hbWVzPzoge1xuICAgIC8qKiBTZWxlY3RlZCB3aG9sZSBhdCB0aGlzIG5lc3RlZCBrZXkgYnkgaXRzIG93biBOQU1FIChtYXJrcywga2V5cywgcGF0dGVybnMpLiAqL1xuICAgIG1hc2tzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgLyoqIFNlbGVjdGVkIHdob2xlIGJ5IHRoZSBkb3R0ZWQgUEFUSCDigJQgcHJlc2VudCBvbmx5IHVuZGVyIHBhdHRlcm5zIChhIHBhdHRlcm4gaXMgdGVzdGVkIG9uIHRoZSBwYXRoKS4gKi9cbiAgICBwYXRoTWFza3M/KHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgLyoqIFRoZSBkZWNsYXJlZCBmaWVsZHMgYmVsb3cgYSBrZXkgb2YgdGhpcyBuYW1lLiAqL1xuICAgIGZpZWxkcyhuYW1lOiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgLyoqIFRoZSByb290J3Mgb3duIGtleXMgd2VyZSBkZWNpZGVkIGJ5IHRoZSBjYWxsZXIgKGByZXRhaW5SZWNvcmRgKTogd2FsayBiZWxvdyB0aGVtIG9ubHkuICovXG4gIHJlYWRvbmx5IHJvb3REZWNpZGVkOiBib29sZWFuO1xuICAvKiogRGVjaXNpb25zIHNoYXJlZCBwZXIgKG9iamVjdCwgdGFyZ2V0cykg4oCUIGFic2VudCB3aGVuIGEgZGVjaXNpb24gZGVwZW5kcyBvbiB0aGUgcGF0aC4gKi9cbiAgcmVhZG9ubHkgbWVtbz86IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBQYXRoIHZpc2l0cyBsZWZ0LiAqL1xuICBidWRnZXQ6IG51bWJlcjtcbiAgLyoqIFRvbGQgb25jZSB3aGVuIHRoZSB3YWxrIHBhc3NlcyBpdHMgbGltaXQuICovXG4gIHJlYWRvbmx5IG9uTGltaXQ/OiAoKSA9PiB2b2lkO1xuICAvKiogVGhlIHdhbGsgaGFzIHBhc3NlZCBpdHMgbGltaXQ6IHdoYXQgaXQgaGFzIG5vdCB2aXNpdGVkIGlzIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuICovXG4gIGxpbWl0ZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhdGggdmlzaXRzIG9uZSB3YWxrIG1heSBtYWtlIOKAlCByZWFjaGFibGUgb25seSB1bmRlciBhIFBBVEgtZGVwZW5kZW50XG4gKiBwYXR0ZXJuIG92ZXIgYSB2YWx1ZSB3aG9zZSBwYXRocyBvdXRudW1iZXIgaXRzIG9iamVjdHMgKGEgbGlua2VkIGhpc3RvcnksIGFcbiAqIERBRyk6IGV2ZXJ5IG90aGVyIHdhbGsgc2hhcmVzIGl0cyBkZWNpc2lvbnMgcGVyIG9iamVjdCBhbmQgc3RheXMgbGluZWFyLlxuICovXG5leHBvcnQgY29uc3QgV0FMS19MSU1JVCA9IDFfMDAwXzAwMDtcblxuLyoqIFRoZSBsaW1pdCB3YWxrcyB1c2U6IHtAbGluayBXQUxLX0xJTUlUfSwgdW5sZXNzIGEgdGVzdCBsb3dlcmVkIGl0ICh7QGxpbmsgdXNlV2Fsa0xpbWl0fSkuICovXG5sZXQgd2Fsa0xpbWl0OiBudW1iZXIgPSBXQUxLX0xJTUlUO1xuXG4vKipcbiAqIEBpbnRlcm5hbCBUZXN0cyBvbmx5IOKAlCBub3Qgb24gYW55IHB1YmxpYyBkb29yOiB3YWxrcyB1c2UgYGxpbWl0YCB1bnRpbCB0aGVcbiAqIHJldHVybmVkIHJlc3RvcmUgaXMgY2FsbGVkLCBzbyBhIHRlc3QgcmVhY2hlcyB0aGUgb3Zlci1saW1pdCBwYXRoIGluIGFcbiAqIHRob3VzYW5kIHZpc2l0cyBpbnN0ZWFkIG9mIGEgbWlsbGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVdhbGtMaW1pdChsaW1pdDogbnVtYmVyKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHByaW9yID0gd2Fsa0xpbWl0O1xuICB3YWxrTGltaXQgPSBsaW1pdDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB3YWxrTGltaXQgPSBwcmlvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBDYW4gYHBhdHRlcm5gIG1hdGNoIGEgZG90dGVkIFBBVEggd2hlcmUgaXQgbWF0Y2hlcyBub25lIG9mIHRoZSBwYXRoJ3NcbiAqIHNlZ21lbnQgTkFNRVM/IE9ubHkgdGhyb3VnaCBhIGNvbnN0cnVjdCB0aGF0IGNhbiBtYXRjaCBvciB0ZXN0IHRoZSBgLmBcbiAqIGJldHdlZW4gc2VnbWVudHM6IGAuYCBpdHNlbGYsIGFuIGVzY2FwZSB0aGF0IGNhbiBzdGFuZCBmb3IgaXQgKGBcXFcgXFxTIFxcRFxuICogXFxCIFxccCBcXFAgXFx1IFxceCBcXGNgLCBhIGRpZ2l0IGVzY2FwZSksIGEgbmVnYXRlZCBjbGFzcywgYSBjbGFzcyByYW5nZSB0aGF0XG4gKiBzcGFucyBgLmAsIGEgbG9va2Fyb3VuZCBvciBhIG5hbWVkIGdyb3VwLiBBbnl0aGluZyBlbHNlIG1hdGNoZXMgYSBwYXRoIG9ubHlcbiAqIGluc2lkZSBvbmUgc2VnbWVudCDigJQgYW5kIGFuIGFuY2VzdG9yIHdob3NlIE5BTUUgbWF0Y2hlcyBpcyBtYXNrZWQgd2hvbGVcbiAqIGJlZm9yZSB0aGUgd2FsayBnb2VzIGJlbG93IGl0LCBzbyB0aGUgbmFtZSBkZWNpZGVzLiBDb25zZXJ2YXRpdmU6IGB0cnVlYFxuICogd2hlbmV2ZXIgaW4gZG91YnQuXG4gKlxuICogTGluZWFyIGluIHRoZSBsZW5ndGggb2YgYHBhdHRlcm4uc291cmNlYDogZXZlcnkgc2NhbiBoZXJlIGlzIG9uZSBmb3J3YXJkXG4gKiBwYXNzICh7QGxpbmsgY2xhc3NCb2RpZXN9KSBvciBhIHJlZ2V4IHRoYXQgZG9lcyBjb25zdGFudCB3b3JrIHBlciBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzUGF0aChwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlID0gcGF0dGVybi5zb3VyY2U7XG4gIGlmICgvXFwufFxcXFxbV1NEQnBQdXhjMC05XXxcXFtcXF58XFwoXFw/Wz0hPF0vLnRlc3Qoc291cmNlKSkgcmV0dXJuIHRydWU7XG4gIGZvciAoY29uc3QgYm9keSBvZiBjbGFzc0JvZGllcyhzb3VyY2UpKSB7XG4gICAgZm9yIChjb25zdCBbLCBsb3csIGhpZ2hdIG9mIGJvZHkubWF0Y2hBbGwoLyhcXFxcP1tcXHNcXFNdKS0oXFxcXD9bXFxzXFxTXSkvZykpIHtcbiAgICAgIGlmIChsb3cubGVuZ3RoID4gMSB8fCBoaWdoLmxlbmd0aCA+IDEgfHwgKGxvdyA8PSAnLicgJiYgaGlnaCA+PSAnLicpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFRoZSBib2R5IG9mIGVhY2ggY2hhcmFjdGVyIGNsYXNzIGluIGBzb3VyY2VgLCBsZWZ0IHRvIHJpZ2h0OiB0aGUgdGV4dFxuICogYmV0d2VlbiBhIGBbYCBhbmQgdGhlIGZpcnN0IGBdYCBhZnRlciBpdCB0aGF0IG5vIGBcXGAgZXNjYXBlcyAoYSBgXFxgIHRha2VzXG4gKiB0aGUgY2hhcmFjdGVyIGFmdGVyIGl0IGFsb25nKS4gT05FIGZvcndhcmQgcGFzcy5cbiAqXG4gKiBJdCByZXBsYWNlcyBgc291cmNlLm1hdGNoQWxsKC9cXFsoKD86XFxcXFtcXHNcXFNdfFteXFxdXFxcXF0pKilcXF0vZylgIGFuZCBnaXZlcyB0aGVcbiAqIHNhbWUgYm9kaWVzIGZvciBldmVyeSBzdHJpbmcgKHBpbm5lZCBhZ2FpbnN0IHRoYXQgcmVnZXggYXMgdGhlIGNvbnRyb2wsXG4gKiB0ZXN0L2xpYi9tZW1vcnkvc2VjdXJpdHkvbmVlZHMtcGF0aC1saW5lYXIuc2VjdXJpdHkudGVzdC50cykuIFRoZSByZWdleCB3YXNcbiAqIHF1YWRyYXRpYzogYWZ0ZXIgYSBgW2AgdGhhdCBuZXZlciBjbG9zZWQgaXQgcmV0cmllZCBhdCBldmVyeSBsYXRlciBgW2AsXG4gKiBlYWNoIHJldHJ5IHJlc2Nhbm5pbmcgdG8gdGhlIGVuZCDigJQgYFxcW2AgcmVwZWF0ZWQgMzIsMDAwIHRpbWVzIHRvb2sgMC43IHMsXG4gKiBhbmQgYHNldFBvbGljeWAgcnVucyBvbmNlIHBlciBzdGFnZSdzIHNjb3BlIChDb2RlUUwganMvcG9seW5vbWlhbC1yZWRvcykuXG4gKiBUaGUgcGFzcyBzdG9wcyBhdCB0aGUgZmlyc3QgYFtgIHRoYXQgbmV2ZXIgY2xvc2VzIGluc3RlYWQ6IGEgbGF0ZXIgYFtgXG4gKiBzdGFydHMgaXRzIGJvZHkgd2hlcmUgdGhlIGZhaWxlZCBzY2FuIHdhcyBhbHNvIGJldHdlZW4gdHdvIHRva2Vucywgc28gaXRcbiAqIHJlYWRzIHRoZSBzYW1lIHRhaWwgdGhlIHNhbWUgd2F5IGFuZCBjbG9zZXMgbm93aGVyZSBlaXRoZXIuXG4gKlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0aGF0IHRlc3Qgb25seSDigJQgbm90IG9uIGFueSBwdWJsaWMgZG9vci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzQm9kaWVzKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBib2RpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBvcGVuID0gc291cmNlLmluZGV4T2YoJ1snKTtcbiAgd2hpbGUgKG9wZW4gIT09IC0xKSB7XG4gICAgY29uc3QgY2xvc2UgPSBjbG9zaW5nQnJhY2tldChzb3VyY2UsIG9wZW4gKyAxKTtcbiAgICBpZiAoY2xvc2UgPT09IC0xKSBicmVhaztcbiAgICBib2RpZXMucHVzaChzb3VyY2Uuc2xpY2Uob3BlbiArIDEsIGNsb3NlKSk7XG4gICAgb3BlbiA9IHNvdXJjZS5pbmRleE9mKCdbJywgY2xvc2UgKyAxKTtcbiAgfVxuICByZXR1cm4gYm9kaWVzO1xufVxuXG4vKiogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBgXWAgYXQgb3IgYWZ0ZXIgYGZyb21gIHRoYXQgbm8gYFxcYCBlc2NhcGVzLCBlbHNlIC0xIChhIHRyYWlsaW5nIGxvbmUgYFxcYCBlc2NhcGVzIG5vdGhpbmcgYW5kIGNsb3NlcyBub3RoaW5nKS4gKi9cbmZ1bmN0aW9uIGNsb3NpbmdCcmFja2V0KHNvdXJjZTogc3RyaW5nLCBmcm9tOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgYXQgPSBmcm9tO1xuICB3aGlsZSAoYXQgPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IHNvdXJjZVthdF07XG4gICAgaWYgKGNoYXIgPT09ICddJykgcmV0dXJuIGF0O1xuICAgIGF0ICs9IGNoYXIgPT09ICdcXFxcJyA/IDIgOiAxO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqIGBzZXJ2ZWRMZWFmYCdzIGFuc3dlciBmb3IgYSB2YWx1ZSBpdCBsZWF2ZXMgYXMgaXQgaXMuICovXG5jb25zdCBLRUVQOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdrZXB0IGFzIGl0IGlzJyk7XG5cbi8qKiBFYWNoIGZpZWxkIHBhdGggYXMgb25lIGxpdGVyYWwga2V5IGFuZCwgd2hlbiBkb3R0ZWQsIGFzIGl0cyBzZWdtZW50cy4gKi9cbmZ1bmN0aW9uIHRhcmdldHNPZihwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBUYXJnZXRbXSB7XG4gIGNvbnN0IG91dDogVGFyZ2V0W10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzID8/IFtdKSB7XG4gICAgb3V0LnB1c2goW3BhdGhdKTtcbiAgICBpZiAocGF0aC5pbmNsdWRlcygnLicpKSBvdXQucHVzaChwYXRoLnNwbGl0KCcuJykpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgbWVtbyBrZXkgb2YgYSB0YXJnZXQgc3RhdGUg4oCUIG9yZGVyLWZyZWUuICovXG5mdW5jdGlvbiBzaWduYXR1cmVPZih0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0YXJnZXRzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IHRhcmdldHNcbiAgICAgICAgLm1hcCgodCkgPT4gdC5qb2luKCdcXHUwMDFmJykpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLmpvaW4oJ1xcdTAwMWUnKTtcbn1cblxuLyoqIE9uZSBlZGdlJ3MgZGVjaXNpb246IHRoZSB2YWx1ZSB1bmRlciBga2V5YCBpcyBtYXNrZWQgaGVyZSwgb3IgdGhlc2UgdGFyZ2V0cyBjb250aW51ZSBiZWxvdyBpdC4gKi9cbmZ1bmN0aW9uIGRlY2lkZUVkZ2UoXG4gIGtleTogc3RyaW5nLFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIGRlcHRoOiBudW1iZXIsXG4pOiB7IG1hc2tlZDogYm9vbGVhbjsgYmVsb3c6IFRhcmdldFtdIH0ge1xuICBjb25zdCBiZWxvdzogVGFyZ2V0W10gPSBbXTtcbiAgbGV0IG1hc2tlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgaWYgKHRhcmdldFswXSAhPT0ga2V5KSBjb250aW51ZTtcbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMSkgbWFza2VkID0gdHJ1ZTtcbiAgICBlbHNlIGJlbG93LnB1c2godGFyZ2V0LnNsaWNlKDEpKTtcbiAgfVxuICBjb25zdCBuYW1lcyA9IHdhbGsucm9vdERlY2lkZWQgJiYgZGVwdGggPT09IDAgPyB1bmRlZmluZWQgOiB3YWxrLm5hbWVzO1xuICBpZiAobmFtZXMgIT09IHVuZGVmaW5lZCAmJiAhbWFza2VkKSB7XG4gICAgbWFza2VkID1cbiAgICAgIG5hbWVzLm1hc2tzKGtleSkgfHxcbiAgICAgIChuYW1lcy5wYXRoTWFza3MgIT09IHVuZGVmaW5lZCAmJiBkb3R0ZWQgIT09IHVuZGVmaW5lZCAmJiBuYW1lcy5wYXRoTWFza3MoYCR7ZG90dGVkfS4ke2tleX1gKSk7XG4gICAgYmVsb3cucHVzaCguLi50YXJnZXRzT2YobmFtZXMuZmllbGRzKGtleSkpKTtcbiAgfVxuICByZXR1cm4geyBtYXNrZWQsIGJlbG93IH07XG59XG5cbi8qKiBPbmUgc3RlcCBkb3duIGEgd2FsaydzIHBhdGg6IGNvdW50IHRoZSB2aXNpdCDigJQgYGZhbHNlYCBvbmNlIHRoZSB3YWxrIGlzIHBhc3QgaXRzIGxpbWl0LiAqL1xuZnVuY3Rpb24gdmlzaXQod2FsazogV2Fsayk6IGJvb2xlYW4ge1xuICBpZiAoLS13YWxrLmJ1ZGdldCA+PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCF3YWxrLmxpbWl0ZWQpIHtcbiAgICB3YWxrLmxpbWl0ZWQgPSB0cnVlO1xuICAgIHdhbGsub25MaW1pdD8uKCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIElzIGFueXRoaW5nIHNlbGVjdGVkIG9uIHNvbWUgUEFUSCB1bmRlciBgbm9kZWA/IFJlYWQtb25seTsgYSBjeWNsZSBlZGdlIGlzXG4gKiBub3QgZm9sbG93ZWQuIGBiYWNrYCBpcyB0aGUgc2hhbGxvd2VzdCBhbmNlc3RvciBhIHNraXBwZWQgY3ljbGUgZWRnZSBiZWxvd1xuICogcmVhY2hlZCDigJQgYSBgZmFsc2VgIHRoYXQgcmVzdHMgb24gb25lIGlzIG5vdCBzaGFyZWQgKG1lbW8pLlxuICovXG5mdW5jdGlvbiBzZWxlY3RzQnlQYXRoKFxuICBub2RlOiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgYW5jZXN0b3JzOiBNYXA8b2JqZWN0LCBudW1iZXI+LFxuICBkZXB0aDogbnVtYmVyLFxuKTogeyBzZWxlY3RlZDogYm9vbGVhbjsgYmFjazogbnVtYmVyIH0ge1xuICAvLyBQYXN0IHRoZSBsaW1pdDogYXNzdW1lIGEgc2VsZWN0aW9uIOKAlCB0aGUgY29weSBzZXJ2ZXMgdGhlIHVudmlzaXRlZCByZW1haW5kZXIgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICBpZiAoIXZpc2l0KHdhbGspKSByZXR1cm4geyBzZWxlY3RlZDogdHJ1ZSwgYmFjazogSW5maW5pdHkgfTtcbiAgaWYgKHdhbGsubmFtZXMgPT09IHVuZGVmaW5lZCAmJiB0YXJnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgc2VsZWN0ZWQ6IGZhbHNlLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBzaWcgPSB3YWxrLm1lbW8gPyBzaWduYXR1cmVPZih0YXJnZXRzKSA6ICcnO1xuICBjb25zdCBrbm93biA9IHdhbGsubWVtbz8uZ2V0KG5vZGUpPy5nZXQoYHMke3NpZ31gKTtcbiAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiB7IHNlbGVjdGVkOiBrbm93biBhcyBib29sZWFuLCBiYWNrOiBJbmZpbml0eSB9O1xuICBhbmNlc3RvcnMuc2V0KG5vZGUsIGRlcHRoKTtcbiAgbGV0IGJhY2sgPSBJbmZpbml0eTtcbiAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgY29uc3QgZWRnZSA9IGRlY2lkZUVkZ2Uoa2V5LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIGRlcHRoKTtcbiAgICBpZiAoZWRnZS5tYXNrZWQpIHtcbiAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgY29uc3QgYXQgPSBhbmNlc3RvcnMuZ2V0KGNoaWxkKTtcbiAgICBpZiAoYXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGF0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZFBhdGggPSB3YWxrLm5hbWVzPy5wYXRoTWFza3MgPyAoZG90dGVkID09PSB1bmRlZmluZWQgPyBrZXkgOiBgJHtkb3R0ZWR9LiR7a2V5fWApIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJlbG93ID0gc2VsZWN0c0J5UGF0aChjaGlsZCwgY2hpbGRQYXRoID8/IGtleSwgZWRnZS5iZWxvdywgd2FsaywgYW5jZXN0b3JzLCBkZXB0aCArIDEpO1xuICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBiZWxvdy5iYWNrKTtcbiAgICBpZiAoYmVsb3cuc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhbmNlc3RvcnMuZGVsZXRlKG5vZGUpO1xuICBpZiAod2Fsay5tZW1vICYmIChzZWxlY3RlZCB8fCBiYWNrID49IGRlcHRoKSkgcmVtZW1iZXIod2Fsay5tZW1vLCBub2RlLCBgcyR7c2lnfWAsIHNlbGVjdGVkKTtcbiAgcmV0dXJuIHsgc2VsZWN0ZWQsIGJhY2s6IGJhY2sgPCBkZXB0aCA/IGJhY2sgOiBJbmZpbml0eSB9O1xufVxuXG5mdW5jdGlvbiByZW1lbWJlcihtZW1vOiBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+LCBub2RlOiBvYmplY3QsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBsZXQgZW50cmllcyA9IG1lbW8uZ2V0KG5vZGUpO1xuICBpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSBtZW1vLnNldChub2RlLCAoZW50cmllcyA9IG5ldyBNYXAoKSkpO1xuICBlbnRyaWVzLnNldChrZXksIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVkIGNvcHkgb2YgYG5vZGVgLCBjb3B5LW9uLXdyaXRlIFBFUiBQQVRILiBFdmVyeSBjb250YWluZXIgZW50ZXJlZFxuICogZ2V0cyBpdHMgY29weSBCRUZPUkUgaXRzIGNoaWxkcmVuIGFyZSB3YWxrZWQsIHNvIGEgY3ljbGUgZWRnZSBpcyBwb2ludGVkIGF0XG4gKiB0aGUgYW5jZXN0b3IncyBjb3B5IOKAlCBuZXZlciBiYWNrIGF0IGFuIHVuc2NydWJiZWQgb3JpZ2luYWw7IGEgY29udGFpbmVyIGlzXG4gKiBzZXJ2ZWQgYXMgaXRzZWxmIHdoZW4gbm90aGluZyB1bmRlciBpdCBjaGFuZ2VkIGFuZCBubyBjeWNsZSBwYXNzZXMgdGhyb3VnaFxuICogaXQuIEEgcHJ1bmVkIGRlc2NlbnQgKGEgYmFyZSBmaWVsZCBzY3J1YiBvZiBhbiBhY3ljbGljIHZhbHVlKSBza2lwcyBzdWJ0cmVlc1xuICogbm8gdGFyZ2V0IHJlYWNoZXMuIGBiYWNrYCBpcyB0aGUgc2hhbGxvd2VzdCBhbmNlc3RvciBhIGN5Y2xlIGVkZ2UgYmVsb3dcbiAqIHJlYWNoZWQgKGBJbmZpbml0eWA6IG5vbmUpOyBhIGNvcHkgdGhhdCByZXN0cyBvbiBub25lIGlzIHNoYXJlZCAobWVtbykuXG4gKi9cbmZ1bmN0aW9uIGNvcHlCeVBhdGgoXG4gIG5vZGU6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBwbGFjZWhvbGRlcjogc3RyaW5nLFxuICBhbmNlc3RvcnM6IE1hcDxvYmplY3QsIHsgY29weTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGRlcHRoOiBudW1iZXIgfT4sXG4gIGRlcHRoOiBudW1iZXIsXG4gIHBydW5lOiBib29sZWFuLFxuKTogeyBvdXQ6IHVua25vd247IGJhY2s6IG51bWJlciB9IHtcbiAgLy8gUGFzdCB0aGUgbGltaXQ6IHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGlzIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIg4oCUIG5ldmVyIHJhdy5cbiAgaWYgKCF2aXNpdCh3YWxrKSkgcmV0dXJuIHsgb3V0OiBwbGFjZWhvbGRlciwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3Qgc2lnID0gd2Fsay5tZW1vID8gYGMke3NpZ25hdHVyZU9mKHRhcmdldHMpfWAgOiAnJztcbiAgY29uc3Qga25vd24gPSB3YWxrLm1lbW8/LmdldChub2RlKT8uZ2V0KHNpZyk7XG4gIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBvdXQ6IGtub3duLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBmcmFtZSA9IHtcbiAgICBjb3B5OiAoQXJyYXkuaXNBcnJheShub2RlKSA/IG5vZGUuc2xpY2UoKSA6IHsgLi4ubm9kZSB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBkZXB0aCxcbiAgfTtcbiAgYW5jZXN0b3JzLnNldChub2RlLCBmcmFtZSk7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGxldCBiYWNrID0gSW5maW5pdHk7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgY29uc3QgZWRnZSA9IGRlY2lkZUVkZ2Uoa2V5LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIGRlcHRoKTtcbiAgICBpZiAoZWRnZS5tYXNrZWQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IHBsYWNlaG9sZGVyO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGFuY2VzdG9yID0gYW5jZXN0b3JzLmdldChjaGlsZCk7XG4gICAgaWYgKGFuY2VzdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IGFuY2VzdG9yLmNvcHk7XG4gICAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYW5jZXN0b3IuZGVwdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcnVuZSAmJiBlZGdlLmJlbG93Lmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgY29uc3QgY2hpbGRQYXRoID0gd2Fsay5uYW1lcz8ucGF0aE1hc2tzID8gKGRvdHRlZCA9PT0gdW5kZWZpbmVkID8ga2V5IDogYCR7ZG90dGVkfS4ke2tleX1gKSA6IGtleTtcbiAgICBjb25zdCBiZWxvdyA9IGNvcHlCeVBhdGgoY2hpbGQsIGNoaWxkUGF0aCwgZWRnZS5iZWxvdywgd2FsaywgcGxhY2Vob2xkZXIsIGFuY2VzdG9ycywgZGVwdGggKyAxLCBwcnVuZSk7XG4gICAgaWYgKGJlbG93Lm91dCAhPT0gY2hpbGQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IGJlbG93Lm91dDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYmVsb3cuYmFjayk7XG4gIH1cbiAgYW5jZXN0b3JzLmRlbGV0ZShub2RlKTtcbiAgY29uc3Qgb3V0ID0gY2hhbmdlZCB8fCBiYWNrIDw9IGRlcHRoID8gZnJhbWUuY29weSA6IG5vZGU7XG4gIGlmICh3YWxrLm1lbW8gJiYgYmFjayA+PSBkZXB0aCkgcmVtZW1iZXIod2Fsay5tZW1vLCBub2RlLCBzaWcsIG91dCk7XG4gIHJldHVybiB7IG91dCwgYmFjazogYmFjayA8IGRlcHRoID8gYmFjayA6IEluZmluaXR5IH07XG59XG5cbi8qKiBEb2VzIGFueSBwYXRoIGZyb20gYHJvb3RgIGNvbWUgYmFjayB0byBhbiBvYmplY3Qgb24gaXQ/ICovXG5mdW5jdGlvbiBoYXNDeWNsZShyb290OiBvYmplY3QpOiBib29sZWFuIHtcbiAgY29uc3QgZG9uZSA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgY29uc3Qgb25QYXRoID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gIGNvbnN0IHZpc2l0Tm9kZSA9IChub2RlOiBvYmplY3QpOiBib29sZWFuID0+IHtcbiAgICBpZiAob25QYXRoLmhhcyhub2RlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGRvbmUuaGFzKG5vZGUpKSByZXR1cm4gZmFsc2U7XG4gICAgb25QYXRoLmFkZChub2RlKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXMobm9kZSkpIHtcbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmIHZpc2l0Tm9kZShjaGlsZCkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBvblBhdGguZGVsZXRlKG5vZGUpO1xuICAgIGRvbmUuYWRkKG5vZGUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgcmV0dXJuIHZpc2l0Tm9kZShyb290KTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVkIGZvcm0gb2YgYHJvb3RgIHVuZGVyIGEgd2FsazogYHJvb3RgIGl0c2VsZiB3aGVuIG5vIHBhdGggc2VsZWN0c1xuICogYW55dGhpbmcsIGVsc2UgaXRzIGNvcHktb24td3JpdGUgY29weSAocGFzdCB0aGUgd2FsayBsaW1pdCwgaXRzIHVudmlzaXRlZFxuICogcmVtYWluZGVyIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIpLiBUaHJvd3Mg4oCUIHRoZSBjYWxsZXIgcmVmdXNlcyB0byBzZXJ2ZVxuICog4oCUIG9uIGFuIGVudW1lcmFibGUgZ2V0dGVyIHRoYXQgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBzZXJ2ZWRCeVBhdGgoXG4gIHJvb3Q6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBwbGFjZWhvbGRlcjogc3RyaW5nLFxuKTogdW5rbm93biB7XG4gIGlmICghc2VsZWN0c0J5UGF0aChyb290LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIG5ldyBNYXAoKSwgMCkuc2VsZWN0ZWQpIHJldHVybiByb290O1xuICB3YWxrLmJ1ZGdldCA9IHdhbGtMaW1pdDtcbiAgLy8gQSBiYXJlIGZpZWxkIHNjcnViIG9mIGFuIGFjeWNsaWMgdmFsdWUgd2Fsa3MgaXRzIHRhcmdldHMgb25seTogbm8gY3ljbGUgY2FuIGJyaW5nIGFuXG4gIC8vIHVuc2NydWJiZWQgb3JpZ2luYWwgYmFjay4gRXZlcnkgb3RoZXIgd2FsayB2aXNpdHMgZXZlcnkgcGF0aCAoYSBjeWNsZSBlZGdlIGFueXdoZXJlXG4gIC8vIG11c3QgbGFuZCBvbiBhIHNlcnZlZCBjb3B5KS5cbiAgY29uc3QgcHJ1bmUgPSB3YWxrLm5hbWVzID09PSB1bmRlZmluZWQgJiYgIWhhc0N5Y2xlKHJvb3QpO1xuICByZXR1cm4gY29weUJ5UGF0aChyb290LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIHBsYWNlaG9sZGVyLCBuZXcgTWFwKCksIDAsIHBydW5lKS5vdXQ7XG59XG5cbi8qKiBBIHBsYWluIHJlY29yZCDigJQgdGhlIG9ubHkgc2hhcGUgYSBtYXBwZXIgaXMgaGFuZGVkIGFzIGEgcmVjb3JkaW5nIHZpZXcgKGEgY2xhc3MgaW5zdGFuY2Uga2VlcHMgaXRzIHByb3RvdHlwZSkuICovXG5mdW5jdGlvbiBpc1BsYWluUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuLyoqIFRoZSBzdHJpY3RlciBvZiB0d28gdmVyZGljdHMgb24gdGhlIHNhbWUgdmFsdWU6IHdob2xlIG92ZXIgZmllbGRzIG92ZXIgY2xlYXI7IGZpZWxkcyB1bml0ZS4gKi9cbmZ1bmN0aW9uIHN0cmljdGVyKGE6IFJlZGFjdGlvblZlcmRpY3QgfCB1bmRlZmluZWQsIGI6IFJlZGFjdGlvblZlcmRpY3QpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgaWYgKGEgPT09IHVuZGVmaW5lZCB8fCBhLmtpbmQgPT09ICdjbGVhcicgfHwgYi5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gYjtcbiAgaWYgKGEua2luZCA9PT0gJ3dob2xlJyB8fCBiLmtpbmQgPT09ICdjbGVhcicpIHJldHVybiBhO1xuICByZXR1cm4geyBraW5kOiAnZmllbGRzJywga2V5OiBhLmtleSwgcGF0aHM6IFsuLi5uZXcgU2V0KFsuLi5hLnBhdGhzLCAuLi5iLnBhdGhzXSldIH07XG59XG5cbi8qKlxuICogVEhFIFRBSU5UIFJVTEUgYXQgYSBzdWJmbG93IG1hcHBlciBib3VuZGFyeSAoYW4gYGlucHV0TWFwcGVyYCBzZWVkaW5nIGFcbiAqIHN1YmZsb3csIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdpbmcgaXQgYmFjayk6IGEga2V5IHRoZSBtYXBwZXIgd3JpdGVzXG4gKiBpbmhlcml0cyB0aGUgcmVkYWN0aW9uIG9mIHRoZSBTRUxFQ1RFRCB2YWx1ZSBpdCBjb3BpZWQg4oCUIGEgbWFyayAob3JcbiAqIGluaGVyaXRlZCBmaWVsZHMpLCBieSBuYW1lLCBsaWtlIGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCDigJRcbiAqIHNvIHRoZSBzdWJmbG93J3Mgc2VlZCwgbG9nLCBtaXJyb3IsIHJlYWRzLCBuYXJyYXRpdmUgYW5kIHJlc3VsdHMsIGFuZCB0aGVcbiAqIHBhcmVudCdzIG1lcmdlLWJhY2ssIHJldGFpbiB0aGUgY29weSBhcyB0aGV5IHJldGFpbiBpdHMgc291cmNlLiBEZWNpZGVkIGJ5XG4gKiB3aGljaCB2YWx1ZXMgdGhlIG1hcHBlciBSRUFEOlxuICpcbiAqICAgLSBTQU1FIE5BTUUg4oCUIGEgdmFsdWUgcGFzc2VkIG9uIHVuZGVyIHRoZSBuYW1lIGl0IHdhcyByZWFkIHVuZGVyIGtlZXBzXG4gKiAgICAgdGhhdCBuYW1lJ3MgdmVyZGljdCAoYHsgY291bnQ6IHAuY291bnQgfWAsIGB7IC4uLnAgfWApOiBhIGNsZWFyIHZhbHVlXG4gKiAgICAgc3RheXMgY2xlYXIsIHdoZXJldmVyIGVsc2UgdGhlIG1hcHBlciByZWFkIGEgc2VjcmV0LlxuICogICAtIEVYQUNUIOKAlCBhbiBvdXRwdXQgT0JKRUNUIHRoYXQgSVMgKGJ5IHJlZmVyZW5jZSkgYSB2YWx1ZSB0aGUgbWFwcGVyIHJlYWRcbiAqICAgICBpbmhlcml0cyB0aGF0IGtleSdzIHZlcmRpY3Q6IHdob2xlIHN0YXlzIHdob2xlLCBgZmllbGRzYCBoYW5kIHRoZWlyIHBhdGhzXG4gKiAgICAgdG8gdGhlIG5ldyBrZXksIGNsZWFyIHN0YXlzIGNsZWFyLiBUaGUgcmVjb3JkIHRoZSBtYXBwZXIgd2FzIEhBTkRFRCxcbiAqICAgICBwYXNzZWQgb24gd2hvbGUgKGAocCkgPT4gKHsgY3R4OiBwIH0pYCksIGhhbmRzIGV2ZXJ5IHNlbGVjdGVkIGtleSBvZiBpdFxuICogICAgIHRvIHRoZSBuZXcga2V5IGFzIGEgZmllbGQgKGBjdHgudG9rZW5gKS5cbiAqICAgLSBDT05TRVJWQVRJVkUg4oCUIGFueSBvdGhlciBvdXRwdXQgKGEgcHJpbWl0aXZlIHVuZGVyIGEgbmV3IG5hbWUsIG9yIGFuXG4gKiAgICAgb2JqZWN0IHRoZSBtYXBwZXIgYnVpbHQpIGlzIHNlbGVjdGVkIFdIT0xFIHdoZW4gdGhlIG1hcHBlciByZWFkIGFcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSDigJQgYSB3aG9sZS1zZWxlY3RlZCBrZXksIG9yIGEgc2VsZWN0ZWQgRklFTEQgb2YgYVxuICogICAgIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZCDigJQgb3Igd2hlbiBpdCBlbWJlZHMgYSBzZWxlY3RlZCByZWNvcmQgYnlcbiAqICAgICByZWZlcmVuY2U7IHRoZSBsaWJyYXJ5IGNhbm5vdCB0ZWxsIHdoYXQgYSBjb21wdXRlZCB2YWx1ZSBjYXJyaWVzLlxuICogICAgIChWYWx1ZXMgYXJlIG5ldmVyIG1hdGNoZWQgYnkgRVFVQUxJVFkgYWNyb3NzIG5hbWVzOiBhbiBlcXVhbCBwcmltaXRpdmVcbiAqICAgICB3b3VsZCBvdmVyLW1hdGNoIHVucmVsYXRlZCBrZXlzLilcbiAqXG4gKiBIT1cgRkFSIEEgTUFSSyBSRUFDSEVTOiBhIE5BTUUsIHJ1bi13aWRlLCBmcm9tIHRoZSBtb21lbnQgaXQgaXMgbWFkZSDigJQgZXZlcnlcbiAqIGtleSBvZiB0aGF0IG5hbWUgaW4gdGhlIHN1YmZsb3csIHRoZSBwYXJlbnQsIGEgc2libGluZyBhbmQgZXZlcnkgbGF0ZXIgc3RhZ2VcbiAqIGlzIHNlbGVjdGVkIGluIHdoYXRldmVyIGlzIHNlcnZlZCwgdW50aWwgdGhlIGtleSBpcyBkZWxldGVkOyBhIHBhdXNlIGNhcnJpZXNcbiAqIGl0IHRvIHRoZSByZXN1bWVkIHJ1biAoYEZsb3djaGFydENoZWNrcG9pbnQucmVkYWN0aW9uTWFya3NgKS5cbiAqXG4gKiBBIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZCB0aGF0IGhvbGRzIGEgc2VsZWN0ZWQgZmllbGQgaXMgaGFuZGVkIHRvIHRoZVxuICogbWFwcGVyIGFzIGEgdmlldyBvZiBpdHMgb3duLCBzbyByZWFkaW5nIHRoZSByZWNvcmQgKHRvIHBhc3MgaXQgb24sIG9yIHRvXG4gKiB0ZXN0IGl0cyB0eXBlKSBpcyBub3QgcmVhZGluZyB0aGUgZmllbGQuIFJlYWRpbmcgYHJ1bnNgICh0aGUgbmFtZXNwYWNlIHJvb3RcbiAqIGZvcmsgY2hpbGRyZW4gd3JpdGUgdW5kZXIpIHJlYWRzIGV2ZXJ5IG5hbWVzcGFjZWQga2V5LiBSZWNvcmRpbmcgc3RvcHMgd2hlblxuICogdGhlIG1hcHBlciByZXR1cm5zOyB7QGxpbmsgaW5oZXJpdH0gaGFuZHMgYmFjayB0aGUgb3V0cHV0IHdpdGggZXZlcnkgdmlldyBpdFxuICogcmV0dXJuZWQgc3dhcHBlZCBmb3IgdGhlIHJlY29yZCBiZWhpbmQgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXBwZXJUYWludCB7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGUgbWFwcGVyIHJlYWQg4oaSIHRoZSB2ZXJkaWN0IG9mIHRoZSBrZXkgaXQgcmVhZCBpdCB1bmRlci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VzID0gbmV3IE1hcDxvYmplY3QsIFJlZGFjdGlvblZlcmRpY3Q+KCk7XG4gIC8qKiBFYWNoIGtleSB0aGUgbWFwcGVyIHJlYWQg4oaSIHRoZSB2YWx1ZXMgaXQgcmVhZCB1bmRlciB0aGF0IG5hbWUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd25bXT4oKTtcbiAgLyoqIEVhY2ggYGZpZWxkc2AgdmlldyBoYW5kZWQgb3V0IOKGkiB0aGUgcmVjb3JkIGJlaGluZCBpdCBhbmQgaXRzIHZlcmRpY3QuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3MgPSBuZXcgTWFwPG9iamVjdCwgeyByYXc6IG9iamVjdDsgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCB9PigpO1xuICAvKiogRWFjaCByZWNvcmQgdGhlIG1hcHBlciB3YXMgaGFuZGVkIOKGkiBhcyBhIHZpZXcgKHBhc3NlZCBvbiB3aG9sZSwgaXQgaGFuZHMgb24gaXRzIHNlbGVjdGVkIGtleXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZHMgPSBuZXcgTWFwPG9iamVjdCwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gIC8qKiBUaGUgc2VsZWN0ZWQgdmFsdWVzIHRoZSBtYXBwZXIgcmVhZCAod2hvbGUga2V5cywgc2VsZWN0ZWQgZmllbGRzKSDigJQgd2hhdCBpdCBjb3VsZCBwbGFudCBieSByZWZlcmVuY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjcmV0UmVhZHM6IHVua25vd25bXSA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkUmVhZCA9IGZhbHNlO1xuICBwcml2YXRlIG9wZW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBydWxlOiBSZWRhY3Rpb25SdWxlKSB7fVxuXG4gIC8qKiBgdW5kZWZpbmVkYCB3aGlsZSB0aGUgcnVuJ3MgcnVsZSBpcyBpbmVydCDigJQgbm90aGluZyBhIG1hcHBlciByZWFkcyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gIHN0YXRpYyBvZihydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkKTogTWFwcGVyVGFpbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gbmV3IE1hcHBlclRhaW50KHJ1bGUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvcmQgYSBtYXBwZXIgaXMgaGFuZGVkOiB0aGUgc2FtZSBvd24ga2V5cyBhbmQgdmFsdWVzLCBlYWNoIHJlYWRcbiAgICogcmVjb3JkZWQuIEFuIGFjY2Vzc29yIHBlciBrZXksIG5vdCBhIFByb3h5IOKAlCBhIG1hcHBlciBtYXkgc3ByZWFkLCBjbG9uZSBvclxuICAgKiBzZXJpYWxpemUgd2hhdCBpdCBpcyBoYW5kZWQuIEFuIGFzc2lnbm1lbnQgbGFuZHMgb24gdGhlIHZpZXcsIG5ldmVyIG9uIHRoZVxuICAgKiBsaXZlIHJlY29yZCBiZWhpbmQgaXQuIEFueXRoaW5nIGJ1dCBhIHBsYWluIHJlY29yZCBpcyBoYW5kZWQgb3ZlciBhcyBpdCBpcy5cbiAgICovXG4gIHdhdGNoPFQ+KHJlY29yZDogVCk6IFQge1xuICAgIGlmICghaXNQbGFpblJlY29yZChyZWNvcmQpKSByZXR1cm4gcmVjb3JkO1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdPZihyZWNvcmQsIChrZXkpID0+IHRoaXMuc2VydmVkKGtleSwgcmVjb3JkW2tleV0pKTtcbiAgICB0aGlzLnJlY29yZHMuc2V0KHZpZXcsIHJlY29yZCk7XG4gICAgcmV0dXJuIHZpZXcgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWFwcGVyIHJldHVybmVkIGBvdXRwdXRgOiBldmVyeSBrZXkgaXQgd3JvdGUgaW5oZXJpdHMgd2hhdCBpdCBjb3BpZWRcbiAgICogKHNlZSB0aGUgY2xhc3MpLiBSZXR1cm5zIHRoZSBvdXRwdXQgdG8gdXNlIOKAlCB0aGUgc2FtZSBvYmplY3QgdW5sZXNzIGEgdmlld1xuICAgKiBoYWQgdG8gYmUgc3dhcHBlZCBiYWNrIGZvciB0aGUgcmVjb3JkIGJlaGluZCBpdC5cbiAgICovXG4gIGluaGVyaXQ8VD4ob3V0cHV0OiBUKTogVCB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgaWYgKG91dHB1dCA9PT0gbnVsbCB8fCB0eXBlb2Ygb3V0cHV0ICE9PSAnb2JqZWN0JykgcmV0dXJuIG91dHB1dDtcbiAgICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdXRwdXQpKSB7XG4gICAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcGllZFZlcmRpY3QodGFyZ2V0LCB2YWx1ZSk7XG4gICAgICBpZiAoY29waWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSZWFkIHx8IHRoaXMuZW1iZWRzU2VsZWN0ZWQodmFsdWUsIG5ldyBXZWFrU2V0KCkpKSB0aGlzLnJ1bGUubWFyayh0YXJnZXQpO1xuICAgICAgfSBlbHNlIGlmIChjb3BpZWQua2luZCA9PT0gJ3dob2xlJykgdGhpcy5ydWxlLm1hcmsodGFyZ2V0KTtcbiAgICAgIGVsc2UgaWYgKGNvcGllZC5raW5kID09PSAnZmllbGRzJykgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHModGFyZ2V0LCBjb3BpZWQucGF0aHMpO1xuICAgICAgY29uc3QgcmF3ID0gdGhpcy5iZWhpbmQodmFsdWUpO1xuICAgICAgLy8gQW4gb2JqZWN0IHBhc3NlZCBvbiBCWSBSRUZFUkVOQ0UgbWF5IGNhcnJ5IHdoYXQgdGhlIG1hcHBlciBwbGFudGVkIGluIGl0XG4gICAgICAvLyAoYE9iamVjdC5hc3NpZ24ocC5yZXF1ZXN0LCB7IGF1dGg6IHAudG9rZW4gfSlgLCBgcC5saXN0LnB1c2gocC50b2tlbilgKTpcbiAgICAgIC8vIGVhY2ggcGxhY2UgaXQgaG9sZHMgYSBzZWxlY3RlZCB2YWx1ZSB0aGUgbWFwcGVyIHJlYWQgaXMgYSBmaWVsZCBvZiB0aGUgbmV3IGtleS5cbiAgICAgIGlmIChjb3BpZWQgIT09IHVuZGVmaW5lZCAmJiBjb3BpZWQua2luZCAhPT0gJ3dob2xlJyAmJiByYXcgIT09IG51bGwgJiYgdHlwZW9mIHJhdyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgcGxhbnRlZCA9IHRoaXMucGxhbnRlZFBhdGhzKHJhdyk7XG4gICAgICAgIGlmIChwbGFudGVkLmxlbmd0aCA+IDApIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKHRhcmdldCwgcGxhbnRlZCk7XG4gICAgICB9XG4gICAgICBpZiAocmF3ICE9PSB2YWx1ZSkge1xuICAgICAgICBvdXQgPz89IChBcnJheS5pc0FycmF5KG91dHB1dCkgPyBbLi4ub3V0cHV0XSA6IHsgLi4ub3V0cHV0IH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBvdXRbdGFyZ2V0XSA9IHJhdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChvdXQgPz8gb3V0cHV0KSBhcyBUO1xuICB9XG5cbiAgLyoqIFdoYXQgb25lIHJlY29yZGVkIHJlYWQgaGFuZHMgdGhlIG1hcHBlciAoc2VlIHRoZSBjbGFzcykuICovXG4gIHByaXZhdGUgc2VydmVkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICghdGhpcy5vcGVuKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgcmVhZCA9IHRoaXMuYnlOYW1lLmdldChrZXkpO1xuICAgIGlmIChyZWFkID09PSB1bmRlZmluZWQpIHRoaXMuYnlOYW1lLnNldChrZXksIFt2YWx1ZV0pO1xuICAgIGVsc2UgcmVhZC5wdXNoKHZhbHVlKTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQoa2V5LCB2YWx1ZSk7XG4gICAgLy8gQW4gYWJzZW50IGtleSBjYXJyaWVzIG5vIHNlY3JldDsgbmVpdGhlciBkb2VzIGEgdmFsdWUgd2l0aCBubyBmaWVsZHMgKGEgc2NhbGFyKSBvciBub25lIG9mXG4gICAgLy8gaXRzIHNlbGVjdGVkIG9uZXMg4oCUIHN0YXRlIHJldGFpbnMgdGhvc2UgYXMgdGhleSBhcmUgdG9vLlxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICFSZWRhY3Rpb25SdWxlLmhvbGRzUGF0aHModmFsdWUsIHZlcmRpY3QucGF0aHMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbWVtYmVyKHZhbHVlLCB2ZXJkaWN0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BsYWluUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHRoaXMuZmllbGRzVmlldyh2YWx1ZSwgdmVyZGljdCk7XG4gICAgfVxuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWFkID0gdHJ1ZTtcbiAgICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHRoaXMuc2VjcmV0UmVhZHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbWVtYmVyKHZhbHVlLCB2ZXJkaWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtZW1iZXIodmFsdWU6IHVua25vd24sIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QpOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5zb3VyY2VzLnNldCh2YWx1ZSwgc3RyaWN0ZXIodGhpcy5zb3VyY2VzLmdldCh2YWx1ZSksIHZlcmRpY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIEEgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkOiByZWFkaW5nIG9uZSBvZiBpdHMgc2VsZWN0ZWQgZmllbGRzIChvciBhIHBhdGgncyBmaXJzdCBzZWdtZW50KSBpcyBhIHNlbGVjdGVkIHJlYWQuICovXG4gIHByaXZhdGUgZmllbGRzVmlldyhyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ICYgeyBraW5kOiAnZmllbGRzJyB9KTogb2JqZWN0IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB2ZXJkaWN0LnBhdGhzKSBzZWxlY3RlZC5hZGQocGF0aCkuYWRkKHBhdGguc3BsaXQoJy4nKVswXSk7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlld09mKHJlY29yZCwgKGtleSkgPT4ge1xuICAgICAgaWYgKHRoaXMub3BlbiAmJiBzZWxlY3RlZC5oYXMoa2V5KSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVhZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VjcmV0UmVhZHMucHVzaChyZWNvcmRba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjb3JkW2tleV07XG4gICAgfSk7XG4gICAgdGhpcy52aWV3cy5zZXQodmlldywgeyByYXc6IHJlY29yZCwgdmVyZGljdCB9KTtcbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIHByaXZhdGUgdmlld09mKHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlYWQ6IChrZXk6IHN0cmluZykgPT4gdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB2aWV3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZCkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHJlYWQoa2V5KSxcbiAgICAgICAgc2V0OiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmlldywga2V5LCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgLyoqIFRoZSByZWNvcmQgYmVoaW5kIGEgdmlldyB0aGUgbWFwcGVyIHJldHVybmVkOyBhbnkgb3RoZXIgdmFsdWUgYXMgaXQgaXMuICovXG4gIHByaXZhdGUgYmVoaW5kKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcy52aWV3cy5nZXQodmFsdWUpPy5yYXcgPz8gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSkgPz8gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgYHRhcmdldGAgaW5oZXJpdHMgZnJvbSBgdmFsdWVgIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzXG4gICAqIG5laXRoZXIgYSB2YWx1ZSB0aGUgbWFwcGVyIHJlYWQgbm9yIG9uZSBwYXNzZWQgdW5kZXIgaXRzIG93biBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBjb3BpZWRWZXJkaWN0KHRhcmdldDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3QgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3cy5nZXQodmFsdWUpO1xuICAgICAgaWYgKHZpZXcpIHJldHVybiB2aWV3LnZlcmRpY3Q7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGRzT2YocmVjb3JkKTtcbiAgICAgIGNvbnN0IGtub3duID0gdGhpcy5zb3VyY2VzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoa25vd24pIHJldHVybiBrbm93bjtcbiAgICB9XG4gICAgY29uc3QgcmVhZCA9IHRoaXMuYnlOYW1lLmdldCh0YXJnZXQpO1xuICAgIHJldHVybiByZWFkPy5zb21lKCh2KSA9PiBPYmplY3QuaXModiwgdmFsdWUpKSA/IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKHRhcmdldCwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEEgd2hvbGUgcmVjb3JkJ3Mgc2VsZWN0ZWQga2V5cywgYXMgZmllbGRzIG9mIHdoYXRldmVyIGtleSBpdCBpcyBwYXNzZWQgb24gdW5kZXIuICovXG4gIHByaXZhdGUgc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgY29uc3QgdmVyZGljdCA9IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKGtleSwgcmVjb3JkW2tleV0pO1xuICAgICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcGF0aHMucHVzaChrZXkpO1xuICAgICAgZWxzZSBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgZm9yIChjb25zdCBwYXRoIG9mIHZlcmRpY3QucGF0aHMpIHBhdGhzLnB1c2goYCR7a2V5fS4ke3BhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRocy5sZW5ndGggPT09IDAgPyBDTEVBUiA6IHsga2luZDogJ2ZpZWxkcycsIGtleTogJycsIHBhdGhzIH07XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgYHJvb3RgIChhbiBvYmplY3QgdGhlIG1hcHBlciBwYXNzZWQgb24gYnkgcmVmZXJlbmNlKSBob2xkcyBvbmUgb2YgdGhlXG4gICAqIHNlbGVjdGVkIFBSSU1JVElWRVMgaXQgcmVhZCDigJQgbWF0Y2hlZCBieSB2YWx1ZSwgb25seSBhZ2FpbnN0IHdoYXQgdGhpc1xuICAgKiBtYXBwZXIgcmVhZCBhbmQgb25seSBpbnNpZGUgd2hhdCBpdCBwYXNzZWQgb24sIHNvIG92ZXItbWF0Y2hpbmcgYW4gZXF1YWxcbiAgICogdmFsdWUgaXMgdGhlIHNhZmUgc2lkZS4gT25lIHJlbGF0aXZlIHBhdGggcGVyIHBsYWNlLCBhIHNoYXJlZCBvYmplY3QgYXRcbiAgICogZWFjaCBvZiBpdHMgcGF0aHM7IGEgY3ljbGUgZWRnZSBpcyBub3QgZm9sbG93ZWQuXG4gICAqL1xuICBwcml2YXRlIHBsYW50ZWRQYXRocyhyb290OiBvYmplY3QpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VjcmV0cyA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgICBjb25zdCBjb2xsZWN0ID0gKHZhbHVlOiB1bmtub3duLCBzZWVuOiBTZXQ8b2JqZWN0Pik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSBzZWNyZXRzLmFkZCh2YWx1ZSk7XG4gICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBjb2xsZWN0KGNoaWxkLCBzZWVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy5zZWNyZXRSZWFkcykgY29sbGVjdCh2YWx1ZSwgbmV3IFNldCgpKTtcbiAgICBpZiAoc2VjcmV0cy5zaXplID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgbWVtbyA9IG5ldyBNYXA8b2JqZWN0LCBzdHJpbmdbXT4oKTtcbiAgICBjb25zdCBvblBhdGggPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgICBjb25zdCBpbnNpZGUgPSAobm9kZTogb2JqZWN0KTogc3RyaW5nW10gPT4ge1xuICAgICAgY29uc3Qga25vd24gPSBtZW1vLmdldChub2RlKTtcbiAgICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4ga25vd247XG4gICAgICBpZiAob25QYXRoLmhhcyhub2RlKSkgcmV0dXJuIFtdO1xuICAgICAgb25QYXRoLmFkZChub2RlKTtcbiAgICAgIGNvbnN0IGZvdW5kOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcpIGZvciAoY29uc3Qgc3ViIG9mIGluc2lkZShjaGlsZCkpIGZvdW5kLnB1c2goYCR7a2V5fS4ke3N1Yn1gKTtcbiAgICAgICAgZWxzZSBpZiAoc2VjcmV0cy5oYXMoY2hpbGQpKSBmb3VuZC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgICBvblBhdGguZGVsZXRlKG5vZGUpO1xuICAgICAgbWVtby5zZXQobm9kZSwgZm91bmQpO1xuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH07XG4gICAgcmV0dXJuIGluc2lkZShyb290KTtcbiAgfVxuXG4gIC8qKiBEb2VzIGEgdmFsdWUgdGhlIG1hcHBlciBCVUlMVCBlbWJlZCwgYnkgcmVmZXJlbmNlLCBhIHNlbGVjdGVkIHJlY29yZCBpdCByZWFkIG9yIHdhcyBoYW5kZWQ/ICovXG4gIHByaXZhdGUgZW1iZWRzU2VsZWN0ZWQodmFsdWU6IHVua25vd24sIHNlZW46IFdlYWtTZXQ8b2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICBpZiAodGhpcy52aWV3cy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKTtcbiAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkc09mKHJlY29yZCkua2luZCAhPT0gJ2NsZWFyJztcbiAgICBjb25zdCBrbm93biA9IHRoaXMuc291cmNlcy5nZXQodmFsdWUpO1xuICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkICYmIGtub3duLmtpbmQgIT09ICdjbGVhcicpIHJldHVybiB0cnVlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGlmICh0aGlzLmVtYmVkc1NlbGVjdGVkKGNoaWxkLCBzZWVuKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
1414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBERzs7O0FBRUgsMkNBQTRDO0FBRzVDLDhDQUEwQztBQUUxQyx5REFBc0U7QUFFdEUsbURBQWdEO0FBRWhEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDVSxRQUFBLGlCQUFpQixHQUFHLFlBQVksQ0FBQztBQTJFakMsUUFBQSxLQUFLLEdBQXFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFXLENBQUMsQ0FBQztBQUVqRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixTQUFTLENBQUMsSUFBdUIsRUFBRSxHQUFXO0lBQzVELE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDMUQsQ0FBQztBQUZELDhCQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQTRDLEVBQUUsR0FBVztJQUMvRSxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0csQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBdUM7SUFD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QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0Y7QUFoTkQsa0NBZ05DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWRhY3Rpb24udHMg4oCUIFRoZSBPTkUgb3duZXIgb2Ygd2hhdCBhIHJlZGFjdGlvbiBwb2xpY3kgc2F5cyBhYm91dCBhIHZhbHVlLlxuICpcbiAqIFRIRSBMQVcgKG93bmVyIHJ1bGluZyAoYSkpLiBBIHJlZGFjdGlvbiBwb2xpY3kgY292ZXJzIEVWRVJZVEhJTkcgdGhlIGxpYnJhcnlcbiAqIHJldGFpbnMgb3Igc2VydmVzIOKAlCB0aGUgY29tbWl0IGxvZyAoYm90aCBlbmNvZGluZ3MpLCB0aGUgcmVkYWN0ZWQgbWlycm9yLFxuICogdHJhY2tlZCByZWFkcy93cml0ZXMsIGV2ZXJ5IHJlY29yZGVyIGV2ZW50IChpbmxpbmUgYW5kIGRlZmVycmVkKSBhbmQgdGhlXG4gKiByZWNvcmRlciByb3dzIGJ1aWx0IGZyb20gdGhlbSwgdGhlIG5hcnJhdGl2ZSwgc25hcHNob3RzLCBkaWFnbm9zdGljcywgcGF1c2VcbiAqIHBheWxvYWRzLCBib3VuZGFyeSByZWNvcmRzIGFuZCBsb2cgbGluZXMg4oCUIGFuZCBORVZFUiB0aGUgbGl2ZSBoZWFwIG9yIHRoZVxuICogcmVzdW1lIGNoZWNrcG9pbnQuIFR3byB2YWx1ZXMgYXJlIHRoZSBjYWxsZXIncyBvd24gYW5kIHN0YXkgcmVhbDogdGhlXG4gKiBgcnVuKClgIHJlamVjdGlvbiAodGhlIHRocm93biB2YWx1ZSBpdHNlbGYpIGFuZCB0aGUgbGl2ZSBmb3JrIHJlc3VsdC5cbiAqXG4gKiBBIHBvbGljeSBzZWxlY3RzIGJ5IE5BTUUg4oCUIGEga2V5LCBhIGRvdHRlZCBwYXRoLCBhIGZpZWxkIOKAlCBuZXZlciBieVxuICogc2Nhbm5pbmcgY29udGVudC4gV2hhdCBjYXJyaWVzIGEgbmFtZTpcbiAqICAgLSBzdGF0ZSDigJQgaXRzIHVzZXItbGV2ZWwgcGF0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUudmVyZGljdH0pO1xuICogICAtIGEgcmVjb3JkIGhhbmRlZCBvdXQgd2hvbGUg4oCUIHJvb3QgaW5wdXQvb3V0cHV0LCBhIHN1YmZsb3cncyBtYXBwZWQgc2VlZFxuICogICAgIGFuZCBleGl0IHN0YXRlLCBhIHBhdXNlIHBheWxvYWQsIGEgdGhyb3duIHZhbHVlIOKAlCBpdHMga2V5cyBhdCBldmVyeVxuICogICAgIGRlcHRoICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeX0pO1xuICogICAtIGEgZGlhZ25vc3RpYyBlbnRyeSDigJQgYCRkZWJ1Z2AvYCRlcnJvcmAvYCRtZXRyaWNgL2AkZXZhbGAvYCRsb2dgIGFuZCB0aGVcbiAqICAgICBlbmdpbmUncyBvd24g4oCUIHRoZSByZWNvcmQgYHsgW25hbWVdOiB2YWx1ZSB9YDogaXRzIG5hbWUgSVMgYSBzdGF0ZSBrZXlcbiAqICAgICAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluRGlhZ25vc3RpY30pLiBgcG9saWN5LmRpYWdub3N0aWNzYCBhZGRzXG4gKiAgICAgZGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycyBvbiB0b3A7IGZsb3ctbWVzc2FnZSB0ZXh0IGhhcyBubyBuYW1lIG9mIGl0c1xuICogICAgIG93biwgc28gb25seSB0aGV5IHNlbGVjdCBpdDtcbiAqICAgLSBhIHN1YmZsb3cgbWFwcGVyJ3MgY29weSDigJQgYSBrZXkgYW4gYGlucHV0TWFwcGVyYC9gb3V0cHV0TWFwcGVyYCAob3IgYVxuICogICAgIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zIHNlbGVjdG9yKSB3cm90ZSBpbmhlcml0cyB0aGUgcmVkYWN0aW9uIG9mIHRoZVxuICogICAgIHNlbGVjdGVkIHZhbHVlIGl0IGNvcGllZCAoe0BsaW5rIE1hcHBlclRhaW50fSkuXG4gKiBBIG1hcmsgaXMgYSBOQU1FLCBydW4td2lkZSwgdW50aWwgdGhlIGtleSBpcyBkZWxldGVkOyBhIHBhdXNlIGNhcnJpZXMgdGhlXG4gKiBtYXJrcyDigJQgbmFtZXMgb25seSDigJQgdG8gdGhlIHJlc3VtZWQgcnVuICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5tYXJrc0ZvckNoZWNrcG9pbnR9KS5cbiAqIEEgdmFsdWUgd2l0aCBubyBuYW1lIOKAlCBhIHNjYWxhciByb290IGlucHV0L291dHB1dCBvciBwYXVzZSBwYXlsb2FkLCBmcmVlXG4gKiBlcnJvciB0ZXh0IOKAlCBpcyBzZWxlY3RlZCBieSBub3RoaW5nLiBgZW1pdFBhdHRlcm5zYCBpcyB0aGUgb25lIHNlcGFyYXRlXG4gKiBzY3J1YjogYSBgJGVtaXRgIHBheWxvYWQgaXMgc2VsZWN0ZWQgYnkgaXRzIGV2ZW50IG5hbWUuXG4gKlxuICogSE9XIE9ORSBPV05FUiBLRUVQUyBJVC4gRXZlcnkgc3RhZ2VkIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgcGFzc2VzXG4gKiB0aHJvdWdoIGBTdGFnZUNvbnRleHRgLCBzbyBgU3RhZ2VDb250ZXh0YCBhc2tzIFRISVMgcnVsZSDigJQgbm90IHRoZSBjYWxsZXIg4oCUXG4gKiB3aGF0IHRoZSBwb2xpY3kgc2F5cyBhYm91dCB0aGUgcGF0aCBpdCBpcyBhYm91dCB0byByZXRhaW4uIEEgYFNjb3BlRmFjYWRlYFxuICogd3JpdGUsIGEgc3ViZmxvdyBgaW5wdXRNYXBwZXJgIHNlZWQsIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2sgYW5kIGFcbiAqIHJlc3VtZSByZS1zZWVkIGFyZSB0aGVuIGFsbCB0aGUgc2FtZSBjYXNlOiB0aGUgZnVubmVsIGRlY2lkZXMsIHRoZSBjYWxsZXJcbiAqIGNhbm5vdCBmb3JnZXQgdG8uIFRoZSBmYWNhZGUgdXNlcyB0aGUgc2FtZSBydWxlIGZvciB0aGUgdmFsdWVzIGl0IGhhbmRzIHRvXG4gKiByZWNvcmRlcnM7IGBTdWJmbG93RXhlY3V0b3JgIHVzZXMgaXQgZm9yIHRoZSBuYXJyYXRlZCBzZWVkIGFuZFxuICogYEZsb3djaGFydFRyYXZlcnNlci5leGVjdXRlYCBmb3Igcm9vdCBpbnB1dC9vdXRwdXQgYmVmb3JlIGRpc3BhdGNoLiBCZWZvcmUgOS4xOS4wXG4gKiB0aGUgZmFjYWRlIGhlbGQgdGhlIHZlcmRpY3QgYWxvbmUsIGFuZCBldmVyeSBwYXRoIHRoYXQgd3JvdGUgb3IgcmVhZCBwYXN0XG4gKiB0aGUgZmFjYWRlIOKAlCBmaXZlIG9mIHRoZW0g4oCUIHJldGFpbmVkIHBsYWludGV4dCB1bmRlciBhIHBvbGljeS5cbiAqXG4gKiBPTkUgVkVSRElDVCBPV05FUiwgT05FIEVOQ09ESU5HIE9XTkVSIChDNCkuIFRoaXMgZmlsZSBERUNJREVTIOKAlCB0aGUgcnVsZSxcbiAqIGFuZCBmb3IgYSBzdGFnZWQgd3JpdGUge0BsaW5rIGRlY2lkZVdyaXRlfSAodGhlIHZlcmRpY3QpLFxuICoge0BsaW5rIGluaGVyaXRCeUlkZW50aXR5fSBhbmQge0BsaW5rIG1hcmtTdGFnZWRXcml0ZX0gKHRoZSBtYXJrcykg4oCUIGFuZCBpc1xuICogdGhlIGVuZ2luZSdzIChMNCwgYmVzaWRlIHRoZSBydW4gcG9saWN5IHRoYXQgY2FycmllcyB0aGUgcnVsZSkuIFRoZSBCWVRFUyBvZiBhXG4gKiB2ZXJkaWN0IGFyZSB0aGUgcmVjb3JkJ3M6IHRoZSBmcmFtZSBoYW5kcyBpdHMgc2NydWIgKGB3aG9sZWAsIG9yIHRoZVxuICogYGZpZWxkc2AgaW5zaWRlIHRoZSB2YWx1ZSDigJQge0BsaW5rIHNjcnViT2Z9KSB0byBgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCBhbmRcbiAqIHRoZSByZWNvcmQncyBvd24gc2NydWIgKGBtZW1vcnkvc2NydWIudHNgLCBMMikgd3JpdGVzIHRoZSBsb2cncyBwbGFjZWhvbGRlclxuICogYXQgY29tbWl0LiBCZWZvcmUgQzQgdGhlIHNjcnViIGxpdmVkIGhlcmUgdG9vLCBzbyB0aGUgcmVjb3JkIGltcG9ydGVkIHRoZVxuICogZW5naW5lJ3MgcG9saWN5IG1vZHVsZSB0byB3cml0ZSBhIHN0cmluZy5cbiAqXG4gKiBUV08gUExBQ0VIT0xERVJTLCBCT1RIIEhJU1RPUklDQUwsIE9ORSBQRVIgT1dORVI6IHRoZSBjb21taXQgbG9nIGFuZCB0aGVcbiAqIG1pcnJvciBjYXJyeSBgJ1JFREFDVEVEJ2AgKGBMT0dfUExBQ0VIT0xERVJgLCBgbWVtb3J5L3BsYWNlaG9sZGVycy50c2Ag4oCUIGFcbiAqIHJlY29yZCBieXRlLCB3cml0dGVuIGJ5IGBtZW1vcnkvc2NydWIudHNgKTsgZXZlcnkgc2NvcGUtdGllciB2aWV3IOKAlCBzY29wZVxuICogcmVjb3JkZXIgZXZlbnRzLCBgc3RhZ2VSZWFkc2AvYHN0YWdlV3JpdGVzYCwgbmFycmF0aXZlIOKAlCBjYXJyaWVzXG4gKiBgJ1tSRURBQ1RFRF0nYCAoe0BsaW5rIFNDT1BFX1BMQUNFSE9MREVSfSwgYmVsb3cg4oCUIHRoZSB2ZXJkaWN0J3Mgb3duKS5cbiAqIE5laXRoZXIgc3RyaW5nIGNoYW5nZWQgaW4gOS4xOS4wIG9yIHNpbmNlOyBlYWNoIGlzIHNwZWxsZWQgb25jZSBpbiBgc3JjL2AuXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlSGFzIH0gZnJvbSAnZm9vdHRyYWNlL3BhdGhzJztcbmltcG9ydCB0eXBlIHsgV3JpdGVTY3J1YiwgV3JpdGVWZXJiIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uTWFya3MgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBSVU5fTkFNRVNQQUNFIH0gZnJvbSAnLi9ydW5BZGRyZXNzLmpzJztcblxuLyoqXG4gKiBXaGF0IHRoZSBTQ09QRSBDSEFOTkVMIGNhcnJpZXMgd2hlcmUgYSB2YWx1ZSB3YXMgc2NydWJiZWQ6IGEgc2NvcGUgcmVjb3JkZXIncyByZWFkLCB3cml0ZSBhbmRcbiAqIGNvbW1pdCBldmVudHMsIHRoZSBgc3RhZ2VSZWFkc2AgLyBgc3RhZ2VXcml0ZXNgIHJldGVudGlvbiwgdGhlIG5hcnJhdGl2ZSwgYSBkZWNpc2lvbidzIGV2aWRlbmNlLCBhblxuICogZW1pdCBwYXlsb2FkIG1hdGNoZWQgYnkgYGVtaXRQYXR0ZXJuc2AsIGEgcGF1c2UgcGF5bG9hZCdzIHNlcnZlZCBmb3JtIGFuZCBhIHN1YmZsb3cncyBuYXJyYXRlZCBzZWVkXG4gKiAoYG9uU3ViZmxvd0VudHJ5YCkg4oCUIGV2ZXJ5IHZhbHVlIHRoaXMgdmVyZGljdCBzZXJ2ZXMsIHVubGVzcyBpdHMgY2FsbGVyIHBhc3NlcyB0aGUgbG9nJ3Mgc3RyaW5nLlxuICpcbiAqIEl0cyB0d2luIGlzIHRoZSBSRUNPUkQncyBgTE9HX1BMQUNFSE9MREVSYCAoYCdSRURBQ1RFRCdgLCBgbWVtb3J5L3BsYWNlaG9sZGVycy50c2ApOiB0aGUgY29tbWl0IGxvZyxcbiAqIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIGV2ZXJ5dGhpbmcgc2VydmVkIGZyb20gdGhlbS4gU28gTk9UIGV2ZXJ5IHJlY29yZGVyIGV2ZW50IGNhcnJpZXMgdGhpcyBvbmU6XG4gKiBgb25TdWJmbG93RXhpdC5vdXRwdXRTdGF0ZWAgc2VydmVzIHRoZSBzdWJmbG93J3MgcmVkYWN0ZWQgbWlycm9yIHdoZW4gYSBwb2xpY3kga2VlcHMgb25lLCBhbmQgc29cbiAqIGNhcnJpZXMgdGhlIGxvZydzIHN0cmluZyAod2l0aG91dCBhIG1pcnJvciDigJQgcGVyLWNhbGwgbWFya3MgYWxvbmUg4oCUIGl0IGlzIHRoZSBzdWJmbG93J3MgaGVhcFxuICogcmV0YWluZWQgdW5kZXIgdGhlIHJ1bGUsIHdpdGggdGhpcyBvbmUpLiBCb3RoIHN0cmluZ3MgYXJlIGhpc3RvcmljYWwgYW5kIG5laXRoZXIgY2hhbmdlZCB3aGVuIGl0XG4gKiBtb3ZlZDogdGhpcyBvbmUgd2FzIHRoZSBjb25zdGFudCBgUkVEQUNURURgIGluIHRoaXMgZmlsZSB1bnRpbCBGNGEsIHRoZW4gYHBsYWNlaG9sZGVycy50cyDCt1xuICogU0NPUEVfUExBQ0VIT0xERVJgLCBhbmQgc2luY2UgQzQgaXQgbGl2ZXMgaGVyZSBhZ2FpbiwgYmVzaWRlIHRoZSB2ZXJkaWN0IHRoYXQgd3JpdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgU0NPUEVfUExBQ0VIT0xERVIgPSAnW1JFREFDVEVEXSc7XG5cbi8qKlxuICogRGVjbGFyYXRpdmUga2V5L3BhdGggcmVkYWN0aW9uIGZvciByZWNvcmRlZCBzdGF0ZSBhbmQgYm91bmRhcnkgcmVjb3Jkcy5cbiAqXG4gKiBDb25maWd1cmUgYXQgdGhlIHNjb3BlIGNsYXNzIGxldmVsIChzdGF0aWMgcHJvcGVydHkpIG9yIHBhc3MgdG9cbiAqIEZsb3dDaGFydEV4ZWN1dG9yIHRvIGFwcGx5IGFjcm9zcyBhbGwgc3RhZ2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblBvbGljeSB7XG4gIC8qKiBFeGFjdCBrZXkgbmFtZXMgdG8gYWx3YXlzIHJlZGFjdCAoZS5nLiBbJ3NzbicsICdjcmVkaXRDYXJkJ10pLiAqL1xuICBrZXlzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBSZWdleCBwYXR0ZXJucyDigJQgYW55IGtleSBtYXRjaGluZyBhIHBhdHRlcm4gaXMgYXV0by1yZWRhY3RlZC5cbiAgICpcbiAgICogUGF0dGVybiBtYXRjaGluZyBpcyBza2lwcGVkIGZvciBrZXlzIHRoYXQgZXhjZWVkIGFuIGludGVybmFsIGxlbmd0aCBjYXBcbiAgICogKGRlc2lnbmVkIHRvIHByZXZlbnQgUmVEb1Mgb24gcGF0aG9sb2dpY2FsIHBhdHRlcm5zKS4gRm9yIHZlcnkgbG9uZyBrZXlcbiAgICogbmFtZXMsIHVzZSBga2V5c2AgKGV4YWN0IG1hdGNoKSBpbnN0ZWFkIG9mIHBhdHRlcm5zLlxuICAgKi9cbiAgcGF0dGVybnM/OiBSZWdFeHBbXTtcbiAgLyoqIEZpZWxkLWxldmVsIHJlZGFjdGlvbiB3aXRoaW4gb2JqZWN0cyDigJQga2V5IOKGkiBhcnJheSBvZiBmaWVsZHMgdG8gc2NydWIuXG4gICAqICBTdXBwb3J0cyBkb3Qtbm90YXRpb24gZm9yIG5lc3RlZCBwYXRocyAoZS5nLiAnYWRkcmVzcy56aXAnKS4gKi9cbiAgZmllbGRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAvKipcbiAgICogRGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycywgSU4gQURESVRJT04gdG8gdGhlIHN0YXRlIHNlbGVjdG9ycyBhYm92ZSAod2hpY2hcbiAgICogYWxyZWFkeSBjb3ZlciBhIGRpYWdub3N0aWMgZW50cnkgYnkgaXRzIG5hbWU6IGBrZXlzOiBbJ3Rva2VuJ11gIG1hc2tzXG4gICAqIGAkZGVidWcoJ3Rva2VuJywg4oCmKWApLiBVc2UgdGhlc2UgZm9yIG5hbWVzIHlvdSBtYXNrIGluIGRpYWdub3N0aWNzIGJ1dFxuICAgKiBub3QgaW4gc3RhdGUuIFBhdGhzIHN0YXJ0IHdpdGggbG9ncy9lcnJvcnMvbWV0cmljcy9ldmFscywgZS5nLlxuICAgKiBgbG9ncy5wcm9maWxlLnRva2VuYC4gT25seSBmbG93TWVzc2FnZXMuZGVzY3JpcHRpb24gYW5kXG4gICAqIGZsb3dNZXNzYWdlcy5yYXRpb25hbGUgYXJlIHBheWxvYWRzOyBmbG93IHRvcG9sb2d5L3RpbWluZyBtZXRhZGF0YSBzdGF5c1xuICAgKiBpbnRhY3QuIEFwcGxpZWQgYmVmb3JlIHJldGVudGlvbiwgbm90IHJldHJvYWN0aXZlbHkgdG8gZXhpc3RpbmcgYmFncy5cbiAgICovXG4gIGRpYWdub3N0aWNzPzogUGljazxSZWRhY3Rpb25Qb2xpY3ksICdrZXlzJyB8ICdwYXR0ZXJucycgfCAnZmllbGRzJz47XG4gIC8qKlxuICAgKiBSZWdleCBwYXR0ZXJucyBtYXRjaGVkIGFnYWluc3QgYEVtaXRFdmVudC5uYW1lYCBmb3IgYHNjb3BlLiRlbWl0KC4uLilgXG4gICAqIGNhbGxzLiBBbnkgZW1pdCBldmVudCB3aG9zZSBuYW1lIG1hdGNoZXMgaGFzIGl0cyBwYXlsb2FkIHJlcGxhY2VkIHdpdGhcbiAgICogdGhlIHN0cmluZyBgJ1tSRURBQ1RFRF0nYCBiZWZvcmUgZGlzcGF0Y2ggdG8gcmVjb3JkZXJzLlxuICAgKiBHbG9iYWwvc3RpY2t5IHBhdHRlcm5zIHN0YXJ0IGF0IGluZGV4IHplcm8gb24gZXZlcnkgdGVzdDsgdGhlaXIgZmxhZ3NcbiAgICogcmV0YWluIHRoZWlyIHVzdWFsIG1lYW5pbmcuIFRoaXMgZG9lcyBub3Qgc2NydWIgZGlhZ25vc3RpYyBzaWRlIGJhZ3MuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIGBgYHRzXG4gICAqIHsgZW1pdFBhdHRlcm5zOiBbL1xcLmF1dGhcXC4vLCAvXFwuYmlsbGluZ1xcLi9dIH1cbiAgICogLy8gSGlkZXMgcGF5bG9hZHMgb2YgZXZlbnRzIGxpa2UgJ215YXBwLmF1dGguY2hlY2snIGFuZCAnbXlhcHAuYmlsbGluZy5zcGVuZCdcbiAgICogYGBgXG4gICAqL1xuICBlbWl0UGF0dGVybnM/OiBSZWdFeHBbXTtcbn1cblxuLyoqXG4gKiBTdGF0ZSByZWRhY3Rpb24gcmVwb3J0LiBOZXZlciBpbmNsdWRlcyB2YWx1ZXM7IGVtaXQgYW5kIGRpYWdub3N0aWNcbiAqIHNlbGVjdG9ycy9hY3Rpdml0eSBhcmUgbm90IHJlcHJlc2VudGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkYWN0aW9uUmVwb3J0IHtcbiAgLyoqIEtleXMgZnVsbHkgcmVkYWN0ZWQgKGV4YWN0IG1hdGNoIG9yIHBhdHRlcm4gbWF0Y2gpLiAqL1xuICByZWRhY3RlZEtleXM6IHN0cmluZ1tdO1xuICAvKiogS2V5cyB3aXRoIGZpZWxkLWxldmVsIHJlZGFjdGlvbiDihpIgd2hpY2ggZmllbGRzIHdlcmUgc2NydWJiZWQuICovXG4gIGZpZWxkUmVkYWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAvKiogUGF0dGVybiBzb3VyY2VzIHRoYXQgd2VyZSBhY3RpdmUgKGUuZy4gWydwYXNzd29yZHxzZWNyZXQnXSkuICovXG4gIHBhdHRlcm5zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBwb2xpY3kgc2F5cyBhYm91dCB0aGUgdmFsdWUgYXQgb25lIHVzZXItbGV2ZWwgcGF0aC5cbiAqXG4gKiAtIGAnY2xlYXInYCAg4oCUIG5vdGhpbmcgdG8gc2NydWI7IHJldGFpbiBhbmQgc2VydmUgdGhlIHZhbHVlIGFzIGl0IGlzLlxuICogLSBgJ3dob2xlJ2AgIOKAlCB0aGUgZW50aXJlIHZhbHVlIGlzIHNlY3JldC4gYGtleWAgaXMgdGhlIHBvbGljeSBvciBtYXJrZWRcbiAqICAga2V5IHRoYXQgZGVjaWRlZCBpdCAodGhlIHBhdGggaXRzZWxmIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzKS5cbiAqIC0gYCdmaWVsZHMnYCDigJQgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCB3aG9zZSBgcGF0aHNgIChkb3QtcGF0aHMgSU5TSURFIHRoZVxuICogICB2YWx1ZSwgcmVsYXRpdmUgdG8gaXQpIGFyZSBzZWNyZXQ7IGV2ZXJ5dGhpbmcgZWxzZSBpbiBpdCBpcyBub3QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZGFjdGlvblZlcmRpY3QgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2NsZWFyJyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnd2hvbGUnOyByZWFkb25seSBrZXk6IHN0cmluZyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZmllbGRzJzsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB9O1xuXG5leHBvcnQgY29uc3QgQ0xFQVI6IFJlZGFjdGlvblZlcmRpY3QgPSBPYmplY3QuZnJlZXplKHsga2luZDogJ2NsZWFyJyB9IGFzIGNvbnN0KTtcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBOQU1FIG9mIGBrZXlgIHVuZGVyIGBwYXRoYCDigJQgdGhlIGtleSBpdHNlbGYgYXQgdGhlIHRvcCBsZXZlbCwgZWxzZSB0aGUgc2VnbWVudHNcbiAqIGpvaW5lZCBieSBhIGRvdCAoYFsncHJvZmlsZSddICsgJ2F1dGgnYCDihpIgYCdwcm9maWxlLmF1dGgnYCk6IHdoYXQgYSB2ZXJkaWN0IGRlY2lkZXMgb24sIGEgbWFya1xuICogaG9sZHMsIGFuZCB0aGUgZnJhbWUga2V5cyBhIHN0YWdlJ3MgcmV0YWluZWQgcmVhZHMgYW5kIHdyaXRlcyBieSAoYFN0YWdlQ29udGV4dGApLiBBIG5hbWUsIG5vdCBhblxuICogYWRkcmVzcyDigJQgYSBrZXkgbWF5IGNvbnRhaW4gYSBkb3Qg4oCUIHNvIGl0IG5ldmVyIGdvZXMgaW50byBhIHRyYWNlIHBhdGguIE5vIGFsbG9jYXRpb24gZm9yIHRoZVxuICogY29tbW9uIHRvcC1sZXZlbCBrZXkuIChUaGUgcmVjb3JkIHNwZWxscyB0aGUgc2FtZSBuYW1lIGZvciBgcmVhZEtleXNgLCBgUmVjb3JkRnJhbWUgwrcgbm90ZVJlYWRgLilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJLZXlPZihwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xufVxuXG4vKipcbiAqIE1heGltdW0ga2V5IGxlbmd0aCAoY2hhcmFjdGVycykgdGhhdCB3aWxsIGJlIHRlc3RlZCBhZ2FpbnN0IHJlZ2V4IHJlZGFjdGlvblxuICogcGF0dGVybnMuIEtleXMgbG9uZ2VyIHRoYW4gdGhpcyBhcmUgc2tpcHBlZCBmb3IgcGF0dGVybiBtYXRjaGluZyB0byBwcmV2ZW50XG4gKiBSZURvUzogYSBwYXRob2xvZ2ljYWwgcmVnZXggdGVzdGVkIGFnYWluc3QgYW4gdW5ib3VuZGVkbHkgbG9uZyBrZXkgc3RyaW5nXG4gKiBjYW4gY2F1c2UgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy4gMjU2IGNoYXJhY3RlcnMgY29tZm9ydGFibHkgZXhjZWVkcyBhbnlcbiAqIHJlYWxpc3RpYyBzY29wZS1zdGF0ZSBrZXkgbmFtZS5cbiAqL1xuY29uc3QgTUFYX1BBVFRFUk5fS0VZX0xFTiA9IDI1NjtcblxuLyoqXG4gKiBUaGUgZmllbGRzIGEgcG9saWN5IGRlY2xhcmVzIHVuZGVyIGBrZXlgIOKAlCBvbmx5IHdoZW4gYGZpZWxkc2AgT1dOUyBga2V5YC5cbiAqIFRoZSBrZXkgaXMgYSBuYW1lIGZyb20gZGF0YSAoYSBzdGF0ZSBrZXksIGEgbmVzdGVkIGtleSBvZiBhIHJlY29yZCBoYW5kZWRcbiAqIG91dCB3aG9sZSksIGFuZCBhIHBsYWluLW9iamVjdCBsb29rdXAgcmVhZHMgdGhlIHByb3RvdHlwZSBjaGFpbjpcbiAqIGBmaWVsZHNbJ2NvbnN0cnVjdG9yJ11gIGlzIGBPYmplY3RgLCBgZmllbGRzWydfX3Byb3RvX18nXWAgaXNcbiAqIGBPYmplY3QucHJvdG90eXBlYC4gVGhlIHdhbGsgdGhlbiBpdGVyYXRlZCB0aGVtLCBzbyBhbnkgYGZpZWxkc2AgcG9saWN5XG4gKiBmYWlsZWQgdGhlIHJ1biB3aXRoIGEgVHlwZUVycm9yIG9uIGRhdGEgaG9sZGluZyBzdWNoIGEga2V5LlxuICovXG5mdW5jdGlvbiBkZWNsYXJlZEZpZWxkcyhmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBmaWVsZHMgIT09IHVuZGVmaW5lZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGRzLCBrZXkpID8gZmllbGRzW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBQb2xpY3kgcGF0dGVybnMgYXJlIHByZWRpY2F0ZXMsIG5vdCBjdXJzb3JzIG92ZXIgc3VjY2Vzc2l2ZSBrZXlzL2V2ZW50cy4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNQYXR0ZXJuKHZhbHVlOiBzdHJpbmcsIHBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXBhdHRlcm5zKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIC8vIE9ubHkgdGhlc2UgZmxhZ3MgY29uc3VtZSBsYXN0SW5kZXguIE9yZGluYXJ5IChpbmNsdWRpbmcgZnJvemVuKVxuICAgIC8vIHJlZ2V4ZXMgbmVlZCBubyB3cml0YWJsZSBjdXJzb3IgdG8gbWF0Y2guIEtlZXAgYWxsIG9yaWdpbmFsIGZsYWdzLlxuICAgIGlmIChwYXR0ZXJuLmdsb2JhbCB8fCBwYXR0ZXJuLnN0aWNreSkgcGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgIGlmIChwYXR0ZXJuLnRlc3QodmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWRhY3Rpb25SdWxlIHtcbiAgcHJpdmF0ZSBwb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkaWFnbm9zdGljUnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZDtcbiAgLyoqIFdoZXRoZXIgYHBvbGljeWAgbmFtZXMgYW55dGhpbmcgYSBzdGF0ZSB2ZXJkaWN0IGNhbiBhY3Qgb24g4oCUIGNvbXB1dGVkXG4gICAqICBvbmNlIHBlciBgc2V0UG9saWN5YCBzbyB7QGxpbmsgaXNJbmVydH0gaXMgYSB0d28tZmllbGQgY2hlY2suICovXG4gIHByaXZhdGUgcG9saWN5QWN0aXZlID0gZmFsc2U7XG4gIC8qKiBUaGUgcG9saWN5J3MgcGF0dGVybnMgdGhhdCBjYW4gZGVwZW5kIG9uIGEgd2hvbGUgZG90dGVkIHBhdGggKHtAbGluayBuZWVkc1BhdGh9KSDigJQgcGVyIGBzZXRQb2xpY3lgLiAqL1xuICBwcml2YXRlIHBhdGhQYXR0ZXJuczogcmVhZG9ubHkgUmVnRXhwW10gPSBbXTtcbiAgcHJpdmF0ZSB3YWxrTGltaXRXYXJuZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEtleXMgbWFya2VkIHNlY3JldCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biDigJQgYnkgYSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgLCBvciBieSBhbnkgd3JpdGUgdGhlIHBvbGljeSByZWRhY3RlZCB3aG9sZS5cbiAgICogT05FIHNldCBwZXIgcnVuLCBzaGFyZWQgYnkgZXZlcnkgc2NvcGUgYW5kIGNvbnRleHQgKHRoZSBleGVjdXRvciBidWlsZHNcbiAgICogdGhlIHJ1bGUgb25jZSBwZXIgcnVuIGFuZCBpbnN0YWxscyBpdCBvbiB0aGUgcnVudGltZSByb290KS5cbiAgICovXG4gIHByaXZhdGUgbWFya2VkOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIEZpZWxkcyBhIHN1YmZsb3cgbWFwcGVyIGhhbmRlZCB0byBhIE5FVyBrZXkgYWxvbmcgd2l0aCB0aGUgdmFsdWUgdGhleVxuICAgKiBiZWxvbmcgdG8g4oCUIHRhcmdldCBrZXkg4oaSIHRoZSBzb3VyY2Uga2V5J3MgZmllbGQgcGF0aHMgKGFuIG9iamVjdCBjb3BpZWRcbiAgICogYnkgcmVmZXJlbmNlIGZyb20gYSBgZmllbGRzYC1zZWxlY3RlZCBrZXk7IHtAbGluayBNYXBwZXJUYWludH0pLlxuICAgKiBSdW4td2lkZSwgYnkgbmFtZSwgbGlrZSB7QGxpbmsgbWFya2VkfS5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdGVkOiBNYXA8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGlzIHJ1bidzIHRocm93biB2YWx1ZXMgc2VydmVkIG1hc2tlZCAodGhlaXIgdGV4dCBzZWxlY3RlZCwgb3IgYSBzZWxlY3RlZCBrZXkgaW5zaWRlIHRoZW0pIOKGkiB0aGVpciBzZXJ2ZWQgZm9ybS4gKi9cbiAgcHJpdmF0ZSBtYXNrZWRFcnJvcnM6IE1hcDx1bmtub3duLCBTdHJ1Y3R1cmVkRXJyb3JJbmZvPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwb2xpY3k/OiBSZWRhY3Rpb25Qb2xpY3ksIG1hcmtlZD86IFNldDxzdHJpbmc+KSB7XG4gICAgdGhpcy5tYXJrZWQgPSBtYXJrZWQgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5zZXRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIGdldFBvbGljeSgpOiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIHNldFBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIGNvbnN0IGRpYWdub3N0aWNzID0gcG9saWN5Py5kaWFnbm9zdGljcztcbiAgICB0aGlzLmRpYWdub3N0aWNSdWxlID0gZGlhZ25vc3RpY3NcbiAgICAgID8gbmV3IFJlZGFjdGlvblJ1bGUoeyBrZXlzOiBkaWFnbm9zdGljcy5rZXlzLCBwYXR0ZXJuczogZGlhZ25vc3RpY3MucGF0dGVybnMsIGZpZWxkczogZGlhZ25vc3RpY3MuZmllbGRzIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhdGhQYXR0ZXJucyA9IChwb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5maWx0ZXIobmVlZHNQYXRoKTtcbiAgICB0aGlzLnBvbGljeUFjdGl2ZSA9XG4gICAgICBwb2xpY3kgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKChwb2xpY3kua2V5cz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgICAocG9saWN5LnBhdHRlcm5zPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKHBvbGljeS5maWVsZHMgPz8ge30pLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGlzIHJ1bGUgaGFzIG5vdGhpbmcgdG8gc2F5IGFib3V0IEFOWSBwYXRoIOKAlCBubyBrZXksIHBhdHRlcm5cbiAgICogb3IgZmllbGQgaW4gdGhlIHBvbGljeSBhbmQgbm8ga2V5IG1hcmtlZCBzbyBmYXIuIFRoZSBuby1wb2xpY3kgZmFzdFxuICAgKiBwYXRoOiBgU3RhZ2VDb250ZXh0YCBza2lwcyB0aGUgdmVyZGljdCAoYW5kIGl0cyBwYXRoIGFsbG9jYXRpb24pIG9uXG4gICAqIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhbmQgc3RhZ2VkIHdyaXRlIHdoaWxlIHRoaXMgaG9sZHMuIEEgcGVyLWNhbGxcbiAgICogYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCBtYXJrcyBhIGtleSBhbmQgZW5kcyBpdC5cbiAgICovXG4gIGlzSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFya2VkLnNpemUgPT09IDAgJiYgIXRoaXMucG9saWN5QWN0aXZlICYmIHRoaXMuaW5oZXJpdGVkID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIHNoYXJlZCBtYXJrZWQta2V5cyBzZXQg4oCUIGZvciB0aGUgYEBpbnRlcm5hbGAgc2hhcmluZyBwcm90b2NvbCBhbmQgYGRlY2lkZSgpYC4gKi9cbiAgbWFya2VkS2V5cygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFya2VkO1xuICB9XG5cbiAgdXNlTWFya2VkS2V5cyhzaGFyZWQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQgPSBzaGFyZWQ7XG4gIH1cblxuICBtYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuYWRkKGtleSk7XG4gIH1cblxuICAvKiogRGVsZXRpbmcgYSBrZXkgY2xlYXJzIGl0cyBwZXItY2FsbCBtYXJrIGFuZCBhbnkgZmllbGRzIGEgbWFwcGVyIGdhdmUgaXQ7IGEgcG9saWN5IHZlcmRpY3Qgc3Vydml2ZXMgaXQuICovXG4gIHVubWFyayhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFya2VkLmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLmluaGVyaXRlZD8uZGVsZXRlKGtleSkgJiYgdGhpcy5pbmhlcml0ZWQuc2l6ZSA9PT0gMCkgdGhpcy5pbmhlcml0ZWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogS2V5LWxldmVsIHZlcmRpY3Q6IG1hcmtlZCwgbGlzdGVkIGluIGBwb2xpY3kua2V5c2AsIG9yIG1hdGNoaW5nIGEgcGF0dGVybi4gKi9cbiAgaXNLZXlSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1hcmtlZC5oYXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLnBvbGljeSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnBvbGljeS5rZXlzPy5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucG9saWN5LnBhdHRlcm5zO1xuICAgIGlmICghcGF0dGVybnMgfHwgcGF0dGVybnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGtleS5sZW5ndGggPiBNQVhfUEFUVEVSTl9LRVlfTEVOKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGtleSAnJHtrZXkuc2xpY2UoMCwgNDApfS4uLicgKCR7a2V5Lmxlbmd0aH0gY2hhcnMpIGV4Y2VlZHMgYCArXG4gICAgICAgICAgICAndGhlIHBhdHRlcm4tbWF0Y2hpbmcgbGVuZ3RoIGNhcCBhbmQgd2FzIHNraXBwZWQuICcgK1xuICAgICAgICAgICAgJ1VzZSBwb2xpY3kua2V5cyBmb3IgZXhhY3QgbWF0Y2hpbmcgb2YgbG9uZyBrZXkgbmFtZXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKGtleSwgcGF0dGVybnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhbiBlbWl0dGVkIHBheWxvYWQgQkVGT1JFIGRpc3BhdGNoL2NhcHR1cmUuIEVtaXQgbmFtZXMgYXJlIG5vdFxuICAgKiBzdGF0ZSBwYXRoczogbm8ga2V5LWxlbmd0aCBjYXAsIG1hcmtzIG9yIGZpZWxkIHNjcnViIGFwcGxpZXMgaGVyZS5cbiAgICogQSBjbGVhciBwYXlsb2FkIGtlZXBzIGl0cyBpZGVudGl0eTsgZGlhZ25vc3RpYyBiYWdzIGFyZSB1bnRvdWNoZWQuXG4gICAqL1xuICByZXRhaW5FbWl0KG5hbWU6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IHVua25vd24ge1xuICAgIHJldHVybiBtYXRjaGVzUGF0dGVybihuYW1lLCB0aGlzLnBvbGljeT8uZW1pdFBhdHRlcm5zKSA/IFNDT1BFX1BMQUNFSE9MREVSIDogcGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gYSBOQU1FRCBkaWFnbm9zdGljIGVudHJ5IOKAlCBgYWRkcmVzc2AgaXMgYFtjaGFubmVsLCAuLi5wYXRoLCBuYW1lXWBcbiAgICogKGAkZGVidWcoJ3Rva2VuJywgdilgIOKGkiBgWydsb2dzJywgJ3Rva2VuJ11gOyBgJGxvZyh2KWAg4oaSIGBbJ2xvZ3MnLFxuICAgKiAnbWVzc2FnZXMnXWApLiBUSEUgTUFQUElORzogdGhlIGVudHJ5IGlzIHRoZSByZWNvcmQgYHsgW25hbWVdOiB2YWx1ZSB9YFxuICAgKiBoYW5kZWQgb3V0IHdob2xlLCBzbyBpdCBpcyByZXRhaW5lZCBhcyBhIGJvdW5kYXJ5IHJlY29yZCBob2xkaW5nIHRoZVxuICAgKiBzdGF0ZSBrZXkgYG5hbWVgIHdvdWxkIGJlIOKAlCB0aGUgc3RhdGUgdmVyZGljdCBhdCBgWy4uLnBhdGgsIG5hbWVdYCAoa2V5cyxcbiAgICogcGF0dGVybnMgYW5kIG1hcmtzIGF0IGV2ZXJ5IGRvdHRlZCBwcmVmaXggYW5kIGF0IHRoZSBuYW1lIGl0c2VsZjsgdGhlIHRvcFxuICAgKiBrZXkncyBgZmllbGRzYCksIHRoZW4gZXZlcnkgbmVzdGVkIG93biBrZXkgd2hvc2UgbmFtZSBvciBkb3R0ZWQgcGF0aCBpc1xuICAgKiBzZWxlY3RlZCAoe0BsaW5rIHJldGFpbkJvdW5kYXJ5fSdzIHdhbGspLiBUaGUgY2hhbm5lbCB0YWtlcyBubyBwYXJ0OlxuICAgKiBgbG9ncy50b2tlbmAsIGBlcnJvcnMudG9rZW5gIGFuZCBgbWV0cmljcy50b2tlbmAgYXJlIGFsbCB0aGUgc3RhdGUga2V5XG4gICAqIGB0b2tlbmAuIGBwb2xpY3kuZGlhZ25vc3RpY3NgIChkaWFnbm9zdGljLW9ubHkgc2VsZWN0b3JzLCByb290ZWQgYXQgdGhlXG4gICAqIGNoYW5uZWwpIGFwcGxpZXMgb24gdG9wLiBDbGVhciB2YWx1ZXMga2VlcCB0aGVpciBpZGVudGl0eS5cbiAgICovXG4gIHJldGFpbkRpYWdub3N0aWMoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuaXNJbmVydCgpID8gdmFsdWUgOiB0aGlzLnJldGFpbk5hbWVkKGFkZHJlc3Muc2xpY2UoMSksIHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5kaWFnbm9zdGljUnVsZSA/IHRoaXMuZGlhZ25vc3RpY1J1bGUucmV0YWluKGFkZHJlc3MsIGtlcHQpIDoga2VwdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gZmxvdy1tZXNzYWdlIHRleHQgKGBmbG93TWVzc2FnZXMuZGVzY3JpcHRpb25gIC8gYC5yYXRpb25hbGVgKTogdGV4dFxuICAgKiB0aGUgZW5naW5lIGNvbXBvc2VzIGhhcyBubyBuYW1lIG9mIGl0cyBvd24sIHNvIG5vIHN0YXRlIHNlbGVjdG9yIHJlYWNoZXNcbiAgICogaXQg4oCUIG9ubHkgYHBvbGljeS5kaWFnbm9zdGljc2Agc2VsZWN0cyBpdC5cbiAgICovXG4gIHJldGFpbkZsb3dUZXh0KGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCB0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gKHRoaXMuZGlhZ25vc3RpY1J1bGUucmV0YWluKGFkZHJlc3MsIHRleHQpIGFzIHN0cmluZykgOiB0ZXh0O1xuICB9XG5cbiAgLyoqIHtAbGluayByZXRhaW5EaWFnbm9zdGljfSdzIHN0YXRlIGhhbGY6IHRoZSB2YWx1ZSBuYW1lZCBieSBgcGF0aGAgKGl0cyBsYXN0IHNlZ21lbnQpLCBzZXJ2ZWQgd2hvbGUuICovXG4gIHByaXZhdGUgcmV0YWluTmFtZWQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgICAgIHBhdGgubGVuZ3RoID4gMSAmJiB0aGlzLmlzS2V5UmVkYWN0ZWQobmFtZSkgPyB7IGtpbmQ6ICd3aG9sZScsIGtleTogbmFtZSB9IDogdGhpcy52ZXJkaWN0KHBhdGgpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBrZXB0ID0gUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSk7XG4gICAgaWYgKGtlcHQgPT09IG51bGwgfHwgdHlwZW9mIGtlcHQgIT09ICdvYmplY3QnKSByZXR1cm4ga2VwdDtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5qb2luKCcuJyk7XG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aChrZXB0LCBiYXNlLCB0aGlzLmRvdHRlZFRhcmdldHMoYmFzZSksIHRoaXMubmFtZXNXYWxrKGZhbHNlKSwgU0NPUEVfUExBQ0VIT0xERVIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBhIHRocm93biB2YWx1ZSwgZGVjaWRlZCBPTkNFIGF0IGl0cyBlcnJvciBzaXRlIGZyb20gdGhlXG4gICAqIHRleHQgdGhlIGRpYWdub3N0aWMgY29sbGVjdG9yIHJldGFpbmVkIGZvciBgZXJyb3JzLnN0YWdlRXhlY3V0aW9uRXJyb3JgXG4gICAqIChga2VwdGApIGFuZCBmcm9tIHRoZSB2YWx1ZSBpdHNlbGYg4oCUIGEgcmVjb3JkIGhhbmRlZCBvdXQgd2hvbGUsIG1hc2tlZFxuICAgKiB3aGVuIG9uZSBvZiBpdHMgb3duIGtleXMsIGF0IGFueSBkZXB0aCwgY2FycmllcyBhIHNlbGVjdGVkIG5hbWUuXG4gICAqIFVubWFza2VkOiB0b2RheSdzIHN0cnVjdHVyZWQgaW5mby4gTWFza2VkOiB0aGUgZXJyb3IncyBgbmFtZWAvYGNvZGVgIGtlcHQsXG4gICAqIG5vIGBpc3N1ZXNgICh0aGV5IHF1b3RlIHRoZSBpbnB1dCkgYW5kIG5vIGByYXdgIGVycm9yIChpdCBob2xkcyB0aGUgdGV4dFxuICAgKiBhbmQgdGhlIGtleXMpOyB0aGUgbWVzc2FnZSBpcyB0aGUgcGxhY2Vob2xkZXIgd2hlbiB0aGUgdGV4dCB3YXMgc2VsZWN0ZWQsXG4gICAqIHRoZSB0ZXh0IGl0c2VsZiB3aGVuIG9ubHkgYSBrZXkgd2FzIOKAlCByZW1lbWJlcmVkIHNvIGBvblJ1bkZhaWxlZGAsIHRoZVxuICAgKiBsb2dnZXIgYW5kIGEgZm9yayBlbnZlbG9wZSBzZXJ2ZSB0aGUgc2FtZSBmb3JtICh7QGxpbmsgc2VydmVkRXJyb3J9KS4gVGhlXG4gICAqIHRocm93biB2YWx1ZSBpdHNlbGYgc3RheXMgcmVhbC5cbiAgICovXG4gIHJldGFpblN0YWdlRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtlcHQ6IHVua25vd24sXG4gICk6IHsgbWVzc2FnZTogc3RyaW5nOyBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfSB7XG4gICAgY29uc3QgaW5mbyA9IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpO1xuICAgIGNvbnN0IHRleHRTZWxlY3RlZCA9IGtlcHQgIT09IHRleHQ7XG4gICAgaWYgKCF0ZXh0U2VsZWN0ZWQgJiYgIXRoaXMuY2Fycmllc1NlbGVjdGVkS2V5KGVycm9yKSkgcmV0dXJuIHsgbWVzc2FnZTogdGV4dCwgc3RydWN0dXJlZEVycm9yOiBpbmZvIH07XG4gICAgY29uc3QgbWVzc2FnZSA9IHRleHRTZWxlY3RlZCA/IFN0cmluZyhrZXB0KSA6IHRleHQ7XG4gICAgY29uc3QgbWFza2VkOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvID0ge1xuICAgICAgbWVzc2FnZTogdGV4dFNlbGVjdGVkID8gbWVzc2FnZSA6IGluZm8ubWVzc2FnZSxcbiAgICAgIC4uLihpbmZvLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWU6IGluZm8ubmFtZSB9KSxcbiAgICAgIC4uLihpbmZvLmNvZGUgIT09IHVuZGVmaW5lZCAmJiB7IGNvZGU6IGluZm8uY29kZSB9KSxcbiAgICAgIHJhdzogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgKHRoaXMubWFza2VkRXJyb3JzID8/PSBuZXcgTWFwKCkpLnNldChlcnJvciwgbWFza2VkKTtcbiAgICByZXR1cm4geyBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3I6IG1hc2tlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgYSB0aHJvd24gdmFsdWUgY2FycnkgYSBzZWxlY3RlZCBuYW1lIOKAlCBhbiBvd24ga2V5LCBhdCBhbnkgZGVwdGgsIHRoYXRcbiAgICogdGhlIHBvbGljeSBvciBhIG1hcmsgc2VsZWN0cz8gVG90YWw6IGEgdmFsdWUgd2hvc2Uga2V5cyBjYW5ub3QgYmUgcmVhZCBpc1xuICAgKiBzZXJ2ZWQgbWFza2VkICh0aGUgc2FmZSBzaWRlKSwgbmV2ZXIgYSBzZWNvbmQgdGhyb3cgZnJvbSBhbiBlcnJvciBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXJyaWVzU2VsZWN0ZWRLZXkodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy50aHJvd25DYXJyaWVzKHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gS2V5cyB0aGF0IGNhbm5vdCBiZSByZWFkIChhIHRocm93aW5nIGdldHRlciwgYSByZXZva2VkIFByb3h5KSBvciBhIHdhbGsgcGFzdCBpdHNcbiAgICAgIC8vIGxpbWl0OiBzZXJ2ZWQgaW4gdGhlIG1hc2tlZCBmb3JtIOKAlCBpdHMgdGV4dCBrZXB0LCBubyBgcmF3YC5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgdGhyb3duIHZhbHVlIGFuZCB3aGF0IGEgbG9nZ2VyIG9yIGEgc2VyaWFsaXplciBwcmludHMgd2l0aCBpdDogaXRzIG93blxuICAgKiBrZXlzIGF0IGV2ZXJ5IGRlcHRoLCBhbmQgaXRzIGBjYXVzZWAgLyBhbiBgQWdncmVnYXRlRXJyb3JgJ3MgYGVycm9yc2Ag4oCUIG93blxuICAgKiBOT04tZW51bWVyYWJsZSBrZXlzIG5vIGtleSB3YWxrIHNlZXMg4oCUIGVhY2ggd2Fsa2VkIHRoZSBzYW1lIHdheSAoYSBjeWNsZVxuICAgKiBhbW9uZyB0aGVtIGlzIGZvbGxvd2VkIG9uY2UpLlxuICAgKi9cbiAgcHJpdmF0ZSB0aHJvd25DYXJyaWVzKHZhbHVlOiBvYmplY3QsIHNlZW46IFNldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICBpZiAoc2VsZWN0c0J5UGF0aCh2YWx1ZSwgdW5kZWZpbmVkLCB0aGlzLmRvdHRlZFRhcmdldHModW5kZWZpbmVkKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBuZXcgTWFwKCksIDApLnNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgb3duID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpID8gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVycm9ycyA9IG93bignZXJyb3JzJyk7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIFtvd24oJ2NhdXNlJyksIC4uLihBcnJheS5pc0FycmF5KGVycm9ycykgPyBlcnJvcnMgOiBbXSldKSB7XG4gICAgICBpZiAocGFydCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFydCA9PT0gJ29iamVjdCcgJiYgdGhpcy50aHJvd25DYXJyaWVzKHBhcnQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBrZXktbGV2ZWwgcnVsZXMgYXMgdGhlIHBhdGggd2FsayBhc2tzIHRoZW0gKHtAbGluayBzZXJ2ZWRCeVBhdGh9KTogYVxuICAgKiBuZXN0ZWQga2V5IGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gTkFNRSAobWFya3MsIGtleXMsIHBhdHRlcm5zKSwgYW5kIOKAlCB1bmRlclxuICAgKiBwYXR0ZXJucyBvbmx5IOKAlCBieSBpdHMgZG90dGVkIHBhdGg7IGEgZGVjbGFyZWQgKG9yIGluaGVyaXRlZCkgZmllbGQgYmVsb3cgYVxuICAgKiBrZXkgb2YgaXRzIG5hbWUgaXMgYSB0YXJnZXQuIERvdHRlZCBrZXlzIGFuZCBtYXJrcyBhcmUgVEFSR0VUUyBmcm9tIHRoZVxuICAgKiB3YWxrJ3Mgcm9vdCAoe0BsaW5rIGRvdHRlZFRhcmdldHN9KSwgc28gd2l0aG91dCBwYXR0ZXJucyBubyBkZWNpc2lvblxuICAgKiBkZXBlbmRzIG9uIHRoZSBwYXRoIGFuZCB0aGUgd2FsayBzaGFyZXMgdGhlbSBwZXIgb2JqZWN0IChsaW5lYXIgb24gYSBEQUcpLlxuICAgKiBgcm9vdERlY2lkZWRgOiB0aGUgcm9vdCdzIG93biBrZXlzIHdlcmUgYWxyZWFkeSBkZWNpZGVkIChgcmV0YWluUmVjb3JkYCkuXG4gICAqL1xuICBwcml2YXRlIG5hbWVzV2Fsayhyb290RGVjaWRlZDogYm9vbGVhbik6IFdhbGsge1xuICAgIGNvbnN0IGJ5UGF0aCA9IHRoaXMucGF0aFBhdHRlcm5zO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lczoge1xuICAgICAgICBtYXNrczogKG5hbWUpID0+IHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSxcbiAgICAgICAgLi4uKGJ5UGF0aC5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICBwYXRoTWFza3M6IChwYXRoOiBzdHJpbmcpID0+IHBhdGgubGVuZ3RoIDw9IE1BWF9QQVRURVJOX0tFWV9MRU4gJiYgbWF0Y2hlc1BhdHRlcm4ocGF0aCwgYnlQYXRoKSxcbiAgICAgICAgfSksXG4gICAgICAgIGZpZWxkczogKG5hbWUpID0+IHRoaXMuZmllbGRzT2YobmFtZSksXG4gICAgICB9LFxuICAgICAgcm9vdERlY2lkZWQsXG4gICAgICAuLi4oYnlQYXRoLmxlbmd0aCA9PT0gMCAmJiB7IG1lbW86IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+KCkgfSksXG4gICAgICBidWRnZXQ6IHdhbGtMaW1pdCxcbiAgICAgIG9uTGltaXQ6ICgpID0+IHRoaXMud2FybldhbGtMaW1pdChieVBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKiogT25jZSBwZXIgcnVsZSwgaW4gZGV2IG1vZGU6IGEgcGF0aCB3YWxrIHBhc3NlZCBpdHMgbGltaXQgYW5kIHNlcnZlZCBpdHMgcmVtYWluZGVyIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgcHJpdmF0ZSB3YXJuV2Fsa0xpbWl0KHBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLndhbGtMaW1pdFdhcm5lZCB8fCAhaXNEZXZNb2RlKCkpIHJldHVybjtcbiAgICB0aGlzLndhbGtMaW1pdFdhcm5lZCA9IHRydWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2Zvb3RwcmludF0gUmVkYWN0aW9uUG9saWN5OiBhIHZhbHVlIHdpdGggbW9yZSB0aGFuICR7d2Fsa0xpbWl0fSBwYXRocyB1bmRlciB0aGUgcGF0aCBwYXR0ZXJuKHMpIGAgK1xuICAgICAgICBgJHtwYXR0ZXJucy5tYXAoU3RyaW5nKS5qb2luKCcsICcpfSDigJQgdGhlIHBhdGhzIHBhc3QgdGhhdCB3ZXJlIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuIGAgK1xuICAgICAgICAnQSBwYXR0ZXJuIHRoYXQgbmFtZXMgYSBLRVkgKG5vIGRvdCwgbm8gbG9va2Fyb3VuZCkgaXMgZGVjaWRlZCBwZXIgb2JqZWN0OyBwcmVmZXIgb25lLCBvciBrZXlzL2ZpZWxkcy4nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRvdHRlZCBrZXlzIGFuZCBtYXJrcyB0aGF0IG5hbWUgYSBwYXRoIHVuZGVyIGBiYXNlYCAodGhlIHdhbGsncyByb290OlxuICAgKiBgdW5kZWZpbmVkYCBmb3IgYSByZWNvcmQncyBvd24ga2V5cywgYW4gZW50cnkncyBuYW1lIGZvciBhIGRpYWdub3N0aWMpLFxuICAgKiBhcyB0YXJnZXRzIHJlbGF0aXZlIHRvIGl0IOKAlCBhIGRvdHRlZCBydWxlIGlzIGV4YWN0IHRvIGl0cyBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBkb3R0ZWRUYXJnZXRzKGJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgICBjb25zdCBwcmVmaXggPSBiYXNlID09PSB1bmRlZmluZWQgPyAnJyA6IGAke2Jhc2V9LmA7XG4gICAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICAgIGNvbnN0IGFkZCA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnLicpIHx8ICFuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBuYW1lLmxlbmd0aCA9PT0gcHJlZml4Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgb3V0LnB1c2gobmFtZS5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdCgnLicpKTtcbiAgICB9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLm1hcmtlZCkgYWRkKG5hbWUpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLnBvbGljeT8ua2V5cyA/PyBbXSkgYWRkKG5hbWUpO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhbnkgb2JzZXJ2ZXIgaXMgc2VydmVkIGZvciBhIHRocm93biB2YWx1ZSDigJQgcmV0cnksIHRocm90dGxlLCBydW5cbiAgICogZmFpbHVyZSwgYSBmb3JrIGVudmVsb3BlLCB0aGUgbG9nZ2VyOiBpdHMgcmVtZW1iZXJlZCBzdGFnZSBmb3JtLCBlbHNlIHRoZVxuICAgKiBzYW1lIGRlY2lzaW9uIG1hZGUgbm93IChhbmQgcmVtZW1iZXJlZCksIGVsc2UgaXRzIHN0cnVjdHVyZWQgaW5mby5cbiAgICovXG4gIHNlcnZlZEVycm9yKGVycm9yOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgLy8gRWFjaCBldmVudCBnZXRzIGl0cyBvd24gb2JqZWN0LCBhcyBleHRyYWN0RXJyb3JJbmZvIGdpdmVzIGl0IG9uZS5cbiAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGxvZ2dlciBpcyBoYW5kZWQ6IHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmIHVubGVzcyB0aGUgcG9saWN5IG1hc2tlZCBpdHMgdGV4dC4gKi9cbiAgbG9nZ2FibGVFcnJvcihlcnJvcjogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIG1hc2tlZEVycm9yKGVycm9yOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga25vd24gPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KGVycm9yKTtcbiAgICBpZiAoa25vd24gfHwgdGhpcy5pc0RpYWdub3N0aWNJbmVydCgpKSByZXR1cm4ga25vd247XG4gICAgY29uc3QgdGV4dCA9IHRocm93blRleHQoZXJyb3IpO1xuICAgIHRoaXMucmV0YWluU3RhZ2VFcnJvcihlcnJvciwgdGV4dCwgdGhpcy5yZXRhaW5EaWFnbm9zdGljKFsnZXJyb3JzJywgJ3N0YWdlRXhlY3V0aW9uRXJyb3InXSwgdGV4dCkpO1xuICAgIHJldHVybiB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KGVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RoaW5nIGNhbiBtYXNrIGEgZGlhZ25vc3RpYyBlbnRyeSBvciBhIHRocm93biB2YWx1ZSDigJQgbm8gc3RhdGUgc2VsZWN0b3IsXG4gICAqIG5vIG1hcmssIG5vIGRpYWdub3N0aWMgc2VsZWN0b3I6IHRoZSBjb2xsZWN0b3JzJyBhbmQgdGhlIGVycm9yIHBhdGhzJyBmYXN0XG4gICAqIHBhdGggKGEgbm8tcG9saWN5IHJ1biBuZXZlciByZWFkcyBhIHBheWxvYWQsIGluY2x1ZGluZyBib3Jyb3dlZCBnZXR0ZXJzKS5cbiAgICovXG4gIGlzRGlhZ25vc3RpY0luZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSW5lcnQoKSAmJiB0aGlzLmlzRmxvd1RleHRJbmVydCgpO1xuICB9XG5cbiAgLyoqIE5vdGhpbmcgY2FuIG1hc2sgZmxvdy1tZXNzYWdlIHRleHQg4oCUIG9ubHkgYHBvbGljeS5kaWFnbm9zdGljc2Agc2VsZWN0cyBpdCAoe0BsaW5rIHJldGFpbkZsb3dUZXh0fSkuICovXG4gIGlzRmxvd1RleHRJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZGlhZ25vc3RpY1J1bGUgfHwgdGhpcy5kaWFnbm9zdGljUnVsZS5pc0luZXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGEgdXNlci1sZXZlbCBwYXRoIOKAlCBgWydwcm9maWxlJ11gIGZvciBhIHNjb3BlIGtleSxcbiAgICogYFsncHJvZmlsZScsICdhdXRoJ11gIGZvciBhIG5lc3RlZCB3cml0ZSBzdWNoIGFzIGEgc3ViZmxvdyBzZWVkLlxuICAgKlxuICAgKiBFdmVyeSBkb3R0ZWQgcHJlZml4IGlzIHRlc3RlZCBhdCBrZXkgbGV2ZWwgKGBwcm9maWxlYCwgdGhlblxuICAgKiBgcHJvZmlsZS5hdXRoYCksIHNvIGEgcG9saWN5IHRoYXQgbmFtZXMgYSBrZXkgY292ZXJzIGV2ZXJ5dGhpbmcgd3JpdHRlblxuICAgKiBiZW5lYXRoIGl0LiBgZmllbGRzYCBhcmUgZGVjbGFyZWQgcmVsYXRpdmUgdG8gdGhlIFRPUCBrZXk7IGZvciBhIG5lc3RlZFxuICAgKiBwYXRoIHRoZXkgYXJlIHJlLWJhc2VkIG9udG8gdGhlIHZhbHVlIGJlaW5nIHdyaXR0ZW4sIGFuZCBhIGZpZWxkIHRoYXRcbiAgICogbmFtZXMgdGhlIHdyaXR0ZW4gcGF0aCBleGFjdGx5IG1ha2VzIHRoZSB3aG9sZSB2YWx1ZSBzZWNyZXQuXG4gICAqL1xuICB2ZXJkaWN0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gQ0xFQVI7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy52ZXJkaWN0T2ZLZXkocGF0aFswXSk7XG4gICAgbGV0IGRvdHRlZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgZG90dGVkID0gaSA9PT0gMCA/IHBhdGhbMF0gOiBgJHtkb3R0ZWR9LiR7cGF0aFtpXX1gO1xuICAgICAgaWYgKHRoaXMuaXNLZXlSZWRhY3RlZChkb3R0ZWQpKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXk6IGRvdHRlZCB9O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkc09mKHBhdGhbMF0pO1xuICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IHBhdGhbMF0sIHBhdGhzOiBmaWVsZHMgfTtcbiAgICBjb25zdCByZWwgPSBwYXRoLnNsaWNlKDEpLmpvaW4oJy4nKTtcbiAgICBjb25zdCBpbnNpZGU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIC8vIFRoZSB3cml0dGVuIHBhdGggSVMgYSBzZWNyZXQgZmllbGQ6IHRoZSB3aG9sZSB2YWx1ZSBpcyBzZWNyZXQsIGFuZFxuICAgICAgLy8gdGhlIGtleSB0aGF0IGRlY2lkZWQgaXQgaXMgdGhhdCBkb3R0ZWQgcGF0aCDigJQgbmV2ZXIgdGhlIHRvcCBrZXksXG4gICAgICAvLyB3aG9zZSBzaWJsaW5ncyBzdGF5IGNsZWFyLlxuICAgICAgaWYgKGZpZWxkID09PSByZWwpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgICBpZiAoZmllbGQuc3RhcnRzV2l0aChgJHtyZWx9LmApKSBpbnNpZGUucHVzaChmaWVsZC5zbGljZShyZWwubGVuZ3RoICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zaWRlLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IHBhdGhbMF0sIHBhdGhzOiBpbnNpZGUgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJkaWN0IGZvciBga2V5YCB3cml0dGVuIG9yIHJlYWQgdW5kZXIgYHBhdGhgIOKAlCB0aGUgY29tbW9uXG4gICAqIHNpbmdsZS1zZWdtZW50IGNhc2UgKGBwYXRoYCBlbXB0eTogZXZlcnkgZmFjYWRlIHdyaXRlIGFuZCByZWFkKSBkZWNpZGVzXG4gICAqIG9uIHRoZSBrZXkgc3RyaW5nIGFsb25lLCBubyBhcnJheSBhbGxvY2F0ZWQuXG4gICAqL1xuICB2ZXJkaWN0QXQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIGtleTogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHBhdGgubGVuZ3RoID09PSAwID8gdGhpcy52ZXJkaWN0T2ZLZXkoa2V5KSA6IHRoaXMudmVyZGljdChbLi4ucGF0aCwga2V5XSk7XG4gIH1cblxuICAvKiogVGhlIHNpbmdsZS1zZWdtZW50IHZlcmRpY3Q6IGtleS1sZXZlbCBoaXQg4oaSIHdob2xlOyBkZWNsYXJlZCBvciBpbmhlcml0ZWQgZmllbGRzIOKGkiBmaWVsZHMuICovXG4gIHByaXZhdGUgdmVyZGljdE9mS2V5KGtleTogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKHRoaXMuaXNLZXlSZWRhY3RlZChrZXkpKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXkgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkc09mKGtleSk7XG4gICAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIGZpZWxkcy5sZW5ndGggPiAwID8geyBraW5kOiAnZmllbGRzJywga2V5LCBwYXRoczogZmllbGRzIH0gOiBDTEVBUjtcbiAgfVxuXG4gIC8qKiBUaGUgc2VjcmV0IGZpZWxkcyBvZiBhIHRvcCBrZXk6IHRoZSBwb2xpY3kncywgcGx1cyBhbnkgYSBtYXBwZXIgaGFuZGVkIGl0ICh7QGxpbmsgTWFwcGVyVGFpbnR9KS4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNPZihrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWNsYXJlZCA9IGRlY2xhcmVkRmllbGRzKHRoaXMucG9saWN5Py5maWVsZHMsIGtleSk7XG4gICAgY29uc3QgaW5oZXJpdGVkID0gdGhpcy5pbmhlcml0ZWQ/LmdldChrZXkpO1xuICAgIGlmIChpbmhlcml0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlY2xhcmVkO1xuICAgIHJldHVybiBkZWNsYXJlZCA9PT0gdW5kZWZpbmVkID8gaW5oZXJpdGVkIDogWy4uLm5ldyBTZXQoWy4uLmRlY2xhcmVkLCAuLi5pbmhlcml0ZWRdKV07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bidzIG1hcmtzIGFuZCB0aGUgZmllbGRzIG1hcHBlcnMgaGFuZGVkIHRvIG5ldyBrZXlzLCBhcyBOQU1FUyDigJQgd2hhdFxuICAgKiBhIHBhdXNlIGNhcnJpZXMgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChubyBwb2xpY3ksIG5vIHBlci1jYWxsIG1hcmspLlxuICAgKi9cbiAgbWFya3NGb3JDaGVja3BvaW50KCk6IFJlZGFjdGlvbk1hcmtzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiB0aGlzLmluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBrZXlzOiBbLi4udGhpcy5tYXJrZWRdLFxuICAgICAgLi4uKHRoaXMuaW5oZXJpdGVkICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBmaWVsZHM6IE9iamVjdC5mcm9tRW50cmllcyhbLi4udGhpcy5pbmhlcml0ZWRdLm1hcCgoW2tleSwgcGF0aHNdKSA9PiBba2V5LCBbLi4ucGF0aHNdXSkpLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBTZWVkIGEgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlIG1hcmtzIGl0cyBwYXVzZSBjYXJyaWVkICh7QGxpbmsgbWFya3NGb3JDaGVja3BvaW50fSkuICovXG4gIHJlc3RvcmVNYXJrcyhtYXJrczogUmVkYWN0aW9uTWFya3MpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBtYXJrcy5rZXlzKSB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHBhdGhzXSBvZiBPYmplY3QuZW50cmllcyhtYXJrcy5maWVsZHMgPz8ge30pKSB0aGlzLmluaGVyaXRGaWVsZHMoa2V5LCBwYXRocyk7XG4gIH1cblxuICAvKipcbiAgICogQSBzdWJmbG93IG1hcHBlcidzIGNvcHkgaW5oZXJpdHMgdGhlIGZpZWxkcyBvZiB0aGUgdmFsdWUgaXQgY29waWVkOlxuICAgKiBgdGFyZ2V0YCBpcyBhIGtleSB0aGUgbWFwcGVyIHdyb3RlOyBgcGF0aHNgIHRoZSBzb3VyY2Uga2V5J3MgZmllbGQgcGF0aHNcbiAgICogKGRlY2xhcmVkIG9yIHRoZW1zZWx2ZXMgaW5oZXJpdGVkKS4gUnVuLXdpZGUsIGJ5IG5hbWUsIGxpa2UgYSBtYXJrLlxuICAgKi9cbiAgaW5oZXJpdEZpZWxkcyh0YXJnZXQ6IHN0cmluZywgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgcHJpb3IgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KHRhcmdldCkgPz8gW107XG4gICAgKHRoaXMuaW5oZXJpdGVkID8/PSBuZXcgTWFwKCkpLnNldCh0YXJnZXQsIFsuLi5uZXcgU2V0KFsuLi5wcmlvciwgLi4ucGF0aHNdKV0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZXJkaWN0IG9mIGEga2V5IGEgbWFwcGVyIHJlYWQg4oCUIGBydW5zYCAodGhlIHJ1biBuYW1lc3BhY2VzLCBgUlVOX05BTUVTUEFDRWApIGlzIHNlbGVjdGVkIHdoZW4gYW55IG5hbWVzcGFjZWQga2V5IGlzLiAqL1xuICB2ZXJkaWN0T2ZSZWFkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnZlcmRpY3RPZktleShrZXkpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwga2V5ICE9PSBSVU5fTkFNRVNQQUNFIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB2ZXJkaWN0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNwYWNlIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICBpZiAoc3BhY2UgPT09IG51bGwgfHwgdHlwZW9mIHNwYWNlICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGlubmVyIG9mIE9iamVjdC5rZXlzKHNwYWNlKSkge1xuICAgICAgICBpZiAodGhpcy52ZXJkaWN0T2ZLZXkoaW5uZXIpLmtpbmQgIT09ICdjbGVhcicpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgLyBzZXJ2ZWQgZm9ybSBvZiBhIHZhbHVlIGF0IGEgcGF0aDogdGhlIHBsYWNlaG9sZGVyLCBhXG4gICAqIHNjcnViYmVkIENMT05FLCBvciB0aGUgdmFsdWUgaXRzZWxmIChzYW1lIHJlZmVyZW5jZSDigJQgcmVjb3JkZXJzIHJlY2VpdmVcbiAgICogYm9ycm93ZWQgbGl2ZSByZWZlcmVuY2VzIGZvciBjbGVhciB2YWx1ZXMsIGFzIHRoZXkgYWx3YXlzIGhhdmUpLlxuICAgKiBgcGxhY2Vob2xkZXJgIGRlZmF1bHRzIHRvIHRoZSBzY29wZS10aWVyIGAnW1JFREFDVEVEXSdgOyB0aGUgbWlycm9yIHNlZWRcbiAgICogcGFzc2VzIHRoZSBsb2cncyBgJ1JFREFDVEVEJ2AuXG4gICAqL1xuICByZXRhaW4ocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duLCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiB1bmtub3duIHtcbiAgICByZXR1cm4gUmVkYWN0aW9uUnVsZS5hcHBseSh0aGlzLnZlcmRpY3QocGF0aCksIHZhbHVlLCBwbGFjZWhvbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSBTVEFURSByZWNvcmQgKHN0YXRlIHJlYWQsIG1pcnJvciBzZWVkKTogZWFjaCBvd25cbiAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5IHRocm91Z2gge0BsaW5rIHJldGFpbn0uIEZpZWxkcyBhcmUgcGF0aHMgaW5zaWRlIHRoYXRcbiAgICoga2V5ZWQgdmFsdWUuIFNjYWxhcnMgYW5kIHJvb3QgYXJyYXlzIHBhc3MgdGhyb3VnaC4gQm91bmRhcnkgcmVjb3JkcyBhZGRcbiAgICogdGhlIG5lc3RlZC1rZXkgd2Fsazoge0BsaW5rIHJldGFpbkJvdW5kYXJ5fS5cbiAgICogUmV0dXJucyB0aGUgU0FNRSBvYmplY3Qgd2hlbiB1bmNoYW5nZWQuIEFuIGluZXJ0IHJ1bGUgZG9lcyBub3QgZW51bWVyYXRlXG4gICAqIHRoZSB2YWx1ZSwgc28gZXZlbiBhbiBhY2Nlc3NvciBpcyB1bnRvdWNoZWQgb24gdGhlIG5vLXBvbGljeSBmYXN0IHBhdGguXG4gICAqL1xuICByZXRhaW5SZWNvcmQ8VD4ocmVjb3JkOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgcmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVjb3JkKSkgcmV0dXJuIHJlY29yZDtcbiAgICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICBjb25zdCBrZXB0ID0gdGhpcy5yZXRhaW4oW2tleV0sIHZhbHVlLCBwbGFjZWhvbGRlcik7XG4gICAgICBpZiAoa2VwdCA9PT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgb3V0ID8/PSB7IC4uLihyZWNvcmQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgICBvdXRba2V5XSA9IGtlcHQ7XG4gICAgfVxuICAgIHJldHVybiAob3V0ID8/IHJlY29yZCkgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIEJPVU5EQVJZIHJlY29yZCDigJQgcm9vdCBpbnB1dC9vdXRwdXQgYW5kIGEgc3ViZmxvdydzXG4gICAqIG1hcHBlZCBzZWVkLCBiZWZvcmUgYW55IG9ic2VydmVyIHNlZXMgaXQuIHtAbGluayByZXRhaW5SZWNvcmR9IGRlY2lkZXMgZWFjaFxuICAgKiB0b3Aga2V5OyB0aGVuIGV2ZXJ5IE5FU1RFRCBvd24ga2V5IGlzIGEga2V5IHRvbzogc2VjcmV0IHdoZW4gaXRzIG93biBuYW1lXG4gICAqIG9yIGl0cyBkb3R0ZWQgcGF0aCBpcyByZWRhY3RlZCBhdCBrZXkgbGV2ZWwgKGBrZXlzOiBbJ3NlY3JldCddYCBjb3ZlcnNcbiAgICogYHsgd3JhcHBlcjogeyBzZWNyZXQgfSB9YDsgYSByb290IGFycmF5J3MgZWxlbWVudHMgYXJlIHdhbGtlZCB0aGUgc2FtZVxuICAgKiB3YXkpLCBhbmQgaXRzIGRlY2xhcmVkIGBmaWVsZHNgIHNjcnViYmVkIGluc2lkZSBpdCAoYGZpZWxkczogeyBwcm9maWxlOlxuICAgKiBbJ3Rva2VuJ10gfWAgY292ZXJzIGB7IHdyYXBwZXI6IHsgcHJvZmlsZTogeyB0b2tlbiB9IH0gfWApLiBEZWNpZGVkIHBlclxuICAgKiBQQVRILCBjb3B5LW9uLXdyaXRlIHBlciBwYXRoICh7QGxpbmsgc2VydmVkQnlQYXRofSk6IGFuIG9iamVjdCBzaGFyZWQgYnlcbiAgICogdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgb25lIGEgcGF0aCBydWxlIG5hbWVzIGFuZCBzZXJ2ZWQgYXMgaXQgaXMgYXRcbiAgICogdGhlIG90aGVyOyBhIGN5Y2xlIGVkZ2UgbGFuZHMgb24gdGhlIHNlcnZlZCBjb3B5LCBuZXZlciBvbiBhbiB1bnNjcnViYmVkXG4gICAqIG9yaWdpbmFsOyB0aGUgbGl2ZSB2YWx1ZSBpcyBuZXZlciB0b3VjaGVkLiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCB3aGVuXG4gICAqIG5vdGhpbmcgbmVzdGVkIGlzIHNlY3JldCwgYW5kIGFuIGluZXJ0IHJ1bGUgZW51bWVyYXRlcyBub3RoaW5nLiBTdGF0ZVxuICAgKiBrZWVwcyBpdHMgb3duIHBhdGggdmVyZGljdHMgKHtAbGluayB2ZXJkaWN0fSk7IHRoaXMgd2FsayBpcyBmb3IgcmVjb3Jkc1xuICAgKiBoYW5kZWQgb3V0IHdob2xlLlxuICAgKi9cbiAgcmV0YWluQm91bmRhcnk8VD4ocmVjb3JkOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICAvLyBBIG1hc2tlZCBzdGFnZSBlcnJvciBpbnNpZGUgdGhlIHJlY29yZCAoYSBmb3JrIGVudmVsb3BlJ3MgYHJlc3VsdGApIGlzXG4gICAgLy8gc2VydmVkIGluIGl0cyBtYXNrZWQgZm9ybTogYW4gRXJyb3IncyBtZXNzYWdlIGlzIG5vbi1lbnVtZXJhYmxlIGFuZCBhXG4gICAgLy8gdGhyb3duIHN0cmluZyBpcyBhIHBsYWluIHZhbHVlLCBzbyBubyBrZXkgd2FsayBzZWVzIGVpdGhlci5cbiAgICBjb25zdCBzZXJ2ZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uc2l6ZSA/ICh0aGlzLndpdGhTZXJ2ZWRFcnJvcnMocmVjb3JkKSBhcyBUKSA6IHJlY29yZDtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgc2VydmVkID09PSBudWxsIHx8IHR5cGVvZiBzZXJ2ZWQgIT09ICdvYmplY3QnKSByZXR1cm4gc2VydmVkO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMucmV0YWluUmVjb3JkKHNlcnZlZCwgcGxhY2Vob2xkZXIpIGFzIHVua25vd24gYXMgb2JqZWN0O1xuICAgIC8vIEJlbG93IHRoZSB0b3Aga2V5cywgb25lIGRlY2lzaW9uIHBlciBQQVRIICh0aGUgd2hvbGUgcmVjb3JkIGlzIHRoZSB3YWxrJ3Mgcm9vdCwgc28gYSBjeWNsZVxuICAgIC8vIGJhY2sgdG8gaXQgbGFuZHMgb24gdGhlIHNlcnZlZCBjb3B5KS5cbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKHRvcCwgdW5kZWZpbmVkLCB0aGlzLmRvdHRlZFRhcmdldHModW5kZWZpbmVkKSwgdGhpcy5uYW1lc1dhbGsodHJ1ZSksIHBsYWNlaG9sZGVyKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHktb24td3JpdGUgb3ZlciBjb250YWluZXJzOiBldmVyeSByZW1lbWJlcmVkIG1hc2tlZCBlcnJvciBiZWNvbWVzIGl0c1xuICAgKiBzZXJ2ZWQgZm9ybSDigJQgYW4gb2JqZWN0IGVycm9yIGl0cyBtYXNrZWQgc3RydWN0dXJlZCBpbmZvLCBhIHRocm93blxuICAgKiBzdHJpbmcvbnVtYmVyIGl0cyBtYXNrZWQgdGV4dCAodGhlIHZhbHVlIGtlZXBzIGJlaW5nIGEgc2NhbGFyKS4gQSBzY2FsYXIgaXNcbiAgICogbWF0Y2hlZCBieSBWQUxVRSwgc28gYW4gdW5yZWxhdGVkIGZpZWxkIHRoYXQgaGFwcGVucyB0byBlcXVhbCBhIG1hc2tlZFxuICAgKiB0aHJvd24gc3RyaW5nIGlzIG1hc2tlZCB0b286IG92ZXItbWFza2luZyBpcyB0aGUgc2FmZSBkaXJlY3Rpb24uXG4gICAqIGB1bmRlZmluZWRgL2BudWxsYC9ib29sZWFucyBhcmUgbmV2ZXIgc3dhcHBlZCDigJQgdGhleSBjYXJyeSBubyB0ZXh0LCBhbmRcbiAgICogc3dhcHBpbmcgdGhlbSB3b3VsZCByZXdyaXRlIG9yZGluYXJ5IGRhdGEgc2hhcGVzLlxuICAgKlxuICAgKiBDWUNMRS1TQUZFIChyZXZpZXcgZmluZGluZyAyKS4gVGhlIGNvbnRhaW5lcnMgdGhhdCBjYW4gUkVBQ0ggYSBtYXNrZWRcbiAgICogZXJyb3IgYXJlIGZvdW5kIGZpcnN0ICh7QGxpbmsgcmVhY2hpbmdNYXNrZWRFcnJvcnN9IOKAlCB0aGUgd2hvbGUgcmVhY2hhYmxlXG4gICAqIGdyYXBoLCBjeWNsZXMgaW5jbHVkZWQpOyBlYWNoIG9mIHRoZW0gaXMgY29waWVkLCBpdHMgY29weSBhbGxvY2F0ZWQgYW5kXG4gICAqIHJlbWVtYmVyZWQgQkVGT1JFIGl0cyBjaGlsZHJlbiBhcmUgZmlsbGVkLCBzbyBhbiBlZGdlIGJhY2sgdG8gaXQg4oCUIGEgY3ljbGVcbiAgICog4oCUIGxhbmRzIG9uIHRoZSBjb3B5LCBuZXZlciBvbiB0aGUgb3JpZ2luYWwgdGhhdCBzdGlsbCBob2xkcyB0aGUgcmF3IGVycm9yLlxuICAgKiBFdmVyeSBvdGhlciBjb250YWluZXIga2VlcHMgaXRzIGlkZW50aXR5LlxuICAgKi9cbiAgcHJpdmF0ZSB3aXRoU2VydmVkRXJyb3JzKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgbGVhZiA9IHRoaXMuc2VydmVkTGVhZih2YWx1ZSk7XG4gICAgaWYgKGxlYWYgIT09IEtFRVAgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGxlYWYgPT09IEtFRVAgPyB2YWx1ZSA6IGxlYWY7XG4gICAgY29uc3QgcmVhY2hpbmcgPSB0aGlzLnJlYWNoaW5nTWFza2VkRXJyb3JzKHZhbHVlKTtcbiAgICBpZiAoIXJlYWNoaW5nLmhhcyh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBjb3BpZXMgPSBuZXcgTWFwPG9iamVjdCwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gICAgY29uc3QgY29weU9mID0gKG5vZGU6IG9iamVjdCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IGtub3duID0gY29waWVzLmdldChub2RlKTtcbiAgICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4ga25vd247XG4gICAgICBjb25zdCBjb3B5ID0gKEFycmF5LmlzQXJyYXkobm9kZSkgPyBub2RlLnNsaWNlKCkgOiB7IC4uLm5vZGUgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb3BpZXMuc2V0KG5vZGUsIGNvcHkpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gdGhpcy5zZXJ2ZWRMZWFmKGNoaWxkKTtcbiAgICAgICAgaWYgKHNlcnZlZCAhPT0gS0VFUCkgY29weVtrZXldID0gc2VydmVkO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmIHJlYWNoaW5nLmhhcyhjaGlsZCkpIGNvcHlba2V5XSA9IGNvcHlPZihjaGlsZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29weTtcbiAgICB9O1xuICAgIHJldHVybiBjb3B5T2YodmFsdWUpO1xuICB9XG5cbiAgLyoqIEEgbWFza2VkIGVycm9yJ3Mgc2VydmVkIGZvcm0g4oCUIGBLRUVQYCBmb3IgYW55dGhpbmcgZWxzZSAoYSBzY2FsYXIgbmV2ZXIgc3dhcHBlZCwgYSBjb250YWluZXIpLiAqL1xuICBwcml2YXRlIHNlcnZlZExlYWYodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIEtFRVA7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3JzPy5nZXQodmFsdWUpO1xuICAgICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBLRUVQO1xuICAgIH1cbiAgICBjb25zdCBzd2FwcGFibGUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JztcbiAgICBjb25zdCBtYXNrZWQgPSBzd2FwcGFibGUgPyB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWFza2VkID8gbWFza2VkLm1lc3NhZ2UgOiBLRUVQO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbnRhaW5lciB1bmRlciBgcm9vdGAgKGl0c2VsZiBpbmNsdWRlZCkgZnJvbSB3aGljaCBzb21lIHBhdGggcmVhY2hlcyBhIG1hc2tlZCBlcnJvci4gKi9cbiAgcHJpdmF0ZSByZWFjaGluZ01hc2tlZEVycm9ycyhyb290OiBvYmplY3QpOiBTZXQ8b2JqZWN0PiB7XG4gICAgY29uc3QgcGFyZW50cyA9IG5ldyBNYXA8b2JqZWN0LCBvYmplY3RbXT4oKTtcbiAgICBjb25zdCBob2xkZXJzOiBvYmplY3RbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG9iamVjdD4oW3Jvb3RdKTtcbiAgICBjb25zdCBzdGFjazogb2JqZWN0W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXMobm9kZSkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VydmVkTGVhZihjaGlsZCkgIT09IEtFRVApIHtcbiAgICAgICAgICBob2xkZXJzLnB1c2gobm9kZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvZiA9IHBhcmVudHMuZ2V0KGNoaWxkKTtcbiAgICAgICAgaWYgKG9mID09PSB1bmRlZmluZWQpIHBhcmVudHMuc2V0KGNoaWxkLCBbbm9kZV0pO1xuICAgICAgICBlbHNlIG9mLnB1c2gobm9kZSk7XG4gICAgICAgIGlmICghc2Vlbi5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgc2Vlbi5hZGQoY2hpbGQpO1xuICAgICAgICAgIHN0YWNrLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlYWNoaW5nID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gICAgd2hpbGUgKGhvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IGhvbGRlcnMucG9wKCkhO1xuICAgICAgaWYgKHJlYWNoaW5nLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICByZWFjaGluZy5hZGQobm9kZSk7XG4gICAgICBob2xkZXJzLnB1c2goLi4uKHBhcmVudHMuZ2V0KG5vZGUpID8/IFtdKSk7XG4gICAgfVxuICAgIHJldHVybiByZWFjaGluZztcbiAgfVxuXG4gIC8qKiBEb2VzIGB2YWx1ZWAgaG9sZCBvbmUgb2YgYHBhdGhzYCDigJQgYW4gb3duIGtleSBvZiB0aGF0IG5hbWUsIG9yIGEgZG90dGVkIHBhdGggaW5zaWRlIGl0PyAqL1xuICBzdGF0aWMgaG9sZHNQYXRocyh2YWx1ZTogb2JqZWN0LCBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAocGF0aHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgcGF0aCkgfHwgKHBhdGguaW5jbHVkZXMoJy4nKSAmJiBuYXRpdmVIYXModmFsdWUsIHBhdGgpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgd2hvbGUgU1RBVEUg4oCUIHtAbGluayByZXRhaW5SZWNvcmR9IG92ZXIgdGhlIHJvb3RcbiAgICoga2V5cyBBTkQgb3ZlciBldmVyeSBydW4gbmFtZXNwYWNlIHVuZGVyIGBydW5zYCAoZm9yayBjaGlsZHJlbiB3cml0ZVxuICAgKiB0aGVyZTsgYSBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYCBjYXJyaWVzIGl0IGJhY2sgYXMgYSBzZWVkKS4gVGhpcyBpc1xuICAgKiB3aGF0IHNlZWRzIHRoZSByZWRhY3RlZCBtaXJyb3I6IHRoZSBzdG9yZSdzIHN0YXJ0aW5nIHN0YXRlLCBzY3J1YmJlZFxuICAgKiB3aXRoIHRoZSBsb2cncyBwbGFjZWhvbGRlciwgc28gYSBwb2xpY3kga2V5IHRoYXQgYXJyaXZlcyBieSBzZWVkIGFuZCBpc1xuICAgKiBuZXZlciByZS13cml0dGVuIGlzIHN0aWxsIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gICAqL1xuICByZXRhaW5TdGF0ZTxUPihzdGF0ZTogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMucmV0YWluUmVjb3JkKHN0YXRlLCBwbGFjZWhvbGRlcik7XG4gICAgaWYgKGtlcHQgPT09IG51bGwgfHwgdHlwZW9mIGtlcHQgIT09ICdvYmplY3QnKSByZXR1cm4ga2VwdDtcbiAgICBjb25zdCBydW5zID0gKGtlcHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1JVTl9OQU1FU1BBQ0VdO1xuICAgIGlmIChydW5zID09PSBudWxsIHx8IHR5cGVvZiBydW5zICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJ1bnMpKSByZXR1cm4ga2VwdDtcbiAgICBsZXQgc2NydWJiZWRSdW5zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtydW5JZCwgcmVjb3JkXSBvZiBPYmplY3QuZW50cmllcyhydW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3Qga2VwdFJ1biA9IHRoaXMucmV0YWluUmVjb3JkKHJlY29yZCwgcGxhY2Vob2xkZXIpO1xuICAgICAgaWYgKGtlcHRSdW4gPT09IHJlY29yZCkgY29udGludWU7XG4gICAgICBzY3J1YmJlZFJ1bnMgPz89IHsgLi4uKHJ1bnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgICBzY3J1YmJlZFJ1bnNbcnVuSWRdID0ga2VwdFJ1bjtcbiAgICB9XG4gICAgcmV0dXJuIHNjcnViYmVkUnVucyA9PT0gdW5kZWZpbmVkID8ga2VwdCA6ICh7IC4uLihrZXB0IGFzIG9iamVjdCksIFtSVU5fTkFNRVNQQUNFXTogc2NydWJiZWRSdW5zIH0gYXMgVCk7XG4gIH1cblxuICAvKiogQXBwbHkgYSB2ZXJkaWN0IHRvIGEgdmFsdWUg4oCUIHNlZSB7QGxpbmsgcmV0YWlufS4gKi9cbiAgc3RhdGljIGFwcGx5KHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsIHZhbHVlOiB1bmtub3duLCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiB1bmtub3duIHtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIHJldHVybiBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzLCBwbGFjZWhvbGRlcikgPz8gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZGVlcCBjbG9uZSBvZiBgdmFsdWVgIHdpdGggdGhlIGdpdmVuIGRvdC1wYXRocyByZXBsYWNlZCBieSB0aGVcbiAgICogcGxhY2Vob2xkZXIg4oCUIGB1bmRlZmluZWRgIHdoZW4gYHZhbHVlYCBpcyBub3QgYW4gb2JqZWN0ICh0aGVyZSBpcyBub3RoaW5nXG4gICAqIHRvIHNjcnViIGluIGEgc2NhbGFyOyB0aGUgY2FsbGVyIGtlZXBzIHRoZSB2YWx1ZSkuIFRoZSBjbG9uZSByZWZ1c2VzIGFuXG4gICAqIHVuY2xvbmVhYmxlIHZhbHVlLiBBIHBhdGggbmFtZXMgYSBsaXRlcmFsIGtleSAoYCdhLmInYCBhcyBvbmUgcHJvcGVydHkpXG4gICAqIGFuZCwgd2hlbiBkb3R0ZWQsIHRoZSBuZXN0ZWQgcGF0aDsgZWFjaCBpcyBzY3J1YmJlZCB3aGVyZSBpdCBleGlzdHMsIHBlclxuICAgKiBQQVRIIOKAlCBhIG5vZGUgdGhlIGNsb25lIHNoYXJlcyBiZXR3ZWVuIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG5hbWVkXG4gICAqIG9uZSBvbmx5ICh7QGxpbmsgc2VydmVkQnlQYXRofSkuIFBhdGhzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBpZ25vcmVkIOKAlFxuICAgKiBzY3J1YmJpbmcgbmV2ZXIgaW52ZW50cyBhIGZpZWxkLlxuICAgKi9cbiAgc3RhdGljIHNjcnViRmllbGRzKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBUaGUgY2xvbmUgZGV0YWNoZXMgdGhlIHJldGFpbmVkIHZhbHVlIChhbmQgcmVmdXNlcyBhbiB1bmNsb25lYWJsZSBvbmUpOyB0aGUgc2NydWIgb24gaXQgaXNcbiAgICAvLyBkZWNpZGVkIHBlciBQQVRILCBzbyBhIG5vZGUgdGhlIGNsb25lIHNoYXJlcyBiZXR3ZWVuIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG5hbWVkIG9uZSBvbmx5LlxuICAgIGNvbnN0IGNvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpIGFzIG9iamVjdDtcbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKFxuICAgICAgY29weSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhcmdldHNPZihwYXRocyksXG4gICAgICB7IHJvb3REZWNpZGVkOiBmYWxzZSwgbWVtbzogbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4oKSwgYnVkZ2V0OiB3YWxrTGltaXQgfSxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICAvLyBLZXllZCBieSBhIE1hcCwgdGhlbiBtYWRlIG93biBkYXRhIGtleXMgYnkgYGZyb21FbnRyaWVzYDogYSBrZXkgYSBtYXBwZXJcbiAgICAvLyB3cm90ZSBpcyBhIG5hbWUgZnJvbSBkYXRhLCBhbmQgb24gYSBwbGFpbiBvYmplY3QgYHRvU3RyaW5nYCB3b3VsZCByZWFkXG4gICAgLy8gdGhlIGluaGVyaXRlZCBtZXRob2QgYW5kIGBfX3Byb3RvX19gIHdvdWxkIGNhbGwgdGhlIHByb3RvdHlwZSBzZXR0ZXIuXG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnBvbGljeT8uZmllbGRzID8/IHt9KSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zLnNldChrZXksIFsuLi5maWVsZHNdKTtcbiAgICB9XG4gICAgLy8gRmllbGRzIGEgbWFwcGVyIGhhbmRlZCB0byBhIG5ldyBrZXkgYXJlIHNjcnViYmVkIHVuZGVyIHRoYXQga2V5IHRvby5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5pbmhlcml0ZWQgPz8gW10pIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9ucy5zZXQoa2V5LCBbLi4ubmV3IFNldChbLi4uKGZpZWxkUmVkYWN0aW9ucy5nZXQoa2V5KSA/PyBbXSksIC4uLmZpZWxkc10pXSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLm1hcmtlZF0sXG4gICAgICBmaWVsZFJlZGFjdGlvbnM6IE9iamVjdC5mcm9tRW50cmllcyhmaWVsZFJlZGFjdGlvbnMpLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLnBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIFRoZSB3cml0ZSBkZWNpc2lvbiDigJQgb25lIHBlciBzdGFnZWQgd3JpdGUgKEM0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyBXaGF0IHRoZSBydW4ncyBydWxlIHNheXMgYWJvdXQgb25lIHN0YWdlZCB3cml0ZSwgYW5kIHdoYXQgdGhlIHdyaXRlIGxlYXZlcyBvbiB0aGUgcnVsZS4gRXZlcnkgc3RhZ2VkXG4vLyB3cml0ZSBwYXNzZXMgYFN0YWdlQ29udGV4dCDCtyBzdGFnZVdyaXRlYCAodGhlIG9uZSBmdW5uZWw6IGZhY2FkZSB3cml0ZXMsIGEgc3ViZmxvdyBzZWVkLCBhblxuLy8gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCksIHdoaWNoIHJ1bnMgdGhlIGZvdXIgc3RlcHMgaW4gdGhlIG9yZGVyIHRoZSByZWNvcmQgbmVlZHM6XG4vL1xuLy8gICAxLiBWRVJESUNUICBgZGVjaWRlV3JpdGVgIOKAlCBhbiBleHBsaWNpdCBwZXItY2FsbCBmbGFnLCBlbHNlIHRoZSBydWxlIHRoYXQgaXMgQUNUSVZFIGFzIHRoZSB3cml0ZSBiZWdpbnMuXG4vLyAgIDIuIElERU5USVRZIGBpbmhlcml0QnlJZGVudGl0eWAg4oCUIHdpdGggdGhlIGZyYW1lJ3Mgc2VsZWN0ZWQgcmVhZHMgQVMgVEhFWSBTVEFORCBhZnRlciBzdGVwIDE6IGEgcG9saWN5XG4vLyAgICAgICAgICAgICAgIHBhdHRlcm4gaXMgdXNlciBjb2RlLCBhbmQgaXQgY2FuIHJlYWQgb24gdGhlIHZlcnkgZnJhbWUgdGhhdCBpcyB3cml0aW5nLlxuLy8gICAzLiBCWVRFUyAgICB0aGUgY2FsbGVyOiBgUmVjb3JkRnJhbWUgwrcgd3JpdGUocGF0aCwgdmFsdWUsIHZlcmIsIHNjcnViT2YodmVyZGljdCkpYC4gVGhlIHJlY29yZCB3cml0ZXNcbi8vICAgICAgICAgICAgICAgdGhlbTsgaXQgbmV2ZXIgZGVjaWRlcyB0aGVtLlxuLy8gICA0LiBNQVJLUyAgICBgbWFya1N0YWdlZFdyaXRlYCDigJQgb25seSBvbmNlIHRoZSB3cml0ZSBzdGFnZWQ6IGEgd3JpdGUgdGhhdCBmYWlscyB0byBzdGFnZSBtYXJrcyBub3RoaW5nLlxuLy9cbi8vIFN0ZXBzIDHigJMyIGFuZCBzdGVwIDQgYXJlIGNhbGxzIGFyb3VuZCB0aGUgd3JpdGUsIG5vdCBvbmUgY2FsbCBiZWZvcmUgaXQsIGFuZCBlYWNoIHJlYWRzIHRoZSBydWxlIHdoZW5cbi8vIGl0IGFjdHMg4oCUIGFzIHRoZSBmdW5uZWwgYWx3YXlzIGRpZCwgc28gdXNlciBjb2RlIHRoYXQgcnVucyBEVVJJTkcgYSB3cml0ZSAoYSBnZXR0ZXIgb24gdGhlIHZhbHVlLCBhXG4vLyBwYXR0ZXJuJ3MgYHRlc3RgKSBmaW5kcyB0aGUgc2FtZSBydWxlLCBhbmQgbGVhdmVzIHRoZSBzYW1lIG1hcmtzLCBhcyBiZWZvcmUgQzQuXG5cbi8qKlxuICogU3RlcCAxIOKAlCBUSEUgVkVSRElDVCBmb3Igb25lIHN0YWdlZCB3cml0ZTogYW4gZXhwbGljaXQgcGVyLWNhbGwgZmxhZyAoYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYClcbiAqIG1ha2VzIHRoZSB2YWx1ZSBzZWNyZXQgd2hvbGUgdW5kZXIgaXRzIHVzZXItbGV2ZWwga2V5OyBlbHNlIHRoZSBgYWN0aXZlYCBydWxlIGRlY2lkZXMgZnJvbSB0aGVcbiAqIHVzZXItbGV2ZWwgcGF0aDsgd2l0aCBub25lIChubyBydWxlLCBvciBhbiBpbmVydCBvbmUg4oCUIHRoZSBjYWxsZXIgcGFzc2VzIGB1bmRlZmluZWRgKSwgY2xlYXIsIHdpdGggbm9cbiAqIHZlcmRpY3QgY2FsbCBhbmQgbm8gcGF0aCBhbGxvY2F0aW9uICh0aGUgbm8tcG9saWN5IGZhc3QgcGF0aCkuIE1hcmtzIG5vdGhpbmcuXG4gKlxuICogYGBgdHNcbiAqIGRlY2lkZVdyaXRlKG5ldyBSZWRhY3Rpb25SdWxlKHsgZmllbGRzOiB7IGNhcmQ6IFsnbnVtYmVyJ10gfSB9KSwgW10sICdjYXJkJywgZmFsc2UpOyAvLyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6ICdjYXJkJywgcGF0aHM6IFsnbnVtYmVyJ10gfVxuICogZGVjaWRlV3JpdGUodW5kZWZpbmVkLCBbJ3Byb2ZpbGUnXSwgJ2F1dGgnLCB0cnVlKTsgLy8geyBraW5kOiAnd2hvbGUnLCBrZXk6ICdwcm9maWxlLmF1dGgnIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjaWRlV3JpdGUoXG4gIGFjdGl2ZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgcGF0aDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtleTogc3RyaW5nLFxuICBleHBsaWNpdDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBpZiAoZXhwbGljaXQpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogdXNlcktleU9mKHBhdGgsIGtleSkgfTtcbiAgcmV0dXJuIGFjdGl2ZSAhPT0gdW5kZWZpbmVkID8gYWN0aXZlLnZlcmRpY3RBdChwYXRoLCBrZXkpIDogQ0xFQVI7XG59XG5cbi8qKlxuICogU3RlcCAyIOKAlCBJREVOVElUWTogYW4gT0JKRUNUIHRoZSBzdGFnZSByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSAoYHNlbGVjdGVkYCDigJQgdGhlIGZyYW1lJ3Mgc2VsZWN0ZWRcbiAqIHJlYWRzLCBmaWxsZWQgYnkgaXRzIHRyYWNrZWQgcmVhZHMpLCB3cml0dGVuIHVuZGVyIGFub3RoZXIgbmFtZSAoYHMucGVyc29uID0gcy5wcm9maWxlYCksIGtlZXBzIHRoYXRcbiAqIHJlYWQncyBydWxlLCBtYXRjaGVkIGJ5IGlkZW50aXR5OiBhIHdob2xlIHJlYWQgbWFya3MgdGhlIG5ldyBrZXksIGEgYGZpZWxkc2AgcmVhZCBoYW5kcyBpdCB0aGUgZmllbGRzXG4gKiAocmUtYmFzZWQgdW5kZXIgdGhlIHdyaXR0ZW4gcGF0aCksIGFuZCB0aGUgdmVyZGljdCBpcyBhc2tlZCBhZ2Fpbi4gQSBuZXcgb2JqZWN0LCBhIHByaW1pdGl2ZSwgb3IgYVxuICogd3JpdGUgYWxyZWFkeSB3aG9sZSBpcyBzZWxlY3RlZCBieSBpdHMgb3duIG5hbWUgb25seSDigJQgYHZlcmRpY3RgIGNvbWVzIGJhY2sgYXMgaXQgaXMuIERlY2lkZWQgQkVGT1JFXG4gKiB0aGUgd3JpdGUsIGJlY2F1c2UgdGhlIHZlcmRpY3QgbmVlZHMgaXQ6IGFuIGluaGVyaXRhbmNlIHN0YXlzIGV2ZW4gaWYgdGhlIHdyaXRlIHRoZW4gZmFpbHMgdG8gc3RhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmhlcml0QnlJZGVudGl0eShcbiAgYWN0aXZlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICBzZWxlY3RlZDogV2Vha01hcDxvYmplY3QsIFJlZGFjdGlvblZlcmRpY3Q+IHwgdW5kZWZpbmVkLFxuICBwYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duLFxuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gIGNvbnN0IHJlYWQgPVxuICAgIGFjdGl2ZSAhPT0gdW5kZWZpbmVkICYmIHZlcmRpY3Qua2luZCAhPT0gJ3dob2xlJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICA/IHNlbGVjdGVkPy5nZXQodmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlYWQgPT09IHVuZGVmaW5lZCB8fCBhY3RpdmUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZlcmRpY3Q7XG4gIGlmIChyZWFkLmtpbmQgPT09ICd3aG9sZScpIGFjdGl2ZS5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgZWxzZSBpZiAocmVhZC5raW5kID09PSAnZmllbGRzJykge1xuICAgIGNvbnN0IGF0ID0gWy4uLnBhdGguc2xpY2UoMSksIC4uLihwYXRoLmxlbmd0aCA+IDAgPyBba2V5XSA6IFtdKV07XG4gICAgYWN0aXZlLmluaGVyaXRGaWVsZHMoXG4gICAgICBwYXRoWzBdID8/IGtleSxcbiAgICAgIHJlYWQucGF0aHMubWFwKChmaWVsZCkgPT4gWy4uLmF0LCBmaWVsZF0uam9pbignLicpKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBhY3RpdmUudmVyZGljdEF0KHBhdGgsIGtleSk7XG59XG5cbi8qKiBUaGUgc2NydWIgb2YgYSB3aG9sZSB2ZXJkaWN0IOKAlCBvbmUgZnJvemVuIG9iamVjdCBmb3IgZXZlcnkgd3JpdGUgaXQgY292ZXJzLiAqL1xuY29uc3QgV0hPTEVfU0NSVUI6IFdyaXRlU2NydWIgPSBPYmplY3QuZnJlZXplKHsgd2hvbGU6IHRydWUgfSk7XG5cbi8qKlxuICogU3RlcCAzJ3MgaW5wdXQg4oCUIGEgdmVyZGljdCdzIEJZVEVTIGZvciB0aGUgcmVjb3JkIChgUmVjb3JkRnJhbWUgwrcgd3JpdGVgKTogbm90aGluZyB3aGVuIGNsZWFyLCB0aGVcbiAqIHdob2xlIHZhbHVlLCBvciB0aGUgZmllbGRzIGluc2lkZSBpdC4gTm8gYWxsb2NhdGlvbiBvbiB0aGUgZGVmYXVsdCBwYXRoIChjbGVhcikgb3IgZm9yIGEgd2hvbGUgdmVyZGljdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcnViT2YodmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCk6IFdyaXRlU2NydWIgfCB1bmRlZmluZWQge1xuICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gV0hPTEVfU0NSVUI7XG4gIHJldHVybiB2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnID8geyBmaWVsZHM6IHZlcmRpY3QucGF0aHMgfSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGVwIDQg4oCUIHRoZSBNQVJLUyBhIHN0YWdlZCB3cml0ZSBsZWF2ZXM7IGNhbGwgaXQgb25seSBvbmNlIHRoZSB3cml0ZSBzdGFnZWQsIHNvIGEgd3JpdGUgdGhhdCBmYWlscyB0b1xuICogc3RhZ2UgbWFya3Mgbm90aGluZy4gQSBkZWxldGUgY2xlYXJzIGl0cyBrZXkncyBtYXJrIChhbmQgYW55IGZpZWxkcyBhIG1hcHBlciBoYW5kZWQgaXQpIG9uIGBhY3RpdmVgLFxuICogdGhlIHJ1bGUgdGhhdCB3YXMgYWN0aXZlIGFzIHRoZSB3cml0ZSBCRUdBTiDigJQgbm9uZSB3aGVuIGl0IHdhcyBpbmVydCwgZXZlbiBpZiB1c2VyIGNvZGUgbWFya2VkIHRoZSBrZXlcbiAqIGR1cmluZyB0aGUgd3JpdGUuIEEgd2hvbGUgdmVyZGljdCBtYXJrcyBpdHMga2V5IOKAlCB0aGUga2V5IHRoYXQgREVDSURFRCBpdCAoYHZlcmRpY3Qua2V5YDogYW4gYW5jZXN0b3JcbiAqIGZvciBhIG5lc3RlZCB3cml0ZSB1bmRlciBhIHdob2xlLXNlbGVjdGVkIGtleSkg4oCUIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuIG9uIGBydWxlYCwgdGhlIHJ1bidzIHJ1bGUgYXNcbiAqIGl0IHN0YW5kcyBOT1cgKHVzZXIgY29kZSBkdXJpbmcgdGhlIHdyaXRlIG1heSBoYXZlIGluc3RhbGxlZCBvbmU7IGFuIGV4cGxpY2l0IG1hcmsgaXMgd2hhdCBtYWtlcyBhblxuICogaW5lcnQgcnVsZSBhY3RpdmUpLiBBIG1hcmsgaXMgYSBydW4td2lkZSBOQU1FOiBpdCBzdGF5cyB3aGVuIHRoZSBzdGFnZSdzIGNvbW1pdCBmYWlscyBvciBhIHJldHJ5XG4gKiBkaXNjYXJkcyB0aGUgYXR0ZW1wdCDigJQgdGhlIHNhZmUgc2lkZTsgb25seSBhIHN0YWdlZCBkZWxldGUgcmVtb3ZlcyBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrU3RhZ2VkV3JpdGUoXG4gIGFjdGl2ZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgcGF0aDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtleTogc3RyaW5nLFxuICB2ZXJiOiBXcml0ZVZlcmIsXG4pOiB2b2lkIHtcbiAgaWYgKHZlcmIgPT09ICdkZWxldGUnKSBhY3RpdmU/LnVubWFyayh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gIGVsc2UgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcnVsZT8ubWFyayh2ZXJkaWN0LmtleSk7XG59XG5cbi8vIOKUgOKUgOKUgCBUaGUgcGF0aCB3YWxrIOKAlCBvbmUgZGVjaXNpb24gcGVyIFBBVEgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gQSBydWxlIHRoYXQgbmFtZXMgYSBQQVRIIChhIGRvdHRlZCBrZXksIGEgcGF0dGVybiwgYSBmaWVsZCkgbXVzdCBiZSBleGFjdFxuLy8gZXZlbiB3aGVuIG9uZSBvYmplY3QgaXMgcmVhY2hhYmxlIGF0IHR3byBwYXRoczogdGhlIGRlY2lzaW9uIGlzIG1hZGUgcGVyXG4vLyBwYXRoLCBuZXZlciBwZXIgb2JqZWN0LCBhbmQgYSBjb3B5IGlzIG1hZGUgcGVyIHBhdGggKGNvcHktb24td3JpdGUpIOKAlCBuZXZlclxuLy8gYSBzY3J1YiBpbiBwbGFjZSBvbiBhIG5vZGUgYW5vdGhlciBwYXRoIHN0aWxsIHNob3dzLiBBIGtleS1OQU1FIHJ1bGUgaXMgdGhlXG4vLyBzYW1lIGF0IGV2ZXJ5IHBhdGgsIHNvIGEgc2hhcmVkIG5vZGUgaXQgbWFza3MgaXMgbWFza2VkIGV2ZXJ5d2hlcmUg4oCUIHRoZVxuLy8gc2FmZSBzaWRlLiBBIGN5Y2xlIGVkZ2UgaXMgbm90IGZvbGxvd2VkOiBpdCBpcyBwb2ludGVkIGF0IHRoZSBhbmNlc3RvcidzXG4vLyBzZXJ2ZWQgY29weS5cbi8vXG4vLyBMSU5FQVIgT04gQSBEQUcuIERvdHRlZCBrZXlzIGFuZCBtYXJrcyBhcmUgd2Fsa2VkIGFzIFRBUkdFVFMgKHBhdGgtcmVsYXRpdmVcbi8vIHN0YXRlLCBsaWtlIGZpZWxkcyksIGFuZCBhIHBhdHRlcm4gdGhhdCBjYW4gb25seSBtYXRjaCB3aXRoaW4gYSBrZXkgTkFNRVxuLy8gKHtAbGluayBuZWVkc1BhdGh9IOKAlCB0aGUgY29tbW9uIGNhc2UsIGAvcGFzc3dvcmQvaWApIGlzIGRlY2lkZWQgYnkgdGhlIG5hbWUsXG4vLyBzbyBhIGRlY2lzaW9uIGRlcGVuZHMgb25seSBvbiB0aGUgb2JqZWN0IGFuZCB0aGUgdGFyZ2V0cyBzdGlsbCBsaXZlIGF0IGl0IOKAlFxuLy8gbWVtb2l6ZWQgcGVyIChvYmplY3QsIHRhcmdldHMpOiBhbiBvYmplY3Qgc2hhcmVkIGJ5IG1hbnkgcGF0aHMgKGFuIGFnZW50J3Ncbi8vIGxpbmtlZCBoaXN0b3J5KSBpcyBkZWNpZGVkIG9uY2UsIGFuZCBpdHMgc2VydmVkIGNvcHkgaXMgc2hhcmVkIHRvby4gT25seSBhXG4vLyBnZW51aW5lbHkgUEFUSC1kZXBlbmRlbnQgcGF0dGVybiAoYC9eYVxcLmIkL2ApIHdhbGtzIHBhdGhzOyBwYXN0XG4vLyB7QGxpbmsgV0FMS19MSU1JVH0gcGF0aCB2aXNpdHMgc3VjaCBhIHdhbGsgc2VydmVzIHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGFzXG4vLyB0aGUgcGxhY2Vob2xkZXIgKHRoZSBzYWZlIHNpZGUpLCB3YXJucyBvbmNlIGluIGRldiBtb2RlLCBhbmQgbmV2ZXIgZmFpbHMuXG5cbi8qKiBBIGZpZWxkIHN0aWxsIHRvIHJlYWNoIGJlbG93IGEgbm9kZTogdGhlIHBhdGggc2VnbWVudHMgbGVmdCB0byB3YWxrLiAqL1xudHlwZSBUYXJnZXQgPSByZWFkb25seSBzdHJpbmdbXTtcblxuLyoqIEhvdyBhIHdhbGsgZGVjaWRlcyBhbiBlZGdlLiAqL1xuaW50ZXJmYWNlIFdhbGsge1xuICAvKiogS2V5LWxldmVsIHJ1bGVzIGF0IGV2ZXJ5IG5lc3RlZCBrZXkg4oCUIGFic2VudCBmb3IgYSBiYXJlIGZpZWxkIHNjcnViICh0YXJnZXRzIG9ubHkpLiAqL1xuICByZWFkb25seSBuYW1lcz86IHtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYXQgdGhpcyBuZXN0ZWQga2V5IGJ5IGl0cyBvd24gTkFNRSAobWFya3MsIGtleXMsIHBhdHRlcm5zKS4gKi9cbiAgICBtYXNrcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIC8qKiBTZWxlY3RlZCB3aG9sZSBieSB0aGUgZG90dGVkIFBBVEgg4oCUIHByZXNlbnQgb25seSB1bmRlciBwYXR0ZXJucyAoYSBwYXR0ZXJuIGlzIHRlc3RlZCBvbiB0aGUgcGF0aCkuICovXG4gICAgcGF0aE1hc2tzPyhwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIC8qKiBUaGUgZGVjbGFyZWQgZmllbGRzIGJlbG93IGEga2V5IG9mIHRoaXMgbmFtZS4gKi9cbiAgICBmaWVsZHMobmFtZTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBUaGUgcm9vdCdzIG93biBrZXlzIHdlcmUgZGVjaWRlZCBieSB0aGUgY2FsbGVyIChgcmV0YWluUmVjb3JkYCk6IHdhbGsgYmVsb3cgdGhlbSBvbmx5LiAqL1xuICByZWFkb25seSByb290RGVjaWRlZDogYm9vbGVhbjtcbiAgLyoqIERlY2lzaW9ucyBzaGFyZWQgcGVyIChvYmplY3QsIHRhcmdldHMpIOKAlCBhYnNlbnQgd2hlbiBhIGRlY2lzaW9uIGRlcGVuZHMgb24gdGhlIHBhdGguICovXG4gIHJlYWRvbmx5IG1lbW8/OiBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogUGF0aCB2aXNpdHMgbGVmdC4gKi9cbiAgYnVkZ2V0OiBudW1iZXI7XG4gIC8qKiBUb2xkIG9uY2Ugd2hlbiB0aGUgd2FsayBwYXNzZXMgaXRzIGxpbWl0LiAqL1xuICByZWFkb25seSBvbkxpbWl0PzogKCkgPT4gdm9pZDtcbiAgLyoqIFRoZSB3YWxrIGhhcyBwYXNzZWQgaXRzIGxpbWl0OiB3aGF0IGl0IGhhcyBub3QgdmlzaXRlZCBpcyBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBsaW1pdGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXRoIHZpc2l0cyBvbmUgd2FsayBtYXkgbWFrZSDigJQgcmVhY2hhYmxlIG9ubHkgdW5kZXIgYSBQQVRILWRlcGVuZGVudFxuICogcGF0dGVybiBvdmVyIGEgdmFsdWUgd2hvc2UgcGF0aHMgb3V0bnVtYmVyIGl0cyBvYmplY3RzIChhIGxpbmtlZCBoaXN0b3J5LCBhXG4gKiBEQUcpOiBldmVyeSBvdGhlciB3YWxrIHNoYXJlcyBpdHMgZGVjaXNpb25zIHBlciBvYmplY3QgYW5kIHN0YXlzIGxpbmVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IFdBTEtfTElNSVQgPSAxXzAwMF8wMDA7XG5cbi8qKiBUaGUgbGltaXQgd2Fsa3MgdXNlOiB7QGxpbmsgV0FMS19MSU1JVH0sIHVubGVzcyBhIHRlc3QgbG93ZXJlZCBpdCAoe0BsaW5rIHVzZVdhbGtMaW1pdH0pLiAqL1xubGV0IHdhbGtMaW1pdDogbnVtYmVyID0gV0FMS19MSU1JVDtcblxuLyoqXG4gKiBAaW50ZXJuYWwgVGVzdHMgb25seSDigJQgbm90IG9uIGFueSBwdWJsaWMgZG9vcjogd2Fsa3MgdXNlIGBsaW1pdGAgdW50aWwgdGhlXG4gKiByZXR1cm5lZCByZXN0b3JlIGlzIGNhbGxlZCwgc28gYSB0ZXN0IHJlYWNoZXMgdGhlIG92ZXItbGltaXQgcGF0aCBpbiBhXG4gKiB0aG91c2FuZCB2aXNpdHMgaW5zdGVhZCBvZiBhIG1pbGxpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VXYWxrTGltaXQobGltaXQ6IG51bWJlcik6ICgpID0+IHZvaWQge1xuICBjb25zdCBwcmlvciA9IHdhbGtMaW1pdDtcbiAgd2Fsa0xpbWl0ID0gbGltaXQ7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgd2Fsa0xpbWl0ID0gcHJpb3I7XG4gIH07XG59XG5cbi8qKlxuICogQ2FuIGBwYXR0ZXJuYCBtYXRjaCBhIGRvdHRlZCBQQVRIIHdoZXJlIGl0IG1hdGNoZXMgbm9uZSBvZiB0aGUgcGF0aCdzXG4gKiBzZWdtZW50IE5BTUVTPyBPbmx5IHRocm91Z2ggYSBjb25zdHJ1Y3QgdGhhdCBjYW4gbWF0Y2ggb3IgdGVzdCB0aGUgYC5gXG4gKiBiZXR3ZWVuIHNlZ21lbnRzOiBgLmAgaXRzZWxmLCBhbiBlc2NhcGUgdGhhdCBjYW4gc3RhbmQgZm9yIGl0IChgXFxXIFxcUyBcXERcbiAqIFxcQiBcXHAgXFxQIFxcdSBcXHggXFxjYCwgYSBkaWdpdCBlc2NhcGUpLCBhIG5lZ2F0ZWQgY2xhc3MsIGEgY2xhc3MgcmFuZ2UgdGhhdFxuICogc3BhbnMgYC5gLCBhIGxvb2thcm91bmQgb3IgYSBuYW1lZCBncm91cC4gQW55dGhpbmcgZWxzZSBtYXRjaGVzIGEgcGF0aCBvbmx5XG4gKiBpbnNpZGUgb25lIHNlZ21lbnQg4oCUIGFuZCBhbiBhbmNlc3RvciB3aG9zZSBOQU1FIG1hdGNoZXMgaXMgbWFza2VkIHdob2xlXG4gKiBiZWZvcmUgdGhlIHdhbGsgZ29lcyBiZWxvdyBpdCwgc28gdGhlIG5hbWUgZGVjaWRlcy4gQ29uc2VydmF0aXZlOiBgdHJ1ZWBcbiAqIHdoZW5ldmVyIGluIGRvdWJ0LlxuICpcbiAqIExpbmVhciBpbiB0aGUgbGVuZ3RoIG9mIGBwYXR0ZXJuLnNvdXJjZWA6IGV2ZXJ5IHNjYW4gaGVyZSBpcyBvbmUgZm9yd2FyZFxuICogcGFzcyAoe0BsaW5rIGNsYXNzQm9kaWVzfSkgb3IgYSByZWdleCB0aGF0IGRvZXMgY29uc3RhbnQgd29yayBwZXIgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWVkc1BhdGgocGF0dGVybjogUmVnRXhwKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZSA9IHBhdHRlcm4uc291cmNlO1xuICBpZiAoL1xcLnxcXFxcW1dTREJwUHV4YzAtOV18XFxbXFxefFxcKFxcP1s9ITxdLy50ZXN0KHNvdXJjZSkpIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IGJvZHkgb2YgY2xhc3NCb2RpZXMoc291cmNlKSkge1xuICAgIGZvciAoY29uc3QgWywgbG93LCBoaWdoXSBvZiBib2R5Lm1hdGNoQWxsKC8oXFxcXD9bXFxzXFxTXSktKFxcXFw/W1xcc1xcU10pL2cpKSB7XG4gICAgICBpZiAobG93Lmxlbmd0aCA+IDEgfHwgaGlnaC5sZW5ndGggPiAxIHx8IChsb3cgPD0gJy4nICYmIGhpZ2ggPj0gJy4nKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUaGUgYm9keSBvZiBlYWNoIGNoYXJhY3RlciBjbGFzcyBpbiBgc291cmNlYCwgbGVmdCB0byByaWdodDogdGhlIHRleHRcbiAqIGJldHdlZW4gYSBgW2AgYW5kIHRoZSBmaXJzdCBgXWAgYWZ0ZXIgaXQgdGhhdCBubyBgXFxgIGVzY2FwZXMgKGEgYFxcYCB0YWtlc1xuICogdGhlIGNoYXJhY3RlciBhZnRlciBpdCBhbG9uZykuIE9ORSBmb3J3YXJkIHBhc3MuXG4gKlxuICogSXQgcmVwbGFjZXMgYHNvdXJjZS5tYXRjaEFsbCgvXFxbKCg/OlxcXFxbXFxzXFxTXXxbXlxcXVxcXFxdKSopXFxdL2cpYCBhbmQgZ2l2ZXMgdGhlXG4gKiBzYW1lIGJvZGllcyBmb3IgZXZlcnkgc3RyaW5nIChwaW5uZWQgYWdhaW5zdCB0aGF0IHJlZ2V4IGFzIHRoZSBjb250cm9sLFxuICogdGVzdC9saWIvbWVtb3J5L3NlY3VyaXR5L25lZWRzLXBhdGgtbGluZWFyLnNlY3VyaXR5LnRlc3QudHMpLiBUaGUgcmVnZXggd2FzXG4gKiBxdWFkcmF0aWM6IGFmdGVyIGEgYFtgIHRoYXQgbmV2ZXIgY2xvc2VkIGl0IHJldHJpZWQgYXQgZXZlcnkgbGF0ZXIgYFtgLFxuICogZWFjaCByZXRyeSByZXNjYW5uaW5nIHRvIHRoZSBlbmQg4oCUIGBcXFtgIHJlcGVhdGVkIDMyLDAwMCB0aW1lcyB0b29rIDAuNyBzLFxuICogYW5kIGBzZXRQb2xpY3lgIHJ1bnMgb25jZSBwZXIgc3RhZ2UncyBzY29wZSAoQ29kZVFMIGpzL3BvbHlub21pYWwtcmVkb3MpLlxuICogVGhlIHBhc3Mgc3RvcHMgYXQgdGhlIGZpcnN0IGBbYCB0aGF0IG5ldmVyIGNsb3NlcyBpbnN0ZWFkOiBhIGxhdGVyIGBbYFxuICogc3RhcnRzIGl0cyBib2R5IHdoZXJlIHRoZSBmYWlsZWQgc2NhbiB3YXMgYWxzbyBiZXR3ZWVuIHR3byB0b2tlbnMsIHNvIGl0XG4gKiByZWFkcyB0aGUgc2FtZSB0YWlsIHRoZSBzYW1lIHdheSBhbmQgY2xvc2VzIG5vd2hlcmUgZWl0aGVyLlxuICpcbiAqIEBpbnRlcm5hbCBFeHBvcnRlZCBmb3IgdGhhdCB0ZXN0IG9ubHkg4oCUIG5vdCBvbiBhbnkgcHVibGljIGRvb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0JvZGllcyhzb3VyY2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYm9kaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgb3BlbiA9IHNvdXJjZS5pbmRleE9mKCdbJyk7XG4gIHdoaWxlIChvcGVuICE9PSAtMSkge1xuICAgIGNvbnN0IGNsb3NlID0gY2xvc2luZ0JyYWNrZXQoc291cmNlLCBvcGVuICsgMSk7XG4gICAgaWYgKGNsb3NlID09PSAtMSkgYnJlYWs7XG4gICAgYm9kaWVzLnB1c2goc291cmNlLnNsaWNlKG9wZW4gKyAxLCBjbG9zZSkpO1xuICAgIG9wZW4gPSBzb3VyY2UuaW5kZXhPZignWycsIGNsb3NlICsgMSk7XG4gIH1cbiAgcmV0dXJuIGJvZGllcztcbn1cblxuLyoqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYF1gIGF0IG9yIGFmdGVyIGBmcm9tYCB0aGF0IG5vIGBcXGAgZXNjYXBlcywgZWxzZSAtMSAoYSB0cmFpbGluZyBsb25lIGBcXGAgZXNjYXBlcyBub3RoaW5nIGFuZCBjbG9zZXMgbm90aGluZykuICovXG5mdW5jdGlvbiBjbG9zaW5nQnJhY2tldChzb3VyY2U6IHN0cmluZywgZnJvbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGF0ID0gZnJvbTtcbiAgd2hpbGUgKGF0IDwgc291cmNlLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbYXRdO1xuICAgIGlmIChjaGFyID09PSAnXScpIHJldHVybiBhdDtcbiAgICBhdCArPSBjaGFyID09PSAnXFxcXCcgPyAyIDogMTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKiBgc2VydmVkTGVhZmAncyBhbnN3ZXIgZm9yIGEgdmFsdWUgaXQgbGVhdmVzIGFzIGl0IGlzLiAqL1xuY29uc3QgS0VFUDogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgna2VwdCBhcyBpdCBpcycpO1xuXG4vKiogRWFjaCBmaWVsZCBwYXRoIGFzIG9uZSBsaXRlcmFsIGtleSBhbmQsIHdoZW4gZG90dGVkLCBhcyBpdHMgc2VnbWVudHMuICovXG5mdW5jdGlvbiB0YXJnZXRzT2YocGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogVGFyZ2V0W10ge1xuICBjb25zdCBvdXQ6IFRhcmdldFtdID0gW107XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocyA/PyBbXSkge1xuICAgIG91dC5wdXNoKFtwYXRoXSk7XG4gICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkgb3V0LnB1c2gocGF0aC5zcGxpdCgnLicpKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogVGhlIG1lbW8ga2V5IG9mIGEgdGFyZ2V0IHN0YXRlIOKAlCBvcmRlci1mcmVlLiAqL1xuZnVuY3Rpb24gc2lnbmF0dXJlT2YodGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10pOiBzdHJpbmcge1xuICByZXR1cm4gdGFyZ2V0cy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiB0YXJnZXRzXG4gICAgICAgIC5tYXAoKHQpID0+IHQuam9pbignXFx1MDAxZicpKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5qb2luKCdcXHUwMDFlJyk7XG59XG5cbi8qKiBPbmUgZWRnZSdzIGRlY2lzaW9uOiB0aGUgdmFsdWUgdW5kZXIgYGtleWAgaXMgbWFza2VkIGhlcmUsIG9yIHRoZXNlIHRhcmdldHMgY29udGludWUgYmVsb3cgaXQuICovXG5mdW5jdGlvbiBkZWNpZGVFZGdlKFxuICBrZXk6IHN0cmluZyxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBkZXB0aDogbnVtYmVyLFxuKTogeyBtYXNrZWQ6IGJvb2xlYW47IGJlbG93OiBUYXJnZXRbXSB9IHtcbiAgY29uc3QgYmVsb3c6IFRhcmdldFtdID0gW107XG4gIGxldCBtYXNrZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgIGlmICh0YXJnZXRbMF0gIT09IGtleSkgY29udGludWU7XG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDEpIG1hc2tlZCA9IHRydWU7XG4gICAgZWxzZSBiZWxvdy5wdXNoKHRhcmdldC5zbGljZSgxKSk7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSB3YWxrLnJvb3REZWNpZGVkICYmIGRlcHRoID09PSAwID8gdW5kZWZpbmVkIDogd2Fsay5uYW1lcztcbiAgaWYgKG5hbWVzICE9PSB1bmRlZmluZWQgJiYgIW1hc2tlZCkge1xuICAgIG1hc2tlZCA9XG4gICAgICBuYW1lcy5tYXNrcyhrZXkpIHx8XG4gICAgICAobmFtZXMucGF0aE1hc2tzICE9PSB1bmRlZmluZWQgJiYgZG90dGVkICE9PSB1bmRlZmluZWQgJiYgbmFtZXMucGF0aE1hc2tzKGAke2RvdHRlZH0uJHtrZXl9YCkpO1xuICAgIGJlbG93LnB1c2goLi4udGFyZ2V0c09mKG5hbWVzLmZpZWxkcyhrZXkpKSk7XG4gIH1cbiAgcmV0dXJuIHsgbWFza2VkLCBiZWxvdyB9O1xufVxuXG4vKiogT25lIHN0ZXAgZG93biBhIHdhbGsncyBwYXRoOiBjb3VudCB0aGUgdmlzaXQg4oCUIGBmYWxzZWAgb25jZSB0aGUgd2FsayBpcyBwYXN0IGl0cyBsaW1pdC4gKi9cbmZ1bmN0aW9uIHZpc2l0KHdhbGs6IFdhbGspOiBib29sZWFuIHtcbiAgaWYgKC0td2Fsay5idWRnZXQgPj0gMCkgcmV0dXJuIHRydWU7XG4gIGlmICghd2Fsay5saW1pdGVkKSB7XG4gICAgd2Fsay5saW1pdGVkID0gdHJ1ZTtcbiAgICB3YWxrLm9uTGltaXQ/LigpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBJcyBhbnl0aGluZyBzZWxlY3RlZCBvbiBzb21lIFBBVEggdW5kZXIgYG5vZGVgPyBSZWFkLW9ubHk7IGEgY3ljbGUgZWRnZSBpc1xuICogbm90IGZvbGxvd2VkLiBgYmFja2AgaXMgdGhlIHNoYWxsb3dlc3QgYW5jZXN0b3IgYSBza2lwcGVkIGN5Y2xlIGVkZ2UgYmVsb3dcbiAqIHJlYWNoZWQg4oCUIGEgYGZhbHNlYCB0aGF0IHJlc3RzIG9uIG9uZSBpcyBub3Qgc2hhcmVkIChtZW1vKS5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0c0J5UGF0aChcbiAgbm9kZTogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIGFuY2VzdG9yczogTWFwPG9iamVjdCwgbnVtYmVyPixcbiAgZGVwdGg6IG51bWJlcixcbik6IHsgc2VsZWN0ZWQ6IGJvb2xlYW47IGJhY2s6IG51bWJlciB9IHtcbiAgLy8gUGFzdCB0aGUgbGltaXQ6IGFzc3VtZSBhIHNlbGVjdGlvbiDigJQgdGhlIGNvcHkgc2VydmVzIHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGFzIHRoZSBwbGFjZWhvbGRlci5cbiAgaWYgKCF2aXNpdCh3YWxrKSkgcmV0dXJuIHsgc2VsZWN0ZWQ6IHRydWUsIGJhY2s6IEluZmluaXR5IH07XG4gIGlmICh3YWxrLm5hbWVzID09PSB1bmRlZmluZWQgJiYgdGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybiB7IHNlbGVjdGVkOiBmYWxzZSwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3Qgc2lnID0gd2Fsay5tZW1vID8gc2lnbmF0dXJlT2YodGFyZ2V0cykgOiAnJztcbiAgY29uc3Qga25vd24gPSB3YWxrLm1lbW8/LmdldChub2RlKT8uZ2V0KGBzJHtzaWd9YCk7XG4gIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBzZWxlY3RlZDoga25vd24gYXMgYm9vbGVhbiwgYmFjazogSW5maW5pdHkgfTtcbiAgYW5jZXN0b3JzLnNldChub2RlLCBkZXB0aCk7XG4gIGxldCBiYWNrID0gSW5maW5pdHk7XG4gIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGNvbnN0IGVkZ2UgPSBkZWNpZGVFZGdlKGtleSwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBkZXB0aCk7XG4gICAgaWYgKGVkZ2UubWFza2VkKSB7XG4gICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGF0ID0gYW5jZXN0b3JzLmdldChjaGlsZCk7XG4gICAgaWYgKGF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBhdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRQYXRoID0gd2Fsay5uYW1lcz8ucGF0aE1hc2tzID8gKGRvdHRlZCA9PT0gdW5kZWZpbmVkID8ga2V5IDogYCR7ZG90dGVkfS4ke2tleX1gKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiZWxvdyA9IHNlbGVjdHNCeVBhdGgoY2hpbGQsIGNoaWxkUGF0aCA/PyBrZXksIGVkZ2UuYmVsb3csIHdhbGssIGFuY2VzdG9ycywgZGVwdGggKyAxKTtcbiAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYmVsb3cuYmFjayk7XG4gICAgaWYgKGJlbG93LnNlbGVjdGVkKSB7XG4gICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgYW5jZXN0b3JzLmRlbGV0ZShub2RlKTtcbiAgaWYgKHdhbGsubWVtbyAmJiAoc2VsZWN0ZWQgfHwgYmFjayA+PSBkZXB0aCkpIHJlbWVtYmVyKHdhbGsubWVtbywgbm9kZSwgYHMke3NpZ31gLCBzZWxlY3RlZCk7XG4gIHJldHVybiB7IHNlbGVjdGVkLCBiYWNrOiBiYWNrIDwgZGVwdGggPyBiYWNrIDogSW5maW5pdHkgfTtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXIobWVtbzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+Piwgbm9kZTogb2JqZWN0LCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgbGV0IGVudHJpZXMgPSBtZW1vLmdldChub2RlKTtcbiAgaWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkgbWVtby5zZXQobm9kZSwgKGVudHJpZXMgPSBuZXcgTWFwKCkpKTtcbiAgZW50cmllcy5zZXQoa2V5LCB2YWx1ZSk7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlZCBjb3B5IG9mIGBub2RlYCwgY29weS1vbi13cml0ZSBQRVIgUEFUSC4gRXZlcnkgY29udGFpbmVyIGVudGVyZWRcbiAqIGdldHMgaXRzIGNvcHkgQkVGT1JFIGl0cyBjaGlsZHJlbiBhcmUgd2Fsa2VkLCBzbyBhIGN5Y2xlIGVkZ2UgaXMgcG9pbnRlZCBhdFxuICogdGhlIGFuY2VzdG9yJ3MgY29weSDigJQgbmV2ZXIgYmFjayBhdCBhbiB1bnNjcnViYmVkIG9yaWdpbmFsOyBhIGNvbnRhaW5lciBpc1xuICogc2VydmVkIGFzIGl0c2VsZiB3aGVuIG5vdGhpbmcgdW5kZXIgaXQgY2hhbmdlZCBhbmQgbm8gY3ljbGUgcGFzc2VzIHRocm91Z2hcbiAqIGl0LiBBIHBydW5lZCBkZXNjZW50IChhIGJhcmUgZmllbGQgc2NydWIgb2YgYW4gYWN5Y2xpYyB2YWx1ZSkgc2tpcHMgc3VidHJlZXNcbiAqIG5vIHRhcmdldCByZWFjaGVzLiBgYmFja2AgaXMgdGhlIHNoYWxsb3dlc3QgYW5jZXN0b3IgYSBjeWNsZSBlZGdlIGJlbG93XG4gKiByZWFjaGVkIChgSW5maW5pdHlgOiBub25lKTsgYSBjb3B5IHRoYXQgcmVzdHMgb24gbm9uZSBpcyBzaGFyZWQgKG1lbW8pLlxuICovXG5mdW5jdGlvbiBjb3B5QnlQYXRoKFxuICBub2RlOiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgcGxhY2Vob2xkZXI6IHN0cmluZyxcbiAgYW5jZXN0b3JzOiBNYXA8b2JqZWN0LCB7IGNvcHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBkZXB0aDogbnVtYmVyIH0+LFxuICBkZXB0aDogbnVtYmVyLFxuICBwcnVuZTogYm9vbGVhbixcbik6IHsgb3V0OiB1bmtub3duOyBiYWNrOiBudW1iZXIgfSB7XG4gIC8vIFBhc3QgdGhlIGxpbWl0OiB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBpcyBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyIOKAlCBuZXZlciByYXcuXG4gIGlmICghdmlzaXQod2FsaykpIHJldHVybiB7IG91dDogcGxhY2Vob2xkZXIsIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IHNpZyA9IHdhbGsubWVtbyA/IGBjJHtzaWduYXR1cmVPZih0YXJnZXRzKX1gIDogJyc7XG4gIGNvbnN0IGtub3duID0gd2Fsay5tZW1vPy5nZXQobm9kZSk/LmdldChzaWcpO1xuICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgb3V0OiBrbm93biwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3QgZnJhbWUgPSB7XG4gICAgY29weTogKEFycmF5LmlzQXJyYXkobm9kZSkgPyBub2RlLnNsaWNlKCkgOiB7IC4uLm5vZGUgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZGVwdGgsXG4gIH07XG4gIGFuY2VzdG9ycy5zZXQobm9kZSwgZnJhbWUpO1xuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBsZXQgYmFjayA9IEluZmluaXR5O1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGNvbnN0IGVkZ2UgPSBkZWNpZGVFZGdlKGtleSwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBkZXB0aCk7XG4gICAgaWYgKGVkZ2UubWFza2VkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBwbGFjZWhvbGRlcjtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBhbmNlc3RvciA9IGFuY2VzdG9ycy5nZXQoY2hpbGQpO1xuICAgIGlmIChhbmNlc3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBhbmNlc3Rvci5jb3B5O1xuICAgICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGFuY2VzdG9yLmRlcHRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocHJ1bmUgJiYgZWRnZS5iZWxvdy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHdhbGsubmFtZXM/LnBhdGhNYXNrcyA/IChkb3R0ZWQgPT09IHVuZGVmaW5lZCA/IGtleSA6IGAke2RvdHRlZH0uJHtrZXl9YCkgOiBrZXk7XG4gICAgY29uc3QgYmVsb3cgPSBjb3B5QnlQYXRoKGNoaWxkLCBjaGlsZFBhdGgsIGVkZ2UuYmVsb3csIHdhbGssIHBsYWNlaG9sZGVyLCBhbmNlc3RvcnMsIGRlcHRoICsgMSwgcHJ1bmUpO1xuICAgIGlmIChiZWxvdy5vdXQgIT09IGNoaWxkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBiZWxvdy5vdXQ7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGJlbG93LmJhY2spO1xuICB9XG4gIGFuY2VzdG9ycy5kZWxldGUobm9kZSk7XG4gIGNvbnN0IG91dCA9IGNoYW5nZWQgfHwgYmFjayA8PSBkZXB0aCA/IGZyYW1lLmNvcHkgOiBub2RlO1xuICBpZiAod2Fsay5tZW1vICYmIGJhY2sgPj0gZGVwdGgpIHJlbWVtYmVyKHdhbGsubWVtbywgbm9kZSwgc2lnLCBvdXQpO1xuICByZXR1cm4geyBvdXQsIGJhY2s6IGJhY2sgPCBkZXB0aCA/IGJhY2sgOiBJbmZpbml0eSB9O1xufVxuXG4vKiogRG9lcyBhbnkgcGF0aCBmcm9tIGByb290YCBjb21lIGJhY2sgdG8gYW4gb2JqZWN0IG9uIGl0PyAqL1xuZnVuY3Rpb24gaGFzQ3ljbGUocm9vdDogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGRvbmUgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gIGNvbnN0IG9uUGF0aCA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICBjb25zdCB2aXNpdE5vZGUgPSAobm9kZTogb2JqZWN0KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKG9uUGF0aC5oYXMobm9kZSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChkb25lLmhhcyhub2RlKSkgcmV0dXJuIGZhbHNlO1xuICAgIG9uUGF0aC5hZGQobm9kZSk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG5vZGUpKSB7XG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiB2aXNpdE5vZGUoY2hpbGQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgb25QYXRoLmRlbGV0ZShub2RlKTtcbiAgICBkb25lLmFkZChub2RlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIHJldHVybiB2aXNpdE5vZGUocm9vdCk7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlZCBmb3JtIG9mIGByb290YCB1bmRlciBhIHdhbGs6IGByb290YCBpdHNlbGYgd2hlbiBubyBwYXRoIHNlbGVjdHNcbiAqIGFueXRoaW5nLCBlbHNlIGl0cyBjb3B5LW9uLXdyaXRlIGNvcHkgKHBhc3QgdGhlIHdhbGsgbGltaXQsIGl0cyB1bnZpc2l0ZWRcbiAqIHJlbWFpbmRlciBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyKS4gVGhyb3dzIOKAlCB0aGUgY2FsbGVyIHJlZnVzZXMgdG8gc2VydmVcbiAqIOKAlCBvbiBhbiBlbnVtZXJhYmxlIGdldHRlciB0aGF0IHRocm93cy5cbiAqL1xuZnVuY3Rpb24gc2VydmVkQnlQYXRoKFxuICByb290OiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgcGxhY2Vob2xkZXI6IHN0cmluZyxcbik6IHVua25vd24ge1xuICBpZiAoIXNlbGVjdHNCeVBhdGgocm9vdCwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBuZXcgTWFwKCksIDApLnNlbGVjdGVkKSByZXR1cm4gcm9vdDtcbiAgd2Fsay5idWRnZXQgPSB3YWxrTGltaXQ7XG4gIC8vIEEgYmFyZSBmaWVsZCBzY3J1YiBvZiBhbiBhY3ljbGljIHZhbHVlIHdhbGtzIGl0cyB0YXJnZXRzIG9ubHk6IG5vIGN5Y2xlIGNhbiBicmluZyBhblxuICAvLyB1bnNjcnViYmVkIG9yaWdpbmFsIGJhY2suIEV2ZXJ5IG90aGVyIHdhbGsgdmlzaXRzIGV2ZXJ5IHBhdGggKGEgY3ljbGUgZWRnZSBhbnl3aGVyZVxuICAvLyBtdXN0IGxhbmQgb24gYSBzZXJ2ZWQgY29weSkuXG4gIGNvbnN0IHBydW5lID0gd2Fsay5uYW1lcyA9PT0gdW5kZWZpbmVkICYmICFoYXNDeWNsZShyb290KTtcbiAgcmV0dXJuIGNvcHlCeVBhdGgocm9vdCwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBwbGFjZWhvbGRlciwgbmV3IE1hcCgpLCAwLCBwcnVuZSkub3V0O1xufVxuXG4vKiogQSBwbGFpbiByZWNvcmQg4oCUIHRoZSBvbmx5IHNoYXBlIGEgbWFwcGVyIGlzIGhhbmRlZCBhcyBhIHJlY29yZGluZyB2aWV3IChhIGNsYXNzIGluc3RhbmNlIGtlZXBzIGl0cyBwcm90b3R5cGUpLiAqL1xuZnVuY3Rpb24gaXNQbGFpblJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cbi8qKiBUaGUgc3RyaWN0ZXIgb2YgdHdvIHZlcmRpY3RzIG9uIHRoZSBzYW1lIHZhbHVlOiB3aG9sZSBvdmVyIGZpZWxkcyBvdmVyIGNsZWFyOyBmaWVsZHMgdW5pdGUuICovXG5mdW5jdGlvbiBzdHJpY3RlcihhOiBSZWRhY3Rpb25WZXJkaWN0IHwgdW5kZWZpbmVkLCBiOiBSZWRhY3Rpb25WZXJkaWN0KTogUmVkYWN0aW9uVmVyZGljdCB7XG4gIGlmIChhID09PSB1bmRlZmluZWQgfHwgYS5raW5kID09PSAnY2xlYXInIHx8IGIua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIGI7XG4gIGlmIChhLmtpbmQgPT09ICd3aG9sZScgfHwgYi5raW5kID09PSAnY2xlYXInKSByZXR1cm4gYTtcbiAgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogYS5rZXksIHBhdGhzOiBbLi4ubmV3IFNldChbLi4uYS5wYXRocywgLi4uYi5wYXRoc10pXSB9O1xufVxuXG4vKipcbiAqIFRIRSBUQUlOVCBSVUxFIGF0IGEgc3ViZmxvdyBtYXBwZXIgYm91bmRhcnkgKGFuIGBpbnB1dE1hcHBlcmAgc2VlZGluZyBhXG4gKiBzdWJmbG93LCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnaW5nIGl0IGJhY2spOiBhIGtleSB0aGUgbWFwcGVyIHdyaXRlc1xuICogaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGUgU0VMRUNURUQgdmFsdWUgaXQgY29waWVkIOKAlCBhIG1hcmsgKG9yXG4gKiBpbmhlcml0ZWQgZmllbGRzKSwgYnkgbmFtZSwgbGlrZSBhIHBlci1jYWxsIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAg4oCUXG4gKiBzbyB0aGUgc3ViZmxvdydzIHNlZWQsIGxvZywgbWlycm9yLCByZWFkcywgbmFycmF0aXZlIGFuZCByZXN1bHRzLCBhbmQgdGhlXG4gKiBwYXJlbnQncyBtZXJnZS1iYWNrLCByZXRhaW4gdGhlIGNvcHkgYXMgdGhleSByZXRhaW4gaXRzIHNvdXJjZS4gRGVjaWRlZCBieVxuICogd2hpY2ggdmFsdWVzIHRoZSBtYXBwZXIgUkVBRDpcbiAqXG4gKiAgIC0gU0FNRSBOQU1FIOKAlCBhIHZhbHVlIHBhc3NlZCBvbiB1bmRlciB0aGUgbmFtZSBpdCB3YXMgcmVhZCB1bmRlciBrZWVwc1xuICogICAgIHRoYXQgbmFtZSdzIHZlcmRpY3QgKGB7IGNvdW50OiBwLmNvdW50IH1gLCBgeyAuLi5wIH1gKTogYSBjbGVhciB2YWx1ZVxuICogICAgIHN0YXlzIGNsZWFyLCB3aGVyZXZlciBlbHNlIHRoZSBtYXBwZXIgcmVhZCBhIHNlY3JldC5cbiAqICAgLSBFWEFDVCDigJQgYW4gb3V0cHV0IE9CSkVDVCB0aGF0IElTIChieSByZWZlcmVuY2UpIGEgdmFsdWUgdGhlIG1hcHBlciByZWFkXG4gKiAgICAgaW5oZXJpdHMgdGhhdCBrZXkncyB2ZXJkaWN0OiB3aG9sZSBzdGF5cyB3aG9sZSwgYGZpZWxkc2AgaGFuZCB0aGVpciBwYXRoc1xuICogICAgIHRvIHRoZSBuZXcga2V5LCBjbGVhciBzdGF5cyBjbGVhci4gVGhlIHJlY29yZCB0aGUgbWFwcGVyIHdhcyBIQU5ERUQsXG4gKiAgICAgcGFzc2VkIG9uIHdob2xlIChgKHApID0+ICh7IGN0eDogcCB9KWApLCBoYW5kcyBldmVyeSBzZWxlY3RlZCBrZXkgb2YgaXRcbiAqICAgICB0byB0aGUgbmV3IGtleSBhcyBhIGZpZWxkIChgY3R4LnRva2VuYCkuXG4gKiAgIC0gQ09OU0VSVkFUSVZFIOKAlCBhbnkgb3RoZXIgb3V0cHV0IChhIHByaW1pdGl2ZSB1bmRlciBhIG5ldyBuYW1lLCBvciBhblxuICogICAgIG9iamVjdCB0aGUgbWFwcGVyIGJ1aWx0KSBpcyBzZWxlY3RlZCBXSE9MRSB3aGVuIHRoZSBtYXBwZXIgcmVhZCBhXG4gKiAgICAgc2VsZWN0ZWQgdmFsdWUg4oCUIGEgd2hvbGUtc2VsZWN0ZWQga2V5LCBvciBhIHNlbGVjdGVkIEZJRUxEIG9mIGFcbiAqICAgICBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQg4oCUIG9yIHdoZW4gaXQgZW1iZWRzIGEgc2VsZWN0ZWQgcmVjb3JkIGJ5XG4gKiAgICAgcmVmZXJlbmNlOyB0aGUgbGlicmFyeSBjYW5ub3QgdGVsbCB3aGF0IGEgY29tcHV0ZWQgdmFsdWUgY2Fycmllcy5cbiAqICAgICAoVmFsdWVzIGFyZSBuZXZlciBtYXRjaGVkIGJ5IEVRVUFMSVRZIGFjcm9zcyBuYW1lczogYW4gZXF1YWwgcHJpbWl0aXZlXG4gKiAgICAgd291bGQgb3Zlci1tYXRjaCB1bnJlbGF0ZWQga2V5cy4pXG4gKlxuICogSE9XIEZBUiBBIE1BUksgUkVBQ0hFUzogYSBOQU1FLCBydW4td2lkZSwgZnJvbSB0aGUgbW9tZW50IGl0IGlzIG1hZGUg4oCUIGV2ZXJ5XG4gKiBrZXkgb2YgdGhhdCBuYW1lIGluIHRoZSBzdWJmbG93LCB0aGUgcGFyZW50LCBhIHNpYmxpbmcgYW5kIGV2ZXJ5IGxhdGVyIHN0YWdlXG4gKiBpcyBzZWxlY3RlZCBpbiB3aGF0ZXZlciBpcyBzZXJ2ZWQsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzXG4gKiBpdCB0byB0aGUgcmVzdW1lZCBydW4gKGBGbG93Y2hhcnRDaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzYCkuXG4gKlxuICogQSBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQgdGhhdCBob2xkcyBhIHNlbGVjdGVkIGZpZWxkIGlzIGhhbmRlZCB0byB0aGVcbiAqIG1hcHBlciBhcyBhIHZpZXcgb2YgaXRzIG93biwgc28gcmVhZGluZyB0aGUgcmVjb3JkICh0byBwYXNzIGl0IG9uLCBvciB0b1xuICogdGVzdCBpdHMgdHlwZSkgaXMgbm90IHJlYWRpbmcgdGhlIGZpZWxkLiBSZWFkaW5nIGBydW5zYCAodGhlIG5hbWVzcGFjZSByb290XG4gKiBmb3JrIGNoaWxkcmVuIHdyaXRlIHVuZGVyKSByZWFkcyBldmVyeSBuYW1lc3BhY2VkIGtleS4gUmVjb3JkaW5nIHN0b3BzIHdoZW5cbiAqIHRoZSBtYXBwZXIgcmV0dXJuczsge0BsaW5rIGluaGVyaXR9IGhhbmRzIGJhY2sgdGhlIG91dHB1dCB3aXRoIGV2ZXJ5IHZpZXcgaXRcbiAqIHJldHVybmVkIHN3YXBwZWQgZm9yIHRoZSByZWNvcmQgYmVoaW5kIGl0LlxuICovXG5leHBvcnQgY2xhc3MgTWFwcGVyVGFpbnQge1xuICAvKiogRWFjaCBvYmplY3QgdGhlIG1hcHBlciByZWFkIOKGkiB0aGUgdmVyZGljdCBvZiB0aGUga2V5IGl0IHJlYWQgaXQgdW5kZXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PigpO1xuICAvKiogRWFjaCBrZXkgdGhlIG1hcHBlciByZWFkIOKGkiB0aGUgdmFsdWVzIGl0IHJlYWQgdW5kZXIgdGhhdCBuYW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duW10+KCk7XG4gIC8qKiBFYWNoIGBmaWVsZHNgIHZpZXcgaGFuZGVkIG91dCDihpIgdGhlIHJlY29yZCBiZWhpbmQgaXQgYW5kIGl0cyB2ZXJkaWN0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdzID0gbmV3IE1hcDxvYmplY3QsIHsgcmF3OiBvYmplY3Q7IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgfT4oKTtcbiAgLyoqIEVhY2ggcmVjb3JkIHRoZSBtYXBwZXIgd2FzIGhhbmRlZCDihpIgYXMgYSB2aWV3IChwYXNzZWQgb24gd2hvbGUsIGl0IGhhbmRzIG9uIGl0cyBzZWxlY3RlZCBrZXlzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWNvcmRzID0gbmV3IE1hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAvKiogVGhlIHNlbGVjdGVkIHZhbHVlcyB0aGUgbWFwcGVyIHJlYWQgKHdob2xlIGtleXMsIHNlbGVjdGVkIGZpZWxkcykg4oCUIHdoYXQgaXQgY291bGQgcGxhbnQgYnkgcmVmZXJlbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3JldFJlYWRzOiB1bmtub3duW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJlYWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvcGVuID0gdHJ1ZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcnVsZTogUmVkYWN0aW9uUnVsZSkge31cblxuICAvKiogYHVuZGVmaW5lZGAgd2hpbGUgdGhlIHJ1bidzIHJ1bGUgaXMgaW5lcnQg4oCUIG5vdGhpbmcgYSBtYXBwZXIgcmVhZHMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICBzdGF0aWMgb2YocnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IE1hcHBlclRhaW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IG5ldyBNYXBwZXJUYWludChydWxlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVjb3JkIGEgbWFwcGVyIGlzIGhhbmRlZDogdGhlIHNhbWUgb3duIGtleXMgYW5kIHZhbHVlcywgZWFjaCByZWFkXG4gICAqIHJlY29yZGVkLiBBbiBhY2Nlc3NvciBwZXIga2V5LCBub3QgYSBQcm94eSDigJQgYSBtYXBwZXIgbWF5IHNwcmVhZCwgY2xvbmUgb3JcbiAgICogc2VyaWFsaXplIHdoYXQgaXQgaXMgaGFuZGVkLiBBbiBhc3NpZ25tZW50IGxhbmRzIG9uIHRoZSB2aWV3LCBuZXZlciBvbiB0aGVcbiAgICogbGl2ZSByZWNvcmQgYmVoaW5kIGl0LiBBbnl0aGluZyBidXQgYSBwbGFpbiByZWNvcmQgaXMgaGFuZGVkIG92ZXIgYXMgaXQgaXMuXG4gICAqL1xuICB3YXRjaDxUPihyZWNvcmQ6IFQpOiBUIHtcbiAgICBpZiAoIWlzUGxhaW5SZWNvcmQocmVjb3JkKSkgcmV0dXJuIHJlY29yZDtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3T2YocmVjb3JkLCAoa2V5KSA9PiB0aGlzLnNlcnZlZChrZXksIHJlY29yZFtrZXldKSk7XG4gICAgdGhpcy5yZWNvcmRzLnNldCh2aWV3LCByZWNvcmQpO1xuICAgIHJldHVybiB2aWV3IGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1hcHBlciByZXR1cm5lZCBgb3V0cHV0YDogZXZlcnkga2V5IGl0IHdyb3RlIGluaGVyaXRzIHdoYXQgaXQgY29waWVkXG4gICAqIChzZWUgdGhlIGNsYXNzKS4gUmV0dXJucyB0aGUgb3V0cHV0IHRvIHVzZSDigJQgdGhlIHNhbWUgb2JqZWN0IHVubGVzcyBhIHZpZXdcbiAgICogaGFkIHRvIGJlIHN3YXBwZWQgYmFjayBmb3IgdGhlIHJlY29yZCBiZWhpbmQgaXQuXG4gICAqL1xuICBpbmhlcml0PFQ+KG91dHB1dDogVCk6IFQge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIGlmIChvdXRwdXQgPT09IG51bGwgfHwgdHlwZW9mIG91dHB1dCAhPT0gJ29iamVjdCcpIHJldHVybiBvdXRwdXQ7XG4gICAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBbdGFyZ2V0LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0KSkge1xuICAgICAgY29uc3QgY29waWVkID0gdGhpcy5jb3BpZWRWZXJkaWN0KHRhcmdldCwgdmFsdWUpO1xuICAgICAgaWYgKGNvcGllZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmVhZCB8fCB0aGlzLmVtYmVkc1NlbGVjdGVkKHZhbHVlLCBuZXcgV2Vha1NldCgpKSkgdGhpcy5ydWxlLm1hcmsodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSBpZiAoY29waWVkLmtpbmQgPT09ICd3aG9sZScpIHRoaXMucnVsZS5tYXJrKHRhcmdldCk7XG4gICAgICBlbHNlIGlmIChjb3BpZWQua2luZCA9PT0gJ2ZpZWxkcycpIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKHRhcmdldCwgY29waWVkLnBhdGhzKTtcbiAgICAgIGNvbnN0IHJhdyA9IHRoaXMuYmVoaW5kKHZhbHVlKTtcbiAgICAgIC8vIEFuIG9iamVjdCBwYXNzZWQgb24gQlkgUkVGRVJFTkNFIG1heSBjYXJyeSB3aGF0IHRoZSBtYXBwZXIgcGxhbnRlZCBpbiBpdFxuICAgICAgLy8gKGBPYmplY3QuYXNzaWduKHAucmVxdWVzdCwgeyBhdXRoOiBwLnRva2VuIH0pYCwgYHAubGlzdC5wdXNoKHAudG9rZW4pYCk6XG4gICAgICAvLyBlYWNoIHBsYWNlIGl0IGhvbGRzIGEgc2VsZWN0ZWQgdmFsdWUgdGhlIG1hcHBlciByZWFkIGlzIGEgZmllbGQgb2YgdGhlIG5ldyBrZXkuXG4gICAgICBpZiAoY29waWVkICE9PSB1bmRlZmluZWQgJiYgY29waWVkLmtpbmQgIT09ICd3aG9sZScgJiYgcmF3ICE9PSBudWxsICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHBsYW50ZWQgPSB0aGlzLnBsYW50ZWRQYXRocyhyYXcpO1xuICAgICAgICBpZiAocGxhbnRlZC5sZW5ndGggPiAwKSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyh0YXJnZXQsIHBsYW50ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHJhdyAhPT0gdmFsdWUpIHtcbiAgICAgICAgb3V0ID8/PSAoQXJyYXkuaXNBcnJheShvdXRwdXQpID8gWy4uLm91dHB1dF0gOiB7IC4uLm91dHB1dCB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgb3V0W3RhcmdldF0gPSByYXc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAob3V0ID8/IG91dHB1dCkgYXMgVDtcbiAgfVxuXG4gIC8qKiBXaGF0IG9uZSByZWNvcmRlZCByZWFkIGhhbmRzIHRoZSBtYXBwZXIgKHNlZSB0aGUgY2xhc3MpLiAqL1xuICBwcml2YXRlIHNlcnZlZChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMub3BlbikgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IHJlYWQgPSB0aGlzLmJ5TmFtZS5nZXQoa2V5KTtcbiAgICBpZiAocmVhZCA9PT0gdW5kZWZpbmVkKSB0aGlzLmJ5TmFtZS5zZXQoa2V5LCBbdmFsdWVdKTtcbiAgICBlbHNlIHJlYWQucHVzaCh2YWx1ZSk7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKGtleSwgdmFsdWUpO1xuICAgIC8vIEFuIGFic2VudCBrZXkgY2FycmllcyBubyBzZWNyZXQ7IG5laXRoZXIgZG9lcyBhIHZhbHVlIHdpdGggbm8gZmllbGRzIChhIHNjYWxhcikgb3Igbm9uZSBvZlxuICAgIC8vIGl0cyBzZWxlY3RlZCBvbmVzIOKAlCBzdGF0ZSByZXRhaW5zIHRob3NlIGFzIHRoZXkgYXJlIHRvby5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCAhUmVkYWN0aW9uUnVsZS5ob2xkc1BhdGhzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1lbWJlcih2YWx1ZSwgdmVyZGljdCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQbGFpblJlY29yZCh2YWx1ZSkpIHJldHVybiB0aGlzLmZpZWxkc1ZpZXcodmFsdWUsIHZlcmRpY3QpO1xuICAgIH1cbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVhZCA9IHRydWU7XG4gICAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSB0aGlzLnNlY3JldFJlYWRzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW1lbWJlcih2YWx1ZSwgdmVyZGljdCk7XG4gIH1cblxuICBwcml2YXRlIHJlbWVtYmVyKHZhbHVlOiB1bmtub3duLCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0KTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuc291cmNlcy5zZXQodmFsdWUsIHN0cmljdGVyKHRoaXMuc291cmNlcy5nZXQodmFsdWUpLCB2ZXJkaWN0KSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBBIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZDogcmVhZGluZyBvbmUgb2YgaXRzIHNlbGVjdGVkIGZpZWxkcyAob3IgYSBwYXRoJ3MgZmlyc3Qgc2VnbWVudCkgaXMgYSBzZWxlY3RlZCByZWFkLiAqL1xuICBwcml2YXRlIGZpZWxkc1ZpZXcocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCAmIHsga2luZDogJ2ZpZWxkcycgfSk6IG9iamVjdCB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdmVyZGljdC5wYXRocykgc2VsZWN0ZWQuYWRkKHBhdGgpLmFkZChwYXRoLnNwbGl0KCcuJylbMF0pO1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdPZihyZWNvcmQsIChrZXkpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wZW4gJiYgc2VsZWN0ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJlYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlY3JldFJlYWRzLnB1c2gocmVjb3JkW2tleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlY29yZFtrZXldO1xuICAgIH0pO1xuICAgIHRoaXMudmlld3Muc2V0KHZpZXcsIHsgcmF3OiByZWNvcmQsIHZlcmRpY3QgfSk7XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICBwcml2YXRlIHZpZXdPZihyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWFkOiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgdmlldzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmQpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmlldywga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiByZWFkKGtleSksXG4gICAgICAgIHNldDogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXcsIGtleSwgeyB2YWx1ZSwgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIC8qKiBUaGUgcmVjb3JkIGJlaGluZCBhIHZpZXcgdGhlIG1hcHBlciByZXR1cm5lZDsgYW55IG90aGVyIHZhbHVlIGFzIGl0IGlzLiAqL1xuICBwcml2YXRlIGJlaGluZCh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMudmlld3MuZ2V0KHZhbHVlKT8ucmF3ID8/IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpID8/IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJkaWN0IGB0YXJnZXRgIGluaGVyaXRzIGZyb20gYHZhbHVlYCDigJQgYHVuZGVmaW5lZGAgd2hlbiBpdCBpc1xuICAgKiBuZWl0aGVyIGEgdmFsdWUgdGhlIG1hcHBlciByZWFkIG5vciBvbmUgcGFzc2VkIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAgICovXG4gIHByaXZhdGUgY29waWVkVmVyZGljdCh0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBSZWRhY3Rpb25WZXJkaWN0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld3MuZ2V0KHZhbHVlKTtcbiAgICAgIGlmICh2aWV3KSByZXR1cm4gdmlldy52ZXJkaWN0O1xuICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkc09mKHJlY29yZCk7XG4gICAgICBjb25zdCBrbm93biA9IHRoaXMuc291cmNlcy5nZXQodmFsdWUpO1xuICAgICAgaWYgKGtub3duKSByZXR1cm4ga25vd247XG4gICAgfVxuICAgIGNvbnN0IHJlYWQgPSB0aGlzLmJ5TmFtZS5nZXQodGFyZ2V0KTtcbiAgICByZXR1cm4gcmVhZD8uc29tZSgodikgPT4gT2JqZWN0LmlzKHYsIHZhbHVlKSkgPyB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZCh0YXJnZXQsIHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBIHdob2xlIHJlY29yZCdzIHNlbGVjdGVkIGtleXMsIGFzIGZpZWxkcyBvZiB3aGF0ZXZlciBrZXkgaXQgaXMgcGFzc2VkIG9uIHVuZGVyLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkRmllbGRzT2YocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZChrZXksIHJlY29yZFtrZXldKTtcbiAgICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHBhdGhzLnB1c2goa2V5KTtcbiAgICAgIGVsc2UgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIGZvciAoY29uc3QgcGF0aCBvZiB2ZXJkaWN0LnBhdGhzKSBwYXRocy5wdXNoKGAke2tleX0uJHtwYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHMubGVuZ3RoID09PSAwID8gQ0xFQVIgOiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6ICcnLCBwYXRocyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIGByb290YCAoYW4gb2JqZWN0IHRoZSBtYXBwZXIgcGFzc2VkIG9uIGJ5IHJlZmVyZW5jZSkgaG9sZHMgb25lIG9mIHRoZVxuICAgKiBzZWxlY3RlZCBQUklNSVRJVkVTIGl0IHJlYWQg4oCUIG1hdGNoZWQgYnkgdmFsdWUsIG9ubHkgYWdhaW5zdCB3aGF0IHRoaXNcbiAgICogbWFwcGVyIHJlYWQgYW5kIG9ubHkgaW5zaWRlIHdoYXQgaXQgcGFzc2VkIG9uLCBzbyBvdmVyLW1hdGNoaW5nIGFuIGVxdWFsXG4gICAqIHZhbHVlIGlzIHRoZSBzYWZlIHNpZGUuIE9uZSByZWxhdGl2ZSBwYXRoIHBlciBwbGFjZSwgYSBzaGFyZWQgb2JqZWN0IGF0XG4gICAqIGVhY2ggb2YgaXRzIHBhdGhzOyBhIGN5Y2xlIGVkZ2UgaXMgbm90IGZvbGxvd2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBwbGFudGVkUGF0aHMocm9vdDogb2JqZWN0KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlY3JldHMgPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgY29uc3QgY29sbGVjdCA9ICh2YWx1ZTogdW5rbm93biwgc2VlbjogU2V0PG9iamVjdD4pOiB2b2lkID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykgc2VjcmV0cy5hZGQodmFsdWUpO1xuICAgICAgZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgY29sbGVjdChjaGlsZCwgc2Vlbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuc2VjcmV0UmVhZHMpIGNvbGxlY3QodmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgaWYgKHNlY3JldHMuc2l6ZSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG1lbW8gPSBuZXcgTWFwPG9iamVjdCwgc3RyaW5nW10+KCk7XG4gICAgY29uc3Qgb25QYXRoID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gICAgY29uc3QgaW5zaWRlID0gKG5vZGU6IG9iamVjdCk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGtub3duID0gbWVtby5nZXQobm9kZSk7XG4gICAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgICAgaWYgKG9uUGF0aC5oYXMobm9kZSkpIHJldHVybiBbXTtcbiAgICAgIG9uUGF0aC5hZGQobm9kZSk7XG4gICAgICBjb25zdCBmb3VuZDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnKSBmb3IgKGNvbnN0IHN1YiBvZiBpbnNpZGUoY2hpbGQpKSBmb3VuZC5wdXNoKGAke2tleX0uJHtzdWJ9YCk7XG4gICAgICAgIGVsc2UgaWYgKHNlY3JldHMuaGFzKGNoaWxkKSkgZm91bmQucHVzaChrZXkpO1xuICAgICAgfVxuICAgICAgb25QYXRoLmRlbGV0ZShub2RlKTtcbiAgICAgIG1lbW8uc2V0KG5vZGUsIGZvdW5kKTtcbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9O1xuICAgIHJldHVybiBpbnNpZGUocm9vdCk7XG4gIH1cblxuICAvKiogRG9lcyBhIHZhbHVlIHRoZSBtYXBwZXIgQlVJTFQgZW1iZWQsIGJ5IHJlZmVyZW5jZSwgYSBzZWxlY3RlZCByZWNvcmQgaXQgcmVhZCBvciB3YXMgaGFuZGVkPyAqL1xuICBwcml2YXRlIGVtYmVkc1NlbGVjdGVkKHZhbHVlOiB1bmtub3duLCBzZWVuOiBXZWFrU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMudmlld3MuaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSk7XG4gICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQpLmtpbmQgIT09ICdjbGVhcic7XG4gICAgY29uc3Qga25vd24gPSB0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKTtcbiAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCAmJiBrbm93bi5raW5kICE9PSAnY2xlYXInKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBpZiAodGhpcy5lbWJlZHNTZWxlY3RlZChjaGlsZCwgc2VlbikpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19