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
@@ -25,9 +25,9 @@
25
25
  */
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
27
  exports.FlowchartTraverser = void 0;
28
+ const foottrace_1 = require("foottrace");
28
29
  const errorInfo_js_1 = require("../../errors/errorInfo.js");
29
30
  const reservedIds_js_1 = require("../../ids/reservedIds.js");
30
- const runtimeStageId_js_1 = require("../../ids/runtimeStageId.js");
31
31
  const types_js_1 = require("../../pause/types.js");
32
32
  const readonlyInput_js_1 = require("../../scope/protection/readonlyInput.js");
33
33
  const prefixNodeTree_js_1 = require("../graph/prefixNodeTree.js");
@@ -246,9 +246,7 @@ class FlowchartTraverser {
246
246
  this.root = opts.root;
247
247
  this.entry = opts.entry;
248
248
  this.entryPendingPauses = opts.entry ? opts.pendingPauses : undefined;
249
- this.resume =
250
- opts.resume ??
251
- (opts.subflowStatesForResume ? ResumeEntry_js_1.ResumeEntry.fromCaptures(opts.subflowStatesForResume) : undefined);
249
+ this.resume = opts.resume;
252
250
  // Shallow-copy stageMap and subflows so that lazy-resolution mutations
253
251
  // (prefixed entries added during execution) stay scoped to THIS traverser
254
252
  // and do not escape to the shared FlowChart object. Without the copy,
@@ -912,7 +910,7 @@ class FlowchartTraverser {
912
910
  // (buffered by runtimeStageId) and flow events (flushed by traversalContext.runtimeStageId)
913
911
  // use the same value. Must happen before executeStage AND before traversalContext.
914
912
  const idx = this._executionCounter.value++;
915
- context.runtimeStageId = (0, runtimeStageId_js_1.buildRuntimeStageId)(node.id, idx);
913
+ context.runtimeStageId = (0, foottrace_1.buildRuntimeStageId)(node.id, idx);
916
914
  context.bindEmitOrigin(this.runId, this.emitDrillPath);
917
915
  // Declared tags (9.21.0) ride the same stamp: per-node identity, set
918
916
  // UNCONDITIONALLY so a re-used context (a loop's next-context, a resumed
@@ -959,7 +957,7 @@ class FlowchartTraverser {
959
957
  this.subflows[node.subflowId] = { root: prefixedRoot };
960
958
  // Merge stageMap entries
961
959
  for (const [key, fn] of resolved.stageMap) {
962
- const prefixedKey = (0, runtimeStageId_js_1.joinPath)(node.subflowId, key);
960
+ const prefixedKey = (0, foottrace_1.joinPath)(node.subflowId, key);
963
961
  if (!this.stageMap.has(prefixedKey)) {
964
962
  this.stageMap.set(prefixedKey, fn);
965
963
  }
@@ -967,7 +965,7 @@ class FlowchartTraverser {
967
965
  // Merge nested subflows
968
966
  if (resolved.subflows) {
969
967
  for (const [key, def] of Object.entries(resolved.subflows)) {
970
- const prefixedKey = (0, runtimeStageId_js_1.joinPath)(node.subflowId, key);
968
+ const prefixedKey = (0, foottrace_1.joinPath)(node.subflowId, key);
971
969
  if (!this.subflows[prefixedKey]) {
972
970
  // Prefixed like the builder's `_mountSubflow` (9.37.0 fix): the
973
971
  // nested root's ids live under the lazy mount's path too.
@@ -1343,14 +1341,14 @@ class FlowchartTraverser {
1343
1341
  this.subflows[subflowId] = { root };
1344
1342
  // Stage functions land under the branch's prefix, matching the prefixed ids.
1345
1343
  for (const [key, fn] of chart.stageMap) {
1346
- this.stageMap.set((0, runtimeStageId_js_1.joinPath)(subflowId, key), fn);
1344
+ this.stageMap.set((0, foottrace_1.joinPath)(subflowId, key), fn);
1347
1345
  }
1348
1346
  // Nested subflows inside the branch chart, same prefixing.
1349
1347
  if (chart.subflows) {
1350
1348
  for (const [key, def] of Object.entries(chart.subflows)) {
1351
1349
  // Prefixed like the builder's `_mountSubflow` (9.37.0 fix): without it
1352
1350
  // every branch ran its nested subflow's stages under ONE id.
1353
- this.subflows[(0, runtimeStageId_js_1.joinPath)(subflowId, key)] = {
1351
+ this.subflows[(0, foottrace_1.joinPath)(subflowId, key)] = {
1354
1352
  root: (0, prefixNodeTree_js_1.prefixNodeTree)(def.root, subflowId),
1355
1353
  };
1356
1354
  }
@@ -1402,4 +1400,4 @@ class FlowchartTraverser {
1402
1400
  }
1403
1401
  }
1404
1402
  exports.FlowchartTraverser = FlowchartTraverser;
1405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHOzs7QUFFSCw0REFBeUU7QUFDekUsNkRBQTREO0FBQzVELG1FQUE0RTtBQUU1RSxtREFBcUQ7QUFDckQsOEVBQTJFO0FBRTNFLGtFQUE0RDtBQUM1RCx3REFBMEQ7QUFDMUQsMkRBQThEO0FBQzlELHlFQUFtRTtBQUNuRSwrREFBeUQ7QUFDekQsaUZBQTJFO0FBQzNFLHFFQUErRDtBQUMvRCxpRUFBMkQ7QUFDM0QscUZBQStFO0FBRS9FLCtEQUF3RjtBQUN4Rix1RkFBaUY7QUFDakYsdUVBQWlFO0FBQ2pFLCtEQUF5RDtBQUN6RCw2REFBbUc7QUFDbkcsK0RBQXlEO0FBQ3pELHVFQUFpRTtBQUNqRSwrRUFBeUU7QUFFekUsc0ZBQWdGO0FBQ2hGLG9GQUE4RTtBQUM5RSw0R0FBc0c7QUFFdEcsZ0VBQW1GO0FBNEpuRjs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZLEdBQWtCLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBcUQvRSxTQUFTLGlCQUFpQixDQUFlLEtBQWM7SUFDckQsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSyxLQUFpQyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNsSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUE2RCxFQUFFLE9BQWU7SUFDdEcsSUFBSSxTQUFTLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQUksS0FBYyxDQUFDO0lBQ25CLElBQUksT0FBTyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFD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QUFpQyxDQUFDLENBQUM7Z0JBQzVELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN2QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBd0MsQ0FBQztnQkFDL0QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQ3JELFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztZQUN2RixJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQ3pDLFNBQVMsRUFDVCxXQUFXLEVBQ1gsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQzVCLFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQW5oREgsZ0RBb2hEQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKAlCBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBvZiBTdGFnZU5vZGUgZ3JhcGguXG4gKlxuICogVW5pZmllZCB0cmF2ZXJzYWwgYWxnb3JpdGhtIGZvciBhbGwgbm9kZSBzaGFwZXMuIGBleGVjdXRlTm9kZWAgaXMgYVxuICogVFJBTVBPTElORSBkcml2ZXI6IGl0IHJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluXG4gKiBhIGZsYXQgbG9vcCwgZm9sbG93aW5nIHRhaWwgY29udGludWF0aW9ucyAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlcyxcbiAqIGR5bmFtaWMgbmV4dCwgZmxhdCBkZWNpZGVyIGRpc3BhdGNoKSBpdGVyYXRpdmVseSDigJQgc28gY2hhaW4gbGVuZ3RoIGFuZFxuICogbG9vcCBpdGVyYXRpb25zIG5ldmVyIGdyb3cgdGhlIGNhbGwgc3RhY2suIE9ubHkgdHJ1ZSB0cmVlIG5lc3RpbmcgKGZvcmtcbiAqIGNoaWxkcmVuLCB3aXRoLWNvbnRpbnVhdGlvbiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLCBzdWJmbG93IG1vdW50cylcbiAqIHJlY3Vyc2VzLlxuICpcbiAqIEZvciBlYWNoIG5vZGUsIGV4ZWN1dGVOb2RlU3RlcCBmb2xsb3dzIDcgcGhhc2VzOlxuICogICAwLiBDTEFTU0lGWSAg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uLCBlYXJseSBkZWxlZ2F0aW9uXG4gKiAgIDBiLiBQQVJBTExFTC1GT1ItRUFDSCDigJQgZHluYW1pYyBmYW4tb3V0IChicmFuY2hlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGF5bG9hZClcbiAqICAgMS4gVkFMSURBVEUgIOKAlCBub2RlIGludmFyaWFudHMsIHJvbGUgbWFya2Vyc1xuICogICAyLiBFWEVDVVRFICAg4oCUIHJ1biBzdGFnZSBmbiwgY29tbWl0LCBicmVhayBjaGVja1xuICogICAzLiBEWU5BTUlDICAg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uLCBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLCBzdHJ1Y3R1cmUgdXBkYXRlc1xuICogICA0LiBDSElMRFJFTiAg4oCUIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBkaXNwYXRjaFxuICogICA1LiBDT05USU5VRSAg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IHJlc29sdXRpb25cbiAqICAgNi4gTEVBRiAgICAgIOKAlCBubyBjb250aW51YXRpb24sIHJldHVybiBvdXRwdXRcbiAqXG4gKiBCcmVhayBzZW1hbnRpY3M6IElmIGEgc3RhZ2UgY2FsbHMgYnJlYWtGbigpLCBjb21taXQgYW5kIFNUT1AuXG4gKiBQYXRjaCBtb2RlbDogU3RhZ2Ugd3JpdGVzIGludG8gbG9jYWwgcGF0Y2g7IGNvbW1pdFBhdGNoKCkgYWZ0ZXIgcmV0dXJuIG9yIHRocm93LlxuICovXG5cbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IHJlZnVzZVJlc2VydmVkSWQgfSBmcm9tICcuLi8uLi9pZHMvcmVzZXJ2ZWRJZHMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCwgam9pblBhdGggfSBmcm9tICcuLi8uLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBzbmFwc2hvdFJ1bklucHV0IH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgcHJlZml4Tm9kZVRyZWUgfSBmcm9tICcuLi9ncmFwaC9wcmVmaXhOb2RlVHJlZS5qcyc7XG5pbXBvcnQgeyBpc1N0YWdlTm9kZVJldHVybiB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVCcmVha0hhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9icmVha0ZsYWcuanMnO1xuaW1wb3J0IHsgQ2hpbGRyZW5FeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL0NoaWxkcmVuRXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2UgfSBmcm9tICcuLi9oYW5kbGVycy9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBDb250aW51YXRpb25SZXNvbHZlciB9IGZyb20gJy4uL2hhbmRsZXJzL0NvbnRpbnVhdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IERlY2lkZXJIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvRGVjaWRlckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9QYXJhbGxlbEZvckVhY2hIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVkUGF1c2UgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBxdWV1ZUJlaGluZCwgcmFpc2VRdWV1ZWRQYXVzZSwgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBSdW50aW1lU3RydWN0dXJlTWFuYWdlciB9IGZyb20gJy4uL2hhbmRsZXJzL1J1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdG9ySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1NlbGVjdG9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRQYXVzZSB9IGZyb20gJy4uL2hhbmRsZXJzL3NlcnZlZFBhdXNlLmpzJztcbmltcG9ydCB7IGxvZ2dhYmxlU3RhZ2VFcnJvciwgcmVjb3JkU3RhZ2VFcnJvciwgc2VydmVkU3RhZ2VFcnJvciB9IGZyb20gJy4uL2hhbmRsZXJzL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHsgU3RhZ2VSdW5uZXIgfSBmcm9tICcuLi9oYW5kbGVycy9TdGFnZVJ1bm5lci5qcyc7XG5pbXBvcnQgeyBTdWJmbG93RXhlY3V0b3IgfSBmcm9tICcuLi9oYW5kbGVycy9TdWJmbG93RXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgVHJhdmVyc2FsRGVwdGhFcnJvciB9IGZyb20gJy4uL2hhbmRsZXJzL1RyYXZlcnNhbERlcHRoRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcgfSBmcm9tICcuLi9oYW5kbGVycy90eXBlcy5qcyc7XG5pbXBvcnQgeyBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIH0gZnJvbSAnLi4vbmFycmF0aXZlL0Zsb3dSZWNvcmRlckRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vbmFycmF0aXZlL05hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IgfSBmcm9tICcuLi9uYXJyYXRpdmUvTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyLCBJQ29udHJvbEZsb3dOYXJyYXRpdmUsIFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgcm9vdFRyYXZlcnNhbENvbnRleHQsIHRyYXZlcnNhbENvbnRleHRGb3IgfSBmcm9tICcuLi90cmF2ZXJzYWxDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBJTG9nZ2VyLFxuICBOb2RlUmVzdWx0VHlwZSxcbiAgU2NvcGVGYWN0b3J5LFxuICBTZWxlY3RvcixcbiAgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdGFnZU5vZGUsXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdWJmbG93TW91bnRPcHRpb25zLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgVHJhdmVyc2FsUmVzdWx0LFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhdmVyc2VyT3B0aW9uczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSBncmFwaCB0aGlzIHRyYXZlcnNlciB3YWxrcyDigJQgYW5kIHRoZSBncmFwaCBldmVyeSBpZCByZXNvbHZlcyBhZ2FpbnN0XG4gICAqICh0aGUgbm9kZSBtYXAgYmVoaW5kIGV2ZXJ5IGBsb29wVG9gLCB0aGUgREZTIGZhbGxiYWNrKS4gYGV4ZWN1dGUoKWBcbiAgICogc3RhcnRzIGhlcmUgdW5sZXNzIGBlbnRyeWAgc2F5cyBvdGhlcndpc2UuXG4gICAqL1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqXG4gICAqIFdoZXJlIGBleGVjdXRlKClgIHN0YXJ0cyB3aGVuIG5vdCBhdCBgcm9vdGAg4oCUIGEgcmVzdW1lJ3Mgb25lLXNob3RcbiAgICogcmUtZW50cnkgKE0yKTogdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluLCBvciB0aGUgbW91bnQgb2YgdGhlIGZpcnN0XG4gICAqIHN1YmZsb3cgb24gdGhlIHBhdXNlIHBhdGgsIGVhY2ggd2l0aCBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvblxuICAgKiBhdHRhY2hlZC4gVmlzaXRlZCBvbmNlLCBmaXJzdCwgYW5kIG5ldmVyIHJlZ2lzdGVyZWQgYW55d2hlcmUgYW4gaWQgY2FuXG4gICAqIHJlYWNoIGl0LCBzbyBhIGxvb3AgYmFjayB0byB0aGUgcGF1c2VkIHN0YWdlIGZpbmRzIHRoZSBSRUFMIHN0YWdlLlxuICAgKiBDb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuXG4gICAqL1xuICBlbnRyeT86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGFyYWxsZWwgc2libGluZ3MnIHBhdXNlcyB3YWl0aW5nIGF0IHRoaXMgbGV2ZWwgKGEgcmVzdW1lLCA5LjI4LjApOiBvbmNlXG4gICAqIGBlbnRyeWAncyBjaGFpbiBlbmRzLCBgZXhlY3V0ZSgpYCByYWlzZXMgdGhlIGZpcnN0IGFnYWluICh0aGUgcmVzdCB3YWl0XG4gICAqIGJlaGluZCBpdCk7IGEgcGF1c2UgcmFpc2VkIGZyb20gaW5zaWRlIHRoZSBjaGFpbiBjYXJyaWVzIHRoZW0gYWxsLiBPbmx5XG4gICAqIHdpdGggYGVudHJ5YDsgY29uc3VtZWQgYnkgdGhlIGZpcnN0IGBleGVjdXRlKClgLiBTZWUgYFJlc3VtZUVudHJ5YC5cbiAgICovXG4gIHBlbmRpbmdQYXVzZXM/OiByZWFkb25seSBRdWV1ZWRQYXVzZVtdO1xuICBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBFeGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHByb3BhZ2F0ZXMgdG8gc3ViZmxvd3MgYXV0b21hdGljYWxseS4gKi9cbiAgZXhlY3V0aW9uRW52PzogaW1wb3J0KCcuLi8uLi9lbmdpbmUvdHlwZXMuanMnKS5FeGVjdXRpb25FbnY7XG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gIG5hcnJhdGl2ZUVuYWJsZWQ/OiBib29sZWFuO1xuICBidWlsZFRpbWVTdHJ1Y3R1cmU/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIGxvZ2dlcjogSUxvZ2dlcjtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBQcmUtY29uZmlndXJlZCBGbG93UmVjb3JkZXJzIHRvIGF0dGFjaCB3aGVuIG5hcnJhdGl2ZSBpcyBlbmFibGVkLiAqL1xuICBmbG93UmVjb3JkZXJzPzogRmxvd1JlY29yZGVyW107XG4gIC8qKlxuICAgKiBQcmUtY29uZmlndXJlZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLiBJZiBwcm92aWRlZCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyXG4gICAqIGZsb3dSZWNvcmRlcnMgYW5kIG5hcnJhdGl2ZUVuYWJsZWQuIFVzZWQgYnkgdGhlIHN1YmZsb3cgdHJhdmVyc2VyIGZhY3RvcnlcbiAgICogdG8gc2hhcmUgdGhlIHBhcmVudCdzIG5hcnJhdGl2ZSBnZW5lcmF0b3Igd2l0aCBzdWJmbG93IHRyYXZlcnNlcnMuXG4gICAqL1xuICBuYXJyYXRpdmVHZW5lcmF0b3I/OiBJQ29udHJvbEZsb3dOYXJyYXRpdmU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG5lc3RlZCBleGVjdXRlTm9kZSBkZXB0aCAodHJlZSBuZXN0aW5nIOKAlCBicmFuY2gvZm9yayBkaXNwYXRjaCBhbmRcbiAgICogZHluYW1pYyByZWN1cnNpb24sIE5PVCBsaW5lYXIgY2hhaW5zIG9yIGxvb3AgaXRlcmF0aW9ucywgd2hpY2ggcnVuIGZsYXQpLlxuICAgKiBEZWZhdWx0cyB0byBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEggKDUwMCkuXG4gICAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gbG9vcCBpdGVyYXRpb25zIHBlciBub2RlICh0aGUgQ29udGludWF0aW9uUmVzb2x2ZXIgZ3VhcmQpLlxuICAgKiBEZWZhdWx0cyB0byBERUZBVUxUX01BWF9JVEVSQVRJT05TICgxMDAwKS4gUHJvcGFnYXRlZCB0byBzdWJmbG93XG4gICAqIHRyYXZlcnNlcnMuIE11c3QgYmUgPj0gMS5cbiAgICovXG4gIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgdHJhdmVyc2VyIHJ1bnMgaW5zaWRlIGEgc3ViZmxvdywgc2V0IHRoaXMgdG8gdGhlIHN1YmZsb3cncyBJRC5cbiAgICogUHJvcGFnYXRlZCB0byBUcmF2ZXJzYWxDb250ZXh0IHNvIG5hcnJhdGl2ZSBlbnRyaWVzIGNhcnJ5IHRoZSBjb3JyZWN0IHN1YmZsb3dJZC5cbiAgICovXG4gIHBhcmVudFN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCB0aGUgcnVudGltZVN0YWdlSWQgb2YgdGhlXG4gICAqIHN1YmZsb3cgTU9VTlQgc3RhZ2UgaW4gdGhlIHBhcmVudCB0cmF2ZXJzZXIuIFVzZWQgYXMgdGhlXG4gICAqIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgZmFsbGJhY2sgZm9yIHN0YWdlcyB3aG9zZSBTdGFnZUNvbnRleHQgaGFzIG5vXG4gICAqIHBhcmVudCAodGhlIHN1YmZsb3cncyBvd24gcm9vdCBjb250ZXh0IGlzIGNyZWF0ZWQgZnJlc2ggYnlcbiAgICogU3ViZmxvd0V4ZWN1dG9yKSBzbyBydW50aW1lIGFuY2VzdG9yIGNoYWlucyBjcm9zcyBzdWJmbG93IGJvdW5kYXJpZXNcbiAgICogKFJGQy0wMDMgRDEpLlxuICAgKi9cbiAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgLyoqIEBpbnRlcm5hbCBBY3R1YWwgcnVudGltZSBtb3VudCBhbmNlc3RyeSBmb3IgdGhlIG93bmluZyBsb2csIG5vdCBzdGF0aWMgc3ViZmxvd1BhdGguICovXG4gIGVtaXREcmlsbFBhdGg/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciBmcm9tIHBhcmVudCB0cmF2ZXJzZXIuIFN1YmZsb3dzIGNvbnRpbnVlIHRoZSBwYXJlbnQncyBudW1iZXJpbmcuICovXG4gIGV4ZWN1dGlvbkNvdW50ZXI/OiB7IHZhbHVlOiBudW1iZXIgfTtcbiAgLyoqXG4gICAqIFNoYXJlZCBwZXItcnVuIHZpc2l0LWNvdW50IG1hcCAoa2V5ZWQgYnkgc3RhZ2VJZCkgZnJvbSB0aGUgcGFyZW50IHRyYXZlcnNlci5cbiAgICogRHJpdmVzIGBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb25gLiBTaGFyZWQgd2l0aCBzdWJmbG93cyBzbyBhIHN0YWdlXG4gICAqIHJlLWVudGVyZWQgYWNyb3NzIGEgc3ViZmxvdyByZS1tb3VudCBrZWVwcyBhIGNvcnJlY3QsIG1vbm90b25pYyBpdGVyYXRpb25cbiAgICogY291bnQg4oCUIHRoZSBzYW1lIHNpbmdsZS1tYXAgc2VtYW50aWNzIHRoZSBuYXJyYXRpdmUgcmVjb3JkZXIgdXNlcy5cbiAgICovXG4gIHZpc2l0Q291bnRzPzogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoTTIpLCBzaGFyZWQgYnkgcmVmZXJlbmNlIHdpdGggZXZlcnlcbiAgICogbmVzdGVkIHRyYXZlcnNlciAodGhlIGV4ZWN1dGlvbiBjb3VudGVyJ3MgcHJlY2VkZW50KTogZWFjaCBzdWJmbG93IG9uIHRoZVxuICAgKiBwYXVzZSBwYXRoIHRha2VzIGl0cyBjYXB0dXJlZCBzdGF0ZSBhbmQgaXRzIGVudHJ5IHBvaW50IGV4YWN0bHkgb25jZSwgb25cbiAgICogaXRzIGZpcnN0IGVudHJ5LiBTZWUgYFJlc3VtZUVudHJ5YC4gVW5kZWZpbmVkIG9uIG5vcm1hbCBgcnVuKClgIHBhdGhzLlxuICAgKi9cbiAgcmVzdW1lPzogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHNpbmNlIDkuMjguMCDigJQgcGFzcyB7QGxpbmsgcmVzdW1lfS4gU3RpbGwgaG9ub3VyZWQsIHVuZGVyIHRoZVxuICAgKiBzYW1lIG9uZS1zaG90IGxhdzogZWFjaCBjYXB0dXJlIHNlZWRzIG9ubHkgdGhlIEZJUlNUIGVudHJ5IGludG8gaXRzXG4gICAqIHN1YmZsb3cgKGluIHBsYWNlIG9mIHRoZSBpbnB1dE1hcHBlcidzIHZhbHVlcyk7IGxhdGVyIGVudHJpZXMgYXJlXG4gICAqIG9yZGluYXJ5LiBJZ25vcmVkIHdoZW4gYHJlc3VtZWAgaXMgc2V0LlxuICAgKi9cbiAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqXG4gICAqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFRocmVhZGVkIGludG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dFxuICAgKiB0aGlzIHRyYXZlcnNlciBwcm9kdWNlcyBzbyByZWNvcmRlcnMgY2FuIHNjb3BlIHN0YXRlIHRvIGEgc2luZ2xlIHJ1bi5cbiAgICogU3ViZmxvdyB0cmF2ZXJzZXJzIGluaGVyaXQgdGhlIHBhcmVudCdzIHJ1bklkICh0aGUgc3ViZmxvdyBpcyBwYXJ0IG9mXG4gICAqIHRoZSBzYW1lIHJ1biBmcm9tIHRoZSBjb25zdW1lcidzIFBPVikuIFJlcXVpcmVkIGZpZWxkIOKAlCBldmVyeSBldmVudFxuICAgKiBuZWVkcyBpdC4gU2VlIGBydW5uZXIvcnVuSWQudHNgLlxuICAgKi9cbiAgcnVuSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXItbG9jYWwgb3ZlcmxheSBlbnRyeSBmb3IgYSBub2RlIHdob3NlIHN0YWdlIGZ1bmN0aW9uIHJldHVybmVkIGFcbiAqIFN0YWdlTm9kZSAoZHluYW1pYyBjb250aW51YXRpb24pLiBIb2xkcyB0aGUgZHluYW1pYyB2YWx1ZXMgdGhhdCBlYXJsaWVyXG4gKiB2ZXJzaW9ucyB3cm90ZSBESVJFQ1RMWSBvbnRvIHRoZSBzaGFyZWQgYnVpbHQtY2hhcnQgbm9kZSDigJQgd2hpY2ggbGVha2VkIHRoZVxuICogZHluYW1pYyBzaGFwZSBpbnRvIGV2ZXJ5IGxhdGVyIHJ1biBvZiB0aGUgc2FtZSBidWlsdCBjaGFydCBhbmQgcmFjZWRcbiAqIGNvbmN1cnJlbnQgZXhlY3V0b3JzLiBUaGUgb3ZlcmxheSBrZWVwcyB0aGUgYnVpbHQgZ3JhcGggaW1tdXRhYmxlOiBwYXRjaGVzXG4gKiBsaXZlIGluIGEgcGVyLXRyYXZlcnNlciBNYXAga2V5ZWQgYnkgYG5vZGUuaWRgIGFuZCBkaWUgd2l0aCB0aGUgcnVuLlxuICpcbiAqIGBuZXh0YCBpcyBpbnRlbnRpb25hbGx5IEFCU0VOVDogYSBkeW5hbWljIGBuZXh0YCBvbmx5IGV2ZXIgYXBwbGllcyB0byB0aGVcbiAqIHZpc2l0IHRoYXQgcHJvZHVjZWQgaXQgKHRoZSBvbGQgY29kZSB3cm90ZSBgbm9kZS5uZXh0YCBhbmQgcmVzdG9yZWQgaXRcbiAqIGJlZm9yZSBhbnl0aGluZyBjb3VsZCBvYnNlcnZlIHRoZSB3cml0ZSksIHNvIGl0IHN0YXlzIGEgbG9jYWwgdmFyaWFibGUgaW5cbiAqIGBleGVjdXRlTm9kZWAgYW5kIGlzIHJvdXRlZCB0aHJvdWdoIGBDb250aW51YXRpb25SZXNvbHZlcmAgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY05vZGVQYXRjaDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFN1YmZsb3cgbW91bnQgbWV0YWRhdGEgZnJvbSBhIGR5bmFtaWMtc3ViZmxvdyByZXR1cm4uIEdyb3VwZWQgc28gdGhlXG4gICAqIG1lcmdlZCB2aWV3IHJlcHJvZHVjZXMgdGhlIG9sZCBmaWVsZC13aXNlIG92ZXJ3cml0ZSBleGFjdGx5IOKAlCBpbmNsdWRpbmdcbiAgICogYHN1YmZsb3dOYW1lYC9gc3ViZmxvd01vdW50T3B0aW9uc2AgYmVjb21pbmcgdW5kZWZpbmVkIHdoZW4gdGhlIGR5bmFtaWNcbiAgICogcmV0dXJuIG9taXR0ZWQgdGhlbS5cbiAgICovXG4gIHN1YmZsb3dNZXRhPzoge1xuICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWU7XG4gICAgc3ViZmxvd0lkOiBzdHJpbmc7XG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBzdWJmbG93TW91bnRPcHRpb25zOiBTdWJmbG93TW91bnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogRHluYW1pYyBmb3JrIGNoaWxkcmVuIChyZXBsYWNlcyB0aGUgYnVpbHQgbm9kZSdzIGNoaWxkcmVuIGZvciB0aGlzIHJ1bikuICovXG4gIGNoaWxkcmVuPzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgLyoqIER5bmFtaWMgb3V0cHV0LWJhc2VkIHNlbGVjdG9yIGFjY29tcGFueWluZyBkeW5hbWljIGNoaWxkcmVuLiAqL1xuICBuZXh0Tm9kZVNlbGVjdG9yPzogU2VsZWN0b3I7XG59XG5cbi8qKlxuICogVHJhbXBvbGluZSBicmFuZCDigJQgbWFya3MgYSBjb250aW51YXRpb24gaG9wIHJldHVybmVkIGJ5IGBleGVjdXRlTm9kZVN0ZXBgXG4gKiB0byB0aGUgZHJpdmVyIGxvb3AgaW4gYGV4ZWN1dGVOb2RlYC4gTW9kdWxlLXByaXZhdGUgc3ltYm9sIHNvIGEgc3RhZ2UncyBvd25cbiAqIHJldHVybiB2YWx1ZSAod2hpY2ggY2FuIGJlIGFueSBvYmplY3QpIGNhbiBuZXZlciBiZSBtaXN0YWtlbiBmb3IgYSBob3AuXG4gKi9cbmNvbnN0IENPTlRJTlVFX0hPUDogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnZm9vdHByaW50anMuZXhlY3V0ZU5vZGUuY29udGludWUnKTtcblxuLyoqXG4gKiBBIGZsYXQgY29udGludWF0aW9uIOKAlCBcImV4ZWN1dGUgdGhpcyBub2RlIG5leHQsIGluIHRoaXMgY29udGV4dFwiIOKAlCByZXR1cm5lZFxuICogYnkgYGV4ZWN1dGVOb2RlU3RlcGAgZm9yIGV2ZXJ5IFRBSUwgY29udGludWF0aW9uIChsaW5lYXIgYG5leHRgLCBsb29wXG4gKiBlZGdlcywgZHluYW1pYyBuZXh0LCBkeW5hbWljLXN1YmZsb3cgcmUtZW50cnksIG5vLWNvbnRpbnVhdGlvbiBkZWNpZGVyXG4gKiBkaXNwYXRjaCkuIFRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgIGNvbnN1bWVzIGhvcHMgaXRlcmF0aXZlbHk6XG4gKiBgY3VycmVudCA9IGhvcDsgY29udGludWU7YCDigJQgc28gbmVpdGhlciB0aGUgY2FsbCBzdGFjayBub3IgdGhlIHJldGFpbmVkXG4gKiBwcm9taXNlIGNoYWluIGdyb3dzIHdpdGggY2hhaW4gbGVuZ3RoIG9yIGxvb3AgaXRlcmF0aW9ucy5cbiAqL1xuaW50ZXJmYWNlIENvbnRpbnVhdGlvbkhvcDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcmVhZG9ubHkgW0NPTlRJTlVFX0hPUF06IHRydWU7XG4gIHJlYWRvbmx5IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICByZWFkb25seSBjb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHJlYWRvbmx5IGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgaG9wIGlzIGEgZGVjaWRlcidzIGJyYW5jaCBkaXNwYXRjaCAoZGVjaWRlciB3aXRob3V0IGl0c1xuICAgKiBvd24gYG5leHRgKS4gVGhlIGRyaXZlciByZWNvcmRzIGl0IHNvIGEgUGF1c2VTaWduYWwgdGhyb3duIGFueXdoZXJlIGluXG4gICAqIHRoZSBjb250aW51ZWQgY2hhaW4gc3RpbGwgZ2V0cyB0aGUgZGVjaWRlciBzdGFtcGVkIGFzIGl0cyBpbnZva2VyIOKAlFxuICAgKiBleGFjdGx5IHdoYXQgdGhlIHJlY3Vyc2l2ZSBkaXNwYXRjaCdzIGNhdGNoIHVzZWQgdG8gZG8uXG4gICAqL1xuICByZWFkb25seSBpbnZva2VyU3RhbXA/OiBJbnZva2VyU3RhbXA7XG4gIC8qKlxuICAgKiBQcmVzZW50IHdoZW4gdGhlIGhvcCBmb2xsb3dzIGEgTE9PUCBlZGdlIChhIGJhY2stcmVmZXJlbmNlIHJlc29sdmVkIGJ5XG4gICAqIGBDb250aW51YXRpb25SZXNvbHZlcmApLiBBIGRlY2lkZXIncyBicmFuY2ggZnJhbWUgaGFuZHMgc3VjaCBhIGhvcCBiYWNrXG4gICAqIHRvIGl0cyBkZWNpZGVyIHdoZW4gdGhlIHRhcmdldCBpcyBub3QgYSBub2RlIHRoZSBmcmFtZSByYW4sIHNvIHRoZSBsb29wXG4gICAqIHJlLWVudGVycyBhdCB0aGUgdGFyZ2V0J3Mgb3duIGxldmVsIOKAlCBmbGF0LCBuZXZlciBvbmUgZnJhbWUgcGVyIHBhc3MuXG4gICAqL1xuICByZWFkb25seSBsb29wPzogdHJ1ZTtcbn1cblxuLyoqXG4gKiBXaGF0IGEgZHJpdmVyIHJlY29yZHMgZm9yIGVhY2ggc3RhZ2UgY29udGV4dCBpdCBydW5zOiBpdHMgTkVTVElORyBkZXB0aFxuICogKHNlZSBgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IG5lc3RpbmdEZXB0aE9mYCkgYW5kIHRoZSBub2RlIGlkcyBlYWNoIGRyaXZlclxuICogb24gaXRzIEJSQU5DSC1GUkFNRSBjaGFpbiBoYXMgcnVuIOKAlCBpdHMgb3duIGxhc3QuIEEgZGVjaWRlciB3aXRoIGl0cyBvd25cbiAqIGBuZXh0YCBoYW5kcyB0aGF0IGNoYWluIHRvIGl0cyBicmFuY2ggZnJhbWUsIHNvIHRoZSBmcmFtZSBjYW4gdGVsbCBhIGxvb3BcbiAqIGJhY2sgaW50byBhbiBlbmNsb3NpbmcgZHJpdmVyIChsZWF2ZSkgZnJvbSBhbnkgb3RoZXIganVtcCAoc3RheSkuXG4gKi9cbmludGVyZmFjZSBEcml2ZXJGcmFtZSB7XG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJhbjogcmVhZG9ubHkgUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPltdO1xuICAvKiogVGhlIGBuZXh0YC1jaGFpbiBpZHMgb2YgZXZlcnkgZGVjaWRlciB3aG9zZSBicmFuY2ggZnJhbWUgZW5jbG9zZXMgdGhpcyBkcml2ZXIuICovXG4gIHJlYWRvbmx5IHRhaWxzOiByZWFkb25seSBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+W107XG59XG5cbi8qKiBXaGF0IGEgYnJhbmNoIGZyYW1lIGluaGVyaXRzOiB0aGUgZW5jbG9zaW5nIHJhbi1zZXRzLCBhbmQgdGhlIHRhaWxzIGl0IG1heSBqdW1wIHRvLiAqL1xudHlwZSBFbmNsb3NpbmdGcmFtZXMgPSBQaWNrPERyaXZlckZyYW1lLCAncmFuJyB8ICd0YWlscyc+O1xuXG4vKiogUGF1c2UtaW52b2tlciBjb250ZXh0IHJlY29yZGVkIGJ5IHRoZSBkcml2ZXIgZm9yIGZsYXQgZGVjaWRlciBkaXNwYXRjaGVzLiAqL1xuaW50ZXJmYWNlIEludm9rZXJTdGFtcCB7XG4gIHJlYWRvbmx5IGludm9rZXJTdGFnZUlkOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbQ09OVElOVUVfSE9QXSA9PT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEge0BsaW5rIFJldHJ5UG9saWN5fSdzIGBiYWNrb2ZmTXNgIGZvciB0aGUgYXR0ZW1wdCB0aGF0IGp1c3QgZmFpbGVkXG4gKiAoMS1iYXNlZCkuIEFueXRoaW5nIHRoYXQgaXMgbm90IGEgZmluaXRlLCBwb3NpdGl2ZSBudW1iZXIg4oCUIGEgbWlzc2luZyBkaWFsLCBhXG4gKiBuZWdhdGl2ZSB2YWx1ZSwgYSBgTmFOYCBmcm9tIGEgY29uc3VtZXIncyBhcml0aG1ldGljLCBvciBhIHRocm93aW5nIGZ1bmN0aW9uXG4gKiDigJQgYmVjb21lcyBgMGAsIGkuZS4gcmV0cnkgaW1tZWRpYXRlbHkuIEEgYmFja29mZiBkaWFsIG11c3QgbmV2ZXIgYmUgYWJsZSB0b1xuICogY3Jhc2ggYSBydW4gb3IgcGFyayBpdCBmb3JldmVyLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQmFja29mZk1zKGJhY2tvZmZNczogbnVtYmVyIHwgKChhdHRlbXB0OiBudW1iZXIpID0+IG51bWJlcikgfCB1bmRlZmluZWQsIGF0dGVtcHQ6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChiYWNrb2ZmTXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgaWYgKHR5cGVvZiBiYWNrb2ZmTXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBiYWNrb2ZmTXMoYXR0ZW1wdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBiYWNrb2ZmTXM7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+IDAgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQXdhaXQgYG1zYCwgY3V0IHNob3J0IGJ5IGFuIGFib3J0LiBSZXNvbHZlcyBlaXRoZXIgd2F5IOKAlCB0aGUgY2FsbGVyIHJlLWNoZWNrc1xuICogYHNpZ25hbC5hYm9ydGVkYCBhbmQgcmV0aHJvd3MgdGhlIG9yaWdpbmFsIHN0YWdlIGVycm9yLCBzbyBhIGNhbmNlbGxlZCBydW5cbiAqIG5ldmVyIHNpdHMgb3V0IGEgbG9uZyBiYWNrb2ZmIGFuZCBuZXZlciBsb3NlcyB0aGUgZmFpbHVyZSB0aGF0IGNhdXNlZCBpdC5cbiAqIFRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyIGFyZSBhbHdheXMgY2xlYW5lZCB1cC5cbiAqL1xuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkb25lID0gKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBkb25lKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9O1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChkb25lLCBtcyk7XG4gICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKiBXaGVyZSB0aGUgbmV4dCBgZXhlY3V0ZSgpYCBzdGFydHMgd2hlbiBub3QgYXQgYHJvb3RgIOKAlCBvbmUtc2hvdCAoc2VlIFRyYXZlcnNlck9wdGlvbnMuZW50cnkpLiAqL1xuICBwcml2YXRlIGVudHJ5OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFNpYmxpbmdzJyBwYXVzZXMgcmFpc2VkIG9uY2UgYGVudHJ5YCdzIGNoYWluIGVuZHMg4oCUIG9uZS1zaG90IChzZWUgVHJhdmVyc2VyT3B0aW9ucy5wZW5kaW5nUGF1c2VzKS4gKi9cbiAgcHJpdmF0ZSBlbnRyeVBlbmRpbmdQYXVzZXM6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10gfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnksIHNoYXJlZCB3aXRoIG5lc3RlZCB0cmF2ZXJzZXJzLiBVbmRlZmluZWQgb24gYSBub3JtYWwgcnVuLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcHJpdmF0ZSBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKiogUkZDLTAwMyBEMTogcnVudGltZVN0YWdlSWQgb2YgdGhlIHN1YmZsb3cgbW91bnQgc3RhZ2UgaW4gdGhlIHBhcmVudFxuICAgKiAgdHJhdmVyc2VyLiBGYWxsYmFjayBgcGFyZW50UnVudGltZVN0YWdlSWRgIGZvciBzdGFnZXMgd2hvc2UgY29udGV4dCBoYXNcbiAgICogIG5vIHBhcmVudCAodGhlIHN1YmZsb3cgcm9vdCkuIFVuZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW1pdERyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIC8qKiBWYWxpZGF0ZWQgdmFsdWUgcGFzc2VkIHZpYSBgcnVuKHtpbnB1dH0pYC4gUm9vdCBib3VuZGFyeSBvYnNlcnZlcnNcbiAgICogIHJlY2VpdmUgaXRzIHJldGFpbmVkIGZvcm07IHN0YWdlIGFyZ3VtZW50cyBrZWVwIHRoZSBvcmlnaW5hbCBkYXRhLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBUaGUgaGFuZGxlcnMnIHNoYXJlZCBkZXBzIOKAlCBpdHMgYHJlYWRPbmx5Q29udGV4dGAgaXMgdGhlIGxlZydzIGlucHV0IHNuYXBzaG90LCBzZXQgYnkgYGV4ZWN1dGVgLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT47XG4gIC8qKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBTdGFtcGVkIG9udG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC5cbiAgICogIEluaGVyaXRlZCBieSBzdWJmbG93IHRyYXZlcnNlcnMgc28gYWxsIGV2ZW50cyBvZiBvbmUgcnVuIHNoYXJlIG9uZSBydW5JZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW5JZDogc3RyaW5nO1xuXG4gIC8vIEhhbmRsZXIgbW9kdWxlc1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVSZXNvbHZlcjogTm9kZVJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dFeGVjdXRvcjogU3ViZmxvd0V4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VSdW5uZXI6IFN0YWdlUnVubmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGludWF0aW9uUmVzb2x2ZXI6IENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaWRlckhhbmRsZXI6IERlY2lkZXJIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JIYW5kbGVyOiBTZWxlY3RvckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJhbGxlbEZvckVhY2hIYW5kbGVyOiBQYXJhbGxlbEZvckVhY2hIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RydWN0dXJlTWFuYWdlcjogUnVudGltZVN0cnVjdHVyZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmFycmF0aXZlR2VuZXJhdG9yOiBJQ29udHJvbEZsb3dOYXJyYXRpdmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB8IHVuZGVmaW5lZDtcblxuICAvLyBFeGVjdXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBzdWJmbG93UmVzdWx0czogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFBlci10cmF2ZXJzZXIgc2V0IG9mIGxhenkgc3ViZmxvdyBJRHMgdGhhdCBoYXZlIGJlZW4gcmVzb2x2ZWQgYnkgVEhJUyBydW4uXG4gICAqIFVzZWQgaW5zdGVhZCBvZiB3cml0aW5nIGBub2RlLnN1YmZsb3dSZXNvbHZlciA9IHVuZGVmaW5lZGAgYmFjayB0byB0aGUgc2hhcmVkXG4gICAqIFN0YWdlTm9kZSBncmFwaCDigJQgYXZvaWRzIGEgcmFjZSB3aGVyZSBhIGNvbmN1cnJlbnQgdHJhdmVyc2VyIGNsZWFycyB0aGUgc2hhcmVkXG4gICAqIHJlc29sdmVyIGJlZm9yZSBhbm90aGVyIHRyYXZlcnNlciBoYXMgZmluaXNoZWQgdXNpbmcgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkTGF6eVN1YmZsb3dzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFBlci10cmF2ZXJzZXIgb3ZlcmxheSBvZiBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm5zLCBrZXllZCBieSBgbm9kZS5pZGAuXG4gICAqIFBoYXNlIDQgd3JpdGVzIHBhdGNoZXMgSEVSRSBpbnN0ZWFkIG9mIG11dGF0aW5nIHRoZSBzaGFyZWQgYnVpbHQtY2hhcnRcbiAgICogbm9kZSBvYmplY3RzIChzYW1lIGlzb2xhdGlvbiBjb252ZW50aW9uIGFzIGByZXNvbHZlZExhenlTdWJmbG93c2ApLlxuICAgKiBBbGwgZW5naW5lIHJlYWRzIG9mIHRoZSBwYXRjaGVkIGZpZWxkcyBnbyB0aHJvdWdoIHRoZSBgZWZmKmAgYWNjZXNzb3JzXG4gICAqIGJlbG93LiBUaGUgbWFwIGRpZXMgd2l0aCB0aGUgdHJhdmVyc2VyIOKAlCBvbmUgcnVuLCBvbmUgb3ZlcmxheSDigJQgc28gYVxuICAgKiBmcmVzaCBleGVjdXRvciBvdmVyIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFsd2F5cyBzZWVzIHRoZSBvcmlnaW5hbCBncmFwaC5cbiAgICpcbiAgICogS2V5ZWQgYnkgdGhlIG5vZGUgT0JKRUNUIChXZWFrTWFwKSwgbm90IGBub2RlLmlkYDogYSBkeW5hbWljIGNoaWxkIHRoYXRcbiAgICogcmV1c2VzIGEgYnVpbHQgbm9kZSdzIGlkIG11c3QgTk9UIG1ha2UgdGhlIGJ1aWx0IG5vZGUgaW5oZXJpdCB0aGUgcGF0Y2hcbiAgICogKGlkLWtleWVkIGxvb2t1cCBjYXVzZWQgcGhhbnRvbSBkb3VibGUtZXhlY3V0aW9uKS4gYHBhdGNoQ291bnRgIGlzIHRoZVxuICAgKiBmYXN0LXBhdGggY2hlY2sg4oCUIFdlYWtNYXAgaGFzIG5vIGBzaXplYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY1BhdGNoZXMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+PigpO1xuICBwcml2YXRlIHBhdGNoQ291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnJhbWUgKE5FU1RJTkcgZGVwdGggKyBicmFuY2gtZnJhbWUgcmFuLXNldHMpIG9mIHRoZSBkcml2ZXIgdGhhdCByYW4gZWFjaCBzdGFnZSBjb250ZXh0IOKAlCBkZXB0aCBpcyBhXG4gICAqIHByb3BlcnR5IG9mIHRoZSBjYWxsIFBBVEgsIHNvIGl0IHRyYXZlbHMgd2l0aCB0aGUgY29udGV4dHMsIG5vdCBpbiBvbmVcbiAgICogcGVyLXRyYXZlcnNlciBjb3VudGVyLiBBIG5lc3RlZCBkcml2ZXIgKGZvcmsvc2VsZWN0b3IgY2hpbGQsIGEgZGVjaWRlcidzXG4gICAqIGJyYW5jaCBmcmFtZSkgc2l0cyBvbmUgbGV2ZWwgYmVsb3cgdGhlIGRyaXZlciB0aGF0IHJhbiB0aGUgY29udGV4dCBpdHNcbiAgICogb3duIGNvbnRleHQgd2FzIGNyZWF0ZWQgZnJvbSAoYFN0YWdlQ29udGV4dC5wYXJlbnRgKSDigJQgc28gcGFyYWxsZWxcbiAgICogc2libGluZ3Mgc2hhcmUgb25lIGRlcHRoLCBhbmQgNTIwIGNoaWxkcmVuIG9mIG9uZSBmb3JrIGFyZSA1MjAgZHJpdmVyc1xuICAgKiBhdCB0aGUgc2FtZSBsZXZlbCAodGhyb3VnaCA5LjM5LjAgYSBzaGFyZWQgY291bnRlciBtYWRlIHRoZW0gNTIwIGxldmVscykuXG4gICAqXG4gICAqIExpbmVhciBgbmV4dGAgY2hhaW5zLCBsb29wIGVkZ2VzLCBhbmQgZHluYW1pYyBjb250aW51YXRpb25zIGFyZSBmb2xsb3dlZFxuICAgKiBJVEVSQVRJVkVMWSBpbnNpZGUgb25lIGRyaXZlciBpbnZvY2F0aW9uLCBzbyB0aGV5IG5ldmVyIGFkZCBhIGxldmVsLlxuICAgKiBPbmx5IHRydWUgdHJlZSByZWN1cnNpb24gZG9lczogZm9yayBjaGlsZHJlbiwgZGVjaWRlci9zZWxlY3RvciBicmFuY2hcbiAgICogZGlzcGF0Y2ggKHdoZW4gdGhlIGRlY2lkZXIgaGFzIGl0cyBvd24gY29udGludWF0aW9uKSwgYW5kIHVuYm91bmRlZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbi4gUHJldmVudHMgY2FsbC1zdGFjayBvdmVyZmxvdyBvbiBydW5hd2F5IHJlY3Vyc2l2ZVxuICAgKiBjb21wb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZyYW1lT2YgPSBuZXcgV2Vha01hcDxTdGFnZUNvbnRleHQsIERyaXZlckZyYW1lPigpO1xuXG4gIC8qKiBgbmV4dGAtY2hhaW4gaWRzIHBlciBkZWNpZGVyIGNvbnRpbnVhdGlvbiBoZWFkIChgdGFpbElkc2ApLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90YWlsSWRzID0gbmV3IFdlYWtNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD4+KCk7XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBtdXRhYmxlIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBtb25vdG9uaWMsIGluY3JlbWVudGVkIHBlciBzdGFnZSBleGVjdXRpb24uXG4gICAqIFNoYXJlZCB3aXRoIGNoaWxkIHRyYXZlcnNlcnMgKHN1YmZsb3dzKSBzbyBpbmRpY2VzIGFyZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIGEgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhlY3V0aW9uQ291bnRlcjogeyB2YWx1ZTogbnVtYmVyIH07XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBwZXItcnVuIHZpc2l0IGNvdW50cyBrZXllZCBieSBzdGFnZUlkIOKAlCBob3cgbWFueSB0aW1lcyBlYWNoIHN0YWdlXG4gICAqIGhhcyBleGVjdXRlZCBpbiB0aGlzIHJ1bi4gU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGFcbiAgICogbG9vcGVkLWJhY2sgc3RhZ2UncyBpdGVyYXRpb24gY291bnQgaXMgbW9ub3RvbmljIGFjcm9zcyBzdWJmbG93IHJlLW1vdW50cyxcbiAgICogbWF0Y2hpbmcgdGhlIG5hcnJhdGl2ZSByZWNvcmRlcidzIHNpbmdsZS1tYXAgc2VtYW50aWNzLiBEcml2ZXNcbiAgICogYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF92aXNpdENvdW50czogTWFwPHN0cmluZywgbnVtYmVyPjtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIG1heGltdW0gZGVwdGggKHNldCBmcm9tIFRyYXZlcnNlck9wdGlvbnMubWF4RGVwdGggb3IgdGhlIGNsYXNzIGRlZmF1bHQpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4RGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIGxvb3AtaXRlcmF0aW9uIGxpbWl0IGZvcndhcmRlZCB0byB0aGUgQ29udGludWF0aW9uUmVzb2x2ZXJcbiAgICogYW5kIHByb3BhZ2F0ZWQgdG8gc3ViZmxvdyB0cmF2ZXJzZXJzLiBVbmRlZmluZWQg4oaSIHJlc29sdmVyIGRlZmF1bHQgKDEwMDApLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIG5lc3RlZCBleGVjdXRlTm9kZSBkZXB0aCBiZWZvcmUgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKlxuICAgKiAqKldoYXQgY291bnRzIGFzIGRlcHRoICh0cmFtcG9saW5lIG1vZGVsKToqKiBgZXhlY3V0ZU5vZGVgIGlzIGFuIGl0ZXJhdGl2ZVxuICAgKiBkcml2ZXIg4oCUIGxpbmVhciBgbmV4dGAgaG9wcywgbG9vcCBlZGdlcyAoYGxvb3BUb2AvZHluYW1pYyBuZXh0KSwgYW5kXG4gICAqIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSBhcmUgZm9sbG93ZWQgaW4gYSBmbGF0IGxvb3AgYW5kIGNvbnN1bWUgTk8gZGVwdGguXG4gICAqIERlcHRoIGdyb3dzIG9ubHkgd2l0aCB0cnVlIHRyZWUgbmVzdGluZzogb25lIHRpY2sgcGVyIGZvcmsgY2hpbGQsIG9uZSBwZXJcbiAgICogZGVjaWRlci9zZWxlY3RvciBicmFuY2ggZGlzcGF0Y2ggdGhhdCBtdXN0IHJldHVybiB0byBpdHMgaW52b2tlciAoZGVjaWRlclxuICAgKiB3aXRoIGl0cyBvd24gYG5leHRgKSwgb25lIHBlciBzdWJmbG93IG1vdW50IGZyYW1lIGluIHRoZSBwYXJlbnQgKHRoZVxuICAgKiBzdWJmbG93IGJvZHkgaXRzZWxmIHJ1bnMgb24gYSBGUkVTSCB0cmF2ZXJzZXIgd2l0aCBpdHMgb3duIGJ1ZGdldCkuXG4gICAqXG4gICAqIDUwMCB0aGVyZWZvcmUgY292ZXJzIGFueSByZWFsaXN0aWMgY2hhcnQg4oCUIGl0IGJvdW5kcyByZWN1cnNpdmVcbiAgICogQ09NUE9TSVRJT04sIG5vdCBjaGFpbiBsZW5ndGggb3IgbG9vcCBjb3VudC4gTG9vcHMgYXJlIGJvdW5kZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCdzIGluZGVwZW5kZW50IGl0ZXJhdGlvbiBsaW1pdCAoZGVmYXVsdCAxMDAwLFxuICAgKiBjb25maWd1cmFibGUgdmlhIGBSdW5PcHRpb25zLm1heEl0ZXJhdGlvbnNgKSwgd2hpY2ggaXMgbm93IHRoZSBiaW5kaW5nXG4gICAqIGNvbnN0cmFpbnQgZm9yIGxvb3AtaGVhdnkgcGlwZWxpbmVzLlxuICAgKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncyBzaGFyZSB0aGVpciBwYXJlbnQncyBkZXB0aCArIDEg4oCUIGEgZm9yayBvciBzZWxlY3RvciBvZiBhbnkgd2lkdGggaXNcbiAgICogb25lIGxldmVsLCBuZXZlciBvbmUgbGV2ZWwgcGVyIGNoaWxkLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3Qgc2FmZSBmb3IgY29uY3VycmVudCBgLmV4ZWN1dGUoKWAgY2FsbHMgb24gdGhlIHNhbWUgaW5zdGFuY2UgKHRoZSBicmVhayBmbGFnXG4gICAqIGFuZCB0aGUgcmVzb2x2ZXIncyBsb29wIGNvdW50cyBhcmUgcGVyIGluc3RhbmNlKS4gVXNlIGEgc2VwYXJhdGUgYEZsb3djaGFydFRyYXZlcnNlcmAgcGVyXG4gICAqIGNvbmN1cnJlbnQgZXhlY3V0aW9uLiBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFsd2F5cyBjcmVhdGVzIGEgZnJlc2ggdHJhdmVyc2VyIHBlciBjYWxsLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9FWEVDVVRFX0RFUFRIID0gNTAwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPikge1xuICAgIGNvbnN0IG1heERlcHRoID0gb3B0cy5tYXhEZXB0aCA/PyBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEg7XG4gICAgaWYgKG1heERlcHRoIDwgMSkgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heERlcHRoIG11c3QgYmUgPj0gMScpO1xuICAgIHRoaXMuX21heERlcHRoID0gbWF4RGVwdGg7XG4gICAgaWYgKG9wdHMubWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWF4SXRlcmF0aW9ucyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhJdGVyYXRpb25zIG11c3QgYmUgPj0gMScpO1xuICAgIH1cbiAgICB0aGlzLl9tYXhJdGVyYXRpb25zID0gb3B0cy5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSBvcHRzLmV4ZWN1dGlvbkNvdW50ZXIgPz8geyB2YWx1ZTogMCB9O1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzID0gb3B0cy52aXNpdENvdW50cyA/PyBuZXcgTWFwKCk7XG4gICAgdGhpcy5yb290ID0gb3B0cy5yb290O1xuICAgIHRoaXMuZW50cnkgPSBvcHRzLmVudHJ5O1xuICAgIHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzID0gb3B0cy5lbnRyeSA/IG9wdHMucGVuZGluZ1BhdXNlcyA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlc3VtZSA9XG4gICAgICBvcHRzLnJlc3VtZSA/P1xuICAgICAgKG9wdHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSA/IFJlc3VtZUVudHJ5LmZyb21DYXB0dXJlczxUT3V0LCBUU2NvcGU+KG9wdHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSkgOiB1bmRlZmluZWQpO1xuICAgIC8vIFNoYWxsb3ctY29weSBzdGFnZU1hcCBhbmQgc3ViZmxvd3Mgc28gdGhhdCBsYXp5LXJlc29sdXRpb24gbXV0YXRpb25zXG4gICAgLy8gKHByZWZpeGVkIGVudHJpZXMgYWRkZWQgZHVyaW5nIGV4ZWN1dGlvbikgc3RheSBzY29wZWQgdG8gVEhJUyB0cmF2ZXJzZXJcbiAgICAvLyBhbmQgZG8gbm90IGVzY2FwZSB0byB0aGUgc2hhcmVkIEZsb3dDaGFydCBvYmplY3QuIFdpdGhvdXQgdGhlIGNvcHksXG4gICAgLy8gY29uY3VycmVudCBGbG93Q2hhcnRFeGVjdXRvciBydW5zIHNoYXJpbmcgdGhlIHNhbWUgRmxvd0NoYXJ0IHdvdWxkIHJhY2VcbiAgICAvLyBvbiB0aGVzZSB0d28gbXV0YWJsZSBkaWN0aW9uYXJpZXMuXG4gICAgdGhpcy5zdGFnZU1hcCA9IG5ldyBNYXAob3B0cy5zdGFnZU1hcCk7XG4gICAgdGhpcy5leGVjdXRpb25SdW50aW1lID0gb3B0cy5leGVjdXRpb25SdW50aW1lO1xuICAgIHRoaXMuc3ViZmxvd3MgPSBvcHRzLnN1YmZsb3dzID8geyAuLi5vcHRzLnN1YmZsb3dzIH0gOiB7fTtcbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyO1xuICAgIHRoaXMuc2lnbmFsID0gb3B0cy5zaWduYWw7XG4gICAgdGhpcy5wYXJlbnRTdWJmbG93SWQgPSBvcHRzLnBhcmVudFN1YmZsb3dJZDtcbiAgICB0aGlzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQgPSBvcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ7XG4gICAgLy8gTWlzc2luZyBhbmNlc3RyeSBpbiBhIGhhbmQtYnVpbHQgbmVzdGVkIHRyYXZlcnNlciBpcyB1bmtub3duLCBuZXZlclxuICAgIC8vIGd1ZXNzZWQgYXMgcm9vdC4gVGhlIG5vcm1hbCBzdWJmbG93IGZhY3Rvcnkgc3VwcGxpZXMgdGhlIGZ1bGwgcGF0aC5cbiAgICBjb25zdCBlbWl0RHJpbGxQYXRoID1cbiAgICAgIG9wdHMuZW1pdERyaWxsUGF0aCA/PyAob3B0cy5wYXJlbnRTdWJmbG93SWQgfHwgb3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkID8gdW5kZWZpbmVkIDogW10pO1xuICAgIHRoaXMuZW1pdERyaWxsUGF0aCA9IGVtaXREcmlsbFBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE9iamVjdC5mcmVlemUoWy4uLmVtaXREcmlsbFBhdGhdKTtcbiAgICB0aGlzLnJlYWRPbmx5Q29udGV4dCA9IG9wdHMucmVhZE9ubHlDb250ZXh0O1xuICAgIHRoaXMucnVuSWQgPSBvcHRzLnJ1bklkO1xuXG4gICAgLy8gU3RydWN0dXJlIG1hbmFnZXIgKGRlZXAtY2xvbmVzIGJ1aWxkLXRpbWUgc3RydWN0dXJlKVxuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlciA9IG5ldyBSdW50aW1lU3RydWN0dXJlTWFuYWdlcigpO1xuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci5pbml0KG9wdHMuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIC8vIE5hcnJhdGl2ZSBnZW5lcmF0b3JcbiAgICAvLyBQcmlvcml0eTogZXhwbGljaXQgbmFycmF0aXZlR2VuZXJhdG9yID4gZmxvd1JlY29yZGVycyA+IGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyID4gbnVsbC5cbiAgICAvLyBTdWJmbG93IHRyYXZlcnNlcnMgcmVjZWl2ZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlR2VuZXJhdG9yIHNvIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2UuXG4gICAgaWYgKG9wdHMubmFycmF0aXZlR2VuZXJhdG9yKSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG9wdHMubmFycmF0aXZlR2VuZXJhdG9yO1xuICAgIH0gZWxzZSBpZiAob3B0cy5uYXJyYXRpdmVFbmFibGVkKSB7XG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gbmV3IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIoKTtcbiAgICAgIHRoaXMuZmxvd1JlY29yZGVyRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgIC8vIElmIGN1c3RvbSBGbG93UmVjb3JkZXJzIGFyZSBwcm92aWRlZCwgdXNlIHRoZW07IG90aGVyd2lzZSBhdHRhY2ggZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXJcbiAgICAgIGlmIChvcHRzLmZsb3dSZWNvcmRlcnMgJiYgb3B0cy5mbG93UmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByZWNvcmRlciBvZiBvcHRzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgICAgICBkaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKG5ldyBOYXJyYXRpdmVGbG93UmVjb3JkZXIoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gZGlzcGF0Y2hlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBuZXcgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgc2hhcmVkIGRlcHMgYmFnXG4gICAgY29uc3QgZGVwcyA9IHRoaXMuY3JlYXRlRGVwcyhvcHRzKTtcbiAgICB0aGlzLmRlcHMgPSBkZXBzO1xuXG4gICAgLy8gQnVpbGQgTygxKSBub2RlIElEIG1hcCBmcm9tIHRoZSByb290IGdyYXBoIChhdm9pZHMgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpKS5cbiAgICAvLyBGcm9tIGByb290YCwgbmV2ZXIgZnJvbSBgZW50cnlgOiBhIHJlc3VtZSdzIHN0YW5kLWluIGNhcnJpZXMgdGhlIHBhdXNlZFxuICAgIC8vIHN0YWdlJ3MgaWQsIGFuZCBhIGxvb3AgYmFjayB0byB0aGF0IGlkIG11c3QgZmluZCB0aGUgUkVBTCBzdGFnZS5cbiAgICBjb25zdCBub2RlSWRNYXAgPSB0aGlzLmJ1aWxkTm9kZUlkTWFwKG9wdHMucm9vdCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgbW9kdWxlcy5cbiAgICAvLyBOb2RlUmVzb2x2ZXIncyBERlMgZmFsbGJhY2sgcmVzb2x2ZXMgbG9vcCB0YXJnZXRzIGFnYWluc3QgdGhlIExJVkVcbiAgICAvLyBydW50aW1lIHNoYXBlLCBzbyBpdCByZWFkcyBjaGlsZHJlbiB0aHJvdWdoIHRoZSBkeW5hbWljLXBhdGNoIG92ZXJsYXlcbiAgICAvLyAoYSBsb29wIGNhbiB0YXJnZXQgYSBub2RlIGFkZGVkIGJ5IGEgZHluYW1pYyBTdGFnZU5vZGUgcmV0dXJuKS5cbiAgICB0aGlzLm5vZGVSZXNvbHZlciA9IG5ldyBOb2RlUmVzb2x2ZXIoZGVwcywgbm9kZUlkTWFwLCAobikgPT4gdGhpcy5lZmZDaGlsZHJlbihuKSk7XG4gICAgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yID0gbmV3IENoaWxkcmVuRXhlY3V0b3IoZGVwcywgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnN0YWdlUnVubmVyID0gbmV3IFN0YWdlUnVubmVyKGRlcHMpO1xuICAgIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIgPSBuZXcgQ29udGludWF0aW9uUmVzb2x2ZXIoXG4gICAgICBkZXBzLFxuICAgICAgdGhpcy5ub2RlUmVzb2x2ZXIsXG4gICAgICAobm9kZUlkLCBjb3VudCkgPT4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUl0ZXJhdGlvbkNvdW50KG5vZGVJZCwgY291bnQpLFxuICAgICAgdGhpcy5fbWF4SXRlcmF0aW9ucyxcbiAgICApO1xuICAgIHRoaXMuZGVjaWRlckhhbmRsZXIgPSBuZXcgRGVjaWRlckhhbmRsZXIoZGVwcyk7XG4gICAgdGhpcy5zZWxlY3RvckhhbmRsZXIgPSBuZXcgU2VsZWN0b3JIYW5kbGVyKGRlcHMsIHRoaXMuY2hpbGRyZW5FeGVjdXRvcik7XG4gICAgdGhpcy5zdWJmbG93RXhlY3V0b3IgPSBuZXcgU3ViZmxvd0V4ZWN1dG9yKGRlcHMsIHRoaXMuY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnkob3B0cykpO1xuICAgIHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlciA9IG5ldyBQYXJhbGxlbEZvckVhY2hIYW5kbGVyKGRlcHMsIHRoaXMuY2hpbGRyZW5FeGVjdXRvciwge1xuICAgICAgcHJlZml4Tm9kZVRyZWU6IChuLCBwcmVmaXgpID0+IHRoaXMucHJlZml4Tm9kZVRyZWUobiwgcHJlZml4KSxcbiAgICAgIHJlZ2lzdGVyQnJhbmNoU3ViZmxvdzogKHN1YmZsb3dJZCwgcm9vdCwgY2hhcnQpID0+IHRoaXMucmVnaXN0ZXJCcmFuY2hTdWJmbG93KHN1YmZsb3dJZCwgcm9vdCwgY2hhcnQpLFxuICAgICAgYnJhbmNoU2hhcmVkU3RhdGU6IChzdWJmbG93SWQpID0+XG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuZ2V0KHN1YmZsb3dJZCk/LnRyZWVDb250ZXh0Py5nbG9iYWxDb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgcmVjb3JkQnJhbmNoU3RydWN0dXJlOiAobm9kZUlkLCBicmFuY2hlcykgPT4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNDaGlsZHJlbihub2RlSWQsIGJyYW5jaGVzKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgcHJvZHVjZXMgRmxvd2NoYXJ0VHJhdmVyc2VyIGluc3RhbmNlcyBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gICAqIENhcHR1cmVzIHBhcmVudCBjb25maWcgaW4gY2xvc3VyZSDigJQgU3ViZmxvd0V4ZWN1dG9yIHByb3ZpZGVzIHN1YmZsb3ctc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICAgKiBFYWNoIHN1YmZsb3cgZ2V0cyBhIGZ1bGwgdHJhdmVyc2VyIHdpdGggYWxsIDcgcGhhc2VzIChkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgZXRjLikuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KFxuICAgIHBhcmVudE9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPixcbiAgKTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPiB7XG4gICAgLy8gQ2FwdHVyZSByZWZlcmVuY2VzIHRvIG11dGFibGUgc3RhdGUg4oCUIGZhY3RvcnkgcmVhZHMgdGhlIENVUlJFTlQgc3RhdGUgd2hlbiBjYWxsZWQsXG4gICAgLy8gbm90IHRoZSBzdGF0ZSBhdCBmYWN0b3J5IGNyZWF0aW9uIHRpbWUuIFRoaXMgaXMgY29ycmVjdCBiZWNhdXNlIGxhenkgc3ViZmxvdyByZXNvbHV0aW9uXG4gICAgLy8gbWF5IGFkZCBlbnRyaWVzIHRvIHN0YWdlTWFwL3N1YmZsb3dzIGJlZm9yZSBhIG5lc3RlZCBzdWJmbG93IGlzIGVuY291bnRlcmVkLlxuICAgIGNvbnN0IHBhcmVudFN0YWdlTWFwID0gdGhpcy5zdGFnZU1hcDtcbiAgICBjb25zdCBwYXJlbnRTdWJmbG93cyA9IHRoaXMuc3ViZmxvd3M7XG4gICAgY29uc3QgbmFycmF0aXZlR2VuZXJhdG9yID0gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3I7XG5cbiAgICByZXR1cm4gKHN1YmZsb3dPcHRzKSA9PiB7XG4gICAgICBjb25zdCB0cmF2ZXJzZXIgPSBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgICByb290OiBzdWJmbG93T3B0cy5yb290LFxuICAgICAgICAuLi4oc3ViZmxvd09wdHMuZW50cnkgJiYgeyBlbnRyeTogc3ViZmxvd09wdHMuZW50cnkgfSksIC8vIGEgcmVzdW1lIGhvcCdzIGVudHJ5IHBvaW50XG4gICAgICAgIC4uLihzdWJmbG93T3B0cy5wZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogc3ViZmxvd09wdHMucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgc3RhZ2VNYXA6IHBhcmVudFN0YWdlTWFwLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIHNjb3BlRmFjdG9yeTogcGFyZW50T3B0cy5zY29wZUZhY3RvcnksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHN1YmZsb3dPcHRzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogc3ViZmxvd09wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgICBleGVjdXRpb25FbnY6IHBhcmVudE9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBwYXJlbnRPcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICAgIHN0cmVhbUhhbmRsZXJzOiBwYXJlbnRPcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnRPcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgIHN1YmZsb3dzOiBwYXJlbnRTdWJmbG93cywgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBuYXJyYXRpdmVHZW5lcmF0b3IsIC8vIFNoYXJlIHBhcmVudCdzIOKAlCBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlXG4gICAgICAgIGxvZ2dlcjogcGFyZW50T3B0cy5sb2dnZXIsXG4gICAgICAgIHNpZ25hbDogcGFyZW50T3B0cy5zaWduYWwsXG4gICAgICAgIG1heERlcHRoOiB0aGlzLl9tYXhEZXB0aCxcbiAgICAgICAgLi4uKHRoaXMuX21heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB7IG1heEl0ZXJhdGlvbnM6IHRoaXMuX21heEl0ZXJhdGlvbnMgfSksXG4gICAgICAgIHBhcmVudFN1YmZsb3dJZDogc3ViZmxvd09wdHMuc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgcGFyZW50IGZhbGxiYWNrIGZvclxuICAgICAgICAvLyB0aGUgc3ViZmxvdydzIHJvb3Qgc3RhZ2Ugc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBib3VuZGFyeS5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgICAgZW1pdERyaWxsUGF0aDpcbiAgICAgICAgICB0aGlzLmVtaXREcmlsbFBhdGggIT09IHVuZGVmaW5lZCAmJiBzdWJmbG93T3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkXG4gICAgICAgICAgICA/IFsuLi50aGlzLmVtaXREcmlsbFBhdGgsIHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWRdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlciwgLy8gU2hhcmUgY291bnRlciDigJQgc3ViZmxvdyBjb250aW51ZXMgZ2xvYmFsIG51bWJlcmluZ1xuICAgICAgICB2aXNpdENvdW50czogdGhpcy5fdmlzaXRDb3VudHMsIC8vIFNoYXJlIHZpc2l0IGNvdW50cyDigJQgbG9vcEl0ZXJhdGlvbiBzdGF5cyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzXG4gICAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLCAvLyBTdWJmbG93IGluaGVyaXRzIHBhcmVudCdzIHJ1bklkIOKAlCBzYW1lIGxvZ2ljYWwgcnVuXG4gICAgICAgIC8vIFNoYXJlIHRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSBCWSBSRUZFUkVOQ0UsIHNvIGEgaG9wIHRha2VuXG4gICAgICAgIC8vIGF0IGFueSBkZXB0aCBpcyB0YWtlbiBmb3IgdGhlIHdob2xlIHJ1biDigJQgYW5kIG5lc3RlZFxuICAgICAgICAvLyBTdWJmbG93RXhlY3V0b3JzIGNhbiB0YWtlIHRoZSBkZWVwZXIgaG9wcyAoZS5nLiBTZXF1ZW5jZShBZ2VudCguLi4pKVxuICAgICAgICAvLyB3aGVyZSB0aGUgaW5uZXIgQWdlbnQgc3ViZmxvdyBwYXVzZWQpLlxuICAgICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4ZWN1dGU6ICgpID0+IHRyYXZlcnNlci5leGVjdXRlKCksXG4gICAgICAgIGdldFN1YmZsb3dSZXN1bHRzOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKSxcbiAgICAgICAgZ2V0QnJlYWtTdGF0ZTogKCkgPT4gdHJhdmVyc2VyLmdldEJyZWFrU3RhdGUoKSxcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwcyhvcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4pOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhZ2VNYXA6IHRoaXMuc3RhZ2VNYXAsXG4gICAgICByb290OiB0aGlzLnJvb3QsXG4gICAgICBleGVjdXRpb25SdW50aW1lOiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICBzY29wZUZhY3Rvcnk6IG9wdHMuc2NvcGVGYWN0b3J5LFxuICAgICAgc3ViZmxvd3M6IHRoaXMuc3ViZmxvd3MsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBvcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogb3B0cy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSA/PyAnZXJyb3InLFxuICAgICAgLy8gVGhlIGxlZydzIE9ORSBvd25lZCBmcm96ZW4gaW5wdXQgc25hcHNob3QgaXMgdGFrZW4gd2hlbiB0aGUgbGVnIFNUQVJUU1xuICAgICAgLy8gKGBleGVjdXRlYCksIG5ldmVyIGhlcmU6IGEgZ2V0dGVyIG9uIHRoZSBpbnB1dCBtdXN0IG5vdCBydW4gYXQgY29uc3RydWN0aW9uLlxuICAgICAgcmVhZE9ubHlDb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICBleGVjdXRpb25FbnY6IG9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgbmFycmF0aXZlR2VuZXJhdG9yOiB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcixcbiAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgICAgLi4uKHRoaXMucmVzdW1lICYmIHsgcmVzdW1lOiB0aGlzLnJlc3VtZSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhvbGRzIHRoZSB0b3AtbGV2ZWwgYnJlYWsgZmxhZyBmb3IgdGhlIGR1cmF0aW9uIG9mIGBleGVjdXRlKClgLiBLZXB0IGFzXG4gICAqIGEgZmllbGQgKG5vdCBhIGxvY2FsKSBzbyBgZ2V0QnJlYWtTdGF0ZSgpYCBjYW4gc3VyZmFjZSB0aGUgZmluYWwgc3RhdGVcbiAgICogZm9yIGNhbGxlcnMgbGlrZSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGF0IGltcGxlbWVudCBgcHJvcGFnYXRlQnJlYWtgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdG9wQnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShicmFuY2hQYXRoPzogc3RyaW5nKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICAvLyBPTkUgb3duZWQgZnJvemVuIGlucHV0IHNuYXBzaG90IHBlciBsZWcgKHJ1biwgcmVzdW1lLCBzdWJmbG93IG1vdW50KSwgdGFrZW4gYXMgdGhlXG4gICAgLy8gbGVnIHN0YXJ0cyDigJQgbmV2ZXIgYXQgY29uc3RydWN0aW9uIChhbiBleGVjdXRvciBjb25zdHJ1Y3RzIGEgdHJhdmVyc2VyIGl0IG1heSBuZXZlclxuICAgIC8vIHJ1bik6IGV2ZXJ5IHNjb3BlIG9mIHRoZSBsZWcgZ2V0cyBpdCwgc28gZWFjaCBwYXlzIE8ocm9vdCBrZXlzKSwgbm90IE8oaW5wdXQpLlxuICAgIHRoaXMuZGVwcy5yZWFkT25seUNvbnRleHQgPSBzbmFwc2hvdFJ1bklucHV0KHRoaXMucmVhZE9ubHlDb250ZXh0KTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5leGVjdXRpb25SdW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgdGhpcy5fdG9wQnJlYWtGbGFnID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcbiAgICAvLyBUaGUgZW50cnkgaXMgb25lLXNob3Q6IHRoZSBmaXJzdCBleGVjdXRlKCkgc3RhcnRzIHRoZXJlLCBuZXZlciBhZ2FpbiDigJRcbiAgICAvLyBhbmQgc28gYXJlIHRoZSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGJlaGluZCBpdC5cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZW50cnkgPz8gdGhpcy5yb290O1xuICAgIGNvbnN0IHdhaXRpbmcgPSB0aGlzLmVudHJ5UGVuZGluZ1BhdXNlcztcbiAgICB0aGlzLmVudHJ5ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHdhbGsgPSAoKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+ID0+XG4gICAgICB3YWl0aW5nXG4gICAgICAgID8gdGhpcy53YWxrVGhlblJhaXNlKHN0YXJ0LCBjb250ZXh0LCB3YWl0aW5nLCBicmFuY2hQYXRoKVxuICAgICAgICA6IHRoaXMuZXhlY3V0ZU5vZGUoc3RhcnQsIGNvbnRleHQsIHRoaXMuX3RvcEJyZWFrRmxhZywgYnJhbmNoUGF0aCA/PyAnJyk7XG5cbiAgICAvLyBGaXJlIG9uUnVuU3RhcnQgT05MWSBhdCB0aGUgdG9wLWxldmVsIHRyYXZlcnNhbCDigJQgc3ViZmxvdyB0cmF2ZXJzZXJzXG4gICAgLy8gYWxyZWFkeSBwcm9kdWNlIG9uU3ViZmxvd0VudHJ5L29uU3ViZmxvd0V4aXQgcGFpcnMsIHNvIGVtaXR0aW5nIHJ1blxuICAgIC8vIGV2ZW50cyBmb3IgdGhlbSB3b3VsZCBkb3VibGUtYnJhY2tldCB0aGUgYm91bmRhcnkgc3RyZWFtLiBUaGVcbiAgICAvLyB0b3AtbGV2ZWwgdHJhdmVyc2VyIGlzIHRoZSBvbmUgd2l0aG91dCBhIHBhcmVudFN1YmZsb3dJZC5cbiAgICBjb25zdCBpc1RvcExldmVsID0gdGhpcy5wYXJlbnRTdWJmbG93SWQgPT09IHVuZGVmaW5lZDtcbiAgICAvLyBTeW50aGV0aWMgVHJhdmVyc2FsQ29udGV4dCBmb3IgcnVuLmVudHJ5IC8gcnVuLmV4aXQuIEZpZWxkcyB1c2VcbiAgICAvLyByb290LXN0YWdlIGRlZmF1bHRzIChzdGFnZUlkPSdfX3Jvb3RfXycsIHJ1bnRpbWVTdGFnZUlkPSdfX3Jvb3RfXyMwJyxcbiAgICAvLyBkZXB0aCAwKSBzbyB0aGUgcnVuSWQgaXMgcmVsaWFibHkgYXZhaWxhYmxlIG9uIHJ1biBldmVudHMgd2l0aG91dFxuICAgIC8vIGZvcmNpbmcgcmVjb3JkZXJzIHRvIGhhbmRsZSBgdHJhdmVyc2FsQ29udGV4dCA9PT0gdW5kZWZpbmVkYC5cbiAgICBjb25zdCByb290Q29udGV4dCA9IHJvb3RUcmF2ZXJzYWxDb250ZXh0KHRoaXMucnVuSWQpO1xuICAgIGNvbnN0IHJlZGFjdGlvblJ1bGUgPSBjb250ZXh0LmdldFJlZGFjdGlvblJ1bGUoKTtcbiAgICBpZiAoaXNUb3BMZXZlbCkge1xuICAgICAgLy8gUmV0YWluIGF0IHRoZSBib3VuZGFyeSwgYmVmb3JlIGRpc3BhdGNoIG9yIGRlZmVycmVkIGNhcHR1cmUg4oCUIHRoZVxuICAgICAgLy8gc2FtZSBvd25lciBhcyBzdWJmbG93IGVudHJ5LCBub3QgYSByZWNvcmRlci1sb2NhbCBzY3J1YiBvciBsYXRlciB3YWxrLlxuICAgICAgLy8gVW5kZXIgYSBwb2xpY3kgdGhlIHdhbGsgcmVhZHMgdGhlIGxlZydzIE9ORSBzbmFwc2hvdCAodGFrZW4gYWJvdmUpLCBuZXZlciB0aGUgbGl2ZSBpbnB1dFxuICAgICAgLy8gYSBzZWNvbmQgdGltZTsgd2l0aG91dCBvbmUgdGhlIGV2ZW50IGNhcnJpZXMgdGhlIGlucHV0IGFzIGl0IGFsd2F5cyBoYXMuXG4gICAgICBjb25zdCBpbnB1dCA9XG4gICAgICAgIHJlZGFjdGlvblJ1bGUgJiYgIXJlZGFjdGlvblJ1bGUuaXNJbmVydCgpXG4gICAgICAgICAgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KHRoaXMuZGVwcy5yZWFkT25seUNvbnRleHQpXG4gICAgICAgICAgOiB0aGlzLnJlYWRPbmx5Q29udGV4dDtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuU3RhcnQoaW5wdXQsIHJvb3RDb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBUb3AtbGV2ZWwgcnVucyBjbG9zZSB0aGVpciBib3VuZGFyeSBTWU1NRVRSSUNBTExZOiBldmVyeSBvblJ1blN0YXJ0XG4gICAgLy8gaXMgZm9sbG93ZWQgYnkgZXhhY3RseSBvbmUgb25SdW5FbmQgKGNsZWFuKSBvciBvblJ1bkZhaWxlZCAoZXJyb3IpLlxuICAgIC8vIFdpdGhvdXQgdGhlIGNhdGNoLCBhIHRocm93biBydW4gZmlyZWQgb25SdW5TdGFydCB0aGVuIG5vdGhpbmcg4oCUIGFcbiAgICAvLyBtb25pdG9yIGNvdWxkbid0IHRlbGwgXCJzdGlsbCBydW5uaW5nXCIgZnJvbSBcImNyYXNoZWQuXCIgUGF1c2UgaXMgTk9UXG4gICAgLy8gYW4gZXJyb3IgKGl0J3MgZXhwZWN0ZWQgc3VzcGVuc2lvbiksIHNvIGl0IHNraXBzIG9uUnVuRmFpbGVkIGFuZFxuICAgIC8vIHJlLXRocm93cyB1bnRvdWNoZWQuIFRoZSBzdGFnZS1sZXZlbCBjYXRjaCBhbHJlYWR5IHJlY29yZGVkIHRoZVxuICAgIC8vIGZhaWxpbmcgc3RhZ2UgKG9uRXJyb3IgKyBjb21taXQpOyB0aGlzIGFkZHMgdGhlIHJ1bi1sZXZlbCB0ZXJtaW5hbFxuICAgIC8vIHNpZ25hbC4gVGhlIGVycm9yIHN0aWxsIHByb3BhZ2F0ZXMg4oCUIHRoaXMgaXMgb2JzZXJ2YXRpb24sIG5vdFxuICAgIC8vIHJlY292ZXJ5LiBTdWJmbG93IHRyYXZlcnNlcnMgZG9uJ3QgZmlyZSBydW4gZXZlbnRzOyB0aGVpciBlcnJvcnNcbiAgICAvLyBidWJibGUgdXAgYW5kIHN1cmZhY2UgaGVyZSBhdCB0aGUgdG9wIGxldmVsLlxuICAgIGlmICghaXNUb3BMZXZlbCkge1xuICAgICAgcmV0dXJuIHdhbGsoKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVHJhdmVyc2FsUmVzdWx0O1xuICAgIGxldCByZXRhaW5lZFJlc3VsdDogVHJhdmVyc2FsUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB3YWxrKCk7XG4gICAgICAvLyBSZWFkIHRoZSBzaGFyZWQgcnVsZSBub3cgc28gbWFya3MgbWFkZSBkdXJpbmcgZXhlY3V0aW9uIGFwcGx5IHRvXG4gICAgICAvLyB0aGlzIGV2ZW50LiBBIHNjcnViIGZhaWx1cmUgY2xvc2VzIHRoZSBydW4gYXMgZmFpbGVkLCBuZXZlciByYXcuXG4gICAgICByZXRhaW5lZFJlc3VsdCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmICghaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5GYWlsZWQoXG4gICAgICAgICAgcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpIDogZXh0cmFjdEVycm9ySW5mbyhlcnJvciksXG4gICAgICAgICAgcm9vdENvbnRleHQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5FbmQocmV0YWluZWRSZXN1bHQsIHJvb3RDb250ZXh0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcmVzdW1lJ3MgZW50cnkgY2hhaW4gYXQgYSBsZXZlbCB3aGVyZSBwYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRcbiAgICogKDkuMjguMCk6IHJ1biB0aGUgY2hhaW4g4oCUIHRoZSByZXN1bWVkIGNoaWxkIG9ubHksIHRoZSBmYW4tb3V0J3Mgam9pbiBpc1xuICAgKiBOT1QgYXR0YWNoZWQg4oCUIHRoZW4gcmFpc2UgdGhlIGZpcnN0IHdhaXRpbmcgcGF1c2UgYWdhaW4sIHRoZSByZXN0IGJlaGluZFxuICAgKiBpdC4gTm90aGluZyBvZiB0aGUgc2libGluZyByZS1ydW5zOyBpdHMgcXVlc3Rpb24gY29tZXMgYmFjayBhcyBpdCB3YXNcbiAgICogYXNrZWQuIEEgcGF1c2UgcmFpc2VkIGZyb20gaW5zaWRlIHRoZSBjaGFpbiAodGhlIHJlc3VtZWQgY2hpbGQgYXNraW5nXG4gICAqIGFnYWluKSBjYXJyaWVzIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBpbnN0ZWFkLCBzbyBub25lIGlzIGV2ZXIgZHJvcHBlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2Fsa1RoZW5SYWlzZShcbiAgICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIHdhaXRpbmc6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10sXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSBxdWV1ZUJlaGluZChlcnJvciwgd2FpdGluZyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY29uc3QgeyBwYXVzZSwgc3RhZ2VOYW1lIH0gPSB3YWl0aW5nWzBdO1xuICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUGF1c2UoXG4gICAgICBzdGFnZU5hbWUsXG4gICAgICBwYXVzZS5wYXVzZWRTdGFnZUlkLFxuICAgICAgc2VydmVkUGF1c2UoY29udGV4dCwgcGF1c2UucGF1c2VEYXRhKSxcbiAgICAgIHBhdXNlLnN1YmZsb3dQYXRoLFxuICAgICk7XG4gICAgdGhyb3cgcmFpc2VRdWV1ZWRQYXVzZSh3YWl0aW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcmVhayBzdGF0ZSBjYXB0dXJlZCBhdCB0aGUgdG9wLWxldmVsIG9mIHRoZSBtb3N0IHJlY2VudCBgZXhlY3V0ZSgpYC5cbiAgICogYHNob3VsZEJyZWFrYCBpcyB0cnVlIHdoZW4gYSBzdGFnZSBjYWxsZWQgYHNjb3BlLiRicmVhayhyZWFzb24pYDsgdGhlXG4gICAqIG9wdGlvbmFsIGByZWFzb25gIGNhcnJpZXMgdGhlIHN0cmluZyBwYXNzZWQgdG8gYCRicmVha2AuXG4gICAqXG4gICAqIFVzZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgdG8gcHJvcGFnYXRlIGFuIGlubmVyIHN1YmZsb3cncyBicmVhayB1cCB0b1xuICAgKiB0aGUgcGFyZW50IHRyYXZlcnNlciB3aGVuIHRoZSBtb3VudCBzZXRzIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAuXG4gICAqL1xuICBnZXRCcmVha1N0YXRlKCk6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICByZXR1cm4geyAuLi50aGlzLl90b3BCcmVha0ZsYWcgfTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmdldFN0cnVjdHVyZSgpO1xuICB9XG5cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KSB7XG4gICAgLy8gU3RhbXAgdGhlIHJ1bidzIGlkIG9udG8gdGhlIHJ1bnRpbWUgc25hcHNob3QgaGVyZSDigJQgdGhlIHRyYXZlcnNlciBpc1xuICAgIC8vIHRoZSBzaW5nbGUgYXV0aG9yaXR5IGZvciBgcnVuSWRgIChpdCBhbHJlYWR5IHN0YW1wcyB0aGUgc2FtZSB2YWx1ZSBvblxuICAgIC8vIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQvZXZlbnQpLCB3aGlsZSB0aGUgcnVudGltZSBpcyBydW4tYWdub3N0aWNcbiAgICAvLyBtZW1vcnkgKGl0cyBnZXRTbmFwc2hvdCByZXR1cm5zIE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPikuXG4gICAgLy8gRnJlc2ggcGVyIHJ1bigpIEFORCBwZXIgcmVzdW1lKCkg4oCUIHNlZSBydW5uZXIvcnVuSWQudHMuXG4gICAgcmV0dXJuIHsgLi4udGhpcy5leGVjdXRpb25SdW50aW1lLmdldFNuYXBzaG90KG9wdGlvbnMpLCBydW5JZDogdGhpcy5ydW5JZCB9O1xuICB9XG5cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5leGVjdXRpb25SdW50aW1lLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uUnVudGltZS5nZXRQaXBlbGluZXMoKTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgfVxuXG4gIGdldFN1YmZsb3dSZXN1bHRzKCk6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJmbG93UmVzdWx0cztcbiAgfVxuXG4gIGdldE5hcnJhdGl2ZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLmdldFNlbnRlbmNlcygpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIEZsb3dSZWNvcmRlckRpc3BhdGNoZXIsIG9yIHVuZGVmaW5lZCBpZiBuYXJyYXRpdmUgaXMgZGlzYWJsZWQuICovXG4gIGdldEZsb3dSZWNvcmRlckRpc3BhdGNoZXIoKTogRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd1JlY29yZGVyRGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBDb3JlIFRyYXZlcnNhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgYW4gTygxKSBJROKGkm5vZGUgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGguXG4gICAqIFVzZWQgYnkgTm9kZVJlc29sdmVyIHRvIGF2b2lkIHJlcGVhdGVkIERGUyBvbiBldmVyeSBsb29wVG8oKSBjYWxsLlxuICAgKiBJdGVyYXRpdmUgd29ya2xpc3QgKG5vIHJlY3Vyc2lvbikgc28gYXJiaXRyYXJpbHkgbG9uZyBjaGFpbnMgaW5kZXggZnVsbHk7XG4gICAqIHRoZSBgbWFwLmhhc2AgZ3VhcmQgaGFuZGxlcyBjeWNsaWMgcmVmcy4gRmlyc3QtdmlzaXRlZCBub2RlIHdpbnMgcGVyIElEIOKAlFxuICAgKiB3b3JrbGlzdCBvcmRlciBtYXRjaGVzIHRoZSBvbGQgcmVjdXJzaXZlIHByZS1vcmRlciAoY2hpbGRyZW4sIHRoZW4gbmV4dCkuXG4gICAqIER5bmFtaWMgc3ViZmxvd3MgYW5kIGxhenktcmVzb2x2ZWQgbm9kZXMgYXJlIGFkZGVkIHRvIHN0YWdlTWFwIGF0IHJ1bnRpbWUgYnV0IG5vdCB0byB0aGlzIG1hcCDigJRcbiAgICogdGhvc2UgdXNlIHRoZSBERlMgZmFsbGJhY2sgaW4gTm9kZVJlc29sdmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5vZGVJZE1hcChyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IE1hcDxzdHJpbmcsIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PigpO1xuICAgIGNvbnN0IHN0YWNrOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdID0gW3Jvb3RdO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgICAgaWYgKG1hcC5oYXMobm9kZS5pZCkpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IHZpc2l0ZWQgKGF2b2lkcyBpbmZpbml0ZSBsb29wcyBvbiBjeWNsaWMgcmVmcylcbiAgICAgIG1hcC5zZXQobm9kZS5pZCwgbm9kZSk7XG4gICAgICAvLyBQdXNoIGluIHJldmVyc2UgdmlzaXQgb3JkZXIgKExJRk8gc3RhY2spOiBuZXh0IGZpcnN0LCB0aGVuIGNoaWxkcmVuXG4gICAgICAvLyByZXZlcnNlZCDigJQgc28gY2hpbGRyZW4gYXJlIHZpc2l0ZWQgYmVmb3JlIG5leHQsIGZpcnN0IGNoaWxkIGZpcnN0LFxuICAgICAgLy8gbWF0Y2hpbmcgdGhlIHJlY3Vyc2l2ZSBwcmUtb3JkZXIgZXhhY3RseS5cbiAgICAgIGlmIChub2RlLm5leHQpIHN0YWNrLnB1c2gobm9kZS5uZXh0KTtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBzdGFjay5wdXNoKG5vZGUuY2hpbGRyZW5baV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFnZUZuKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIG5vZGUuZm4gPT09ICdmdW5jdGlvbicpIHJldHVybiBub2RlLmZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICAvLyBQcmltYXJ5OiBsb29rIHVwIGJ5IGlkIChzdGFibGUgaWRlbnRpZmllciwga2V5ZWQgYnkgRmxvd0NoYXJ0QnVpbGRlcilcbiAgICBjb25zdCBieUlkID0gdGhpcy5zdGFnZU1hcC5nZXQobm9kZS5pZCk7XG4gICAgaWYgKGJ5SWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGJ5SWQ7XG4gICAgLy8gRmFsbGJhY2s6IGxvb2sgdXAgYnkgbmFtZSAoc3VwcG9ydHMgaGFuZC1jcmFmdGVkIHN0YWdlTWFwcyBpbiB0ZXN0cyBhbmQgYWR2YW5jZWQgdXNlKVxuICAgIHJldHVybiB0aGlzLnN0YWdlTWFwLmdldChub2RlLm5hbWUpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIER5bmFtaWMtcGF0Y2ggb3ZlcmxheSBhY2Nlc3NvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIEV2ZXJ5IGVuZ2luZSByZWFkIG9mIGEgZmllbGQgdGhhdCBQaGFzZSA0IGNhbiBwYXRjaCAoY2hpbGRyZW4sXG4gIC8vIG5leHROb2RlU2VsZWN0b3IsIHN1YmZsb3cgbWV0YSkgZ29lcyB0aHJvdWdoIHRoZXNlLiBGYXN0IHBhdGg6IGNoYXJ0c1xuICAvLyB3aXRoIG5vIGR5bmFtaWMgcmV0dXJucyBuZXZlciBhbGxvY2F0ZSBhbmQgcGF5IG9uZSBgc2l6ZSA9PT0gMGAgY2hlY2suXG5cbiAgcHJpdmF0ZSBnZXRQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucGF0Y2hDb3VudCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE9yQ3JlYXRlUGF0Y2gobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4ge1xuICAgIGxldCBwYXRjaCA9IHRoaXMuZHluYW1pY1BhdGNoZXMuZ2V0KG5vZGUpO1xuICAgIGlmICghcGF0Y2gpIHtcbiAgICAgIHBhdGNoID0ge307XG4gICAgICB0aGlzLmR5bmFtaWNQYXRjaGVzLnNldChub2RlLCBwYXRjaCk7XG4gICAgICB0aGlzLnBhdGNoQ291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIHBhdGNoO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBjaGlsZHJlbjogZHluYW1pYyBwYXRjaCBmaXJzdCwgdGhlbiB0aGUgYnVpbHQgbm9kZSdzIGNoaWxkcmVuLiAqL1xuICBwcml2YXRlIGVmZkNoaWxkcmVuKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/LmNoaWxkcmVuID8/IG5vZGUuY2hpbGRyZW47XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIG91dHB1dC1iYXNlZCBzZWxlY3RvcjogZHluYW1pYyBwYXRjaCBmaXJzdCwgdGhlbiB0aGUgYnVpbHQgbm9kZSdzLiAqL1xuICBwcml2YXRlIGVmZlNlbGVjdG9yKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU2VsZWN0b3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldFBhdGNoKG5vZGUpPy5uZXh0Tm9kZVNlbGVjdG9yID8/IG5vZGUubmV4dE5vZGVTZWxlY3RvcjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgc3ViZmxvdy1yb290IG1hcmtlciAodHJ1ZSB3aGVuIGEgZHluYW1pYyBzdWJmbG93IHdhcyBwYXRjaGVkIG9uKS4gKi9cbiAgcHJpdmF0ZSBlZmZJc1N1YmZsb3dSb290KG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0UGF0Y2gobm9kZSk/LnN1YmZsb3dNZXRhO1xuICAgIHJldHVybiBtZXRhID8gdHJ1ZSA6IG5vZGUuaXNTdWJmbG93Um9vdDtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgc3ViZmxvdyBpZCAocGF0Y2hlZCB2ZXJiYXRpbSBieSBhIGR5bmFtaWMgc3ViZmxvdyByZXR1cm4pLiAqL1xuICBwcml2YXRlIGVmZlN1YmZsb3dJZChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0UGF0Y2gobm9kZSk/LnN1YmZsb3dNZXRhO1xuICAgIHJldHVybiBtZXRhID8gbWV0YS5zdWJmbG93SWQgOiBub2RlLnN1YmZsb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRlcmlhbGl6ZSB0aGUgZWZmZWN0aXZlIHZpZXcgb2YgYSBub2RlIOKAlCBmaWVsZC1pZGVudGljYWwgdG8gd2hhdCB0aGVcbiAgICogcHJlLW92ZXJsYXkgY29kZSBwcm9kdWNlZCBieSBtdXRhdGluZyB0aGUgc2hhcmVkIG5vZGUuIFVzZWQgd2hlcmUgYSBub2RlXG4gICAqIGlzIGhhbmRlZCB0byBhIGhlbHBlciBleGVjdXRvciAoTm9kZVJlc29sdmVyIC8gU3ViZmxvd0V4ZWN1dG9yIC9cbiAgICogQ2hpbGRyZW5FeGVjdXRvcikgc28gaGVscGVycyBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy4gUmV0dXJucyB0aGVcbiAgICogbm9kZSBpdHNlbGYgKG5vIGFsbG9jYXRpb24pIHdoZW4gaXQgY2FycmllcyBubyBwYXRjaC5cbiAgICovXG4gIHByaXZhdGUgZWZmTm9kZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBwYXRjaCA9IHRoaXMuZ2V0UGF0Y2gobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkgcmV0dXJuIG5vZGU7XG4gICAgY29uc3QgbWVyZ2VkOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ubm9kZSB9O1xuICAgIGlmIChwYXRjaC5zdWJmbG93TWV0YSkge1xuICAgICAgbWVyZ2VkLmlzU3ViZmxvd1Jvb3QgPSB0cnVlO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dJZCA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dJZDtcbiAgICAgIG1lcmdlZC5zdWJmbG93TmFtZSA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dOYW1lO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBwYXRjaC5zdWJmbG93TWV0YS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIH1cbiAgICBpZiAocGF0Y2guY2hpbGRyZW4pIG1lcmdlZC5jaGlsZHJlbiA9IHBhdGNoLmNoaWxkcmVuO1xuICAgIGlmIChwYXRjaC5uZXh0Tm9kZVNlbGVjdG9yKSBtZXJnZWQubmV4dE5vZGVTZWxlY3RvciA9IHBhdGNoLm5leHROb2RlU2VsZWN0b3I7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgc2luZ2xlIGZ1bm5lbCBldmVyeSBzdGFnZSBmdW5jdGlvbiBwYXNzZXMgdGhyb3VnaCDigJQgbGluZWFyIHN0YWdlc1xuICAgKiAoUGhhc2UgMyksIGRlY2lkZXIgc3RhZ2VzIGFuZCBzZWxlY3RvciBzdGFnZXMgKHRoZWlyIGhhbmRsZXJzIGFyZSBoYW5kZWRcbiAgICogdGhpcyBtZXRob2QgYXMgYHJ1blN0YWdlYCksIGFuZCBieSBleHRlbnNpb24gZm9yayBjaGlsZHJlbiBhbmRcbiAgICogc3ViZmxvdy1pbnRlcm5hbCBzdGFnZXMsIHdoaWNoIHJlLWVudGVyIFBoYXNlIDMgaW4gdGhlaXIgb3duIHRyYXZlcnNlci5cbiAgICpcbiAgICogV2hpY2ggaXMgZXhhY3RseSB3aHkgdGhlIGRlY2xhcmF0aXZlIHJldHJ5IGxvb3AgbGl2ZXMgSEVSRSBhbmQgbm93aGVyZVxuICAgKiBlbHNlOiBvbmUgaW1wbGVtZW50YXRpb24gZ2l2ZXMgYHJldHJ5YCB0byBldmVyeSBzdGFnZSBraW5kIHRoYXQgaGFzIGFcbiAgICogZnVuY3Rpb24gdG8gcmV0cnkuIChQdXR0aW5nIGl0IGluIGBTdGFnZVJ1bm5lcmAgd291bGQgaGF2ZSBiZWVuIHdyb25nIOKAlFxuICAgKiB0aGUgcnVubmVyIG93bnMgdGhlIHNjb3BlIGFuZCB0aGUgaW50ZXJydXB0IGJvdW5kYXJ5LCBidXQgbm90IHRoZVxuICAgKiBgU3RhZ2VDb250ZXh0YCB3aG9zZSBzdGFnZWQgd3JpdGVzIGEgZmFpbGVkIGF0dGVtcHQgbXVzdCBkaXNjYXJkLilcbiAgICpcbiAgICogV2l0aCBubyBgcmV0cnlgIHBvbGljeSB0aGlzIGlzIGEgc2luZ2xlIGNhbGwsIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZVxuICAgKiBwcmUtOS4xNSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlU3RhZ2UoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8VE91dD4ge1xuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGlzIGFzc2lnbmVkIGluIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24sXG4gICAgLy8gZW5zdXJpbmcgc2NvcGUgZXZlbnRzIGFuZCBmbG93IGV2ZW50cyB1c2UgdGhlIHNhbWUgdmFsdWUuIEl0IGRvZXMgTk9UXG4gICAgLy8gY2hhbmdlIGFjcm9zcyBhdHRlbXB0czogYXR0ZW1wdHMgYXJlIGludGVybmFsIHRvIE9ORSBzdGFnZSBleGVjdXRpb24g4oCUXG4gICAgLy8gb25lIHJ1bnRpbWVTdGFnZUlkLCBvbmUgZXhlY3V0aW9uIGluZGV4LCBvbmUgZmluYWwgQ29tbWl0QnVuZGxlLlxuICAgIGNvbnN0IHBvbGljeSA9IG5vZGUucmV0cnk7XG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSBwb2xpY3kgPyBNYXRoLmZsb29yKHBvbGljeS5hdHRlbXB0cykgOiAxO1xuICAgIGlmICghcG9saWN5IHx8ICEobWF4QXR0ZW1wdHMgPiAxKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhZ2VSdW5uZXIucnVuKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IGlzRmluYWxBdHRlbXB0ID0gYXR0ZW1wdCA+PSBtYXhBdHRlbXB0cztcbiAgICAgICAgLy8gQSBQYXVzZVNpZ25hbCBpcyBjb250cm9sIGZsb3csIG5vdCBhIGZhaWx1cmUg4oCUIHJldHJ5aW5nIGl0IHdvdWxkXG4gICAgICAgIC8vIHJlLXJ1biBhIHN0YWdlIHRoYXQgYXNrZWQgdG8gU1VTUEVORCAoYW5kIHdvdWxkIGJyZWFrIHJlc3VtZSwgd2hpY2hcbiAgICAgICAgLy8gcmUtZW50ZXJzIHRoaXMgc3RhZ2UgZnJvbSBpdHMgdG9wKS4gQ292ZXJzIGJvdGggcmFpc2Ugc2hhcGVzOlxuICAgICAgICAvLyBgYWRkUGF1c2FibGVGdW5jdGlvbmAgcmV0dXJuaW5nIGRhdGEsIGFuZCBgaW50ZXJydXB0KClgLlxuICAgICAgICBpZiAoaXNGaW5hbEF0dGVtcHQgfHwgaXNQYXVzZVNpZ25hbChlcnJvcikgfHwgIXRoaXMuc2hvdWxkUmV0cnkocG9saWN5LCBlcnJvciwgY29udGV4dCkpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIGNhbmNlbGxlZCBydW4gbXVzdCBub3Qgc2l0IHRocm91Z2ggYSBiYWNrb2ZmIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnJvcjtcblxuICAgICAgICAvLyBBdHRlbXB0IGlzb2xhdGlvbjogZHJvcCBldmVyeXRoaW5nIHRoaXMgYXR0ZW1wdCBzdGFnZWQgQkVGT1JFIHRoZVxuICAgICAgICAvLyBuZXh0IG9uZSBzdGFydHMuIE5vdGhpbmcgd2FzIGFwcGxpZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcm9sbFxuICAgICAgICAvLyBiYWNrIOKAlCBzZWUgU3RhZ2VDb250ZXh0LmRpc2NhcmRTdGFnZWQoKS5cbiAgICAgICAgY29udGV4dC5kaXNjYXJkU3RhZ2VkKCk7XG5cbiAgICAgICAgY29uc3QgZGVsYXlNcyA9IHJlc29sdmVCYWNrb2ZmTXMocG9saWN5LmJhY2tvZmZNcywgYXR0ZW1wdCk7XG4gICAgICAgIC8vIEZpcmVkIEJFRk9SRSB0aGUgd2FpdDogYSBsaXZlIG1vbml0b3IgbGVhcm5zIFwicmV0cnlpbmcgaW4gNTAwbXNcIlxuICAgICAgICAvLyB3aGVuIHRoZSBkZWNpc2lvbiBpcyBtYWRlLCBub3Qgb25jZSBpdCBoYXMgYWxyZWFkeSBlbGFwc2VkLlxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlUmV0cnkoXG4gICAgICAgICAgbm9kZS5uYW1lLFxuICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBtYXhBdHRlbXB0cyxcbiAgICAgICAgICBkZWxheU1zLFxuICAgICAgICAgIHNlcnZlZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChkZWxheU1zID4gMCkgYXdhaXQgc2xlZXAoZGVsYXlNcywgdGhpcy5zaWduYWwpO1xuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSNSBmb3IgaWRzIGEgc3RhZ2UgQURPUFRTIGF0IHJ1biB0aW1lIChhIHJldHVybmVkIFN0YWdlTm9kZSdzIGBuZXh0YCBjaGFpbixcbiAgICogYGNoaWxkcmVuYCBhbmQgc3ViZmxvdyBpZHMpOiB0aGUgc2FtZSByZWZ1c2FsIHRoZSBidWlsZGVyJ3MgZG9vcnMgYXBwbHkg4oCUXG4gICAqIGBpZHMvcmVzZXJ2ZWRJZHMudHMgwrcgcmVmdXNlUmVzZXJ2ZWRJZGAg4oCUIHNvIFwibm8gdXNlciBpZCBjYXJyaWVzIGFcbiAgICogZ3JhbW1hciBkZWxpbWl0ZXJcIiBzdGF5cyB0cnVlIGJ5IGNvbnN0cnVjdGlvbi4gTG9vcC1yZWYgc3R1YnMgKHRoZXkgbmFtZSBhblxuICAgKiBleGlzdGluZyBub2RlKSBhbmQgdGhlIGNoYXJ0J3Mgb3duIG5vZGVzIChhZG1pdHRlZCBhdCBidWlsZDsgYSBwcmVmaXhlZCBpZFxuICAgKiBjYXJyaWVzIGAvYCBvbiBwdXJwb3NlKSBhcmUgbm90IG5ldyBpZHMgYW5kIGFyZSBza2lwcGVkLiBBIHN1YmZsb3dcbiAgICogZGVmaW5pdGlvbidzIG93biB0cmVlIGlzIGEgYnVpbHQgY2hhcnQgYW5kIGlzIG5vdCB3YWxrZWQuXG4gICAqL1xuICBwcml2YXRlIGFkbWl0RHluYW1pY0lkcyhvdXRwdXQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIW91dHB1dCB8fCB0eXBlb2Ygb3V0cHV0ICE9PSAnb2JqZWN0JyB8fCAhaXNTdGFnZU5vZGVSZXR1cm4ob3V0cHV0KSkgcmV0dXJuO1xuICAgIGNvbnN0IHJvb3QgPSBvdXRwdXQgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgY29uc3QgcmVmdXNlID0gKHJlZnVzYWw6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBbZm9vdHByaW50XSBkeW5hbWljIFN0YWdlTm9kZTogJHtyZWZ1c2FsfWApO1xuICAgIH07XG4gICAgaWYgKHJvb3Quc3ViZmxvd0lkKSByZWZ1c2UocmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdWJmbG93IGlkJywgcm9vdC5zdWJmbG93SWQsICdzZWdtZW50JykpO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PigpO1xuICAgIGNvbnN0IHN0YWNrOiBBcnJheTxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD4gPSBbcm9vdC5uZXh0LCAuLi4ocm9vdC5jaGlsZHJlbiA/PyBbXSldO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuID0gc3RhY2sucG9wKCk7XG4gICAgICBpZiAoIW4gfHwgc2Vlbi5oYXMobikgfHwgbi5pc0xvb3BSZWYpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobik7XG4gICAgICBjb25zdCByZWZ1c2FsID1cbiAgICAgICAgcmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdGFnZSBpZCcsIG4uaWQsICdzdGFnZScpID8/XG4gICAgICAgIChuLnN1YmZsb3dJZCA/IHJlZnVzZVJlc2VydmVkSWQoJ2R5bmFtaWMgc3ViZmxvdyBpZCcsIG4uc3ViZmxvd0lkLCAnc2VnbWVudCcpIDogdW5kZWZpbmVkKTtcbiAgICAgIGlmIChyZWZ1c2FsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gT25seSBhIFNVU1BFQ1QgaWQgcGF5cyBmb3IgdGhlIGNoYXJ0IGxvb2t1cDogYSBjaGFydCBub2RlIChhbmQgdGhlXG4gICAgICAgIC8vIGNoYXJ0IGJlbG93IGl0KSB3YXMgYWRtaXR0ZWQgYXQgYnVpbGQuXG4gICAgICAgIGlmICh0aGlzLm5vZGVSZXNvbHZlci5maW5kTm9kZUJ5SWQobi5pZCkgPT09IG4pIGNvbnRpbnVlO1xuICAgICAgICByZWZ1c2UocmVmdXNhbCk7XG4gICAgICB9XG4gICAgICBzdGFjay5wdXNoKG4ubmV4dCwgLi4uKG4uY2hpbGRyZW4gPz8gW10pKTtcbiAgICB9XG4gIH1cblxuICAvKiogYHJldHJ5T25gIGdhdGUuIEEgdGhyb3dpbmcgcHJlZGljYXRlIGNvdW50cyBhcyBcImRvIG5vdCByZXRyeVwiIOKAlCBhIGJyb2tlblxuICAgKiAgcHJlZGljYXRlIG11c3QgbmV2ZXIgdHVybiBhIGZhaWxpbmcgc3RhZ2UgaW50byBhbiBlbmRsZXNzIHJldHJ5IGxvb3AuICovXG4gIHByaXZhdGUgc2hvdWxkUmV0cnkoXG4gICAgcG9saWN5OiBOb25OdWxsYWJsZTxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPlsncmV0cnknXT4sXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXBvbGljeS5yZXRyeU9uKSByZXR1cm4gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBvbGljeS5yZXRyeU9uKGVycm9yKSA9PT0gdHJ1ZTtcbiAgICB9IGNhdGNoIChwcmVkaWNhdGVFcnJvcikge1xuICAgICAgLy8gQSBwcmVkaWNhdGUgbWF5IHJldGhyb3cgdGhlIHN0YWdlJ3Mgb3duIGVycm9yOiB0aGUgbG9nZ2VyIGdldHMgdGhlIHNlcnZlZCBmb3JtLlxuICAgICAgdGhpcy5sb2dnZXIud2FybignW2Zvb3RwcmludF0gcmV0cnlPbiBwcmVkaWNhdGUgdGhyZXc7IHRyZWF0aW5nIHRoZSBmYWlsdXJlIGFzIGZpbmFsJywge1xuICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKGNvbnRleHQsIHByZWRpY2F0ZUVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFtcG9saW5lIGRyaXZlciDigJQgcHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgZW50cnkgcG9pbnQuXG4gICAqXG4gICAqIFJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluIGEgZmxhdCBsb29wOiBldmVyeVxuICAgKiBUQUlMIGNvbnRpbnVhdGlvbiAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlLCBkeW5hbWljIG5leHQgLyBkeW5hbWljXG4gICAqIHJlLWVudHJ5LCBuby1jb250aW51YXRpb24gZGVjaWRlciBkaXNwYXRjaCkgY29tZXMgYmFjayBhcyBhXG4gICAqIGBDb250aW51YXRpb25Ib3BgIGFuZCBpcyBmb2xsb3dlZCBJVEVSQVRJVkVMWSDigJQgbmVpdGhlciB0aGUgY2FsbCBzdGFja1xuICAgKiBub3IgdGhlIHJldGFpbmVkIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBjb3VudC5cbiAgICpcbiAgICogUmVjdXJzaW9uIHJlbWFpbnMgT05MWSBmb3IgdHJ1ZSB0cmVlIG5lc3RpbmcgKGVhY2ggZ2V0cyBhIG5lc3RlZCBkcml2ZXJcbiAgICogY2FsbCk6IGZvcmsgY2hpbGRyZW4gKGBDaGlsZHJlbkV4ZWN1dG9yYCksIHNlbGVjdG9yIGJyYW5jaGVzIChwYXJhbGxlbFxuICAgKiBmYW4tb3V0KSwgZGVjaWRlciBicmFuY2ggZGlzcGF0Y2ggd2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBgbmV4dGBcbiAgICogKHRoZSBicmFuY2ggbXVzdCBjb21wbGV0ZSBCRUZPUkUgdGhlIGRlY2lkZXIncyBjb250aW51YXRpb24gcnVucyksIGFuZFxuICAgKiBzdWJmbG93IG1vdW50cyAoZnJlc2ggdHJhdmVyc2VyOyB0aGUgbW91bnQgZnJhbWUgc3RheXMgaW4gdGhlIHBhcmVudCkuXG4gICAqIGBfZXhlY3V0ZURlcHRoYCB0aGVyZWZvcmUgY291bnRzIGNoYXJ0IENPTVBPU0lUSU9OIGRlcHRoIG9ubHksIGd1YXJkZWRcbiAgICogYnkgYF9tYXhEZXB0aGAgKGRlZmF1bHQgYE1BWF9FWEVDVVRFX0RFUFRIYCA9IDUwMCkuXG4gICAqXG4gICAqIFBhdXNlU2lnbmFsOiBhIGZsYXQgZGVjaWRlciBkaXNwYXRjaCByZWNvcmRzIGFuIGBJbnZva2VyU3RhbXBgOyBpZiB0aGVcbiAgICogY29udGludWVkIGNoYWluIGxhdGVyIHBhdXNlcywgdGhlIGRyaXZlciBzdGFtcHMgdGhlIHNpZ25hbCBkdXJpbmdcbiAgICogdW53aW5kIOKAlCBzYW1lIGludm9rZXIgY29udGV4dCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0b1xuICAgKiBzdGFtcCwgaW5uZXJtb3N0IChtb3N0IHJlY2VudCBkaXNwYXRjaCkgZmlyc3QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVOb2RlKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICAgIGVuY2xvc2luZz86IEVuY2xvc2luZ0ZyYW1lcyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyDilIDilIDilIAgVHJlZS1kZXB0aCBndWFyZCDilIDilIDilIBcbiAgICAvLyBEZXB0aCBpcyB0aGUgQ0FMTCBQQVRIJ3MgbmVzdGluZywgcmVhZCBvZmYgdGhlIGNvbnRleHQgdGhpcyBkcml2ZXIgd2FzXG4gICAgLy8gaGFuZGVkIChzZWUgYF9mcmFtZU9mYCkg4oCUIHNpYmxpbmdzIG5ldmVyIGNvbnN1bWUgaXQuIEEgcmVhY2hlZCBjYXAgaXMgYVxuICAgIC8vIFJVTiBmYWlsdXJlOiBgb25FcnJvcmAgZmlyZXMgaGVyZSAobm8gc3RhZ2UgcmFuIGZvciB0aGlzIG5vZGUsIHNvIG5vXG4gICAgLy8gc3RhZ2UgY2F0Y2ggd291bGQpIGFuZCBgQ2hpbGRyZW5FeGVjdXRvcmAgcmV0aHJvd3MgaXQgd2hhdGV2ZXIgdGhlXG4gICAgLy8gZmFuLW91dCdzIGVycm9yIG1vZGUuXG4gICAgY29uc3QgZGVwdGggPSB0aGlzLm5lc3RpbmdEZXB0aE9mKGNvbnRleHQpO1xuICAgIGlmIChkZXB0aCA+IHRoaXMuX21heERlcHRoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBUcmF2ZXJzYWxEZXB0aEVycm9yKHRoaXMuX21heERlcHRoLCBub2RlLm5hbWUpO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHRocm93blRleHQoZXJyb3IpLCBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBJbnZva2VyIHN0YW1wcyBmcm9tIGZsYXQgZGVjaWRlciBkaXNwYXRjaGVzIGluIFRISVMgZHJpdmVyIOKAlCBrZXB0XG4gICAgLy8gbG9jYWwgc28gbmVzdGVkIGRyaXZlcnMgKGZvcmsgY2hpbGRyZW4sIHdpdGgtbmV4dCBkZWNpZGVyIGJyYW5jaGVzKVxuICAgIC8vIGdldCB0aGVpciBvd24gd2luZG93cywgbWF0Y2hpbmcgdGhlIG9sZCBmcmFtZS1vbi1zdGFjayBzdGFtcGluZyBzY29wZS5cbiAgICBsZXQgcGVuZGluZ0ludm9rZXJzOiBJbnZva2VyU3RhbXBbXSB8IHVuZGVmaW5lZDtcbiAgICAvLyBFdmVyeSBkcml2ZXIgcmVtZW1iZXJzIHRoZSBub2RlcyBpdCByYW4uIEEgZGVjaWRlcidzIEJSQU5DSCBGUkFNRVxuICAgIC8vIChkZWNpZGVyIHdpdGggaXRzIG93biBgbmV4dGA7IGBlbmNsb3NpbmdgID0gdGhlIHJhbi1zZXRzIG9mIHRoZSBkcml2ZXJzXG4gICAgLy8gaXQgaXMgbmVzdGVkIGluICsgdGhlIGBuZXh0YCBjaGFpbnMgb2YgdGhlIGRlY2lkZXJzIHdob3NlIGZyYW1lcyBob2xkXG4gICAgLy8gaXQpIExFQVZFUyBvbiBhIGp1bXAgYnkgaWQgKGEgYGxvb3BgIGhvcCkgdG8gYSBub2RlIHRoaXMgZnJhbWUgZGlkIG5vdFxuICAgIC8vIHJ1biB0aGF0IGlzIGVpdGhlciBvbmUgYW4gRU5DTE9TSU5HIGRyaXZlciBhbHJlYWR5IHJhbiAoYSBsb29wIGJhY2spIG9yXG4gICAgLy8gb25lIG9uIGFuIGVuY2xvc2luZyBkZWNpZGVyJ3MgYG5leHRgIGNoYWluIChhIGZvcndhcmQganVtcCBpbnRvIHRoZVxuICAgIC8vIHRhaWwpIOKAlCB0aGUgaG9wIGlzIGhhbmRlZCBiYWNrIHRvIHRoZSBkZWNpZGVyLCB3aGljaCBmb2xsb3dzIGl0IGZsYXRcbiAgICAvLyBhdCBpdHMgb3duIGxldmVsIGFuZCBza2lwcyBpdHMgYG5leHRgLCBzbyBuZWl0aGVyIGEgbG9vcCBzdGFja3Mgb25lXG4gICAgLy8gZnJhbWUgcGVyIHBhc3Mgbm9yIGEgdGFpbCBydW5zIHR3aWNlLiBBbnkgb3RoZXIganVtcCAoc2lkZXdheXMgdG8gYVxuICAgIC8vIHNpYmxpbmcgYnJhbmNoKSBzdGF5cyBpbiB0aGUgZnJhbWUsIGFzIHRocm91Z2ggOS4zOS4wLlxuICAgIGNvbnN0IHJhbkhlcmUgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICBjb25zdCBmcmFtZTogRHJpdmVyRnJhbWUgPSB7XG4gICAgICBkZXB0aCxcbiAgICAgIHJhbjogZW5jbG9zaW5nID8gWy4uLmVuY2xvc2luZy5yYW4sIHJhbkhlcmVdIDogW3JhbkhlcmVdLFxuICAgICAgdGFpbHM6IGVuY2xvc2luZz8udGFpbHMgPz8gW10sXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgbGV0IGN1cnJlbnQ6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+ID0geyBbQ09OVElOVUVfSE9QXTogdHJ1ZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCB9O1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICB0aGlzLl9mcmFtZU9mLnNldChjdXJyZW50LmNvbnRleHQsIGZyYW1lKTtcbiAgICAgICAgcmFuSGVyZS5hZGQoY3VycmVudC5ub2RlLmlkKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlTm9kZVN0ZXAoY3VycmVudC5ub2RlLCBjdXJyZW50LmNvbnRleHQsIGJyZWFrRmxhZywgY3VycmVudC5icmFuY2hQYXRoKTtcbiAgICAgICAgaWYgKCFpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KHJlc3VsdCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmNsb3NpbmcgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQubG9vcCA9PT0gdHJ1ZSAmJiAhcmFuSGVyZS5oYXMocmVzdWx0Lm5vZGUuaWQpKSB7XG4gICAgICAgICAgY29uc3QgaWQgPSByZXN1bHQubm9kZS5pZDtcbiAgICAgICAgICBjb25zdCBoYXMgPSAoaWRzOiBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KSA9PiBpZHMuaGFzKGlkKTtcbiAgICAgICAgICBpZiAoZW5jbG9zaW5nLnJhbi5zb21lKGhhcykgfHwgZW5jbG9zaW5nLnRhaWxzLnNvbWUoaGFzKSkgcmV0dXJuIHJlc3VsdDsgLy8gdGhlIGp1bXAgbGVhdmVzIHRoaXMgZnJhbWVcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0Lmludm9rZXJTdGFtcCkgKHBlbmRpbmdJbnZva2VycyA/Pz0gW10pLnB1c2gocmVzdWx0Lmludm9rZXJTdGFtcCk7XG4gICAgICAgIGN1cnJlbnQgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFJlcGxheSBpbnZva2VyIHN0YW1wcyBtb3N0LXJlY2VudC1maXJzdC4gYHNldEludm9rZXJgIGlzXG4gICAgICAvLyBmaXJzdC13cml0ZS13aW5zLCBzbyB0aGUgaW5uZXJtb3N0IGRpc3BhdGNoJ3Mgc3RhbXAgbGFuZHMg4oCUIGV4YWN0bHlcbiAgICAgIC8vIHRoZSBvbGQgYnViYmxlLXVwIG9yZGVyIHRocm91Z2ggbmVzdGVkIGNhdGNoIGZyYW1lcy5cbiAgICAgIGlmIChwZW5kaW5nSW52b2tlcnMgIT09IHVuZGVmaW5lZCAmJiBpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gcGVuZGluZ0ludm9rZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihwZW5kaW5nSW52b2tlcnNbaV0uaW52b2tlclN0YWdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5lc3RpbmcgZGVwdGggYSBkcml2ZXIgaGFuZGVkIGBjb250ZXh0YCBydW5zIGF0OiBvbmUgYmVsb3cgdGhlXG4gICAqIGRyaXZlciB0aGF0IHJhbiB0aGUgY29udGV4dCBpdCB3YXMgY3JlYXRlZCBmcm9tLCAxIGF0IHRoZSB0b3AgKGFuZCBmb3JcbiAgICogYSBjb250ZXh0IHdob3NlIHBhcmVudCBubyBkcml2ZXIgb2YgdGhpcyB0cmF2ZXJzZXIgcmFuIOKAlCBhIHN1YmZsb3cnc1xuICAgKiByb290LCBhIHJlc3VtZSdzIHN0YXJ0KS4gUmVhZCBieSB0aGUgaW5zdHJ1bWVudGF0aW9uIGluXG4gICAqIGBiZW5jaC9kZXB0aC1wcm9iZS50c2AgYW5kIHRoZSB0cmFtcG9saW5lIHRlc3RzLlxuICAgKi9cbiAgcHJpdmF0ZSBuZXN0aW5nRGVwdGhPZihjb250ZXh0OiBTdGFnZUNvbnRleHQpOiBudW1iZXIge1xuICAgIGNvbnN0IHBhcmVudCA9IGNvbnRleHQucGFyZW50O1xuICAgIHJldHVybiAocGFyZW50ID09PSB1bmRlZmluZWQgPyAwIDogdGhpcy5fZnJhbWVPZi5nZXQocGFyZW50KT8uZGVwdGggPz8gMCkgKyAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgYSBkZWNpZGVyJ3MgYnJhbmNoIGZyYW1lIGluaGVyaXRzOiB0aGUgcmFuLXNldHMgb2YgdGhlIGRyaXZlcnMgaXQgaXNcbiAgICogbmVzdGVkIGluLCBhbmQgZXZlcnkgZW5jbG9zaW5nIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4gcGx1cyB0aGlzIG9uZSdzLlxuICAgKi9cbiAgcHJpdmF0ZSBicmFuY2hGcmFtZUZvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRW5jbG9zaW5nRnJhbWVzIHtcbiAgICBjb25zdCBvdXRlciA9IHRoaXMuX2ZyYW1lT2YuZ2V0KGNvbnRleHQpO1xuICAgIHJldHVybiB7IHJhbjogb3V0ZXI/LnJhbiA/PyBbXSwgdGFpbHM6IFsuLi4ob3V0ZXI/LnRhaWxzID8/IFtdKSwgdGhpcy50YWlsSWRzKG5leHQpXSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZHMgb24gYSBkZWNpZGVyJ3MgYG5leHRgIGNoYWluIOKAlCBgbmV4dGAsIGl0cyBgbmV4dGAsIOKApiDigJQgdXAgdG8gYVxuICAgKiBsb29wLXJlZiBzdHViIChhIGJhY2stZWRnZSwgbm90IHRoZSB0YWlsKS4gQ2FjaGVkIHBlciBjaGFpbiBoZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSB0YWlsSWRzKG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGlkcyA9IHRoaXMuX3RhaWxJZHMuZ2V0KG5leHQpO1xuICAgIGlmIChpZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2hhaW4gPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgIGZvciAobGV0IG46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkID0gbmV4dDsgbiAmJiAhbi5pc0xvb3BSZWYgJiYgIWNoYWluLmhhcyhuLmlkKTsgbiA9IG4ubmV4dCkge1xuICAgICAgICBjaGFpbi5hZGQobi5pZCk7XG4gICAgICB9XG4gICAgICBpZHMgPSBjaGFpbjtcbiAgICAgIHRoaXMuX3RhaWxJZHMuc2V0KG5leHQsIGlkcyk7XG4gICAgfVxuICAgIHJldHVybiBpZHM7XG4gIH1cblxuICAvKiogQnVpbGQgYSBmbGF0IGNvbnRpbnVhdGlvbiBob3AgZm9yIHRoZSBkcml2ZXIgbG9vcC4gKi9cbiAgcHJpdmF0ZSBob3AoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBpbnZva2VyU3RhbXA/OiBJbnZva2VyU3RhbXAsXG4gICk6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4geyBbQ09OVElOVUVfSE9QXTogdHJ1ZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgLi4uKGludm9rZXJTdGFtcCAmJiB7IGludm9rZXJTdGFtcCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBsb29wIGVkZ2UgKGEgYGxvb3BUb2Agc3R1YiBvciBhIGJ5LWlkIGR5bmFtaWMgbmV4dCkgYW5kIGhvcCB0b1xuICAgKiBpdHMgdGFyZ2V0LiBUaGUgaG9wIGlzIGZsYWdnZWQgYGxvb3BgIHdoZW4gdGhlIHJlc29sdmVyIGZvbGxvd2VkIGFcbiAgICogYmFjay1yZWZlcmVuY2UsIHNvIGEgZGVjaWRlcidzIGJyYW5jaCBmcmFtZSBjYW4gdGVsbCBhIGxvb3AgdGhhdCBsZWF2ZXNcbiAgICogaXQgZnJvbSBvbmUgdGhhdCBzdGF5cyBpbnNpZGUgaXQuXG4gICAqL1xuICBwcml2YXRlIGxvb3BIb3AoXG4gICAgbG9vcFJlZjogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZVRhcmdldChsb29wUmVmLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICBjb25zdCBob3AgPSB0aGlzLmhvcCh0YXJnZXQubm9kZSwgdGFyZ2V0LmNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgIHJldHVybiB0YXJnZXQubm9kZSA9PT0gbG9vcFJlZiA/IGhvcCA6IHsgLi4uaG9wLCBsb29wOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSXMgdGhlIGRlY2lkZXIncyBvd24gYG5leHRgIHRoZSBzdHViIGBsb29wVG9gIHBsYW50ZWQgKG9yIGFcbiAgICogcmVmZXJlbmNlLW9ubHkgbm9kZSDigJQgbm8gZm4sIG5vIGNoaWxkcmVuLCBubyBkZWNpZGVyL3NlbGVjdG9yLCBub3QgYVxuICAgKiBzdWJmbG93IHJvb3QpPyBUaGUgc2VsZWN0b3IncyBhbmQgdGhlIG1vdW50J3MgY29udGludWF0aW9uIGFza1xuICAgKiBgaXNMb29wUmVmYCBhbG9uZS5cbiAgICovXG4gIHByaXZhdGUgaXNMb29wU3R1YihuZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBuZXh0LmlzTG9vcFJlZiA9PT0gdHJ1ZSB8fFxuICAgICAgKCF0aGlzLmdldFN0YWdlRm4obmV4dCkgJiZcbiAgICAgICAgIXRoaXMuZWZmQ2hpbGRyZW4obmV4dCk/Lmxlbmd0aCAmJlxuICAgICAgICAhbmV4dC5kZWNpZGVyRm4gJiZcbiAgICAgICAgIW5leHQuc2VsZWN0b3JGbiAmJlxuICAgICAgICAhdGhpcy5lZmZJc1N1YmZsb3dSb290KG5leHQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBPTkUgbm9kZSB0aHJvdWdoIGFsbCA3IHBoYXNlcyDigJQgdGhlIG9sZCByZWN1cnNpdmUgYGV4ZWN1dGVOb2RlYFxuICAgKiBib2R5OyBvbmx5IHRoZSB0YWlsIGNhbGxzIGJlY2FtZSBgQ29udGludWF0aW9uSG9wYCByZXR1cm5zLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlJ3MgcmVzdWx0LCBvciBhIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wIHRvIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGVTdGVwKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEF0dGFjaCBidWlsZGVyIG1ldGFkYXRhIHRvIGNvbnRleHQgZm9yIHNuYXBzaG90IGVucmljaG1lbnQuXG4gICAgLy8gU3ViZmxvdyBtZXRhIHJlYWRzIGdvIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheSDigJQgYSBub2RlXG4gICAgLy8gcGF0Y2hlZCBieSBhIGR5bmFtaWMtc3ViZmxvdyByZXR1cm4gcmUtZW50ZXJzIGV4ZWN1dGVOb2RlIGFuZCBtdXN0XG4gICAgLy8gY2xhc3NpZnkgYXMgYSBzdWJmbG93IHdpdGhvdXQgdGhlIHNoYXJlZCBub2RlIGV2ZXIgYmVpbmcgbXV0YXRlZC5cbiAgICBpZiAobm9kZS5kZXNjcmlwdGlvbikgY29udGV4dC5kZXNjcmlwdGlvbiA9IG5vZGUuZGVzY3JpcHRpb247XG4gICAgY29uc3QgZWZmU3ViZmxvd0lkID0gdGhpcy5lZmZTdWJmbG93SWQobm9kZSk7XG4gICAgaWYgKHRoaXMuZWZmSXNTdWJmbG93Um9vdChub2RlKSAmJiBlZmZTdWJmbG93SWQpIGNvbnRleHQuc3ViZmxvd0lkID0gZWZmU3ViZmxvd0lkO1xuXG4gICAgLy8gQXNzaWduIHJ1bnRpbWVTdGFnZUlkIEJFRk9SRSB0cmF2ZXJzYWxDb250ZXh0IGNyZWF0aW9uIOKAlCBlbnN1cmVzIHNjb3BlIGV2ZW50c1xuICAgIC8vIChidWZmZXJlZCBieSBydW50aW1lU3RhZ2VJZCkgYW5kIGZsb3cgZXZlbnRzIChmbHVzaGVkIGJ5IHRyYXZlcnNhbENvbnRleHQucnVudGltZVN0YWdlSWQpXG4gICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlLiBNdXN0IGhhcHBlbiBiZWZvcmUgZXhlY3V0ZVN0YWdlIEFORCBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dC5cbiAgICBjb25zdCBpZHggPSB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKys7XG4gICAgY29udGV4dC5ydW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQobm9kZS5pZCwgaWR4KTtcbiAgICBjb250ZXh0LmJpbmRFbWl0T3JpZ2luKHRoaXMucnVuSWQsIHRoaXMuZW1pdERyaWxsUGF0aCk7XG4gICAgLy8gRGVjbGFyZWQgdGFncyAoOS4yMS4wKSByaWRlIHRoZSBzYW1lIHN0YW1wOiBwZXItbm9kZSBpZGVudGl0eSwgc2V0XG4gICAgLy8gVU5DT05ESVRJT05BTExZIHNvIGEgcmUtdXNlZCBjb250ZXh0IChhIGxvb3AncyBuZXh0LWNvbnRleHQsIGEgcmVzdW1lZFxuICAgIC8vIGxlZykgbmV2ZXIga2VlcHMgYSBwcmV2aW91cyBub2RlJ3MgbmFtZXMuIGBTdGFnZUNvbnRleHQuY29tbWl0YCByZWNvcmRzXG4gICAgLy8gdGhlbSBvbiB0aGUgZmlyc3QgYnVuZGxlIG9mIHRoaXMgZXhlY3V0aW9uIGFuZCByZWxlYXNlcyB0aGVtLlxuICAgIGNvbnRleHQudGFncyA9IG5vZGUudGFncztcblxuICAgIC8vIFJGQy0wMDMgRDE6IHJ1bnRpbWUgcGFyZW50IOKAlCB0aGUgcHJldmlvdXMgZXhlY3V0aW9uIHN0ZXAncyBydW50aW1lU3RhZ2VJZC5cbiAgICAvLyBGYWxscyBiYWNrIHRvIHRoZSBzdWJmbG93IE1PVU5UJ3MgcnVudGltZVN0YWdlSWQgZm9yIHRoZSBzdWJmbG93IHJvb3RcbiAgICAvLyBzdGFnZSAoaXRzIFN0YWdlQ29udGV4dCBpcyBjcmVhdGVkIGZyZXNoIHdpdGggbm8gcGFyZW50KSwgc28gcnVudGltZVxuICAgIC8vIGFuY2VzdG9yIGNoYWlucyBjcm9zcyBzdWJmbG93IGJvdW5kYXJpZXMuIGB8fGAgKG5vdCBgPz9gKSBvbiBwdXJwb3NlOlxuICAgIC8vIGEgcGFyZW50IGNvbnRleHQgdGhhdCBuZXZlciBleGVjdXRlZCBzdGlsbCBjYXJyaWVzIHRoZSBmaWVsZCdzXG4gICAgLy8gaW5pdGlhbCBgJydgLCB3aGljaCBtdXN0IGFsc28gZmFsbCB0aHJvdWdoIHRvIHRoZSBtb3VudCBmYWxsYmFjay5cbiAgICBjb25zdCBwYXJlbnRSdW50aW1lU3RhZ2VJZCA9IGNvbnRleHQucGFyZW50Py5ydW50aW1lU3RhZ2VJZCB8fCB0aGlzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ7XG5cbiAgICAvLyBsb29wSXRlcmF0aW9uIOKAlCBob3cgbWFueSB0aW1lcyBUSElTIHN0YWdlIGhhcyBydW4gYmVmb3JlIGluIHRoaXMgcnVuLlxuICAgIC8vIEtleWVkIGJ5IHRoZSBzYW1lIHN0YWdlSWQgd2Ugc3RhbXAgb24gdGhlIGNvbnRleHQgKGFuZCB0aGUgc2FtZSB2YWx1ZSB0aGVcbiAgICAvLyBuYXJyYXRpdmUgcmVjb3JkZXIgY291bnRzIG9uKSwgcnVuLXNjb3BlZCBhbmQgc2hhcmVkIGFjcm9zcyBzdWJmbG93XG4gICAgLy8gcmUtbW91bnRzIHZpYSBgX3Zpc2l0Q291bnRzYC4gdW5kZWZpbmVkIG9uIHRoZSBmaXJzdCB2aXNpdDsgMSBvbiB0aGVcbiAgICAvLyBmaXJzdCBsb29wLWJhY2ssIDIgb24gdGhlIG5leHQsIOKApiDigJQgaS5lLiB2aXNpdENvdW50IC0gMS4gQ291bnRlZCBmb3JcbiAgICAvLyBFVkVSWSBzdGFnZSBraW5kIChhbnkgbm9kZSBjYW4gYmUgYSBsb29wIHRhcmdldCksIHVubGlrZSB0aGUgbmFycmF0aXZlXG4gICAgLy8gcmVjb3JkZXIgd2hpY2ggb25seSByZW5kZXJzIGl0IGZvciBsaW5lYXIgc3RhZ2VzLlxuICAgIGNvbnN0IGNvbnRleHRTdGFnZUlkID0gbm9kZS5pZCA/PyBjb250ZXh0LnN0YWdlSWQ7XG4gICAgY29uc3QgdmlzaXRDb3VudCA9ICh0aGlzLl92aXNpdENvdW50cy5nZXQoY29udGV4dFN0YWdlSWQpID8/IDApICsgMTtcbiAgICB0aGlzLl92aXNpdENvdW50cy5zZXQoY29udGV4dFN0YWdlSWQsIHZpc2l0Q291bnQpO1xuICAgIGNvbnN0IGxvb3BJdGVyYXRpb24gPSB2aXNpdENvdW50ID4gMSA/IHZpc2l0Q291bnQgLSAxIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gQnVpbGQgdHJhdmVyc2FsIGNvbnRleHQgZm9yIHJlY29yZGVyIGV2ZW50cyDigJQgY3JlYXRlZCBvbmNlIHBlciBzdGFnZSwgc2hhcmVkIGJ5IGFsbCBldmVudHNcbiAgICBjb25zdCB0cmF2ZXJzYWxDb250ZXh0ID0gdHJhdmVyc2FsQ29udGV4dEZvcih7XG4gICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgIHN0YWdlSWQ6IGNvbnRleHRTdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBzdGFnZU5hbWU6IG5vZGUubmFtZSxcbiAgICAgIHBhcmVudFN0YWdlSWQ6IGNvbnRleHQucGFyZW50Py5zdGFnZUlkLFxuICAgICAgcGFyZW50UnVudGltZVN0YWdlSWQsXG4gICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgc3ViZmxvd0lkOiBjb250ZXh0LnN1YmZsb3dJZCA/PyB0aGlzLnBhcmVudFN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBicmFuY2hQYXRoIHx8IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYTogTEFaWSBSRVNPTFZFIOKAlCBkZWZlcnJlZCBzdWJmbG93IHJlc29sdXRpb24g4pSA4pSA4pSAXG4gICAgLy8gR3VhcmQgdXNlcyB0aGUgcGVyLXRyYXZlcnNlciByZXNvbHZlZExhenlTdWJmbG93cyBzZXQgKG5vdCB0aGUgc2hhcmVkIG5vZGUpIHNvXG4gICAgLy8gY29uY3VycmVudCB0cmF2ZXJzZXJzIGRvIG5vdCByYWNlIG9uIG5vZGUuc3ViZmxvd1Jlc29sdmVyIG9yIGNsZWFyIGl0IGZvciBlYWNoIG90aGVyLlxuICAgIGlmIChub2RlLmlzU3ViZmxvd1Jvb3QgJiYgbm9kZS5zdWJmbG93UmVzb2x2ZXIgJiYgIXRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuaGFzKG5vZGUuc3ViZmxvd0lkISkpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gbm9kZS5zdWJmbG93UmVzb2x2ZXIoKTtcbiAgICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMucHJlZml4Tm9kZVRyZWUocmVzb2x2ZWQucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgbm9kZS5zdWJmbG93SWQhKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHJlc29sdmVkIHN1YmZsb3cgKHNhbWUgcGF0aCBhcyBlYWdlciByZWdpc3RyYXRpb24pXG4gICAgICB0aGlzLnN1YmZsb3dzW25vZGUuc3ViZmxvd0lkIV0gPSB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9O1xuXG4gICAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiByZXNvbHZlZC5zdGFnZU1hcCkge1xuICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhwcmVmaXhlZEtleSkpIHtcbiAgICAgICAgICB0aGlzLnN0YWdlTWFwLnNldChwcmVmaXhlZEtleSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBNZXJnZSBuZXN0ZWQgc3ViZmxvd3NcbiAgICAgIGlmIChyZXNvbHZlZC5zdWJmbG93cykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMocmVzb2x2ZWQuc3ViZmxvd3MpKSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ZWRLZXkgPSBqb2luUGF0aChub2RlLnN1YmZsb3dJZCEsIGtleSk7XG4gICAgICAgICAgaWYgKCF0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSkge1xuICAgICAgICAgICAgLy8gUHJlZml4ZWQgbGlrZSB0aGUgYnVpbGRlcidzIGBfbW91bnRTdWJmbG93YCAoOS4zNy4wIGZpeCk6IHRoZVxuICAgICAgICAgICAgLy8gbmVzdGVkIHJvb3QncyBpZHMgbGl2ZSB1bmRlciB0aGUgbGF6eSBtb3VudCdzIHBhdGggdG9vLlxuICAgICAgICAgICAgdGhpcy5zdWJmbG93c1twcmVmaXhlZEtleV0gPSB7XG4gICAgICAgICAgICAgIHJvb3Q6IHByZWZpeE5vZGVUcmVlKChkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9KS5yb290LCBub2RlLnN1YmZsb3dJZCEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHJ1bnRpbWUgc3RydWN0dXJlIHdpdGggdGhlIG5vdy1yZXNvbHZlZCBzcGVjXG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG5vZGUuaWQsXG4gICAgICAgIG5vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgbm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgcmVzb2x2ZWQuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhcyByZXNvbHZlZCBmb3IgVEhJUyB0cmF2ZXJzZXIg4oCUIHBlci10cmF2ZXJzZXIgc2V0IHByZXZlbnRzIHJlLWVudHJ5XG4gICAgICAvLyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgU3RhZ2VOb2RlIGdyYXBoICh3aGljaCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgdHJhdmVyc2VycykuXG4gICAgICB0aGlzLnJlc29sdmVkTGF6eVN1YmZsb3dzLmFkZChub2RlLnN1YmZsb3dJZCEpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwOiBDTEFTU0lGWSDigJQgc3ViZmxvdyBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuZWZmSXNTdWJmbG93Um9vdChub2RlKSAmJiBlZmZTdWJmbG93SWQpIHtcbiAgICAgIC8vIEhhbmQgaGVscGVycyB0aGUgRUZGRUNUSVZFIG5vZGUgdmlldyAoYnVpbHQgZmllbGRzICsgZHluYW1pYyBwYXRjaClcbiAgICAgIC8vIHNvIFN1YmZsb3dFeGVjdXRvci9Ob2RlUmVzb2x2ZXIgbmV2ZXIgcmVhZCBzdGFsZSBidWlsdCBmaWVsZHMuXG4gICAgICBjb25zdCBtb3VudE5vZGUgPSB0aGlzLmVmZk5vZGUobm9kZSk7XG4gICAgICBjb25zdCByZXNvbHZlZE5vZGUgPSB0aGlzLm5vZGVSZXNvbHZlci5yZXNvbHZlU3ViZmxvd1JlZmVyZW5jZShtb3VudE5vZGUpO1xuXG4gICAgICBjb25zdCBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdGhpcy5zdWJmbG93RXhlY3V0b3IuZXhlY3V0ZVN1YmZsb3coXG4gICAgICAgIHJlc29sdmVkTm9kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgPSByZXNvbHZlZE5vZGUgIT09IG1vdW50Tm9kZTtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbihtb3VudE5vZGUuY2hpbGRyZW4gJiYgbW91bnROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbiA9IGlzUmVmZXJlbmNlQmFzZWRTdWJmbG93IHx8IGhhc0NoaWxkcmVuO1xuXG4gICAgICAvLyDilIDilIDilIAgQnJlYWstZmxhZyBjaGVjayBBRlRFUiBzdWJmbG93IHJldHVybnMg4pSA4pSA4pSAXG4gICAgICAvLyBJZiB0aGUgc3ViZmxvdyB3YXMgbW91bnRlZCB3aXRoIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAgYW5kIGJyb2tlXG4gICAgICAvLyBpbnRlcm5hbGx5LCBgU3ViZmxvd0V4ZWN1dG9yYCBoYXMgYWxyZWFkeSBmbGlwcGVkIG91ciBicmVha0ZsYWcuXG4gICAgICAvLyBTdG9wIHRoZSBvdXRlciB0cmF2ZXJzYWwgaGVyZSDigJQgZG8gbm90IHJ1biB0aGUgbmV4dCBsaW5lYXIgc3RhZ2UuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5uZXh0ICYmIHNob3VsZEV4ZWN1dGVDb250aW51YXRpb24pIHtcbiAgICAgICAgLy8gQSBtb3VudCdzIGBuZXh0YCBjYW4gYmUgYSBsb29wLXJlZiBTVFVCIOKAlCBhIHN1YmZsb3cgbW91bnRlZCBhcyBhXG4gICAgICAgIC8vIGRlY2lkZXIgYnJhbmNoIHdpdGggYHsgbG9vcFRvIH1gIC8gYC5sb29wVG8oKWAuIFJlc29sdmUgaXQgbGlrZVxuICAgICAgICAvLyBQaGFzZSA2IGRvZXMgKGl0ZXJhdGlvbiBjb3VudGVkLCBgb25Mb29wYCBmaXJlZCk7IGhvcHBpbmcgaW50byB0aGVcbiAgICAgICAgLy8gYmFyZSBzdHViIHJhbiB0aGUgdGFyZ2V0J3MgZnVuY3Rpb24gb25jZSBhbmQgZW5kZWQgdGhlIHJ1bi5cbiAgICAgICAgaWYgKG5vZGUubmV4dC5pc0xvb3BSZWYpIHJldHVybiB0aGlzLmxvb3BIb3Aobm9kZS5uZXh0LCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMGI6IFBBUkFMTEVMLUZPUi1FQUNIIOKAlCBkeW5hbWljIGZhbi1vdXQsIG9uZSBicmFuY2ggcGVyIGl0ZW0g4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBTaXRzIEJFRk9SRSBQaGFzZSAxIChWQUxJREFURSkgb24gcHVycG9zZTogdGhpcyBub2RlIGxlZ2l0aW1hdGVseSBoYXMgbm9cbiAgICAvLyBzdGFnZSBmdW5jdGlvbiwgbm8gc3RhdGljIGNoaWxkcmVuLCBhbmQgbm8gZGVjaWRlciDigJQgaXRzIGJyYW5jaGVzIGRvIG5vdFxuICAgIC8vIGV4aXN0IHVudGlsIGBpdGVtcygpYCBydW5zIOKAlCBzbyB0aGUgXCJtdXN0IGRlZmluZSBmbiBPUiBjaGlsZHJlblwiIGNoZWNrXG4gICAgLy8gd291bGQgcmVqZWN0IGEgcGVyZmVjdGx5IHZhbGlkIGNoYXJ0LiBUaGUgaGFuZGxlciBvd25zIGl0cyBvd24gY29tbWl0XG4gICAgLy8gKHRoZSBvcmRlcmVkIHJlc3VsdHMgYXJyYXkpLCBsaWtlIHRoZSBkZWNpZGVyIGFuZCBzZWxlY3RvciBwaGFzZXMgZG8uXG4gICAgaWYgKG5vZGUuaXNEeW5hbWljUGFyYWxsZWwgJiYgbm9kZS5wYXJhbGxlbEZvckVhY2gpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnBhcmFsbGVsRm9yRWFjaEhhbmRsZXIucnVuKG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5vZGUubmV4dC5uYW1lLCBub2RlLm5leHQuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0LCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWdlRnVuYyA9IHRoaXMuZ2V0U3RhZ2VGbihub2RlKTtcbiAgICBjb25zdCBoYXNTdGFnZUZ1bmN0aW9uID0gQm9vbGVhbihzdGFnZUZ1bmMpO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZERlY2lkZXIgPSBCb29sZWFuKG5vZGUuZGVjaWRlckZuKTtcbiAgICBjb25zdCBpc1Njb3BlQmFzZWRTZWxlY3RvciA9IEJvb2xlYW4obm9kZS5zZWxlY3RvckZuKTtcbiAgICBjb25zdCBpc0RlY2lkZXJOb2RlID0gaXNTY29wZUJhc2VkRGVjaWRlcjtcbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4odGhpcy5lZmZDaGlsZHJlbihub2RlKT8ubGVuZ3RoKTtcbiAgICAvLyBgbmV4dGAgaXMgbmV2ZXIgb3ZlcmxhaWQg4oCUIGEgZHluYW1pYyBuZXh0IGFwcGxpZXMgb25seSB0byB0aGUgdmlzaXRcbiAgICAvLyB0aGF0IHByb2R1Y2VkIGl0IChoYW5kbGVkIHZpYSB0aGUgYGR5bmFtaWNOZXh0YCBsb2NhbCBiZWxvdyksIHNvIHRoZVxuICAgIC8vIGJ1aWx0IGNoYXJ0J3MgbmV4dCBpcyBhbHdheXMgdGhlIGNvcnJlY3QgY29udGludWF0aW9uIGhlcmUuXG4gICAgY29uc3QgaGFzTmV4dCA9IEJvb2xlYW4obm9kZS5uZXh0KTtcbiAgICBjb25zdCBvcmlnaW5hbE5leHQgPSBub2RlLm5leHQ7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMTogVkFMSURBVEUg4oCUIG5vZGUgaW52YXJpYW50cyDilIDilIDilIBcbiAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24gJiYgIWlzRGVjaWRlck5vZGUgJiYgIWlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYE5vZGUgJyR7bm9kZS5uYW1lfScgbXVzdCBkZWZpbmU6IGVtYmVkZGVkIGZuIE9SIGEgc3RhZ2VNYXAgZW50cnkgT1IgaGF2ZSBjaGlsZHJlbi9kZWNpZGVyYDtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIGlmIChpc0RlY2lkZXJOb2RlICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ0RlY2lkZXIgbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ1NlbGVjdG9yIG5vZGUgbmVlZHMgdG8gaGF2ZSBjaGlsZHJlbiB0byBleGVjdXRlJztcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gUm9sZSBtYXJrZXJzIGZvciBkZWJ1ZyBwYW5lbHNcbiAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24pIHtcbiAgICAgIGlmIChpc0RlY2lkZXJOb2RlKSBjb250ZXh0LnNldEFzRGVjaWRlcigpO1xuICAgICAgZWxzZSBpZiAoaGFzQ2hpbGRyZW4pIGNvbnRleHQuc2V0QXNGb3JrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYnJlYWtGbiA9IGNyZWF0ZUJyZWFrSGFuZGxlcihicmVha0ZsYWcpO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJhOiBTRUxFQ1RPUiDigJQgc2NvcGUtYmFzZWQgbXVsdGktY2hvaWNlIOKUgOKUgOKUgFxuICAgIGlmIChpc1Njb3BlQmFzZWRTZWxlY3Rvcikge1xuICAgICAgY29uc3Qgc2VsZWN0b3JSZXN1bHQgPSBhd2FpdCB0aGlzLnNlbGVjdG9ySGFuZGxlci5oYW5kbGVTY29wZUJhc2VkKFxuICAgICAgICBub2RlLFxuICAgICAgICBzdGFnZUZ1bmMhLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0YWdlLmJpbmQodGhpcyksXG4gICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBoYW5kbGVyIGNvbW1pdHRlZCBhbmQgcmVjb3JkZWQgdGhlIHN0b3AuIERvIG5vdCBjcmVhdGUgYSBuZXh0XG4gICAgICAvLyBmcmFtZSBvciByZXNvbHZlIGEgbG9vcCBlZGdlIGZvciBhIHNlbGVjdG9yIHRoYXQgc3RvcHBlZCBoZXJlLlxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykgcmV0dXJuIHNlbGVjdG9yUmVzdWx0O1xuXG4gICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICAvLyBBIHNlbGVjdG9yJ3Mgb3duIGBsb29wVG9gIGlzIGEgbG9vcCBlZGdlIGxpa2UgYW55IG90aGVyOiByZXNvbHZlZFxuICAgICAgICAvLyAoaXRlcmF0aW9uIGd1YXJkICsgYG9uTG9vcGApLCBuZXZlciBhIGhvcCBpbnRvIHRoZSBiYXJlIHN0dWIuXG4gICAgICAgIGlmIChub2RlLm5leHQhLmlzTG9vcFJlZiA9PT0gdHJ1ZSkgcmV0dXJuIHRoaXMubG9vcEhvcChub2RlLm5leHQhLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0IS5uYW1lLCBub2RlLm5leHQhLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCEsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdG9yUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYjogREVDSURFUiDigJQgc2NvcGUtYmFzZWQgc2luZ2xlLWNob2ljZSBjb25kaXRpb25hbCBicmFuY2gg4pSA4pSA4pSAXG4gICAgaWYgKGlzRGVjaWRlck5vZGUpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoID0gYXdhaXQgdGhpcy5kZWNpZGVySGFuZGxlci5wcmVwYXJlRGlzcGF0Y2goXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIC8vIE5vIGRlY2lkZXItbGV2ZWwgY29udGludWF0aW9uIOKGkiB0aGUgYnJhbmNoIGRpc3BhdGNoIGlzIGEgdGFpbFxuICAgICAgLy8gY2FsbC4gSGFuZCBpdCB0byB0aGUgZHJpdmVyIGFzIGEgZmxhdCBob3Agc28gbG9vcC1oZWF2eSBkZWNpZGVyXG4gICAgICAvLyBjaGFydHMgKGUuZy4gYWdlbnQgUmVBY3QgbG9vcHMgd2l0aCBicmFuY2gtc291cmNlZCBgbG9vcFRvYCkgc3RheVxuICAgICAgLy8gZmxhdC1zdGFja2VkLiBUaGUgaW52b2tlciBzdGFtcCBwcmVzZXJ2ZXMgUGF1c2VTaWduYWwgc2VtYW50aWNzIOKAlFxuICAgICAgLy8gdGhlIGRlY2lkZXIgaXMgdGhlIGludm9rZXIgb2Ygd2hhdGV2ZXIgcGF1c2VzIGluIHRoZSBjaGFpbi5cbiAgICAgIGlmICghaGFzTmV4dCAmJiBkaXNwYXRjaC5raW5kID09PSAnZGlzcGF0Y2gnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChkaXNwYXRjaC5jaG9zZW4sIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsIGJyYW5jaFBhdGgsIHsgaW52b2tlclN0YWdlSWQ6IG5vZGUuaWQhIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWNpZGVyIFdJVEggaXRzIG93biBuZXh0OiB0aGUgYnJhbmNoIGNoYWluIG11c3QgY29tcGxldGUgQkVGT1JFXG4gICAgICAvLyB0aGUgZGVjaWRlcidzIGNvbnRpbnVhdGlvbiBydW5zIOKAlCB0cnVlIHRyZWUgbmVzdGluZywga2VwdFxuICAgICAgLy8gcmVjdXJzaXZlIChhIG5lc3RlZCBkcml2ZXIsIHJ1biBhcyBhIEJSQU5DSCBGUkFNRSkuIE1pcnJvcnNcbiAgICAgIC8vIGhhbmRsZVNjb3BlQmFzZWQgZXhhY3RseSwgaW5jbHVkaW5nIHRoZSBQYXVzZVNpZ25hbCBpbnZva2VyIHN0YW1wXG4gICAgICAvLyBvbiBidWJibGUtdXAuXG4gICAgICBsZXQgZGVjaWRlclJlc3VsdDogYW55O1xuICAgICAgaWYgKGRpc3BhdGNoLmtpbmQgPT09ICdicmVhaycpIHtcbiAgICAgICAgZGVjaWRlclJlc3VsdCA9IGRpc3BhdGNoLmJyYW5jaElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWNpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShcbiAgICAgICAgICAgIGRpc3BhdGNoLmNob3NlbixcbiAgICAgICAgICAgIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsXG4gICAgICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgICAgdGhpcy5icmFuY2hGcmFtZUZvcihjb250ZXh0LCBvcmlnaW5hbE5leHQhKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBicmFuY2ggTE9PUEVEIE9VVCBvZiBpdHMgZnJhbWUgKGJhY2sgdGhyb3VnaCB0aGlzIGRlY2lkZXIgb3JcbiAgICAgICAgLy8gZnVydGhlciB1cCk6IHRoZSBicmFuY2ggbmV2ZXIgY29tcGxldGVkLCBzbyB0aGlzIGRlY2lkZXIncyBgbmV4dGBcbiAgICAgICAgLy8gaXMgbm90IGR1ZSDigJQgZm9sbG93IHRoZSBsb29wIGZsYXQgYXQgdGhpcyBsZXZlbC4gVGhlIGBuZXh0YCBydW5zXG4gICAgICAgIC8vIG9uY2UsIGFmdGVyIHRoZSBwYXNzIHdob3NlIGJyYW5jaCBjb21wbGV0ZXMgKENMQVVERS5tZCBcImxvb3BcIjogYVxuICAgICAgICAvLyBmbGF0IGhvcCB3aXRoIHplcm8gc3RhY2spLlxuICAgICAgICBpZiAoaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPihkZWNpZGVyUmVzdWx0KSkgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGJyYW5jaCBleGVjdXRpb24sIGZvbGxvdyBkZWNpZGVyJ3Mgb3duIG5leHQgKGUuZy4sIGxvb3BUbyB0YXJnZXQpXG4gICAgICBpZiAoaGFzTmV4dCAmJiAhYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcbiAgICAgICAgLy8gVXNlIHRoZSBpc0xvb3BSZWYgZmxhZyBzZXQgYnkgbG9vcFRvKCkg4oCUIGRvIG5vdCByZWx5IG9uIHN0YWdlTWFwIGFic2VuY2UsXG4gICAgICAgIC8vIHNpbmNlIGlkLWtleWVkIHN0YWdlTWFwcyB3b3VsZCBvdGhlcndpc2UgY2F1c2UgbG9vcCB0YXJnZXRzIHRvIGJlIGV4ZWN1dGVkIGRpcmVjdGx5LlxuICAgICAgICBpZiAodGhpcy5pc0xvb3BTdHViKG5leHROb2RlKSkgcmV0dXJuIHRoaXMubG9vcEhvcChuZXh0Tm9kZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChuZXh0Tm9kZSwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWNpZGVyUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBBYm9ydCBjaGVjayDigJQgY29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uIOKUgOKUgOKUgFxuICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgdGhpcy5zaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyB0aGlzLnNpZ25hbC5yZWFzb24gOiBuZXcgRXJyb3IodGhpcy5zaWduYWwucmVhc29uID8/ICdBYm9ydGVkJyk7XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDM6IEVYRUNVVEUg4oCUIHJ1biBzdGFnZSBmdW5jdGlvbiDilIDilIDilIBcbiAgICBsZXQgc3RhZ2VPdXRwdXQ6IFRPdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGR5bmFtaWNOZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmV0dXJuZWREeW5hbWljTm9kZSA9IGZhbHNlO1xuXG4gICAgaWYgKHN0YWdlRnVuYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhZ2VPdXRwdXQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICAvLyBSNSBhdCB0aGUgcnVuLXRpbWUgZG9vcjogYSByZXR1cm5lZCBTdGFnZU5vZGUgYWRvcHRzIGlkcyB0aGUgYnVpbGRlclxuICAgICAgICAvLyBuZXZlciBzYXcuIFJlZnVzZWQgaGVyZSwgaW5zaWRlIHRoZSB0cnksIHNvIGl0IHRha2VzIHRoZSBzdGFnZSdzXG4gICAgICAgIC8vIGVycm9yIHBhdGggKGNvbW1pdCwgb25FcnJvciwgcmV0aHJvdykuXG4gICAgICAgIHRoaXMuYWRtaXREeW5hbWljSWRzKHN0YWdlT3V0cHV0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gUGF1c2VTaWduYWwgaXMgZXhwZWN0ZWQgY29udHJvbCBmbG93LCBub3QgYW4gZXJyb3Ig4oCUIGZpcmUgbmFycmF0aXZlLCBjb21taXQsIHJlLXRocm93LlxuICAgICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUGF1c2UoXG4gICAgICAgICAgICBub2RlLm5hbWUsXG4gICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgc2VydmVkUGF1c2UoY29udGV4dCwgZXJyb3IucGF1c2VEYXRhKSxcbiAgICAgICAgICAgIGVycm9yLnN1YmZsb3dQYXRoLFxuICAgICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IHJlY29yZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpO1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgc2VydmVkLm1lc3NhZ2UsIHNlcnZlZC5zdHJ1Y3R1cmVkRXJyb3IsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHtcbiAgICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKGNvbnRleHQsIGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29tbWl0U3RhZ2UoY29udGV4dCwgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IsIG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCAnbGluZWFyJyk7XG5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgLy8gRm9yd2FyZCB0aGUgb3B0aW9uYWwgcmVhc29uIGNhcHR1cmVkIG9uIGJyZWFrRmxhZyDigJQgc2V0IGJ5IHRoZVxuICAgICAgICAvLyBzdGFnZSdzICRicmVhayhyZWFzb24pIGNhbGwgT1IgYnkgYSBzdWJmbG93J3MgcHJvcGFnYXRlQnJlYWsuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsobm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0LCBicmVha0ZsYWcucmVhc29uKTtcbiAgICAgICAgcmV0dXJuIHN0YWdlT3V0cHV0O1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgNDogRFlOQU1JQyDigJQgU3RhZ2VOb2RlIHJldHVybiBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgICBpZiAoc3RhZ2VPdXRwdXQgJiYgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJiBpc1N0YWdlTm9kZVJldHVybihzdGFnZU91dHB1dCkpIHtcbiAgICAgICAgY29uc3QgZHluYW1pY05vZGUgPSBzdGFnZU91dHB1dCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICAgICAgcmV0dXJuZWREeW5hbWljTm9kZSA9IHRydWU7XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCdpc0R5bmFtaWMnLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNQYXR0ZXJuJywgJ1N0YWdlTm9kZVJldHVybicpO1xuXG4gICAgICAgIC8vIER5bmFtaWMgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbi4gVGhlIHN1YmZsb3cgbWV0YSBsYW5kcyBpbiB0aGVcbiAgICAgICAgLy8gdHJhdmVyc2VyLWxvY2FsIG92ZXJsYXkgKE5PVCBvbiB0aGUgc2hhcmVkIG5vZGUpOyB0aGUgaW1tZWRpYXRlXG4gICAgICAgIC8vIGV4ZWN1dGVOb2RlIHJlLWVudHJ5IHNlZXMgaXQgdGhyb3VnaCB0aGUgZWZmKiBhY2Nlc3NvcnMgYW5kXG4gICAgICAgIC8vIGNsYXNzaWZpZXMgdGhlIG5vZGUgYXMgYSBzdWJmbG93IG1vdW50IGluIFBoYXNlIDAuXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5pc1N1YmZsb3dSb290ICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYgJiYgZHluYW1pY05vZGUuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNQYXR0ZXJuJywgJ2R5bmFtaWNTdWJmbG93Jyk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNTdWJmbG93SWQnLCBkeW5hbWljTm9kZS5zdWJmbG93SWQpO1xuXG4gICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGR5bmFtaWNOb2RlLnN1YmZsb3dJZCwgZHluYW1pY05vZGUuc3ViZmxvd0RlZiwgbm9kZS5pZCk7XG5cbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuc3ViZmxvd01ldGEgPSB7XG4gICAgICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICAgICAgc3ViZmxvd0lkOiBkeW5hbWljTm9kZS5zdWJmbG93SWQsXG4gICAgICAgICAgICBzdWJmbG93TmFtZTogZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBzdWJmbG93TW91bnRPcHRpb25zOiBkeW5hbWljTm9kZS5zdWJmbG93TW91bnRPcHRpb25zLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZS1lbnRlciBUSElTIG5vZGUgKHNhbWUgY29udGV4dCk6IHRoZSBvdmVybGF5IHBhdGNoIG1ha2VzIHRoZVxuICAgICAgICAgIC8vIG5leHQgc3RlcCBjbGFzc2lmeSBpdCBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBjaGlsZHJlbiBmb3Igc3ViZmxvd0RlZlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGR5bmFtaWNOb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQuaXNTdWJmbG93Um9vdCAmJiBjaGlsZC5zdWJmbG93RGVmICYmIGNoaWxkLnN1YmZsb3dJZCkge1xuICAgICAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoY2hpbGQuc3ViZmxvd0lkLCBjaGlsZC5zdWJmbG93RGVmLCBjaGlsZC5pZCk7XG4gICAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgICAgICBjaGlsZC5pZCxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93SWQhLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIGNoaWxkcmVuIChmb3JrIHBhdHRlcm4pIOKAlCBwYXRjaGVkIGludG8gdGhlIG92ZXJsYXk7XG4gICAgICAgIC8vIFBoYXNlIDUgYmVsb3cgcmVhZHMgdGhlbSBiYWNrIHRocm91Z2ggZWZmQ2hpbGRyZW4vZWZmU2VsZWN0b3IuXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbiAmJiBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLmNoaWxkcmVuID0gZHluYW1pY05vZGUuY2hpbGRyZW47XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNDaGlsZENvdW50JywgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZyhcbiAgICAgICAgICAgICdkeW5hbWljQ2hpbGRJZHMnLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuY2hpbGRyZW4ubWFwKChjKSA9PiBjLmlkKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNDaGlsZHJlbihcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvciksXG4gICAgICAgICAgICBCb29sZWFuKGR5bmFtaWNOb2RlLmRlY2lkZXJGbiksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLm5leHROb2RlU2VsZWN0b3IgPSBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc1NlbGVjdG9yJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHluYW1pYyBuZXh0IChsaW5lYXIgY29udGludWF0aW9uKSDigJQgc3RheXMgYSBMT0NBTDogaXQgYXBwbGllc1xuICAgICAgICAvLyBvbmx5IHRvIHRoaXMgdmlzaXQgKFBoYXNlIDYgcm91dGVzIGl0IHRocm91Z2ggdGhlXG4gICAgICAgIC8vIENvbnRpbnVhdGlvblJlc29sdmVyKSwgc28gdGhlIHNoYXJlZCBub2RlJ3MgbmV4dCBpcyBuZXZlciB0b3VjaGVkXG4gICAgICAgIC8vIGFuZCBhIGxvb3AgcmV2aXNpdCBuYXR1cmFsbHkgc2VlcyB0aGUgYnVpbHQgY29udGludWF0aW9uLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUubmV4dCkge1xuICAgICAgICAgIGR5bmFtaWNOZXh0ID0gZHluYW1pY05vZGUubmV4dDtcbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY05leHQobm9kZS5pZCwgZHluYW1pY05vZGUubmV4dCk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc0R5bmFtaWNOZXh0JywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFnZU91dHB1dCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNTogQ0hJTERSRU4g4oCUIGZvcmsgZGlzcGF0Y2gg4pSA4pSA4pSAXG4gICAgLy8gUmUtcmVhZCB0aHJvdWdoIHRoZSBvdmVybGF5OiBQaGFzZSA0IG1heSBoYXZlIGp1c3QgcGF0Y2hlZCBkeW5hbWljXG4gICAgLy8gY2hpbGRyZW4vc2VsZWN0b3IgZm9yIFRISVMgdmlzaXQgKG9yIGFuIGVhcmxpZXIgdmlzaXQgaW4gdGhpcyBydW4pLlxuICAgIGNvbnN0IGNoaWxkcmVuQWZ0ZXJTdGFnZSA9IHRoaXMuZWZmQ2hpbGRyZW4obm9kZSk7XG4gICAgY29uc3QgaGFzQ2hpbGRyZW5BZnRlclN0YWdlID0gQm9vbGVhbihjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCk7XG5cbiAgICBpZiAoaGFzQ2hpbGRyZW5BZnRlclN0YWdlKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygndG90YWxDaGlsZHJlbicsIGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdvcmRlck9mRXhlY3V0aW9uJywgJ0NoaWxkcmVuQWZ0ZXJTdGFnZScpO1xuXG4gICAgICBsZXQgbm9kZUNoaWxkcmVuUmVzdWx0czogUmVjb3JkPHN0cmluZywgTm9kZVJlc3VsdFR5cGU+O1xuXG4gICAgICBjb25zdCBlZmZTZWxlY3RvckZuID0gdGhpcy5lZmZTZWxlY3Rvcihub2RlKTtcbiAgICAgIGlmIChlZmZTZWxlY3RvckZuKSB7XG4gICAgICAgIG5vZGVDaGlsZHJlblJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZVNlbGVjdGVkQ2hpbGRyZW4oXG4gICAgICAgICAgZWZmU2VsZWN0b3JGbixcbiAgICAgICAgICBjaGlsZHJlbkFmdGVyU3RhZ2UhLFxuICAgICAgICAgIHN0YWdlT3V0cHV0LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYnJhbmNoUGF0aCBhcyBzdHJpbmcsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICBub2RlLmZhaWxGYXN0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hpbGRDb3VudCA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoID8/IDA7XG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZXMgPSBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKS5qb2luKCcsICcpO1xuICAgICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ2NoaWxkcmVuJywgYEV4ZWN1dGluZyBhbGwgJHtjaGlsZENvdW50fSBjaGlsZHJlbiBpbiBwYXJhbGxlbDogJHtjaGlsZE5hbWVzfWAsIHtcbiAgICAgICAgICBjb3VudDogY2hpbGRDb3VudCxcbiAgICAgICAgICB0YXJnZXRTdGFnZTogY2hpbGRyZW5BZnRlclN0YWdlPy5tYXAoKGMpID0+IGMubmFtZSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGVmZk5vZGU6IENoaWxkcmVuRXhlY3V0b3IgcmVhZHMgbm9kZS5jaGlsZHJlbi9ub2RlLmZhaWxGYXN0IGl0c2VsZi5cbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlTm9kZUNoaWxkcmVuKFxuICAgICAgICAgIHRoaXMuZWZmTm9kZShub2RlKSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvcmstb25seTogcmV0dXJuIGJ1bmRsZVxuICAgICAgaWYgKCFoYXNOZXh0ICYmICFkeW5hbWljTmV4dCkge1xuICAgICAgICByZXR1cm4gbm9kZUNoaWxkcmVuUmVzdWx0cyE7XG4gICAgICB9XG5cbiAgICAgIC8vIENhcHR1cmUgZHluYW1pYyBjaGlsZHJlbiBhcyBzeW50aGV0aWMgc3ViZmxvdyByZXN1bHQgZm9yIFVJXG4gICAgICAvLyBSdW50aW1lIHN0cnVjdHVyZSBpcyB0aGUgc291cmNlIG9mIHRydXRoOyBkaWFnbm9zdGljIHRleHQgbWF5IGJlXG4gICAgICAvLyBtYXNrZWQgKG9yIHVzZXItd3JpdHRlbikgYW5kIG11c3QgbmV2ZXIgZGVjaWRlIGNhcHR1cmUgYmVoYXZpb3IuXG4gICAgICBpZiAocmV0dXJuZWREeW5hbWljTm9kZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UgJiYgY2hpbGRyZW5BZnRlclN0YWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KG5vZGUsIGNoaWxkcmVuQWZ0ZXJTdGFnZSwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDY6IENPTlRJTlVFIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCDilIDilIDilIBcbiAgICBpZiAoZHluYW1pY05leHQpIHJldHVybiB0aGlzLmxvb3BIb3AoZHluYW1pY05leHQsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgpO1xuXG4gICAgaWYgKGhhc05leHQpIHtcbiAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcblxuICAgICAgLy8gRGV0ZWN0IGxvb3AgcmVmZXJlbmNlIG5vZGVzIGNyZWF0ZWQgYnkgbG9vcFRvKCkg4oCUIG1hcmtlZCB3aXRoIGlzTG9vcFJlZiBmbGFnLlxuICAgICAgLy8gUm91dGUgdGhyb3VnaCBDb250aW51YXRpb25SZXNvbHZlciBmb3IgcHJvcGVyIElEIHJlc29sdXRpb24sIGl0ZXJhdGlvblxuICAgICAgLy8gdHJhY2tpbmcsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdGlvbi4gVGhlIHJlc29sdmVkIHRhcmdldCBjb21lcyBiYWNrXG4gICAgICAvLyBhcyBhIGhvcCDigJQgbG9vcCBlZGdlcyBjb25zdW1lIG5vIHN0YWNrLCBzbyB0aGUgaXRlcmF0aW9uIGxpbWl0XG4gICAgICAvLyAobm90IGNhbGwtc3RhY2sgZGVwdGgpIGlzIHdoYXQgYm91bmRzIGEgbG9vcC5cbiAgICAgIGNvbnN0IGlzTG9vcFJlZmVyZW5jZSA9IG5leHROb2RlLmlzTG9vcFJlZjtcblxuICAgICAgaWYgKGlzTG9vcFJlZmVyZW5jZSkgcmV0dXJuIHRoaXMubG9vcEhvcChuZXh0Tm9kZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uTmV4dChub2RlLm5hbWUsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbmV4dCcsIGBNb3ZpbmcgdG8gJHtuZXh0Tm9kZS5uYW1lfSBzdGFnZWAsIHtcbiAgICAgICAgdGFyZ2V0U3RhZ2U6IG5leHROb2RlLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgIHJldHVybiB0aGlzLmhvcChuZXh0Tm9kZSwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDc6IExFQUYg4oCUIG5vIGNvbnRpbnVhdGlvbiDilIDilIDilIBcbiAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHJpdmF0ZSBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGlsZHJlbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSxcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudFN0YWdlSWQgPSBjb250ZXh0LmdldFN0YWdlSWQoKTtcblxuICAgIGNvbnN0IGNoaWxkU3RydWN0dXJlOiBhbnkgPSB7XG4gICAgICBpZDogYCR7bm9kZS5pZH0tY2hpbGRyZW5gLFxuICAgICAgbmFtZTogJ0R5bmFtaWMgQ2hpbGRyZW4nLFxuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLm1hcCgoYykgPT4gKHtcbiAgICAgICAgaWQ6IGMuaWQsXG4gICAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2hpbGRTdGFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgaWYgKGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGRDdHggb2YgY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGNoaWxkQ3R4LmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNoaWxkU3RhZ2VzW3NuYXBzaG90Lm5hbWUgfHwgc25hcHNob3QuaWRdID0ge1xuICAgICAgICAgIG5hbWU6IHNuYXBzaG90Lm5hbWUsXG4gICAgICAgICAgb3V0cHV0OiBzbmFwc2hvdC5sb2dzLFxuICAgICAgICAgIGVycm9yczogc25hcHNob3QuZXJyb3JzLFxuICAgICAgICAgIG1ldHJpY3M6IHNuYXBzaG90Lm1ldHJpY3MsXG4gICAgICAgICAgc3RhdHVzOiBzbmFwc2hvdC5lcnJvcnMgJiYgT2JqZWN0LmtleXMoc25hcHNob3QuZXJyb3JzKS5sZW5ndGggPiAwID8gJ2Vycm9yJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLnNldChub2RlLmlkLCB7XG4gICAgICBzdWJmbG93SWQ6IG5vZGUuaWQsXG4gICAgICBzdWJmbG93TmFtZTogbm9kZS5uYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDoge30sXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IGNoaWxkU3RhZ2VzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IFtdLFxuICAgICAgICBpbml0aWFsU3RhdGU6IHt9LFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQsXG4gICAgICBwaXBlbGluZVN0cnVjdHVyZTogY2hpbGRTdHJ1Y3R1cmUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBnZW5lcmF0ZWQgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoIGFzIGEgc3ViZmxvdyDigJQgT1ZFUldSSVRJTkdcbiAgICogYW55IHJlZ2lzdHJhdGlvbiBmcm9tIGEgcHJldmlvdXMgdmlzaXQuXG4gICAqXG4gICAqIERlbGliZXJhdGUgZGl2ZXJnZW5jZSBmcm9tIGBhdXRvUmVnaXN0ZXJTdWJmbG93RGVmYCdzIGZpcnN0LXdyaXRlLXdpbnMuXG4gICAqIEdlbmVyYXRlZCBzZWdtZW50cyBhcmUgc3RhYmxlIGFjcm9zcyBsb29wIGl0ZXJhdGlvbnMgKGA8c3RhZ2VJZD5+PGluZGV4PmBcbiAgICogaXMgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZCBhbmQgdGhlIGJyYW5jaCBpbmRleCwgbmVpdGhlciBvZiB3aGljaFxuICAgKiBjaGFuZ2VzKSwgc28gZmlyc3Qtd3JpdGUtd2lucyB3b3VsZCBtZWFuIGEgTE9PUElORyBmYW4tb3V0IHNpbGVudGx5XG4gICAqIHJlLWV4ZWN1dGluZyBpdGVyYXRpb24gMSdzIGJyYW5jaCBjaGFydHMgZm9yZXZlciDigJQgZXZlbiB3aGVuIHRoZSBicmFuY2hcbiAgICogZmFjdG9yeSByZXR1cm5zIGEgZGlmZmVyZW50IGNoYXJ0IGVhY2ggdGltZS4gVGhhdCBpcyB0aGUgXCJ3b3VsZCBub3QgY3Jhc2gsXG4gICAqIHdvdWxkIHNpbGVudGx5IGNvcnJ1cHRcIiBmYWlsdXJlIGNsYXNzIHRoaXMgd2hvbGUgZGVzaWduIGlzIGJ1aWx0IHRvIGF2b2lkLFxuICAgKiBzbyBhIHJlZ2VuZXJhdGVkIGJyYW5jaCBhbHdheXMgcmVwbGFjZXMgaXRzIHByZWRlY2Vzc29yLiBQZXItaXRlcmF0aW9uXG4gICAqIHJlc3VsdHMgc3RheSBhZGRyZXNzYWJsZSB2aWEgdGhlIG1vdW50J3MgYHJ1bnRpbWVTdGFnZUlkYCBrZXksIGV4YWN0bHkgYXNcbiAgICogZm9yIGEgaGFuZC1hdXRob3JlZCBsb29waW5nIHN1YmZsb3cuXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyQnJhbmNoU3ViZmxvdyhcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGFydDogeyBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+Pjsgc3ViZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZSB9PiB9LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnN1YmZsb3dzW3N1YmZsb3dJZF0gPSB7IHJvb3QgfTtcblxuICAgIC8vIFN0YWdlIGZ1bmN0aW9ucyBsYW5kIHVuZGVyIHRoZSBicmFuY2gncyBwcmVmaXgsIG1hdGNoaW5nIHRoZSBwcmVmaXhlZCBpZHMuXG4gICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgY2hhcnQuc3RhZ2VNYXApIHtcbiAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KGpvaW5QYXRoKHN1YmZsb3dJZCwga2V5KSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICB9XG5cbiAgICAvLyBOZXN0ZWQgc3ViZmxvd3MgaW5zaWRlIHRoZSBicmFuY2ggY2hhcnQsIHNhbWUgcHJlZml4aW5nLlxuICAgIGlmIChjaGFydC5zdWJmbG93cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGNoYXJ0LnN1YmZsb3dzKSkge1xuICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tb3VudFN1YmZsb3dgICg5LjM3LjAgZml4KTogd2l0aG91dCBpdFxuICAgICAgICAvLyBldmVyeSBicmFuY2ggcmFuIGl0cyBuZXN0ZWQgc3ViZmxvdydzIHN0YWdlcyB1bmRlciBPTkUgaWQuXG4gICAgICAgIHRoaXMuc3ViZmxvd3Nbam9pblBhdGgoc3ViZmxvd0lkLCBrZXkpXSA9IHtcbiAgICAgICAgICByb290OiBwcmVmaXhOb2RlVHJlZSgoZGVmIGFzIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfSkucm9vdCwgc3ViZmxvd0lkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlZml4IGEgbm9kZSB0cmVlIHdpdGggYSBzdWJmbG93IHBhdGggc2VnbWVudCBhdCBSVU4gdGltZSAobGF6eSBzdWJmbG93cyxcbiAgICogdGhlIGdlbmVyYXRlZCBicmFuY2hlcyBvZiBgYWRkUGFyYWxsZWxGb3JFYWNoYCkg4oCUIHRoZSBvbmUgcHJlZml4ZXIsXG4gICAqIGBlbmdpbmUvZ3JhcGgvcHJlZml4Tm9kZVRyZWUudHNgLCB3aGljaCB0aGUgYnVpbGRlciBjYWxscyBhdCBtb3VudCB0aW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBwcmVmaXhOb2RlVHJlZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4OiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHByZWZpeE5vZGVUcmVlKG5vZGUsIHByZWZpeCk7XG4gIH1cblxuICBwcml2YXRlIGF1dG9SZWdpc3RlclN1YmZsb3dEZWYoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd0RlZjogTm9uTnVsbGFibGU8U3RhZ2VOb2RlWydzdWJmbG93RGVmJ10+LFxuICAgIG1vdW50Tm9kZUlkPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICAvLyB0aGlzLnN1YmZsb3dzIGlzIGFsd2F5cyBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3I7IHRoZSBudWxsIGd1YXJkIGJlbG93IGlzIHVucmVhY2hhYmxlLlxuICAgIGNvbnN0IHN1YmZsb3dzRGljdCA9IHRoaXMuc3ViZmxvd3M7XG5cbiAgICAvLyBGaXJzdC13cml0ZS13aW5zXG4gICAgY29uc3QgaXNOZXdSZWdpc3RyYXRpb24gPSAhc3ViZmxvd3NEaWN0W3N1YmZsb3dJZF07XG4gICAgaWYgKGlzTmV3UmVnaXN0cmF0aW9uICYmIHN1YmZsb3dEZWYucm9vdCkge1xuICAgICAgc3ViZmxvd3NEaWN0W3N1YmZsb3dJZF0gPSB7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dEZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICAgICAgLi4uKHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlID8geyBidWlsZFRpbWVTdHJ1Y3R1cmU6IHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlIH0gOiB7fSksXG4gICAgICB9IGFzIGFueTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzIChwYXJlbnQgZW50cmllcyBwcmVzZXJ2ZWQpXG4gICAgaWYgKHN1YmZsb3dEZWYuc3RhZ2VNYXApIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIEFycmF5LmZyb20oc3ViZmxvd0RlZi5zdGFnZU1hcC5lbnRyaWVzKCkpKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFnZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KGtleSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgIGlmIChzdWJmbG93RGVmLnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViZmxvd0RlZi5zdWJmbG93cykpIHtcbiAgICAgICAgaWYgKCFzdWJmbG93c0RpY3Rba2V5XSkge1xuICAgICAgICAgIHN1YmZsb3dzRGljdFtrZXldID0gZGVmIGFzIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3VudE5vZGVJZCkge1xuICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICBtb3VudE5vZGVJZCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSBGbG93UmVjb3JkZXJzIG9ubHkgb24gZmlyc3QgcmVnaXN0cmF0aW9uIChtYXRjaGVzIGZpcnN0LXdyaXRlLXdpbnMpXG4gICAgaWYgKGlzTmV3UmVnaXN0cmF0aW9uKSB7XG4gICAgICBjb25zdCBzdWJmbG93TmFtZSA9IHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lIHx8IHN1YmZsb3dJZDtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd1JlZ2lzdGVyZWQoXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd05hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uZGVzY3JpcHRpb24sXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
1403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHOzs7QUFFSCx5Q0FBMEQ7QUFFMUQsNERBQXlFO0FBQ3pFLDZEQUE0RDtBQUU1RCxtREFBcUQ7QUFDckQsOEVBQTJFO0FBRTNFLGtFQUE0RDtBQUM1RCx3REFBMEQ7QUFDMUQsMkRBQThEO0FBQzlELHlFQUFtRTtBQUNuRSwrREFBeUQ7QUFDekQsaUZBQTJFO0FBQzNFLHFFQUErRDtBQUMvRCxpRUFBMkQ7QUFDM0QscUZBQStFO0FBRS9FLCtEQUEyRTtBQUMzRSx1RkFBaUY7QUFDakYsdUVBQWlFO0FBQ2pFLCtEQUF5RDtBQUN6RCw2REFBbUc7QUFDbkcsK0RBQXlEO0FBQ3pELHVFQUFpRTtBQUNqRSwrRUFBeUU7QUFFekUsc0ZBQWdGO0FBQ2hGLG9GQUE4RTtBQUM5RSw0R0FBc0c7QUFFdEcsZ0VBQW1GO0FBcUpuRjs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZLEdBQWtCLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBcUQvRSxTQUFTLGlCQUFpQixDQUFlLEtBQWM7SUFDckQsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSyxLQUFpQyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNsSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUE2RCxFQUFFLE9BQWU7SUFDdEcsSUFBSSxTQUFTLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQUksS0FBYyxDQUFDO0lBQ25CLElBQUksT0FBTyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFD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Q0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN2QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBd0MsQ0FBQztnQkFDL0QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQ3JELFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztZQUN2RixJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQ3pDLFNBQVMsRUFDVCxXQUFXLEVBQ1gsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQzVCLFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQWpoREgsZ0RBa2hEQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKAlCBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBvZiBTdGFnZU5vZGUgZ3JhcGguXG4gKlxuICogVW5pZmllZCB0cmF2ZXJzYWwgYWxnb3JpdGhtIGZvciBhbGwgbm9kZSBzaGFwZXMuIGBleGVjdXRlTm9kZWAgaXMgYVxuICogVFJBTVBPTElORSBkcml2ZXI6IGl0IHJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluXG4gKiBhIGZsYXQgbG9vcCwgZm9sbG93aW5nIHRhaWwgY29udGludWF0aW9ucyAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlcyxcbiAqIGR5bmFtaWMgbmV4dCwgZmxhdCBkZWNpZGVyIGRpc3BhdGNoKSBpdGVyYXRpdmVseSDigJQgc28gY2hhaW4gbGVuZ3RoIGFuZFxuICogbG9vcCBpdGVyYXRpb25zIG5ldmVyIGdyb3cgdGhlIGNhbGwgc3RhY2suIE9ubHkgdHJ1ZSB0cmVlIG5lc3RpbmcgKGZvcmtcbiAqIGNoaWxkcmVuLCB3aXRoLWNvbnRpbnVhdGlvbiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLCBzdWJmbG93IG1vdW50cylcbiAqIHJlY3Vyc2VzLlxuICpcbiAqIEZvciBlYWNoIG5vZGUsIGV4ZWN1dGVOb2RlU3RlcCBmb2xsb3dzIDcgcGhhc2VzOlxuICogICAwLiBDTEFTU0lGWSAg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uLCBlYXJseSBkZWxlZ2F0aW9uXG4gKiAgIDBiLiBQQVJBTExFTC1GT1ItRUFDSCDigJQgZHluYW1pYyBmYW4tb3V0IChicmFuY2hlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGF5bG9hZClcbiAqICAgMS4gVkFMSURBVEUgIOKAlCBub2RlIGludmFyaWFudHMsIHJvbGUgbWFya2Vyc1xuICogICAyLiBFWEVDVVRFICAg4oCUIHJ1biBzdGFnZSBmbiwgY29tbWl0LCBicmVhayBjaGVja1xuICogICAzLiBEWU5BTUlDICAg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uLCBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLCBzdHJ1Y3R1cmUgdXBkYXRlc1xuICogICA0LiBDSElMRFJFTiAg4oCUIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBkaXNwYXRjaFxuICogICA1LiBDT05USU5VRSAg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IHJlc29sdXRpb25cbiAqICAgNi4gTEVBRiAgICAgIOKAlCBubyBjb250aW51YXRpb24sIHJldHVybiBvdXRwdXRcbiAqXG4gKiBCcmVhayBzZW1hbnRpY3M6IElmIGEgc3RhZ2UgY2FsbHMgYnJlYWtGbigpLCBjb21taXQgYW5kIFNUT1AuXG4gKiBQYXRjaCBtb2RlbDogU3RhZ2Ugd3JpdGVzIGludG8gbG9jYWwgcGF0Y2g7IGNvbW1pdFBhdGNoKCkgYWZ0ZXIgcmV0dXJuIG9yIHRocm93LlxuICovXG5cbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQsIGpvaW5QYXRoIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgcmVmdXNlUmVzZXJ2ZWRJZCB9IGZyb20gJy4uLy4uL2lkcy9yZXNlcnZlZElkcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IHNuYXBzaG90UnVuSW5wdXQgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcmVmaXhOb2RlVHJlZSB9IGZyb20gJy4uL2dyYXBoL3ByZWZpeE5vZGVUcmVlLmpzJztcbmltcG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJyZWFrSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL2JyZWFrRmxhZy5qcyc7XG5pbXBvcnQgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21taXRTdGFnZSB9IGZyb20gJy4uL2hhbmRsZXJzL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB7IENvbnRpbnVhdGlvblJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ29udGludWF0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgRGVjaWRlckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9EZWNpZGVySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Ob2RlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgUGFyYWxsZWxGb3JFYWNoSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZWRQYXVzZSwgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBxdWV1ZUJlaGluZCwgcmFpc2VRdWV1ZWRQYXVzZSB9IGZyb20gJy4uL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUnVudGltZVN0cnVjdHVyZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IHNlcnZlZFBhdXNlIH0gZnJvbSAnLi4vaGFuZGxlcnMvc2VydmVkUGF1c2UuanMnO1xuaW1wb3J0IHsgbG9nZ2FibGVTdGFnZUVycm9yLCByZWNvcmRTdGFnZUVycm9yLCBzZXJ2ZWRTdGFnZUVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBUcmF2ZXJzYWxEZXB0aEVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvVHJhdmVyc2FsRGVwdGhFcnJvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByb290VHJhdmVyc2FsQ29udGV4dCwgdHJhdmVyc2FsQ29udGV4dEZvciB9IGZyb20gJy4uL3RyYXZlcnNhbENvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIGdyYXBoIHRoaXMgdHJhdmVyc2VyIHdhbGtzIOKAlCBhbmQgdGhlIGdyYXBoIGV2ZXJ5IGlkIHJlc29sdmVzIGFnYWluc3RcbiAgICogKHRoZSBub2RlIG1hcCBiZWhpbmQgZXZlcnkgYGxvb3BUb2AsIHRoZSBERlMgZmFsbGJhY2spLiBgZXhlY3V0ZSgpYFxuICAgKiBzdGFydHMgaGVyZSB1bmxlc3MgYGVudHJ5YCBzYXlzIG90aGVyd2lzZS5cbiAgICovXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogV2hlcmUgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgYSByZXN1bWUncyBvbmUtc2hvdFxuICAgKiByZS1lbnRyeSAoTTIpOiB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3RcbiAgICogc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aCwgZWFjaCB3aXRoIGl0cyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uXG4gICAqIGF0dGFjaGVkLiBWaXNpdGVkIG9uY2UsIGZpcnN0LCBhbmQgbmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZSBhbiBpZCBjYW5cbiAgICogcmVhY2ggaXQsIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgc3RhZ2UgZmluZHMgdGhlIFJFQUwgc3RhZ2UuXG4gICAqIENvbnN1bWVkIGJ5IHRoZSBmaXJzdCBgZXhlY3V0ZSgpYC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYXQgdGhpcyBsZXZlbCAoYSByZXN1bWUsIDkuMjguMCk6IG9uY2VcbiAgICogYGVudHJ5YCdzIGNoYWluIGVuZHMsIGBleGVjdXRlKClgIHJhaXNlcyB0aGUgZmlyc3QgYWdhaW4gKHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KTsgYSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluIGNhcnJpZXMgdGhlbSBhbGwuIE9ubHlcbiAgICogd2l0aCBgZW50cnlgOyBjb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKi9cbiAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoICh0cmVlIG5lc3Rpbmcg4oCUIGJyYW5jaC9mb3JrIGRpc3BhdGNoIGFuZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbiwgTk9UIGxpbmVhciBjaGFpbnMgb3IgbG9vcCBpdGVyYXRpb25zLCB3aGljaCBydW4gZmxhdCkuXG4gICAqIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgKHRoZSBDb250aW51YXRpb25SZXNvbHZlciBndWFyZCkuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfTUFYX0lURVJBVElPTlMgKDEwMDApLiBQcm9wYWdhdGVkIHRvIHN1YmZsb3dcbiAgICogdHJhdmVyc2Vycy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCBzZXQgdGhpcyB0byB0aGUgc3ViZmxvdydzIElELlxuICAgKiBQcm9wYWdhdGVkIHRvIFRyYXZlcnNhbENvbnRleHQgc28gbmFycmF0aXZlIGVudHJpZXMgY2FycnkgdGhlIGNvcnJlY3Qgc3ViZmxvd0lkLlxuICAgKi9cbiAgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGVcbiAgICogc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci4gVXNlZCBhcyB0aGVcbiAgICogYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3Igc3RhZ2VzIHdob3NlIFN0YWdlQ29udGV4dCBoYXMgbm9cbiAgICogcGFyZW50ICh0aGUgc3ViZmxvdydzIG93biByb290IGNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCBieVxuICAgKiBTdWJmbG93RXhlY3V0b3IpIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllc1xuICAgKiAoUkZDLTAwMyBEMSkuXG4gICAqL1xuICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogQGludGVybmFsIEFjdHVhbCBydW50aW1lIG1vdW50IGFuY2VzdHJ5IGZvciB0aGUgb3duaW5nIGxvZywgbm90IHN0YXRpYyBzdWJmbG93UGF0aC4gKi9cbiAgZW1pdERyaWxsUGF0aD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGZyb20gcGFyZW50IHRyYXZlcnNlci4gU3ViZmxvd3MgY29udGludWUgdGhlIHBhcmVudCdzIG51bWJlcmluZy4gKi9cbiAgZXhlY3V0aW9uQ291bnRlcj86IHsgdmFsdWU6IG51bWJlciB9O1xuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQtY291bnQgbWFwIChrZXllZCBieSBzdGFnZUlkKSBmcm9tIHRoZSBwYXJlbnQgdHJhdmVyc2VyLlxuICAgKiBEcml2ZXMgYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuIFNoYXJlZCB3aXRoIHN1YmZsb3dzIHNvIGEgc3RhZ2VcbiAgICogcmUtZW50ZXJlZCBhY3Jvc3MgYSBzdWJmbG93IHJlLW1vdW50IGtlZXBzIGEgY29ycmVjdCwgbW9ub3RvbmljIGl0ZXJhdGlvblxuICAgKiBjb3VudCDigJQgdGhlIHNhbWUgc2luZ2xlLW1hcCBzZW1hbnRpY3MgdGhlIG5hcnJhdGl2ZSByZWNvcmRlciB1c2VzLlxuICAgKi9cbiAgdmlzaXRDb3VudHM/OiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMiksIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyICh0aGUgZXhlY3V0aW9uIGNvdW50ZXIncyBwcmVjZWRlbnQpOiBlYWNoIHN1YmZsb3cgb24gdGhlXG4gICAqIHBhdXNlIHBhdGggdGFrZXMgaXRzIGNhcHR1cmVkIHN0YXRlIGFuZCBpdHMgZW50cnkgcG9pbnQgZXhhY3RseSBvbmNlLCBvblxuICAgKiBpdHMgZmlyc3QgZW50cnkuIFNlZSBgUmVzdW1lRW50cnlgLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWAgcGF0aHMuXG4gICAqL1xuICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gVGhyZWFkZWQgaW50byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0XG4gICAqIHRoaXMgdHJhdmVyc2VyIHByb2R1Y2VzIHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGUgcnVuLlxuICAgKiBTdWJmbG93IHRyYXZlcnNlcnMgaW5oZXJpdCB0aGUgcGFyZW50J3MgcnVuSWQgKHRoZSBzdWJmbG93IGlzIHBhcnQgb2ZcbiAgICogdGhlIHNhbWUgcnVuIGZyb20gdGhlIGNvbnN1bWVyJ3MgUE9WKS4gUmVxdWlyZWQgZmllbGQg4oCUIGV2ZXJ5IGV2ZW50XG4gICAqIG5lZWRzIGl0LiBTZWUgYHJ1bm5lci9ydW5JZC50c2AuXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYXZlcnNlci1sb2NhbCBvdmVybGF5IGVudHJ5IGZvciBhIG5vZGUgd2hvc2Ugc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYVxuICogU3RhZ2VOb2RlIChkeW5hbWljIGNvbnRpbnVhdGlvbikuIEhvbGRzIHRoZSBkeW5hbWljIHZhbHVlcyB0aGF0IGVhcmxpZXJcbiAqIHZlcnNpb25zIHdyb3RlIERJUkVDVExZIG9udG8gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlIOKAlCB3aGljaCBsZWFrZWQgdGhlXG4gKiBkeW5hbWljIHNoYXBlIGludG8gZXZlcnkgbGF0ZXIgcnVuIG9mIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFuZCByYWNlZFxuICogY29uY3VycmVudCBleGVjdXRvcnMuIFRoZSBvdmVybGF5IGtlZXBzIHRoZSBidWlsdCBncmFwaCBpbW11dGFibGU6IHBhdGNoZXNcbiAqIGxpdmUgaW4gYSBwZXItdHJhdmVyc2VyIE1hcCBrZXllZCBieSBgbm9kZS5pZGAgYW5kIGRpZSB3aXRoIHRoZSBydW4uXG4gKlxuICogYG5leHRgIGlzIGludGVudGlvbmFsbHkgQUJTRU5UOiBhIGR5bmFtaWMgYG5leHRgIG9ubHkgZXZlciBhcHBsaWVzIHRvIHRoZVxuICogdmlzaXQgdGhhdCBwcm9kdWNlZCBpdCAodGhlIG9sZCBjb2RlIHdyb3RlIGBub2RlLm5leHRgIGFuZCByZXN0b3JlZCBpdFxuICogYmVmb3JlIGFueXRoaW5nIGNvdWxkIG9ic2VydmUgdGhlIHdyaXRlKSwgc28gaXQgc3RheXMgYSBsb2NhbCB2YXJpYWJsZSBpblxuICogYGV4ZWN1dGVOb2RlYCBhbmQgaXMgcm91dGVkIHRocm91Z2ggYENvbnRpbnVhdGlvblJlc29sdmVyYCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljTm9kZVBhdGNoPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogU3ViZmxvdyBtb3VudCBtZXRhZGF0YSBmcm9tIGEgZHluYW1pYy1zdWJmbG93IHJldHVybi4gR3JvdXBlZCBzbyB0aGVcbiAgICogbWVyZ2VkIHZpZXcgcmVwcm9kdWNlcyB0aGUgb2xkIGZpZWxkLXdpc2Ugb3ZlcndyaXRlIGV4YWN0bHkg4oCUIGluY2x1ZGluZ1xuICAgKiBgc3ViZmxvd05hbWVgL2BzdWJmbG93TW91bnRPcHRpb25zYCBiZWNvbWluZyB1bmRlZmluZWQgd2hlbiB0aGUgZHluYW1pY1xuICAgKiByZXR1cm4gb21pdHRlZCB0aGVtLlxuICAgKi9cbiAgc3ViZmxvd01ldGE/OiB7XG4gICAgaXNTdWJmbG93Um9vdDogdHJ1ZTtcbiAgICBzdWJmbG93SWQ6IHN0cmluZztcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBEeW5hbWljIGZvcmsgY2hpbGRyZW4gKHJlcGxhY2VzIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4gZm9yIHRoaXMgcnVuKS4gKi9cbiAgY2hpbGRyZW4/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAvKiogRHluYW1pYyBvdXRwdXQtYmFzZWQgc2VsZWN0b3IgYWNjb21wYW55aW5nIGR5bmFtaWMgY2hpbGRyZW4uICovXG4gIG5leHROb2RlU2VsZWN0b3I/OiBTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBUcmFtcG9saW5lIGJyYW5kIOKAlCBtYXJrcyBhIGNvbnRpbnVhdGlvbiBob3AgcmV0dXJuZWQgYnkgYGV4ZWN1dGVOb2RlU3RlcGBcbiAqIHRvIHRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgLiBNb2R1bGUtcHJpdmF0ZSBzeW1ib2wgc28gYSBzdGFnZSdzIG93blxuICogcmV0dXJuIHZhbHVlICh3aGljaCBjYW4gYmUgYW55IG9iamVjdCkgY2FuIG5ldmVyIGJlIG1pc3Rha2VuIGZvciBhIGhvcC5cbiAqL1xuY29uc3QgQ09OVElOVUVfSE9QOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdmb290cHJpbnRqcy5leGVjdXRlTm9kZS5jb250aW51ZScpO1xuXG4vKipcbiAqIEEgZmxhdCBjb250aW51YXRpb24g4oCUIFwiZXhlY3V0ZSB0aGlzIG5vZGUgbmV4dCwgaW4gdGhpcyBjb250ZXh0XCIg4oCUIHJldHVybmVkXG4gKiBieSBgZXhlY3V0ZU5vZGVTdGVwYCBmb3IgZXZlcnkgVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3BcbiAqIGVkZ2VzLCBkeW5hbWljIG5leHQsIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXJcbiAqIGRpc3BhdGNoKS4gVGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAgY29uc3VtZXMgaG9wcyBpdGVyYXRpdmVseTpcbiAqIGBjdXJyZW50ID0gaG9wOyBjb250aW51ZTtgIOKAlCBzbyBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrIG5vciB0aGUgcmV0YWluZWRcbiAqIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBpdGVyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgQ29udGludWF0aW9uSG9wPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByZWFkb25seSBbQ09OVElOVUVfSE9QXTogdHJ1ZTtcbiAgcmVhZG9ubHkgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcmVhZG9ubHkgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogUHJlc2VudCB3aGVuIHRoZSBob3AgaXMgYSBkZWNpZGVyJ3MgYnJhbmNoIGRpc3BhdGNoIChkZWNpZGVyIHdpdGhvdXQgaXRzXG4gICAqIG93biBgbmV4dGApLiBUaGUgZHJpdmVyIHJlY29yZHMgaXQgc28gYSBQYXVzZVNpZ25hbCB0aHJvd24gYW55d2hlcmUgaW5cbiAgICogdGhlIGNvbnRpbnVlZCBjaGFpbiBzdGlsbCBnZXRzIHRoZSBkZWNpZGVyIHN0YW1wZWQgYXMgaXRzIGludm9rZXIg4oCUXG4gICAqIGV4YWN0bHkgd2hhdCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0byBkby5cbiAgICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcDtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgaG9wIGZvbGxvd3MgYSBMT09QIGVkZ2UgKGEgYmFjay1yZWZlcmVuY2UgcmVzb2x2ZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCkuIEEgZGVjaWRlcidzIGJyYW5jaCBmcmFtZSBoYW5kcyBzdWNoIGEgaG9wIGJhY2tcbiAgICogdG8gaXRzIGRlY2lkZXIgd2hlbiB0aGUgdGFyZ2V0IGlzIG5vdCBhIG5vZGUgdGhlIGZyYW1lIHJhbiwgc28gdGhlIGxvb3BcbiAgICogcmUtZW50ZXJzIGF0IHRoZSB0YXJnZXQncyBvd24gbGV2ZWwg4oCUIGZsYXQsIG5ldmVyIG9uZSBmcmFtZSBwZXIgcGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGxvb3A/OiB0cnVlO1xufVxuXG4vKipcbiAqIFdoYXQgYSBkcml2ZXIgcmVjb3JkcyBmb3IgZWFjaCBzdGFnZSBjb250ZXh0IGl0IHJ1bnM6IGl0cyBORVNUSU5HIGRlcHRoXG4gKiAoc2VlIGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgbmVzdGluZ0RlcHRoT2ZgKSBhbmQgdGhlIG5vZGUgaWRzIGVhY2ggZHJpdmVyXG4gKiBvbiBpdHMgQlJBTkNILUZSQU1FIGNoYWluIGhhcyBydW4g4oCUIGl0cyBvd24gbGFzdC4gQSBkZWNpZGVyIHdpdGggaXRzIG93blxuICogYG5leHRgIGhhbmRzIHRoYXQgY2hhaW4gdG8gaXRzIGJyYW5jaCBmcmFtZSwgc28gdGhlIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcFxuICogYmFjayBpbnRvIGFuIGVuY2xvc2luZyBkcml2ZXIgKGxlYXZlKSBmcm9tIGFueSBvdGhlciBqdW1wIChzdGF5KS5cbiAqL1xuaW50ZXJmYWNlIERyaXZlckZyYW1lIHtcbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmFuOiByZWFkb25seSBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+W107XG4gIC8qKiBUaGUgYG5leHRgLWNoYWluIGlkcyBvZiBldmVyeSBkZWNpZGVyIHdob3NlIGJyYW5jaCBmcmFtZSBlbmNsb3NlcyB0aGlzIGRyaXZlci4gKi9cbiAgcmVhZG9ubHkgdGFpbHM6IHJlYWRvbmx5IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbn1cblxuLyoqIFdoYXQgYSBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSBlbmNsb3NpbmcgcmFuLXNldHMsIGFuZCB0aGUgdGFpbHMgaXQgbWF5IGp1bXAgdG8uICovXG50eXBlIEVuY2xvc2luZ0ZyYW1lcyA9IFBpY2s8RHJpdmVyRnJhbWUsICdyYW4nIHwgJ3RhaWxzJz47XG5cbi8qKiBQYXVzZS1pbnZva2VyIGNvbnRleHQgcmVjb3JkZWQgYnkgdGhlIGRyaXZlciBmb3IgZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMuICovXG5pbnRlcmZhY2UgSW52b2tlclN0YW1wIHtcbiAgcmVhZG9ubHkgaW52b2tlclN0YWdlSWQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtDT05USU5VRV9IT1BdID09PSB0cnVlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB7QGxpbmsgUmV0cnlQb2xpY3l9J3MgYGJhY2tvZmZNc2AgZm9yIHRoZSBhdHRlbXB0IHRoYXQganVzdCBmYWlsZWRcbiAqICgxLWJhc2VkKS4gQW55dGhpbmcgdGhhdCBpcyBub3QgYSBmaW5pdGUsIHBvc2l0aXZlIG51bWJlciDigJQgYSBtaXNzaW5nIGRpYWwsIGFcbiAqIG5lZ2F0aXZlIHZhbHVlLCBhIGBOYU5gIGZyb20gYSBjb25zdW1lcidzIGFyaXRobWV0aWMsIG9yIGEgdGhyb3dpbmcgZnVuY3Rpb25cbiAqIOKAlCBiZWNvbWVzIGAwYCwgaS5lLiByZXRyeSBpbW1lZGlhdGVseS4gQSBiYWNrb2ZmIGRpYWwgbXVzdCBuZXZlciBiZSBhYmxlIHRvXG4gKiBjcmFzaCBhIHJ1biBvciBwYXJrIGl0IGZvcmV2ZXIuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVCYWNrb2ZmTXMoYmFja29mZk1zOiBudW1iZXIgfCAoKGF0dGVtcHQ6IG51bWJlcikgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZCwgYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGJhY2tvZmZNcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgbGV0IHZhbHVlOiB1bmtub3duO1xuICBpZiAodHlwZW9mIGJhY2tvZmZNcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGJhY2tvZmZNcyhhdHRlbXB0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGJhY2tvZmZNcztcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBBd2FpdCBgbXNgLCBjdXQgc2hvcnQgYnkgYW4gYWJvcnQuIFJlc29sdmVzIGVpdGhlciB3YXkg4oCUIHRoZSBjYWxsZXIgcmUtY2hlY2tzXG4gKiBgc2lnbmFsLmFib3J0ZWRgIGFuZCByZXRocm93cyB0aGUgb3JpZ2luYWwgc3RhZ2UgZXJyb3IsIHNvIGEgY2FuY2VsbGVkIHJ1blxuICogbmV2ZXIgc2l0cyBvdXQgYSBsb25nIGJhY2tvZmYgYW5kIG5ldmVyIGxvc2VzIHRoZSBmYWlsdXJlIHRoYXQgY2F1c2VkIGl0LlxuICogVGhlIHRpbWVyIGFuZCB0aGUgbGlzdGVuZXIgYXJlIGFsd2F5cyBjbGVhbmVkIHVwLlxuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KGRvbmUsIG1zKTtcbiAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFdoZXJlIHRoZSBuZXh0IGBleGVjdXRlKClgIHN0YXJ0cyB3aGVuIG5vdCBhdCBgcm9vdGAg4oCUIG9uZS1zaG90IChzZWUgVHJhdmVyc2VyT3B0aW9ucy5lbnRyeSkuICovXG4gIHByaXZhdGUgZW50cnk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAvKiogU2libGluZ3MnIHBhdXNlcyByYWlzZWQgb25jZSBgZW50cnlgJ3MgY2hhaW4gZW5kcyDigJQgb25lLXNob3QgKHNlZSBUcmF2ZXJzZXJPcHRpb25zLnBlbmRpbmdQYXVzZXMpLiAqL1xuICBwcml2YXRlIGVudHJ5UGVuZGluZ1BhdXNlczogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSwgc2hhcmVkIHdpdGggbmVzdGVkIHRyYXZlcnNlcnMuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbCBydW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzdW1lOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICBwcml2YXRlIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBSRkMtMDAzIEQxOiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgc3ViZmxvdyBtb3VudCBzdGFnZSBpbiB0aGUgcGFyZW50XG4gICAqICB0cmF2ZXJzZXIuIEZhbGxiYWNrIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgZm9yIHN0YWdlcyB3aG9zZSBjb250ZXh0IGhhc1xuICAgKiAgbm8gcGFyZW50ICh0aGUgc3ViZmxvdyByb290KS4gVW5kZWZpbmVkIGF0IHRoZSB0b3AgbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbWl0RHJpbGxQYXRoOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFZhbGlkYXRlZCB2YWx1ZSBwYXNzZWQgdmlhIGBydW4oe2lucHV0fSlgLiBSb290IGJvdW5kYXJ5IG9ic2VydmVyc1xuICAgKiAgcmVjZWl2ZSBpdHMgcmV0YWluZWQgZm9ybTsgc3RhZ2UgYXJndW1lbnRzIGtlZXAgdGhlIG9yaWdpbmFsIGRhdGEuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFRoZSBoYW5kbGVycycgc2hhcmVkIGRlcHMg4oCUIGl0cyBgcmVhZE9ubHlDb250ZXh0YCBpcyB0aGUgbGVnJ3MgaW5wdXQgc25hcHNob3QsIHNldCBieSBgZXhlY3V0ZWAuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFN0YW1wZWQgb250byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0LlxuICAgKiAgSW5oZXJpdGVkIGJ5IHN1YmZsb3cgdHJhdmVyc2VycyBzbyBhbGwgZXZlbnRzIG9mIG9uZSBydW4gc2hhcmUgb25lIHJ1bklkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLy8gSGFuZGxlciBtb2R1bGVzXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd0V4ZWN1dG9yOiBTdWJmbG93RXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZVJ1bm5lcjogU3RhZ2VSdW5uZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250aW51YXRpb25SZXNvbHZlcjogQ29udGludWF0aW9uUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVySGFuZGxlcjogRGVjaWRlckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RvckhhbmRsZXI6IFNlbGVjdG9ySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFsbGVsRm9yRWFjaEhhbmRsZXI6IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJ1Y3R1cmVNYW5hZ2VyOiBSdW50aW1lU3RydWN0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93UmVjb3JkZXJEaXNwYXRjaGVyOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBzZXQgb2YgbGF6eSBzdWJmbG93IElEcyB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBieSBUSElTIHJ1bi5cbiAgICogVXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgYG5vZGUuc3ViZmxvd1Jlc29sdmVyID0gdW5kZWZpbmVkYCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAgICogU3RhZ2VOb2RlIGdyYXBoIOKAlCBhdm9pZHMgYSByYWNlIHdoZXJlIGEgY29uY3VycmVudCB0cmF2ZXJzZXIgY2xlYXJzIHRoZSBzaGFyZWRcbiAgICogcmVzb2x2ZXIgYmVmb3JlIGFub3RoZXIgdHJhdmVyc2VyIGhhcyBmaW5pc2hlZCB1c2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRMYXp5U3ViZmxvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBvdmVybGF5IG9mIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybnMsIGtleWVkIGJ5IGBub2RlLmlkYC5cbiAgICogUGhhc2UgNCB3cml0ZXMgcGF0Y2hlcyBIRVJFIGluc3RlYWQgb2YgbXV0YXRpbmcgdGhlIHNoYXJlZCBidWlsdC1jaGFydFxuICAgKiBub2RlIG9iamVjdHMgKHNhbWUgaXNvbGF0aW9uIGNvbnZlbnRpb24gYXMgYHJlc29sdmVkTGF6eVN1YmZsb3dzYCkuXG4gICAqIEFsbCBlbmdpbmUgcmVhZHMgb2YgdGhlIHBhdGNoZWQgZmllbGRzIGdvIHRocm91Z2ggdGhlIGBlZmYqYCBhY2Nlc3NvcnNcbiAgICogYmVsb3cuIFRoZSBtYXAgZGllcyB3aXRoIHRoZSB0cmF2ZXJzZXIg4oCUIG9uZSBydW4sIG9uZSBvdmVybGF5IOKAlCBzbyBhXG4gICAqIGZyZXNoIGV4ZWN1dG9yIG92ZXIgdGhlIHNhbWUgYnVpbHQgY2hhcnQgYWx3YXlzIHNlZXMgdGhlIG9yaWdpbmFsIGdyYXBoLlxuICAgKlxuICAgKiBLZXllZCBieSB0aGUgbm9kZSBPQkpFQ1QgKFdlYWtNYXApLCBub3QgYG5vZGUuaWRgOiBhIGR5bmFtaWMgY2hpbGQgdGhhdFxuICAgKiByZXVzZXMgYSBidWlsdCBub2RlJ3MgaWQgbXVzdCBOT1QgbWFrZSB0aGUgYnVpbHQgbm9kZSBpbmhlcml0IHRoZSBwYXRjaFxuICAgKiAoaWQta2V5ZWQgbG9va3VwIGNhdXNlZCBwaGFudG9tIGRvdWJsZS1leGVjdXRpb24pLiBgcGF0Y2hDb3VudGAgaXMgdGhlXG4gICAqIGZhc3QtcGF0aCBjaGVjayDigJQgV2Vha01hcCBoYXMgbm8gYHNpemVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljUGF0Y2hlcyA9IG5ldyBXZWFrTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4+KCk7XG4gIHByaXZhdGUgcGF0Y2hDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFtZSAoTkVTVElORyBkZXB0aCArIGJyYW5jaC1mcmFtZSByYW4tc2V0cykgb2YgdGhlIGRyaXZlciB0aGF0IHJhbiBlYWNoIHN0YWdlIGNvbnRleHQg4oCUIGRlcHRoIGlzIGFcbiAgICogcHJvcGVydHkgb2YgdGhlIGNhbGwgUEFUSCwgc28gaXQgdHJhdmVscyB3aXRoIHRoZSBjb250ZXh0cywgbm90IGluIG9uZVxuICAgKiBwZXItdHJhdmVyc2VyIGNvdW50ZXIuIEEgbmVzdGVkIGRyaXZlciAoZm9yay9zZWxlY3RvciBjaGlsZCwgYSBkZWNpZGVyJ3NcbiAgICogYnJhbmNoIGZyYW1lKSBzaXRzIG9uZSBsZXZlbCBiZWxvdyB0aGUgZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0c1xuICAgKiBvd24gY29udGV4dCB3YXMgY3JlYXRlZCBmcm9tIChgU3RhZ2VDb250ZXh0LnBhcmVudGApIOKAlCBzbyBwYXJhbGxlbFxuICAgKiBzaWJsaW5ncyBzaGFyZSBvbmUgZGVwdGgsIGFuZCA1MjAgY2hpbGRyZW4gb2Ygb25lIGZvcmsgYXJlIDUyMCBkcml2ZXJzXG4gICAqIGF0IHRoZSBzYW1lIGxldmVsICh0aHJvdWdoIDkuMzkuMCBhIHNoYXJlZCBjb3VudGVyIG1hZGUgdGhlbSA1MjAgbGV2ZWxzKS5cbiAgICpcbiAgICogTGluZWFyIGBuZXh0YCBjaGFpbnMsIGxvb3AgZWRnZXMsIGFuZCBkeW5hbWljIGNvbnRpbnVhdGlvbnMgYXJlIGZvbGxvd2VkXG4gICAqIElURVJBVElWRUxZIGluc2lkZSBvbmUgZHJpdmVyIGludm9jYXRpb24sIHNvIHRoZXkgbmV2ZXIgYWRkIGEgbGV2ZWwuXG4gICAqIE9ubHkgdHJ1ZSB0cmVlIHJlY3Vyc2lvbiBkb2VzOiBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaFxuICAgKiBkaXNwYXRjaCAod2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBjb250aW51YXRpb24pLCBhbmQgdW5ib3VuZGVkXG4gICAqIGR5bmFtaWMgcmVjdXJzaW9uLiBQcmV2ZW50cyBjYWxsLXN0YWNrIG92ZXJmbG93IG9uIHJ1bmF3YXkgcmVjdXJzaXZlXG4gICAqIGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJhbWVPZiA9IG5ldyBXZWFrTWFwPFN0YWdlQ29udGV4dCwgRHJpdmVyRnJhbWU+KCk7XG5cbiAgLyoqIGBuZXh0YC1jaGFpbiBpZHMgcGVyIGRlY2lkZXIgY29udGludWF0aW9uIGhlYWQgKGB0YWlsSWRzYCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RhaWxJZHMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQgY291bnRzIGtleWVkIGJ5IHN0YWdlSWQg4oCUIGhvdyBtYW55IHRpbWVzIGVhY2ggc3RhZ2VcbiAgICogaGFzIGV4ZWN1dGVkIGluIHRoaXMgcnVuLiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gYVxuICAgKiBsb29wZWQtYmFjayBzdGFnZSdzIGl0ZXJhdGlvbiBjb3VudCBpcyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzLFxuICAgKiBtYXRjaGluZyB0aGUgbmFycmF0aXZlIHJlY29yZGVyJ3Mgc2luZ2xlLW1hcCBzZW1hbnRpY3MuIERyaXZlc1xuICAgKiBgVHJhdmVyc2FsQ29udGV4dC5sb29wSXRlcmF0aW9uYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Zpc2l0Q291bnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbWF4aW11bSBkZXB0aCAoc2V0IGZyb20gVHJhdmVyc2VyT3B0aW9ucy5tYXhEZXB0aCBvciB0aGUgY2xhc3MgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhEZXB0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbG9vcC1pdGVyYXRpb24gbGltaXQgZm9yd2FyZGVkIHRvIHRoZSBDb250aW51YXRpb25SZXNvbHZlclxuICAgKiBhbmQgcHJvcGFnYXRlZCB0byBzdWJmbG93IHRyYXZlcnNlcnMuIFVuZGVmaW5lZCDihpIgcmVzb2x2ZXIgZGVmYXVsdCAoMTAwMCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoIGJlZm9yZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqICoqV2hhdCBjb3VudHMgYXMgZGVwdGggKHRyYW1wb2xpbmUgbW9kZWwpOioqIGBleGVjdXRlTm9kZWAgaXMgYW4gaXRlcmF0aXZlXG4gICAqIGRyaXZlciDigJQgbGluZWFyIGBuZXh0YCBob3BzLCBsb29wIGVkZ2VzIChgbG9vcFRvYC9keW5hbWljIG5leHQpLCBhbmRcbiAgICogZHluYW1pYy1zdWJmbG93IHJlLWVudHJ5IGFyZSBmb2xsb3dlZCBpbiBhIGZsYXQgbG9vcCBhbmQgY29uc3VtZSBOTyBkZXB0aC5cbiAgICogRGVwdGggZ3Jvd3Mgb25seSB3aXRoIHRydWUgdHJlZSBuZXN0aW5nOiBvbmUgdGljayBwZXIgZm9yayBjaGlsZCwgb25lIHBlclxuICAgKiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaCBkaXNwYXRjaCB0aGF0IG11c3QgcmV0dXJuIHRvIGl0cyBpbnZva2VyIChkZWNpZGVyXG4gICAqIHdpdGggaXRzIG93biBgbmV4dGApLCBvbmUgcGVyIHN1YmZsb3cgbW91bnQgZnJhbWUgaW4gdGhlIHBhcmVudCAodGhlXG4gICAqIHN1YmZsb3cgYm9keSBpdHNlbGYgcnVucyBvbiBhIEZSRVNIIHRyYXZlcnNlciB3aXRoIGl0cyBvd24gYnVkZ2V0KS5cbiAgICpcbiAgICogNTAwIHRoZXJlZm9yZSBjb3ZlcnMgYW55IHJlYWxpc3RpYyBjaGFydCDigJQgaXQgYm91bmRzIHJlY3Vyc2l2ZVxuICAgKiBDT01QT1NJVElPTiwgbm90IGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LiBMb29wcyBhcmUgYm91bmRlZCBieVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgJ3MgaW5kZXBlbmRlbnQgaXRlcmF0aW9uIGxpbWl0IChkZWZhdWx0IDEwMDAsXG4gICAqIGNvbmZpZ3VyYWJsZSB2aWEgYFJ1bk9wdGlvbnMubWF4SXRlcmF0aW9uc2ApLCB3aGljaCBpcyBub3cgdGhlIGJpbmRpbmdcbiAgICogY29uc3RyYWludCBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMuXG4gICAqXG4gICAqIFBhcmFsbGVsIHNpYmxpbmdzIHNoYXJlIHRoZWlyIHBhcmVudCdzIGRlcHRoICsgMSDigJQgYSBmb3JrIG9yIHNlbGVjdG9yIG9mIGFueSB3aWR0aCBpc1xuICAgKiBvbmUgbGV2ZWwsIG5ldmVyIG9uZSBsZXZlbCBwZXIgY2hpbGQuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCBzYWZlIGZvciBjb25jdXJyZW50IGAuZXhlY3V0ZSgpYCBjYWxscyBvbiB0aGUgc2FtZSBpbnN0YW5jZSAodGhlIGJyZWFrIGZsYWdcbiAgICogYW5kIHRoZSByZXNvbHZlcidzIGxvb3AgY291bnRzIGFyZSBwZXIgaW5zdGFuY2UpLiBVc2UgYSBzZXBhcmF0ZSBgRmxvd2NoYXJ0VHJhdmVyc2VyYCBwZXJcbiAgICogY29uY3VycmVudCBleGVjdXRpb24uIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYWx3YXlzIGNyZWF0ZXMgYSBmcmVzaCB0cmF2ZXJzZXIgcGVyIGNhbGwuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0VYRUNVVEVfREVQVEggPSA1MDA7XG5cbiAgY29uc3RydWN0b3Iob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KSB7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRzLm1heERlcHRoID8/IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSDtcbiAgICBpZiAobWF4RGVwdGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4RGVwdGggbXVzdCBiZSA+PSAxJyk7XG4gICAgdGhpcy5fbWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICBpZiAob3B0cy5tYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0cy5tYXhJdGVyYXRpb25zIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heEl0ZXJhdGlvbnMgbXVzdCBiZSA+PSAxJyk7XG4gICAgfVxuICAgIHRoaXMuX21heEl0ZXJhdGlvbnMgPSBvcHRzLm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IG9wdHMuZXhlY3V0aW9uQ291bnRlciA/PyB7IHZhbHVlOiAwIH07XG4gICAgdGhpcy5fdmlzaXRDb3VudHMgPSBvcHRzLnZpc2l0Q291bnRzID8/IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgdGhpcy5lbnRyeSA9IG9wdHMuZW50cnk7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSBvcHRzLmVudHJ5ID8gb3B0cy5wZW5kaW5nUGF1c2VzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzdW1lID0gb3B0cy5yZXN1bWU7XG4gICAgLy8gU2hhbGxvdy1jb3B5IHN0YWdlTWFwIGFuZCBzdWJmbG93cyBzbyB0aGF0IGxhenktcmVzb2x1dGlvbiBtdXRhdGlvbnNcbiAgICAvLyAocHJlZml4ZWQgZW50cmllcyBhZGRlZCBkdXJpbmcgZXhlY3V0aW9uKSBzdGF5IHNjb3BlZCB0byBUSElTIHRyYXZlcnNlclxuICAgIC8vIGFuZCBkbyBub3QgZXNjYXBlIHRvIHRoZSBzaGFyZWQgRmxvd0NoYXJ0IG9iamVjdC4gV2l0aG91dCB0aGUgY29weSxcbiAgICAvLyBjb25jdXJyZW50IEZsb3dDaGFydEV4ZWN1dG9yIHJ1bnMgc2hhcmluZyB0aGUgc2FtZSBGbG93Q2hhcnQgd291bGQgcmFjZVxuICAgIC8vIG9uIHRoZXNlIHR3byBtdXRhYmxlIGRpY3Rpb25hcmllcy5cbiAgICB0aGlzLnN0YWdlTWFwID0gbmV3IE1hcChvcHRzLnN0YWdlTWFwKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUgPSBvcHRzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgdGhpcy5zdWJmbG93cyA9IG9wdHMuc3ViZmxvd3MgPyB7IC4uLm9wdHMuc3ViZmxvd3MgfSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gb3B0cy5sb2dnZXI7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICB0aGlzLnBhcmVudFN1YmZsb3dJZCA9IG9wdHMucGFyZW50U3ViZmxvd0lkO1xuICAgIHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCA9IG9wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcbiAgICAvLyBNaXNzaW5nIGFuY2VzdHJ5IGluIGEgaGFuZC1idWlsdCBuZXN0ZWQgdHJhdmVyc2VyIGlzIHVua25vd24sIG5ldmVyXG4gICAgLy8gZ3Vlc3NlZCBhcyByb290LiBUaGUgbm9ybWFsIHN1YmZsb3cgZmFjdG9yeSBzdXBwbGllcyB0aGUgZnVsbCBwYXRoLlxuICAgIGNvbnN0IGVtaXREcmlsbFBhdGggPVxuICAgICAgb3B0cy5lbWl0RHJpbGxQYXRoID8/IChvcHRzLnBhcmVudFN1YmZsb3dJZCB8fCBvcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQgPyB1bmRlZmluZWQgOiBbXSk7XG4gICAgdGhpcy5lbWl0RHJpbGxQYXRoID0gZW1pdERyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogT2JqZWN0LmZyZWV6ZShbLi4uZW1pdERyaWxsUGF0aF0pO1xuICAgIHRoaXMucmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgdGhpcy5ydW5JZCA9IG9wdHMucnVuSWQ7XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuICAgIHRoaXMuZGVwcyA9IGRlcHM7XG5cbiAgICAvLyBCdWlsZCBPKDEpIG5vZGUgSUQgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGggKGF2b2lkcyByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkpLlxuICAgIC8vIEZyb20gYHJvb3RgLCBuZXZlciBmcm9tIGBlbnRyeWA6IGEgcmVzdW1lJ3Mgc3RhbmQtaW4gY2FycmllcyB0aGUgcGF1c2VkXG4gICAgLy8gc3RhZ2UncyBpZCwgYW5kIGEgbG9vcCBiYWNrIHRvIHRoYXQgaWQgbXVzdCBmaW5kIHRoZSBSRUFMIHN0YWdlLlxuICAgIGNvbnN0IG5vZGVJZE1hcCA9IHRoaXMuYnVpbGROb2RlSWRNYXAob3B0cy5yb290KTtcblxuICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBtb2R1bGVzLlxuICAgIC8vIE5vZGVSZXNvbHZlcidzIERGUyBmYWxsYmFjayByZXNvbHZlcyBsb29wIHRhcmdldHMgYWdhaW5zdCB0aGUgTElWRVxuICAgIC8vIHJ1bnRpbWUgc2hhcGUsIHNvIGl0IHJlYWRzIGNoaWxkcmVuIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheVxuICAgIC8vIChhIGxvb3AgY2FuIHRhcmdldCBhIG5vZGUgYWRkZWQgYnkgYSBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm4pLlxuICAgIHRoaXMubm9kZVJlc29sdmVyID0gbmV3IE5vZGVSZXNvbHZlcihkZXBzLCBub2RlSWRNYXAsIChuKSA9PiB0aGlzLmVmZkNoaWxkcmVuKG4pKTtcbiAgICB0aGlzLmNoaWxkcmVuRXhlY3V0b3IgPSBuZXcgQ2hpbGRyZW5FeGVjdXRvcihkZXBzLCB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc3RhZ2VSdW5uZXIgPSBuZXcgU3RhZ2VSdW5uZXIoZGVwcyk7XG4gICAgdGhpcy5jb250aW51YXRpb25SZXNvbHZlciA9IG5ldyBDb250aW51YXRpb25SZXNvbHZlcihcbiAgICAgIGRlcHMsXG4gICAgICB0aGlzLm5vZGVSZXNvbHZlcixcbiAgICAgIChub2RlSWQsIGNvdW50KSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlSXRlcmF0aW9uQ291bnQobm9kZUlkLCBjb3VudCksXG4gICAgICB0aGlzLl9tYXhJdGVyYXRpb25zLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gICAgdGhpcy5wYXJhbGxlbEZvckVhY2hIYW5kbGVyID0gbmV3IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLCB7XG4gICAgICBwcmVmaXhOb2RlVHJlZTogKG4sIHByZWZpeCkgPT4gdGhpcy5wcmVmaXhOb2RlVHJlZShuLCBwcmVmaXgpLFxuICAgICAgcmVnaXN0ZXJCcmFuY2hTdWJmbG93OiAoc3ViZmxvd0lkLCByb290LCBjaGFydCkgPT4gdGhpcy5yZWdpc3RlckJyYW5jaFN1YmZsb3coc3ViZmxvd0lkLCByb290LCBjaGFydCksXG4gICAgICBicmFuY2hTaGFyZWRTdGF0ZTogKHN1YmZsb3dJZCkgPT5cbiAgICAgICAgdGhpcy5zdWJmbG93UmVzdWx0cy5nZXQoc3ViZmxvd0lkKT8udHJlZUNvbnRleHQ/Lmdsb2JhbENvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICByZWNvcmRCcmFuY2hTdHJ1Y3R1cmU6IChub2RlSWQsIGJyYW5jaGVzKSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKG5vZGVJZCwgYnJhbmNoZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBwcm9kdWNlcyBGbG93Y2hhcnRUcmF2ZXJzZXIgaW5zdGFuY2VzIGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAgICogQ2FwdHVyZXMgcGFyZW50IGNvbmZpZyBpbiBjbG9zdXJlIOKAlCBTdWJmbG93RXhlY3V0b3IgcHJvdmlkZXMgc3ViZmxvdy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gICAqIEVhY2ggc3ViZmxvdyBnZXRzIGEgZnVsbCB0cmF2ZXJzZXIgd2l0aCBhbGwgNyBwaGFzZXMgKGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBldGMuKS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkoXG4gICAgcGFyZW50T3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+LFxuICApOiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBDYXB0dXJlIHJlZmVyZW5jZXMgdG8gbXV0YWJsZSBzdGF0ZSDigJQgZmFjdG9yeSByZWFkcyB0aGUgQ1VSUkVOVCBzdGF0ZSB3aGVuIGNhbGxlZCxcbiAgICAvLyBub3QgdGhlIHN0YXRlIGF0IGZhY3RvcnkgY3JlYXRpb24gdGltZS4gVGhpcyBpcyBjb3JyZWN0IGJlY2F1c2UgbGF6eSBzdWJmbG93IHJlc29sdXRpb25cbiAgICAvLyBtYXkgYWRkIGVudHJpZXMgdG8gc3RhZ2VNYXAvc3ViZmxvd3MgYmVmb3JlIGEgbmVzdGVkIHN1YmZsb3cgaXMgZW5jb3VudGVyZWQuXG4gICAgY29uc3QgcGFyZW50U3RhZ2VNYXAgPSB0aGlzLnN0YWdlTWFwO1xuICAgIGNvbnN0IHBhcmVudFN1YmZsb3dzID0gdGhpcy5zdWJmbG93cztcbiAgICBjb25zdCBuYXJyYXRpdmVHZW5lcmF0b3IgPSB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcjtcblxuICAgIHJldHVybiAoc3ViZmxvd09wdHMpID0+IHtcbiAgICAgIGNvbnN0IHRyYXZlcnNlciA9IG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dPcHRzLnJvb3QsXG4gICAgICAgIC4uLihzdWJmbG93T3B0cy5lbnRyeSAmJiB7IGVudHJ5OiBzdWJmbG93T3B0cy5lbnRyeSB9KSwgLy8gYSByZXN1bWUgaG9wJ3MgZW50cnkgcG9pbnRcbiAgICAgICAgLi4uKHN1YmZsb3dPcHRzLnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiBzdWJmbG93T3B0cy5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBzdGFnZU1hcDogcGFyZW50U3RhZ2VNYXAsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgc2NvcGVGYWN0b3J5OiBwYXJlbnRPcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogc3ViZmxvd09wdHMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBzdWJmbG93T3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICAgIGV4ZWN1dGlvbkVudjogcGFyZW50T3B0cy5leGVjdXRpb25FbnYsXG4gICAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IHBhcmVudE9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgICAgc3RyZWFtSGFuZGxlcnM6IHBhcmVudE9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IHBhcmVudE9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgc3ViZmxvd3M6IHBhcmVudFN1YmZsb3dzLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvciwgLy8gU2hhcmUgcGFyZW50J3Mg4oCUIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2VcbiAgICAgICAgbG9nZ2VyOiBwYXJlbnRPcHRzLmxvZ2dlcixcbiAgICAgICAgc2lnbmFsOiBwYXJlbnRPcHRzLnNpZ25hbCxcbiAgICAgICAgbWF4RGVwdGg6IHRoaXMuX21heERlcHRoLFxuICAgICAgICAuLi4odGhpcy5fbWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9uczogdGhpcy5fbWF4SXRlcmF0aW9ucyB9KSxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBwYXJlbnQgZmFsbGJhY2sgZm9yXG4gICAgICAgIC8vIHRoZSBzdWJmbG93J3Mgcm9vdCBzdGFnZSBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIGJvdW5kYXJ5LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBzdWJmbG93T3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBlbWl0RHJpbGxQYXRoOlxuICAgICAgICAgIHRoaXMuZW1pdERyaWxsUGF0aCAhPT0gdW5kZWZpbmVkICYmIHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWRcbiAgICAgICAgICAgID8gWy4uLnRoaXMuZW1pdERyaWxsUGF0aCwgc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLCAvLyBTaGFyZSBjb3VudGVyIOKAlCBzdWJmbG93IGNvbnRpbnVlcyBnbG9iYWwgbnVtYmVyaW5nXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cywgLy8gU2hhcmUgdmlzaXQgY291bnRzIOKAlCBsb29wSXRlcmF0aW9uIHN0YXlzIG1vbm90b25pYyBhY3Jvc3Mgc3ViZmxvdyByZS1tb3VudHNcbiAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsIC8vIFN1YmZsb3cgaW5oZXJpdHMgcGFyZW50J3MgcnVuSWQg4oCUIHNhbWUgbG9naWNhbCBydW5cbiAgICAgICAgLy8gU2hhcmUgdGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IEJZIFJFRkVSRU5DRSwgc28gYSBob3AgdGFrZW5cbiAgICAgICAgLy8gYXQgYW55IGRlcHRoIGlzIHRha2VuIGZvciB0aGUgd2hvbGUgcnVuIOKAlCBhbmQgbmVzdGVkXG4gICAgICAgIC8vIFN1YmZsb3dFeGVjdXRvcnMgY2FuIHRha2UgdGhlIGRlZXBlciBob3BzIChlLmcuIFNlcXVlbmNlKEFnZW50KC4uLikpXG4gICAgICAgIC8vIHdoZXJlIHRoZSBpbm5lciBBZ2VudCBzdWJmbG93IHBhdXNlZCkuXG4gICAgICAgIC4uLih0aGlzLnJlc3VtZSAmJiB7IHJlc3VtZTogdGhpcy5yZXN1bWUgfSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgICBnZXRCcmVha1N0YXRlOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICAvLyBUaGUgbGVnJ3MgT05FIG93bmVkIGZyb3plbiBpbnB1dCBzbmFwc2hvdCBpcyB0YWtlbiB3aGVuIHRoZSBsZWcgU1RBUlRTXG4gICAgICAvLyAoYGV4ZWN1dGVgKSwgbmV2ZXIgaGVyZTogYSBnZXR0ZXIgb24gdGhlIGlucHV0IG11c3Qgbm90IHJ1biBhdCBjb25zdHJ1Y3Rpb24uXG4gICAgICByZWFkT25seUNvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4ZWN1dGlvbkVudjogb3B0cy5leGVjdXRpb25FbnYsXG4gICAgICBuYXJyYXRpdmVHZW5lcmF0b3I6IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLFxuICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSG9sZHMgdGhlIHRvcC1sZXZlbCBicmVhayBmbGFnIGZvciB0aGUgZHVyYXRpb24gb2YgYGV4ZWN1dGUoKWAuIEtlcHQgYXNcbiAgICogYSBmaWVsZCAobm90IGEgbG9jYWwpIHNvIGBnZXRCcmVha1N0YXRlKClgIGNhbiBzdXJmYWNlIHRoZSBmaW5hbCBzdGF0ZVxuICAgKiBmb3IgY2FsbGVycyBsaWtlIGBTdWJmbG93RXhlY3V0b3JgIHRoYXQgaW1wbGVtZW50IGBwcm9wYWdhdGVCcmVha2AuXG4gICAqL1xuICBwcml2YXRlIF90b3BCcmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9ID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICBhc3luYyBleGVjdXRlKGJyYW5jaFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIC8vIE9ORSBvd25lZCBmcm96ZW4gaW5wdXQgc25hcHNob3QgcGVyIGxlZyAocnVuLCByZXN1bWUsIHN1YmZsb3cgbW91bnQpLCB0YWtlbiBhcyB0aGVcbiAgICAvLyBsZWcgc3RhcnRzIOKAlCBuZXZlciBhdCBjb25zdHJ1Y3Rpb24gKGFuIGV4ZWN1dG9yIGNvbnN0cnVjdHMgYSB0cmF2ZXJzZXIgaXQgbWF5IG5ldmVyXG4gICAgLy8gcnVuKTogZXZlcnkgc2NvcGUgb2YgdGhlIGxlZyBnZXRzIGl0LCBzbyBlYWNoIHBheXMgTyhyb290IGtleXMpLCBub3QgTyhpbnB1dCkuXG4gICAgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCA9IHNuYXBzaG90UnVuSW5wdXQodGhpcy5yZWFkT25seUNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICB0aGlzLl90b3BCcmVha0ZsYWcgPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuICAgIC8vIFRoZSBlbnRyeSBpcyBvbmUtc2hvdDogdGhlIGZpcnN0IGV4ZWN1dGUoKSBzdGFydHMgdGhlcmUsIG5ldmVyIGFnYWluIOKAlFxuICAgIC8vIGFuZCBzbyBhcmUgdGhlIHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIGl0LlxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5lbnRyeSA/PyB0aGlzLnJvb3Q7XG4gICAgY29uc3Qgd2FpdGluZyA9IHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzO1xuICAgIHRoaXMuZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FsayA9ICgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4gPT5cbiAgICAgIHdhaXRpbmdcbiAgICAgICAgPyB0aGlzLndhbGtUaGVuUmFpc2Uoc3RhcnQsIGNvbnRleHQsIHdhaXRpbmcsIGJyYW5jaFBhdGgpXG4gICAgICAgIDogdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gcm9vdFRyYXZlcnNhbENvbnRleHQodGhpcy5ydW5JZCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IGNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChpc1RvcExldmVsKSB7XG4gICAgICAvLyBSZXRhaW4gYXQgdGhlIGJvdW5kYXJ5LCBiZWZvcmUgZGlzcGF0Y2ggb3IgZGVmZXJyZWQgY2FwdHVyZSDigJQgdGhlXG4gICAgICAvLyBzYW1lIG93bmVyIGFzIHN1YmZsb3cgZW50cnksIG5vdCBhIHJlY29yZGVyLWxvY2FsIHNjcnViIG9yIGxhdGVyIHdhbGsuXG4gICAgICAvLyBVbmRlciBhIHBvbGljeSB0aGUgd2FsayByZWFkcyB0aGUgbGVnJ3MgT05FIHNuYXBzaG90ICh0YWtlbiBhYm92ZSksIG5ldmVyIHRoZSBsaXZlIGlucHV0XG4gICAgICAvLyBhIHNlY29uZCB0aW1lOyB3aXRob3V0IG9uZSB0aGUgZXZlbnQgY2FycmllcyB0aGUgaW5wdXQgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICAgIGNvbnN0IGlucHV0ID1cbiAgICAgICAgcmVkYWN0aW9uUnVsZSAmJiAhcmVkYWN0aW9uUnVsZS5pc0luZXJ0KClcbiAgICAgICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkodGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dClcbiAgICAgICAgICA6IHRoaXMucmVhZE9ubHlDb250ZXh0O1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5TdGFydChpbnB1dCwgcm9vdENvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFRvcC1sZXZlbCBydW5zIGNsb3NlIHRoZWlyIGJvdW5kYXJ5IFNZTU1FVFJJQ0FMTFk6IGV2ZXJ5IG9uUnVuU3RhcnRcbiAgICAvLyBpcyBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSBvblJ1bkVuZCAoY2xlYW4pIG9yIG9uUnVuRmFpbGVkIChlcnJvcikuXG4gICAgLy8gV2l0aG91dCB0aGUgY2F0Y2gsIGEgdGhyb3duIHJ1biBmaXJlZCBvblJ1blN0YXJ0IHRoZW4gbm90aGluZyDigJQgYVxuICAgIC8vIG1vbml0b3IgY291bGRuJ3QgdGVsbCBcInN0aWxsIHJ1bm5pbmdcIiBmcm9tIFwiY3Jhc2hlZC5cIiBQYXVzZSBpcyBOT1RcbiAgICAvLyBhbiBlcnJvciAoaXQncyBleHBlY3RlZCBzdXNwZW5zaW9uKSwgc28gaXQgc2tpcHMgb25SdW5GYWlsZWQgYW5kXG4gICAgLy8gcmUtdGhyb3dzIHVudG91Y2hlZC4gVGhlIHN0YWdlLWxldmVsIGNhdGNoIGFscmVhZHkgcmVjb3JkZWQgdGhlXG4gICAgLy8gZmFpbGluZyBzdGFnZSAob25FcnJvciArIGNvbW1pdCk7IHRoaXMgYWRkcyB0aGUgcnVuLWxldmVsIHRlcm1pbmFsXG4gICAgLy8gc2lnbmFsLiBUaGUgZXJyb3Igc3RpbGwgcHJvcGFnYXRlcyDigJQgdGhpcyBpcyBvYnNlcnZhdGlvbiwgbm90XG4gICAgLy8gcmVjb3ZlcnkuIFN1YmZsb3cgdHJhdmVyc2VycyBkb24ndCBmaXJlIHJ1biBldmVudHM7IHRoZWlyIGVycm9yc1xuICAgIC8vIGJ1YmJsZSB1cCBhbmQgc3VyZmFjZSBoZXJlIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAgaWYgKCFpc1RvcExldmVsKSB7XG4gICAgICByZXR1cm4gd2FsaygpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgbGV0IHJldGFpbmVkUmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHdhbGsoKTtcbiAgICAgIC8vIFJlYWQgdGhlIHNoYXJlZCBydWxlIG5vdyBzbyBtYXJrcyBtYWRlIGR1cmluZyBleGVjdXRpb24gYXBwbHkgdG9cbiAgICAgIC8vIHRoaXMgZXZlbnQuIEEgc2NydWIgZmFpbHVyZSBjbG9zZXMgdGhlIHJ1biBhcyBmYWlsZWQsIG5ldmVyIHJhdy5cbiAgICAgIHJldGFpbmVkUmVzdWx0ID0gcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkocmVzdWx0KSA6IHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChcbiAgICAgICAgICByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5zZXJ2ZWRFcnJvcihlcnJvcikgOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSxcbiAgICAgICAgICByb290Q29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkVuZChyZXRhaW5lZFJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSByZXN1bWUncyBlbnRyeSBjaGFpbiBhdCBhIGxldmVsIHdoZXJlIHBhcmFsbGVsIHNpYmxpbmdzJyBwYXVzZXMgd2FpdFxuICAgKiAoOS4yOC4wKTogcnVuIHRoZSBjaGFpbiDigJQgdGhlIHJlc3VtZWQgY2hpbGQgb25seSwgdGhlIGZhbi1vdXQncyBqb2luIGlzXG4gICAqIE5PVCBhdHRhY2hlZCDigJQgdGhlbiByYWlzZSB0aGUgZmlyc3Qgd2FpdGluZyBwYXVzZSBhZ2FpbiwgdGhlIHJlc3QgYmVoaW5kXG4gICAqIGl0LiBOb3RoaW5nIG9mIHRoZSBzaWJsaW5nIHJlLXJ1bnM7IGl0cyBxdWVzdGlvbiBjb21lcyBiYWNrIGFzIGl0IHdhc1xuICAgKiBhc2tlZC4gQSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluICh0aGUgcmVzdW1lZCBjaGlsZCBhc2tpbmdcbiAgICogYWdhaW4pIGNhcnJpZXMgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGluc3RlYWQsIHNvIG5vbmUgaXMgZXZlciBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWxrVGhlblJhaXNlKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgd2FpdGluZzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHN0YXJ0LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHF1ZXVlQmVoaW5kKGVycm9yLCB3YWl0aW5nKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCB7IHBhdXNlLCBzdGFnZU5hbWUgfSA9IHdhaXRpbmdbMF07XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHBhdXNlLnBhdXNlZFN0YWdlSWQsXG4gICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBwYXVzZS5wYXVzZURhdGEpLFxuICAgICAgcGF1c2Uuc3ViZmxvd1BhdGgsXG4gICAgKTtcbiAgICB0aHJvdyByYWlzZVF1ZXVlZFBhdXNlKHdhaXRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyZWFrIHN0YXRlIGNhcHR1cmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIG1vc3QgcmVjZW50IGBleGVjdXRlKClgLlxuICAgKiBgc2hvdWxkQnJlYWtgIGlzIHRydWUgd2hlbiBhIHN0YWdlIGNhbGxlZCBgc2NvcGUuJGJyZWFrKHJlYXNvbilgOyB0aGVcbiAgICogb3B0aW9uYWwgYHJlYXNvbmAgY2FycmllcyB0aGUgc3RyaW5nIHBhc3NlZCB0byBgJGJyZWFrYC5cbiAgICpcbiAgICogVXNlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0byBwcm9wYWdhdGUgYW4gaW5uZXIgc3ViZmxvdydzIGJyZWFrIHVwIHRvXG4gICAqIHRoZSBwYXJlbnQgdHJhdmVyc2VyIHdoZW4gdGhlIG1vdW50IHNldHMgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYC5cbiAgICovXG4gIGdldEJyZWFrU3RhdGUoKTogeyBzaG91bGRCcmVhazogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3RvcEJyZWFrRmxhZyB9O1xuICB9XG5cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIuZ2V0U3RydWN0dXJlKCk7XG4gIH1cblxuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pIHtcbiAgICAvLyBTdGFtcCB0aGUgcnVuJ3MgaWQgb250byB0aGUgcnVudGltZSBzbmFwc2hvdCBoZXJlIOKAlCB0aGUgdHJhdmVyc2VyIGlzXG4gICAgLy8gdGhlIHNpbmdsZSBhdXRob3JpdHkgZm9yIGBydW5JZGAgKGl0IGFscmVhZHkgc3RhbXBzIHRoZSBzYW1lIHZhbHVlIG9uXG4gICAgLy8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC9ldmVudCksIHdoaWxlIHRoZSBydW50aW1lIGlzIHJ1bi1hZ25vc3RpY1xuICAgIC8vIG1lbW9yeSAoaXRzIGdldFNuYXBzaG90IHJldHVybnMgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+KS5cbiAgICAvLyBGcmVzaCBwZXIgcnVuKCkgQU5EIHBlciByZXN1bWUoKSDigJQgc2VlIHJ1bm5lci9ydW5JZC50cy5cbiAgICByZXR1cm4geyAuLi50aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0U25hcHNob3Qob3B0aW9ucyksIHJ1bklkOiB0aGlzLnJ1bklkIH07XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIEl0ZXJhdGl2ZSB3b3JrbGlzdCAobm8gcmVjdXJzaW9uKSBzbyBhcmJpdHJhcmlseSBsb25nIGNoYWlucyBpbmRleCBmdWxseTtcbiAgICogdGhlIGBtYXAuaGFzYCBndWFyZCBoYW5kbGVzIGN5Y2xpYyByZWZzLiBGaXJzdC12aXNpdGVkIG5vZGUgd2lucyBwZXIgSUQg4oCUXG4gICAqIHdvcmtsaXN0IG9yZGVyIG1hdGNoZXMgdGhlIG9sZCByZWN1cnNpdmUgcHJlLW9yZGVyIChjaGlsZHJlbiwgdGhlbiBuZXh0KS5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBpZiAobWFwLmhhcyhub2RlLmlkKSkgY29udGludWU7IC8vIGFscmVhZHkgdmlzaXRlZCAoYXZvaWRzIGluZmluaXRlIGxvb3BzIG9uIGN5Y2xpYyByZWZzKVxuICAgICAgbWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIC8vIFB1c2ggaW4gcmV2ZXJzZSB2aXNpdCBvcmRlciAoTElGTyBzdGFjayk6IG5leHQgZmlyc3QsIHRoZW4gY2hpbGRyZW5cbiAgICAgIC8vIHJldmVyc2VkIOKAlCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZCBiZWZvcmUgbmV4dCwgZmlyc3QgY2hpbGQgZmlyc3QsXG4gICAgICAvLyBtYXRjaGluZyB0aGUgcmVjdXJzaXZlIHByZS1vcmRlciBleGFjdGx5LlxuICAgICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChub2RlLm5leHQpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHN0YWNrLnB1c2gobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgRHluYW1pYy1wYXRjaCBvdmVybGF5IGFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRXZlcnkgZW5naW5lIHJlYWQgb2YgYSBmaWVsZCB0aGF0IFBoYXNlIDQgY2FuIHBhdGNoIChjaGlsZHJlbixcbiAgLy8gbmV4dE5vZGVTZWxlY3Rvciwgc3ViZmxvdyBtZXRhKSBnb2VzIHRocm91Z2ggdGhlc2UuIEZhc3QgcGF0aDogY2hhcnRzXG4gIC8vIHdpdGggbm8gZHluYW1pYyByZXR1cm5zIG5ldmVyIGFsbG9jYXRlIGFuZCBwYXkgb25lIGBzaXplID09PSAwYCBjaGVjay5cblxuICBwcml2YXRlIGdldFBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wYXRjaENvdW50ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB7XG4gICAgbGV0IHBhdGNoID0gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkge1xuICAgICAgcGF0Y2ggPSB7fTtcbiAgICAgIHRoaXMuZHluYW1pY1BhdGNoZXMuc2V0KG5vZGUsIHBhdGNoKTtcbiAgICAgIHRoaXMucGF0Y2hDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2g7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIGNoaWxkcmVuOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4uICovXG4gIHByaXZhdGUgZWZmQ2hpbGRyZW4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgb3V0cHV0LWJhc2VkIHNlbGVjdG9yOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MuICovXG4gIHByaXZhdGUgZWZmU2VsZWN0b3Iobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/Lm5leHROb2RlU2VsZWN0b3IgPz8gbm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93LXJvb3QgbWFya2VyICh0cnVlIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgd2FzIHBhdGNoZWQgb24pLiAqL1xuICBwcml2YXRlIGVmZklzU3ViZmxvd1Jvb3Qobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyB0cnVlIDogbm9kZS5pc1N1YmZsb3dSb290O1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93IGlkIChwYXRjaGVkIHZlcmJhdGltIGJ5IGEgZHluYW1pYyBzdWJmbG93IHJldHVybikuICovXG4gIHByaXZhdGUgZWZmU3ViZmxvd0lkKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyBtZXRhLnN1YmZsb3dJZCA6IG5vZGUuc3ViZmxvd0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBlZmZlY3RpdmUgdmlldyBvZiBhIG5vZGUg4oCUIGZpZWxkLWlkZW50aWNhbCB0byB3aGF0IHRoZVxuICAgKiBwcmUtb3ZlcmxheSBjb2RlIHByb2R1Y2VkIGJ5IG11dGF0aW5nIHRoZSBzaGFyZWQgbm9kZS4gVXNlZCB3aGVyZSBhIG5vZGVcbiAgICogaXMgaGFuZGVkIHRvIGEgaGVscGVyIGV4ZWN1dG9yIChOb2RlUmVzb2x2ZXIgLyBTdWJmbG93RXhlY3V0b3IgL1xuICAgKiBDaGlsZHJlbkV4ZWN1dG9yKSBzbyBoZWxwZXJzIG5ldmVyIHJlYWQgc3RhbGUgYnVpbHQgZmllbGRzLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlIGl0c2VsZiAobm8gYWxsb2NhdGlvbikgd2hlbiBpdCBjYXJyaWVzIG5vIHBhdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZOb2RlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5nZXRQYXRjaChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBtZXJnZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgaWYgKHBhdGNoLnN1YmZsb3dNZXRhKSB7XG4gICAgICBtZXJnZWQuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd0lkID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd0lkO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dOYW1lID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd05hbWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd01vdW50T3B0aW9ucyA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgfVxuICAgIGlmIChwYXRjaC5jaGlsZHJlbikgbWVyZ2VkLmNoaWxkcmVuID0gcGF0Y2guY2hpbGRyZW47XG4gICAgaWYgKHBhdGNoLm5leHROb2RlU2VsZWN0b3IpIG1lcmdlZC5uZXh0Tm9kZVNlbGVjdG9yID0gcGF0Y2gubmV4dE5vZGVTZWxlY3RvcjtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBzaW5nbGUgZnVubmVsIGV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIHBhc3NlcyB0aHJvdWdoIOKAlCBsaW5lYXIgc3RhZ2VzXG4gICAqIChQaGFzZSAzKSwgZGVjaWRlciBzdGFnZXMgYW5kIHNlbGVjdG9yIHN0YWdlcyAodGhlaXIgaGFuZGxlcnMgYXJlIGhhbmRlZFxuICAgKiB0aGlzIG1ldGhvZCBhcyBgcnVuU3RhZ2VgKSwgYW5kIGJ5IGV4dGVuc2lvbiBmb3JrIGNoaWxkcmVuIGFuZFxuICAgKiBzdWJmbG93LWludGVybmFsIHN0YWdlcywgd2hpY2ggcmUtZW50ZXIgUGhhc2UgMyBpbiB0aGVpciBvd24gdHJhdmVyc2VyLlxuICAgKlxuICAgKiBXaGljaCBpcyBleGFjdGx5IHdoeSB0aGUgZGVjbGFyYXRpdmUgcmV0cnkgbG9vcCBsaXZlcyBIRVJFIGFuZCBub3doZXJlXG4gICAqIGVsc2U6IG9uZSBpbXBsZW1lbnRhdGlvbiBnaXZlcyBgcmV0cnlgIHRvIGV2ZXJ5IHN0YWdlIGtpbmQgdGhhdCBoYXMgYVxuICAgKiBmdW5jdGlvbiB0byByZXRyeS4gKFB1dHRpbmcgaXQgaW4gYFN0YWdlUnVubmVyYCB3b3VsZCBoYXZlIGJlZW4gd3Jvbmcg4oCUXG4gICAqIHRoZSBydW5uZXIgb3ducyB0aGUgc2NvcGUgYW5kIHRoZSBpbnRlcnJ1cHQgYm91bmRhcnksIGJ1dCBub3QgdGhlXG4gICAqIGBTdGFnZUNvbnRleHRgIHdob3NlIHN0YWdlZCB3cml0ZXMgYSBmYWlsZWQgYXR0ZW1wdCBtdXN0IGRpc2NhcmQuKVxuICAgKlxuICAgKiBXaXRoIG5vIGByZXRyeWAgcG9saWN5IHRoaXMgaXMgYSBzaW5nbGUgY2FsbCwgYnl0ZS1pZGVudGljYWwgdG8gdGhlXG4gICAqIHByZS05LjE1IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGFnZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxUT3V0PiB7XG4gICAgLy8gcnVudGltZVN0YWdlSWQgaXMgYXNzaWduZWQgaW4gZXhlY3V0ZU5vZGUoKSBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbixcbiAgICAvLyBlbnN1cmluZyBzY29wZSBldmVudHMgYW5kIGZsb3cgZXZlbnRzIHVzZSB0aGUgc2FtZSB2YWx1ZS4gSXQgZG9lcyBOT1RcbiAgICAvLyBjaGFuZ2UgYWNyb3NzIGF0dGVtcHRzOiBhdHRlbXB0cyBhcmUgaW50ZXJuYWwgdG8gT05FIHN0YWdlIGV4ZWN1dGlvbiDigJRcbiAgICAvLyBvbmUgcnVudGltZVN0YWdlSWQsIG9uZSBleGVjdXRpb24gaW5kZXgsIG9uZSBmaW5hbCBDb21taXRCdW5kbGUuXG4gICAgY29uc3QgcG9saWN5ID0gbm9kZS5yZXRyeTtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IHBvbGljeSA/IE1hdGguZmxvb3IocG9saWN5LmF0dGVtcHRzKSA6IDE7XG4gICAgaWYgKCFwb2xpY3kgfHwgIShtYXhBdHRlbXB0cyA+IDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YWdlUnVubmVyLnJ1bihub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgaXNGaW5hbEF0dGVtcHQgPSBhdHRlbXB0ID49IG1heEF0dGVtcHRzO1xuICAgICAgICAvLyBBIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgZmFpbHVyZSDigJQgcmV0cnlpbmcgaXQgd291bGRcbiAgICAgICAgLy8gcmUtcnVuIGEgc3RhZ2UgdGhhdCBhc2tlZCB0byBTVVNQRU5EIChhbmQgd291bGQgYnJlYWsgcmVzdW1lLCB3aGljaFxuICAgICAgICAvLyByZS1lbnRlcnMgdGhpcyBzdGFnZSBmcm9tIGl0cyB0b3ApLiBDb3ZlcnMgYm90aCByYWlzZSBzaGFwZXM6XG4gICAgICAgIC8vIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCByZXR1cm5pbmcgZGF0YSwgYW5kIGBpbnRlcnJ1cHQoKWAuXG4gICAgICAgIGlmIChpc0ZpbmFsQXR0ZW1wdCB8fCBpc1BhdXNlU2lnbmFsKGVycm9yKSB8fCAhdGhpcy5zaG91bGRSZXRyeShwb2xpY3ksIGVycm9yLCBjb250ZXh0KSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgY2FuY2VsbGVkIHJ1biBtdXN0IG5vdCBzaXQgdGhyb3VnaCBhIGJhY2tvZmYgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHRocm93IGVycm9yO1xuXG4gICAgICAgIC8vIEF0dGVtcHQgaXNvbGF0aW9uOiBkcm9wIGV2ZXJ5dGhpbmcgdGhpcyBhdHRlbXB0IHN0YWdlZCBCRUZPUkUgdGhlXG4gICAgICAgIC8vIG5leHQgb25lIHN0YXJ0cy4gTm90aGluZyB3YXMgYXBwbGllZCwgc28gdGhlcmUgaXMgbm90aGluZyB0byByb2xsXG4gICAgICAgIC8vIGJhY2sg4oCUIHNlZSBTdGFnZUNvbnRleHQuZGlzY2FyZFN0YWdlZCgpLlxuICAgICAgICBjb250ZXh0LmRpc2NhcmRTdGFnZWQoKTtcblxuICAgICAgICBjb25zdCBkZWxheU1zID0gcmVzb2x2ZUJhY2tvZmZNcyhwb2xpY3kuYmFja29mZk1zLCBhdHRlbXB0KTtcbiAgICAgICAgLy8gRmlyZWQgQkVGT1JFIHRoZSB3YWl0OiBhIGxpdmUgbW9uaXRvciBsZWFybnMgXCJyZXRyeWluZyBpbiA1MDBtc1wiXG4gICAgICAgIC8vIHdoZW4gdGhlIGRlY2lzaW9uIGlzIG1hZGUsIG5vdCBvbmNlIGl0IGhhcyBhbHJlYWR5IGVsYXBzZWQuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VSZXRyeShcbiAgICAgICAgICBub2RlLm5hbWUsXG4gICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIG1heEF0dGVtcHRzLFxuICAgICAgICAgIGRlbGF5TXMsXG4gICAgICAgICAgc2VydmVkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGF5TXMgPiAwKSBhd2FpdCBzbGVlcChkZWxheU1zLCB0aGlzLnNpZ25hbCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFI1IGZvciBpZHMgYSBzdGFnZSBBRE9QVFMgYXQgcnVuIHRpbWUgKGEgcmV0dXJuZWQgU3RhZ2VOb2RlJ3MgYG5leHRgIGNoYWluLFxuICAgKiBgY2hpbGRyZW5gIGFuZCBzdWJmbG93IGlkcyk6IHRoZSBzYW1lIHJlZnVzYWwgdGhlIGJ1aWxkZXIncyBkb29ycyBhcHBseSDigJRcbiAgICogYGlkcy9yZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYCDigJQgc28gXCJubyB1c2VyIGlkIGNhcnJpZXMgYVxuICAgKiBncmFtbWFyIGRlbGltaXRlclwiIHN0YXlzIHRydWUgYnkgY29uc3RydWN0aW9uLiBMb29wLXJlZiBzdHVicyAodGhleSBuYW1lIGFuXG4gICAqIGV4aXN0aW5nIG5vZGUpIGFuZCB0aGUgY2hhcnQncyBvd24gbm9kZXMgKGFkbWl0dGVkIGF0IGJ1aWxkOyBhIHByZWZpeGVkIGlkXG4gICAqIGNhcnJpZXMgYC9gIG9uIHB1cnBvc2UpIGFyZSBub3QgbmV3IGlkcyBhbmQgYXJlIHNraXBwZWQuIEEgc3ViZmxvd1xuICAgKiBkZWZpbml0aW9uJ3Mgb3duIHRyZWUgaXMgYSBidWlsdCBjaGFydCBhbmQgaXMgbm90IHdhbGtlZC5cbiAgICovXG4gIHByaXZhdGUgYWRtaXREeW5hbWljSWRzKG91dHB1dDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghb3V0cHV0IHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnIHx8ICFpc1N0YWdlTm9kZVJldHVybihvdXRwdXQpKSByZXR1cm47XG4gICAgY29uc3Qgcm9vdCA9IG91dHB1dCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBjb25zdCByZWZ1c2UgPSAocmVmdXNhbDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIGR5bmFtaWMgU3RhZ2VOb2RlOiAke3JlZnVzYWx9YCk7XG4gICAgfTtcbiAgICBpZiAocm9vdC5zdWJmbG93SWQpIHJlZnVzZShyZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN1YmZsb3cgaWQnLCByb290LnN1YmZsb3dJZCwgJ3NlZ21lbnQnKSk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiA9IFtyb290Lm5leHQsIC4uLihyb290LmNoaWxkcmVuID8/IFtdKV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG4gPSBzdGFjay5wb3AoKTtcbiAgICAgIGlmICghbiB8fCBzZWVuLmhhcyhuKSB8fCBuLmlzTG9vcFJlZikgY29udGludWU7XG4gICAgICBzZWVuLmFkZChuKTtcbiAgICAgIGNvbnN0IHJlZnVzYWwgPVxuICAgICAgICByZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN0YWdlIGlkJywgbi5pZCwgJ3N0YWdlJykgPz9cbiAgICAgICAgKG4uc3ViZmxvd0lkID8gcmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdWJmbG93IGlkJywgbi5zdWJmbG93SWQsICdzZWdtZW50JykgOiB1bmRlZmluZWQpO1xuICAgICAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBPbmx5IGEgU1VTUEVDVCBpZCBwYXlzIGZvciB0aGUgY2hhcnQgbG9va3VwOiBhIGNoYXJ0IG5vZGUgKGFuZCB0aGVcbiAgICAgICAgLy8gY2hhcnQgYmVsb3cgaXQpIHdhcyBhZG1pdHRlZCBhdCBidWlsZC5cbiAgICAgICAgaWYgKHRoaXMubm9kZVJlc29sdmVyLmZpbmROb2RlQnlJZChuLmlkKSA9PT0gbikgY29udGludWU7XG4gICAgICAgIHJlZnVzZShyZWZ1c2FsKTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnB1c2gobi5uZXh0LCAuLi4obi5jaGlsZHJlbiA/PyBbXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBgcmV0cnlPbmAgZ2F0ZS4gQSB0aHJvd2luZyBwcmVkaWNhdGUgY291bnRzIGFzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuXG4gICAqICBwcmVkaWNhdGUgbXVzdCBuZXZlciB0dXJuIGEgZmFpbGluZyBzdGFnZSBpbnRvIGFuIGVuZGxlc3MgcmV0cnkgbG9vcC4gKi9cbiAgcHJpdmF0ZSBzaG91bGRSZXRyeShcbiAgICBwb2xpY3k6IE5vbk51bGxhYmxlPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+WydyZXRyeSddPixcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghcG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcG9saWN5LnJldHJ5T24oZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHByZWRpY2F0ZUVycm9yKSB7XG4gICAgICAvLyBBIHByZWRpY2F0ZSBtYXkgcmV0aHJvdyB0aGUgc3RhZ2UncyBvd24gZXJyb3I6IHRoZSBsb2dnZXIgZ2V0cyB0aGUgc2VydmVkIGZvcm0uXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbZm9vdHByaW50XSByZXRyeU9uIHByZWRpY2F0ZSB0aHJldzsgdHJlYXRpbmcgdGhlIGZhaWx1cmUgYXMgZmluYWwnLCB7XG4gICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgcHJlZGljYXRlRXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW1wb2xpbmUgZHJpdmVyIOKAlCBwcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogUnVucyBgZXhlY3V0ZU5vZGVTdGVwYCAob25lIG5vZGUsIGFsbCA3IHBoYXNlcykgaW4gYSBmbGF0IGxvb3A6IGV2ZXJ5XG4gICAqIFRBSUwgY29udGludWF0aW9uIChsaW5lYXIgYG5leHRgLCBsb29wIGVkZ2UsIGR5bmFtaWMgbmV4dCAvIGR5bmFtaWNcbiAgICogcmUtZW50cnksIG5vLWNvbnRpbnVhdGlvbiBkZWNpZGVyIGRpc3BhdGNoKSBjb21lcyBiYWNrIGFzIGFcbiAgICogYENvbnRpbnVhdGlvbkhvcGAgYW5kIGlzIGZvbGxvd2VkIElURVJBVElWRUxZIOKAlCBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrXG4gICAqIG5vciB0aGUgcmV0YWluZWQgcHJvbWlzZSBjaGFpbiBncm93cyB3aXRoIGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LlxuICAgKlxuICAgKiBSZWN1cnNpb24gcmVtYWlucyBPTkxZIGZvciB0cnVlIHRyZWUgbmVzdGluZyAoZWFjaCBnZXRzIGEgbmVzdGVkIGRyaXZlclxuICAgKiBjYWxsKTogZm9yayBjaGlsZHJlbiAoYENoaWxkcmVuRXhlY3V0b3JgKSwgc2VsZWN0b3IgYnJhbmNoZXMgKHBhcmFsbGVsXG4gICAqIGZhbi1vdXQpLCBkZWNpZGVyIGJyYW5jaCBkaXNwYXRjaCB3aGVuIHRoZSBkZWNpZGVyIGhhcyBpdHMgb3duIGBuZXh0YFxuICAgKiAodGhlIGJyYW5jaCBtdXN0IGNvbXBsZXRlIEJFRk9SRSB0aGUgZGVjaWRlcidzIGNvbnRpbnVhdGlvbiBydW5zKSwgYW5kXG4gICAqIHN1YmZsb3cgbW91bnRzIChmcmVzaCB0cmF2ZXJzZXI7IHRoZSBtb3VudCBmcmFtZSBzdGF5cyBpbiB0aGUgcGFyZW50KS5cbiAgICogYF9leGVjdXRlRGVwdGhgIHRoZXJlZm9yZSBjb3VudHMgY2hhcnQgQ09NUE9TSVRJT04gZGVwdGggb25seSwgZ3VhcmRlZFxuICAgKiBieSBgX21heERlcHRoYCAoZGVmYXVsdCBgTUFYX0VYRUNVVEVfREVQVEhgID0gNTAwKS5cbiAgICpcbiAgICogUGF1c2VTaWduYWw6IGEgZmxhdCBkZWNpZGVyIGRpc3BhdGNoIHJlY29yZHMgYW4gYEludm9rZXJTdGFtcGA7IGlmIHRoZVxuICAgKiBjb250aW51ZWQgY2hhaW4gbGF0ZXIgcGF1c2VzLCB0aGUgZHJpdmVyIHN0YW1wcyB0aGUgc2lnbmFsIGR1cmluZ1xuICAgKiB1bndpbmQg4oCUIHNhbWUgaW52b2tlciBjb250ZXh0IHRoZSByZWN1cnNpdmUgZGlzcGF0Y2gncyBjYXRjaCB1c2VkIHRvXG4gICAqIHN0YW1wLCBpbm5lcm1vc3QgKG1vc3QgcmVjZW50IGRpc3BhdGNoKSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGUoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICAgZW5jbG9zaW5nPzogRW5jbG9zaW5nRnJhbWVzLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIOKUgOKUgOKUgCBUcmVlLWRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIERlcHRoIGlzIHRoZSBDQUxMIFBBVEgncyBuZXN0aW5nLCByZWFkIG9mZiB0aGUgY29udGV4dCB0aGlzIGRyaXZlciB3YXNcbiAgICAvLyBoYW5kZWQgKHNlZSBgX2ZyYW1lT2ZgKSDigJQgc2libGluZ3MgbmV2ZXIgY29uc3VtZSBpdC4gQSByZWFjaGVkIGNhcCBpcyBhXG4gICAgLy8gUlVOIGZhaWx1cmU6IGBvbkVycm9yYCBmaXJlcyBoZXJlIChubyBzdGFnZSByYW4gZm9yIHRoaXMgbm9kZSwgc28gbm9cbiAgICAvLyBzdGFnZSBjYXRjaCB3b3VsZCkgYW5kIGBDaGlsZHJlbkV4ZWN1dG9yYCByZXRocm93cyBpdCB3aGF0ZXZlciB0aGVcbiAgICAvLyBmYW4tb3V0J3MgZXJyb3IgbW9kZS5cbiAgICBjb25zdCBkZXB0aCA9IHRoaXMubmVzdGluZ0RlcHRoT2YoY29udGV4dCk7XG4gICAgaWYgKGRlcHRoID4gdGhpcy5fbWF4RGVwdGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFRyYXZlcnNhbERlcHRoRXJyb3IodGhpcy5fbWF4RGVwdGgsIG5vZGUubmFtZSk7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgdGhyb3duVGV4dChlcnJvciksIGV4dHJhY3RFcnJvckluZm8oZXJyb3IpKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEludm9rZXIgc3RhbXBzIGZyb20gZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMgaW4gVEhJUyBkcml2ZXIg4oCUIGtlcHRcbiAgICAvLyBsb2NhbCBzbyBuZXN0ZWQgZHJpdmVycyAoZm9yayBjaGlsZHJlbiwgd2l0aC1uZXh0IGRlY2lkZXIgYnJhbmNoZXMpXG4gICAgLy8gZ2V0IHRoZWlyIG93biB3aW5kb3dzLCBtYXRjaGluZyB0aGUgb2xkIGZyYW1lLW9uLXN0YWNrIHN0YW1waW5nIHNjb3BlLlxuICAgIGxldCBwZW5kaW5nSW52b2tlcnM6IEludm9rZXJTdGFtcFtdIHwgdW5kZWZpbmVkO1xuICAgIC8vIEV2ZXJ5IGRyaXZlciByZW1lbWJlcnMgdGhlIG5vZGVzIGl0IHJhbi4gQSBkZWNpZGVyJ3MgQlJBTkNIIEZSQU1FXG4gICAgLy8gKGRlY2lkZXIgd2l0aCBpdHMgb3duIGBuZXh0YDsgYGVuY2xvc2luZ2AgPSB0aGUgcmFuLXNldHMgb2YgdGhlIGRyaXZlcnNcbiAgICAvLyBpdCBpcyBuZXN0ZWQgaW4gKyB0aGUgYG5leHRgIGNoYWlucyBvZiB0aGUgZGVjaWRlcnMgd2hvc2UgZnJhbWVzIGhvbGRcbiAgICAvLyBpdCkgTEVBVkVTIG9uIGEganVtcCBieSBpZCAoYSBgbG9vcGAgaG9wKSB0byBhIG5vZGUgdGhpcyBmcmFtZSBkaWQgbm90XG4gICAgLy8gcnVuIHRoYXQgaXMgZWl0aGVyIG9uZSBhbiBFTkNMT1NJTkcgZHJpdmVyIGFscmVhZHkgcmFuIChhIGxvb3AgYmFjaykgb3JcbiAgICAvLyBvbmUgb24gYW4gZW5jbG9zaW5nIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4gKGEgZm9yd2FyZCBqdW1wIGludG8gdGhlXG4gICAgLy8gdGFpbCkg4oCUIHRoZSBob3AgaXMgaGFuZGVkIGJhY2sgdG8gdGhlIGRlY2lkZXIsIHdoaWNoIGZvbGxvd3MgaXQgZmxhdFxuICAgIC8vIGF0IGl0cyBvd24gbGV2ZWwgYW5kIHNraXBzIGl0cyBgbmV4dGAsIHNvIG5laXRoZXIgYSBsb29wIHN0YWNrcyBvbmVcbiAgICAvLyBmcmFtZSBwZXIgcGFzcyBub3IgYSB0YWlsIHJ1bnMgdHdpY2UuIEFueSBvdGhlciBqdW1wIChzaWRld2F5cyB0byBhXG4gICAgLy8gc2libGluZyBicmFuY2gpIHN0YXlzIGluIHRoZSBmcmFtZSwgYXMgdGhyb3VnaCA5LjM5LjAuXG4gICAgY29uc3QgcmFuSGVyZSA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgIGNvbnN0IGZyYW1lOiBEcml2ZXJGcmFtZSA9IHtcbiAgICAgIGRlcHRoLFxuICAgICAgcmFuOiBlbmNsb3NpbmcgPyBbLi4uZW5jbG9zaW5nLnJhbiwgcmFuSGVyZV0gOiBbcmFuSGVyZV0sXG4gICAgICB0YWlsczogZW5jbG9zaW5nPy50YWlscyA/PyBbXSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBsZXQgY3VycmVudDogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4gPSB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoIH07XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHRoaXMuX2ZyYW1lT2Yuc2V0KGN1cnJlbnQuY29udGV4dCwgZnJhbWUpO1xuICAgICAgICByYW5IZXJlLmFkZChjdXJyZW50Lm5vZGUuaWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlU3RlcChjdXJyZW50Lm5vZGUsIGN1cnJlbnQuY29udGV4dCwgYnJlYWtGbGFnLCBjdXJyZW50LmJyYW5jaFBhdGgpO1xuICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ocmVzdWx0KSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuY2xvc2luZyAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5sb29wID09PSB0cnVlICYmICFyYW5IZXJlLmhhcyhyZXN1bHQubm9kZS5pZCkpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IHJlc3VsdC5ub2RlLmlkO1xuICAgICAgICAgIGNvbnN0IGhhcyA9IChpZHM6IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD4pID0+IGlkcy5oYXMoaWQpO1xuICAgICAgICAgIGlmIChlbmNsb3NpbmcucmFuLnNvbWUoaGFzKSB8fCBlbmNsb3NpbmcudGFpbHMuc29tZShoYXMpKSByZXR1cm4gcmVzdWx0OyAvLyB0aGUganVtcCBsZWF2ZXMgdGhpcyBmcmFtZVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW52b2tlclN0YW1wKSAocGVuZGluZ0ludm9rZXJzID8/PSBbXSkucHVzaChyZXN1bHQuaW52b2tlclN0YW1wKTtcbiAgICAgICAgY3VycmVudCA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gUmVwbGF5IGludm9rZXIgc3RhbXBzIG1vc3QtcmVjZW50LWZpcnN0LiBgc2V0SW52b2tlcmAgaXNcbiAgICAgIC8vIGZpcnN0LXdyaXRlLXdpbnMsIHNvIHRoZSBpbm5lcm1vc3QgZGlzcGF0Y2gncyBzdGFtcCBsYW5kcyDigJQgZXhhY3RseVxuICAgICAgLy8gdGhlIG9sZCBidWJibGUtdXAgb3JkZXIgdGhyb3VnaCBuZXN0ZWQgY2F0Y2ggZnJhbWVzLlxuICAgICAgaWYgKHBlbmRpbmdJbnZva2VycyAhPT0gdW5kZWZpbmVkICYmIGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBwZW5kaW5nSW52b2tlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKHBlbmRpbmdJbnZva2Vyc1tpXS5pbnZva2VyU3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmVzdGluZyBkZXB0aCBhIGRyaXZlciBoYW5kZWQgYGNvbnRleHRgIHJ1bnMgYXQ6IG9uZSBiZWxvdyB0aGVcbiAgICogZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0IHdhcyBjcmVhdGVkIGZyb20sIDEgYXQgdGhlIHRvcCAoYW5kIGZvclxuICAgKiBhIGNvbnRleHQgd2hvc2UgcGFyZW50IG5vIGRyaXZlciBvZiB0aGlzIHRyYXZlcnNlciByYW4g4oCUIGEgc3ViZmxvdydzXG4gICAqIHJvb3QsIGEgcmVzdW1lJ3Mgc3RhcnQpLiBSZWFkIGJ5IHRoZSBpbnN0cnVtZW50YXRpb24gaW5cbiAgICogYGJlbmNoL2RlcHRoLXByb2JlLnRzYCBhbmQgdGhlIHRyYW1wb2xpbmUgdGVzdHMuXG4gICAqL1xuICBwcml2YXRlIG5lc3RpbmdEZXB0aE9mKGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IG51bWJlciB7XG4gICAgY29uc3QgcGFyZW50ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgcmV0dXJuIChwYXJlbnQgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLl9mcmFtZU9mLmdldChwYXJlbnQpPy5kZXB0aCA/PyAwKSArIDE7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIGRlY2lkZXIncyBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSByYW4tc2V0cyBvZiB0aGUgZHJpdmVycyBpdCBpc1xuICAgKiBuZXN0ZWQgaW4sIGFuZCBldmVyeSBlbmNsb3NpbmcgZGVjaWRlcidzIGBuZXh0YCBjaGFpbiBwbHVzIHRoaXMgb25lJ3MuXG4gICAqL1xuICBwcml2YXRlIGJyYW5jaEZyYW1lRm9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgbmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBFbmNsb3NpbmdGcmFtZXMge1xuICAgIGNvbnN0IG91dGVyID0gdGhpcy5fZnJhbWVPZi5nZXQoY29udGV4dCk7XG4gICAgcmV0dXJuIHsgcmFuOiBvdXRlcj8ucmFuID8/IFtdLCB0YWlsczogWy4uLihvdXRlcj8udGFpbHMgPz8gW10pLCB0aGlzLnRhaWxJZHMobmV4dCldIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkcyBvbiBhIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4g4oCUIGBuZXh0YCwgaXRzIGBuZXh0YCwg4oCmIOKAlCB1cCB0byBhXG4gICAqIGxvb3AtcmVmIHN0dWIgKGEgYmFjay1lZGdlLCBub3QgdGhlIHRhaWwpLiBDYWNoZWQgcGVyIGNoYWluIGhlYWQuXG4gICAqL1xuICBwcml2YXRlIHRhaWxJZHMobmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgaWRzID0gdGhpcy5fdGFpbElkcy5nZXQobmV4dCk7XG4gICAgaWYgKGlkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgZm9yIChsZXQgbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQgPSBuZXh0OyBuICYmICFuLmlzTG9vcFJlZiAmJiAhY2hhaW4uaGFzKG4uaWQpOyBuID0gbi5uZXh0KSB7XG4gICAgICAgIGNoYWluLmFkZChuLmlkKTtcbiAgICAgIH1cbiAgICAgIGlkcyA9IGNoYWluO1xuICAgICAgdGhpcy5fdGFpbElkcy5zZXQobmV4dCwgaWRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkcztcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIGZsYXQgY29udGludWF0aW9uIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wLiAqL1xuICBwcml2YXRlIGhvcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCAuLi4oaW52b2tlclN0YW1wICYmIHsgaW52b2tlclN0YW1wIH0pIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGxvb3AgZWRnZSAoYSBgbG9vcFRvYCBzdHViIG9yIGEgYnktaWQgZHluYW1pYyBuZXh0KSBhbmQgaG9wIHRvXG4gICAqIGl0cyB0YXJnZXQuIFRoZSBob3AgaXMgZmxhZ2dlZCBgbG9vcGAgd2hlbiB0aGUgcmVzb2x2ZXIgZm9sbG93ZWQgYVxuICAgKiBiYWNrLXJlZmVyZW5jZSwgc28gYSBkZWNpZGVyJ3MgYnJhbmNoIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcCB0aGF0IGxlYXZlc1xuICAgKiBpdCBmcm9tIG9uZSB0aGF0IHN0YXlzIGluc2lkZSBpdC5cbiAgICovXG4gIHByaXZhdGUgbG9vcEhvcChcbiAgICBsb29wUmVmOiBzdHJpbmcgfCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KGxvb3BSZWYsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgIGNvbnN0IGhvcCA9IHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgcmV0dXJuIHRhcmdldC5ub2RlID09PSBsb29wUmVmID8gaG9wIDogeyAuLi5ob3AsIGxvb3A6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB0aGUgZGVjaWRlcidzIG93biBgbmV4dGAgdGhlIHN0dWIgYGxvb3BUb2AgcGxhbnRlZCAob3IgYVxuICAgKiByZWZlcmVuY2Utb25seSBub2RlIOKAlCBubyBmbiwgbm8gY2hpbGRyZW4sIG5vIGRlY2lkZXIvc2VsZWN0b3IsIG5vdCBhXG4gICAqIHN1YmZsb3cgcm9vdCk/IFRoZSBzZWxlY3RvcidzIGFuZCB0aGUgbW91bnQncyBjb250aW51YXRpb24gYXNrXG4gICAqIGBpc0xvb3BSZWZgIGFsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0xvb3BTdHViKG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5leHQuaXNMb29wUmVmID09PSB0cnVlIHx8XG4gICAgICAoIXRoaXMuZ2V0U3RhZ2VGbihuZXh0KSAmJlxuICAgICAgICAhdGhpcy5lZmZDaGlsZHJlbihuZXh0KT8ubGVuZ3RoICYmXG4gICAgICAgICFuZXh0LmRlY2lkZXJGbiAmJlxuICAgICAgICAhbmV4dC5zZWxlY3RvckZuICYmXG4gICAgICAgICF0aGlzLmVmZklzU3ViZmxvd1Jvb3QobmV4dCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIE9ORSBub2RlIHRocm91Z2ggYWxsIDcgcGhhc2VzIOKAlCB0aGUgb2xkIHJlY3Vyc2l2ZSBgZXhlY3V0ZU5vZGVgXG4gICAqIGJvZHk7IG9ubHkgdGhlIHRhaWwgY2FsbHMgYmVjYW1lIGBDb250aW51YXRpb25Ib3BgIHJldHVybnMuIFJldHVybnMgdGhlXG4gICAqIG5vZGUncyByZXN1bHQsIG9yIGEgaG9wIGZvciB0aGUgZHJpdmVyIGxvb3AgdG8gZm9sbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZVN0ZXAoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gQXR0YWNoIGJ1aWxkZXIgbWV0YWRhdGEgdG8gY29udGV4dCBmb3Igc25hcHNob3QgZW5yaWNobWVudC5cbiAgICAvLyBTdWJmbG93IG1ldGEgcmVhZHMgZ28gdGhyb3VnaCB0aGUgZHluYW1pYy1wYXRjaCBvdmVybGF5IOKAlCBhIG5vZGVcbiAgICAvLyBwYXRjaGVkIGJ5IGEgZHluYW1pYy1zdWJmbG93IHJldHVybiByZS1lbnRlcnMgZXhlY3V0ZU5vZGUgYW5kIG11c3RcbiAgICAvLyBjbGFzc2lmeSBhcyBhIHN1YmZsb3cgd2l0aG91dCB0aGUgc2hhcmVkIG5vZGUgZXZlciBiZWluZyBtdXRhdGVkLlxuICAgIGlmIChub2RlLmRlc2NyaXB0aW9uKSBjb250ZXh0LmRlc2NyaXB0aW9uID0gbm9kZS5kZXNjcmlwdGlvbjtcbiAgICBjb25zdCBlZmZTdWJmbG93SWQgPSB0aGlzLmVmZlN1YmZsb3dJZChub2RlKTtcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkgY29udGV4dC5zdWJmbG93SWQgPSBlZmZTdWJmbG93SWQ7XG5cbiAgICAvLyBBc3NpZ24gcnVudGltZVN0YWdlSWQgQkVGT1JFIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24g4oCUIGVuc3VyZXMgc2NvcGUgZXZlbnRzXG4gICAgLy8gKGJ1ZmZlcmVkIGJ5IHJ1bnRpbWVTdGFnZUlkKSBhbmQgZmxvdyBldmVudHMgKGZsdXNoZWQgYnkgdHJhdmVyc2FsQ29udGV4dC5ydW50aW1lU3RhZ2VJZClcbiAgICAvLyB1c2UgdGhlIHNhbWUgdmFsdWUuIE11c3QgaGFwcGVuIGJlZm9yZSBleGVjdXRlU3RhZ2UgQU5EIGJlZm9yZSB0cmF2ZXJzYWxDb250ZXh0LlxuICAgIGNvbnN0IGlkeCA9IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUrKztcbiAgICBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkID0gYnVpbGRSdW50aW1lU3RhZ2VJZChub2RlLmlkLCBpZHgpO1xuICAgIGNvbnRleHQuYmluZEVtaXRPcmlnaW4odGhpcy5ydW5JZCwgdGhpcy5lbWl0RHJpbGxQYXRoKTtcbiAgICAvLyBEZWNsYXJlZCB0YWdzICg5LjIxLjApIHJpZGUgdGhlIHNhbWUgc3RhbXA6IHBlci1ub2RlIGlkZW50aXR5LCBzZXRcbiAgICAvLyBVTkNPTkRJVElPTkFMTFkgc28gYSByZS11c2VkIGNvbnRleHQgKGEgbG9vcCdzIG5leHQtY29udGV4dCwgYSByZXN1bWVkXG4gICAgLy8gbGVnKSBuZXZlciBrZWVwcyBhIHByZXZpb3VzIG5vZGUncyBuYW1lcy4gYFN0YWdlQ29udGV4dC5jb21taXRgIHJlY29yZHNcbiAgICAvLyB0aGVtIG9uIHRoZSBmaXJzdCBidW5kbGUgb2YgdGhpcyBleGVjdXRpb24gYW5kIHJlbGVhc2VzIHRoZW0uXG4gICAgY29udGV4dC50YWdzID0gbm9kZS50YWdzO1xuXG4gICAgLy8gUkZDLTAwMyBEMTogcnVudGltZSBwYXJlbnQg4oCUIHRoZSBwcmV2aW91cyBleGVjdXRpb24gc3RlcCdzIHJ1bnRpbWVTdGFnZUlkLlxuICAgIC8vIEZhbGxzIGJhY2sgdG8gdGhlIHN1YmZsb3cgTU9VTlQncyBydW50aW1lU3RhZ2VJZCBmb3IgdGhlIHN1YmZsb3cgcm9vdFxuICAgIC8vIHN0YWdlIChpdHMgU3RhZ2VDb250ZXh0IGlzIGNyZWF0ZWQgZnJlc2ggd2l0aCBubyBwYXJlbnQpLCBzbyBydW50aW1lXG4gICAgLy8gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllcy4gYHx8YCAobm90IGA/P2ApIG9uIHB1cnBvc2U6XG4gICAgLy8gYSBwYXJlbnQgY29udGV4dCB0aGF0IG5ldmVyIGV4ZWN1dGVkIHN0aWxsIGNhcnJpZXMgdGhlIGZpZWxkJ3NcbiAgICAvLyBpbml0aWFsIGAnJ2AsIHdoaWNoIG11c3QgYWxzbyBmYWxsIHRocm91Z2ggdG8gdGhlIG1vdW50IGZhbGxiYWNrLlxuICAgIGNvbnN0IHBhcmVudFJ1bnRpbWVTdGFnZUlkID0gY29udGV4dC5wYXJlbnQ/LnJ1bnRpbWVTdGFnZUlkIHx8IHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcblxuICAgIC8vIGxvb3BJdGVyYXRpb24g4oCUIGhvdyBtYW55IHRpbWVzIFRISVMgc3RhZ2UgaGFzIHJ1biBiZWZvcmUgaW4gdGhpcyBydW4uXG4gICAgLy8gS2V5ZWQgYnkgdGhlIHNhbWUgc3RhZ2VJZCB3ZSBzdGFtcCBvbiB0aGUgY29udGV4dCAoYW5kIHRoZSBzYW1lIHZhbHVlIHRoZVxuICAgIC8vIG5hcnJhdGl2ZSByZWNvcmRlciBjb3VudHMgb24pLCBydW4tc2NvcGVkIGFuZCBzaGFyZWQgYWNyb3NzIHN1YmZsb3dcbiAgICAvLyByZS1tb3VudHMgdmlhIGBfdmlzaXRDb3VudHNgLiB1bmRlZmluZWQgb24gdGhlIGZpcnN0IHZpc2l0OyAxIG9uIHRoZVxuICAgIC8vIGZpcnN0IGxvb3AtYmFjaywgMiBvbiB0aGUgbmV4dCwg4oCmIOKAlCBpLmUuIHZpc2l0Q291bnQgLSAxLiBDb3VudGVkIGZvclxuICAgIC8vIEVWRVJZIHN0YWdlIGtpbmQgKGFueSBub2RlIGNhbiBiZSBhIGxvb3AgdGFyZ2V0KSwgdW5saWtlIHRoZSBuYXJyYXRpdmVcbiAgICAvLyByZWNvcmRlciB3aGljaCBvbmx5IHJlbmRlcnMgaXQgZm9yIGxpbmVhciBzdGFnZXMuXG4gICAgY29uc3QgY29udGV4dFN0YWdlSWQgPSBub2RlLmlkID8/IGNvbnRleHQuc3RhZ2VJZDtcbiAgICBjb25zdCB2aXNpdENvdW50ID0gKHRoaXMuX3Zpc2l0Q291bnRzLmdldChjb250ZXh0U3RhZ2VJZCkgPz8gMCkgKyAxO1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzLnNldChjb250ZXh0U3RhZ2VJZCwgdmlzaXRDb3VudCk7XG4gICAgY29uc3QgbG9vcEl0ZXJhdGlvbiA9IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCB0cmF2ZXJzYWwgY29udGV4dCBmb3IgcmVjb3JkZXIgZXZlbnRzIOKAlCBjcmVhdGVkIG9uY2UgcGVyIHN0YWdlLCBzaGFyZWQgYnkgYWxsIGV2ZW50c1xuICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQgPSB0cmF2ZXJzYWxDb250ZXh0Rm9yKHtcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgc3RhZ2VJZDogY29udGV4dFN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgcGFyZW50U3RhZ2VJZDogY29udGV4dC5wYXJlbnQ/LnN0YWdlSWQsXG4gICAgICBwYXJlbnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gam9pblBhdGgobm9kZS5zdWJmbG93SWQhLCBrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tb3VudFN1YmZsb3dgICg5LjM3LjAgZml4KTogdGhlXG4gICAgICAgICAgICAvLyBuZXN0ZWQgcm9vdCdzIGlkcyBsaXZlIHVuZGVyIHRoZSBsYXp5IG1vdW50J3MgcGF0aCB0b28uXG4gICAgICAgICAgICB0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSA9IHtcbiAgICAgICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIG5vZGUuc3ViZmxvd0lkISksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgLy8gSGFuZCBoZWxwZXJzIHRoZSBFRkZFQ1RJVkUgbm9kZSB2aWV3IChidWlsdCBmaWVsZHMgKyBkeW5hbWljIHBhdGNoKVxuICAgICAgLy8gc28gU3ViZmxvd0V4ZWN1dG9yL05vZGVSZXNvbHZlciBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy5cbiAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG1vdW50Tm9kZSk7XG5cbiAgICAgIGNvbnN0IHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbW91bnROb2RlO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG1vdW50Tm9kZS5jaGlsZHJlbiAmJiBtb3VudE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBCcmVhay1mbGFnIGNoZWNrIEFGVEVSIHN1YmZsb3cgcmV0dXJucyDilIDilIDilIBcbiAgICAgIC8vIElmIHRoZSBzdWJmbG93IHdhcyBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBhbmQgYnJva2VcbiAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgIC8vIFN0b3AgdGhlIG91dGVyIHRyYXZlcnNhbCBoZXJlIOKAlCBkbyBub3QgcnVuIHRoZSBuZXh0IGxpbmVhciBzdGFnZS5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICAvLyBBIG1vdW50J3MgYG5leHRgIGNhbiBiZSBhIGxvb3AtcmVmIFNUVUIg4oCUIGEgc3ViZmxvdyBtb3VudGVkIGFzIGFcbiAgICAgICAgLy8gZGVjaWRlciBicmFuY2ggd2l0aCBgeyBsb29wVG8gfWAgLyBgLmxvb3BUbygpYC4gUmVzb2x2ZSBpdCBsaWtlXG4gICAgICAgIC8vIFBoYXNlIDYgZG9lcyAoaXRlcmF0aW9uIGNvdW50ZWQsIGBvbkxvb3BgIGZpcmVkKTsgaG9wcGluZyBpbnRvIHRoZVxuICAgICAgICAvLyBiYXJlIHN0dWIgcmFuIHRoZSB0YXJnZXQncyBmdW5jdGlvbiBvbmNlIGFuZCBlbmRlZCB0aGUgcnVuLlxuICAgICAgICBpZiAobm9kZS5uZXh0LmlzTG9vcFJlZikgcmV0dXJuIHRoaXMubG9vcEhvcChub2RlLm5leHQsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYjogUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCwgb25lIGJyYW5jaCBwZXIgaXRlbSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFNpdHMgQkVGT1JFIFBoYXNlIDEgKFZBTElEQVRFKSBvbiBwdXJwb3NlOiB0aGlzIG5vZGUgbGVnaXRpbWF0ZWx5IGhhcyBub1xuICAgIC8vIHN0YWdlIGZ1bmN0aW9uLCBubyBzdGF0aWMgY2hpbGRyZW4sIGFuZCBubyBkZWNpZGVyIOKAlCBpdHMgYnJhbmNoZXMgZG8gbm90XG4gICAgLy8gZXhpc3QgdW50aWwgYGl0ZW1zKClgIHJ1bnMg4oCUIHNvIHRoZSBcIm11c3QgZGVmaW5lIGZuIE9SIGNoaWxkcmVuXCIgY2hlY2tcbiAgICAvLyB3b3VsZCByZWplY3QgYSBwZXJmZWN0bHkgdmFsaWQgY2hhcnQuIFRoZSBoYW5kbGVyIG93bnMgaXRzIG93biBjb21taXRcbiAgICAvLyAodGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSksIGxpa2UgdGhlIGRlY2lkZXIgYW5kIHNlbGVjdG9yIHBoYXNlcyBkby5cbiAgICBpZiAobm9kZS5pc0R5bmFtaWNQYXJhbGxlbCAmJiBub2RlLnBhcmFsbGVsRm9yRWFjaCkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlci5ydW4obm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgIGNvbnN0IGhhc1N0YWdlRnVuY3Rpb24gPSBCb29sZWFuKHN0YWdlRnVuYyk7XG4gICAgY29uc3QgaXNTY29wZUJhc2VkRGVjaWRlciA9IEJvb2xlYW4obm9kZS5kZWNpZGVyRm4pO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgIGNvbnN0IGlzRGVjaWRlck5vZGUgPSBpc1Njb3BlQmFzZWREZWNpZGVyO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbih0aGlzLmVmZkNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpO1xuICAgIC8vIGBuZXh0YCBpcyBuZXZlciBvdmVybGFpZCDigJQgYSBkeW5hbWljIG5leHQgYXBwbGllcyBvbmx5IHRvIHRoZSB2aXNpdFxuICAgIC8vIHRoYXQgcHJvZHVjZWQgaXQgKGhhbmRsZWQgdmlhIHRoZSBgZHluYW1pY05leHRgIGxvY2FsIGJlbG93KSwgc28gdGhlXG4gICAgLy8gYnVpbHQgY2hhcnQncyBuZXh0IGlzIGFsd2F5cyB0aGUgY29ycmVjdCBjb250aW51YXRpb24gaGVyZS5cbiAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgIGNvbnN0IG9yaWdpbmFsTmV4dCA9IG5vZGUubmV4dDtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAxOiBWQUxJREFURSDigJQgbm9kZSBpbnZhcmlhbnRzIOKUgOKUgOKUgFxuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTm9kZSAnJHtub2RlLm5hbWV9JyBtdXN0IGRlZmluZTogZW1iZWRkZWQgZm4gT1IgYSBzdGFnZU1hcCBlbnRyeSBPUiBoYXZlIGNoaWxkcmVuL2RlY2lkZXJgO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzRGVjaWRlck5vZGUgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnU2VsZWN0b3Igbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbikge1xuICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIGNvbnRleHQuc2V0QXNEZWNpZGVyKCk7XG4gICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICB9XG5cbiAgICBjb25zdCBicmVha0ZuID0gY3JlYXRlQnJlYWtIYW5kbGVyKGJyZWFrRmxhZyk7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMmE6IFNFTEVDVE9SIOKAlCBzY29wZS1iYXNlZCBtdWx0aS1jaG9pY2Ug4pSA4pSA4pSAXG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGhhbmRsZXIgY29tbWl0dGVkIGFuZCByZWNvcmRlZCB0aGUgc3RvcC4gRG8gbm90IGNyZWF0ZSBhIG5leHRcbiAgICAgIC8vIGZyYW1lIG9yIHJlc29sdmUgYSBsb29wIGVkZ2UgZm9yIGEgc2VsZWN0b3IgdGhhdCBzdG9wcGVkIGhlcmUuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG5cbiAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgIC8vIEEgc2VsZWN0b3IncyBvd24gYGxvb3BUb2AgaXMgYSBsb29wIGVkZ2UgbGlrZSBhbnkgb3RoZXI6IHJlc29sdmVkXG4gICAgICAgIC8vIChpdGVyYXRpb24gZ3VhcmQgKyBgb25Mb29wYCksIG5ldmVyIGEgaG9wIGludG8gdGhlIGJhcmUgc3R1Yi5cbiAgICAgICAgaWYgKG5vZGUubmV4dCEuaXNMb29wUmVmID09PSB0cnVlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5vZGUubmV4dCEsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLnByZXBhcmVEaXNwYXRjaChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gTm8gZGVjaWRlci1sZXZlbCBjb250aW51YXRpb24g4oaSIHRoZSBicmFuY2ggZGlzcGF0Y2ggaXMgYSB0YWlsXG4gICAgICAvLyBjYWxsLiBIYW5kIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBmbGF0IGhvcCBzbyBsb29wLWhlYXZ5IGRlY2lkZXJcbiAgICAgIC8vIGNoYXJ0cyAoZS5nLiBhZ2VudCBSZUFjdCBsb29wcyB3aXRoIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBzdGF5XG4gICAgICAvLyBmbGF0LXN0YWNrZWQuIFRoZSBpbnZva2VyIHN0YW1wIHByZXNlcnZlcyBQYXVzZVNpZ25hbCBzZW1hbnRpY3Mg4oCUXG4gICAgICAvLyB0aGUgZGVjaWRlciBpcyB0aGUgaW52b2tlciBvZiB3aGF0ZXZlciBwYXVzZXMgaW4gdGhlIGNoYWluLlxuICAgICAgaWYgKCFoYXNOZXh0ICYmIGRpc3BhdGNoLmtpbmQgPT09ICdkaXNwYXRjaCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJhbmNoUGF0aCwgeyBpbnZva2VyU3RhZ2VJZDogbm9kZS5pZCEgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZXIgV0lUSCBpdHMgb3duIG5leHQ6IHRoZSBicmFuY2ggY2hhaW4gbXVzdCBjb21wbGV0ZSBCRUZPUkVcbiAgICAgIC8vIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMg4oCUIHRydWUgdHJlZSBuZXN0aW5nLCBrZXB0XG4gICAgICAvLyByZWN1cnNpdmUgKGEgbmVzdGVkIGRyaXZlciwgcnVuIGFzIGEgQlJBTkNIIEZSQU1FKS4gTWlycm9yc1xuICAgICAgLy8gaGFuZGxlU2NvcGVCYXNlZCBleGFjdGx5LCBpbmNsdWRpbmcgdGhlIFBhdXNlU2lnbmFsIGludm9rZXIgc3RhbXBcbiAgICAgIC8vIG9uIGJ1YmJsZS11cC5cbiAgICAgIGxldCBkZWNpZGVyUmVzdWx0OiBhbnk7XG4gICAgICBpZiAoZGlzcGF0Y2gua2luZCA9PT0gJ2JyZWFrJykge1xuICAgICAgICBkZWNpZGVyUmVzdWx0ID0gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY2lkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKFxuICAgICAgICAgICAgZGlzcGF0Y2guY2hvc2VuLFxuICAgICAgICAgICAgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCxcbiAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0aGlzLmJyYW5jaEZyYW1lRm9yKGNvbnRleHQsIG9yaWdpbmFsTmV4dCEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBMT09QRUQgT1VUIG9mIGl0cyBmcmFtZSAoYmFjayB0aHJvdWdoIHRoaXMgZGVjaWRlciBvclxuICAgICAgICAvLyBmdXJ0aGVyIHVwKTogdGhlIGJyYW5jaCBuZXZlciBjb21wbGV0ZWQsIHNvIHRoaXMgZGVjaWRlcidzIGBuZXh0YFxuICAgICAgICAvLyBpcyBub3QgZHVlIOKAlCBmb2xsb3cgdGhlIGxvb3AgZmxhdCBhdCB0aGlzIGxldmVsLiBUaGUgYG5leHRgIHJ1bnNcbiAgICAgICAgLy8gb25jZSwgYWZ0ZXIgdGhlIHBhc3Mgd2hvc2UgYnJhbmNoIGNvbXBsZXRlcyAoQ0xBVURFLm1kIFwibG9vcFwiOiBhXG4gICAgICAgIC8vIGZsYXQgaG9wIHdpdGggemVybyBzdGFjaykuXG4gICAgICAgIGlmIChpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KGRlY2lkZXJSZXN1bHQpKSByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgIGlmIChoYXNOZXh0ICYmICFicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgLy8gc2luY2UgaWQta2V5ZWQgc3RhZ2VNYXBzIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBsb29wIHRhcmdldHMgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTG9vcFN0dWIobmV4dE5vZGUpKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXR1cm5lZER5bmFtaWNOb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoc3RhZ2VGdW5jKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIC8vIFI1IGF0IHRoZSBydW4tdGltZSBkb29yOiBhIHJldHVybmVkIFN0YWdlTm9kZSBhZG9wdHMgaWRzIHRoZSBidWlsZGVyXG4gICAgICAgIC8vIG5ldmVyIHNhdy4gUmVmdXNlZCBoZXJlLCBpbnNpZGUgdGhlIHRyeSwgc28gaXQgdGFrZXMgdGhlIHN0YWdlJ3NcbiAgICAgICAgLy8gZXJyb3IgcGF0aCAoY29tbWl0LCBvbkVycm9yLCByZXRocm93KS5cbiAgICAgICAgdGhpcy5hZG1pdER5bmFtaWNJZHMoc3RhZ2VPdXRwdXQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3csIG5vdCBhbiBlcnJvciDigJQgZmlyZSBuYXJyYXRpdmUsIGNvbW1pdCwgcmUtdGhyb3cuXG4gICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgICAgICAgIG5vZGUubmFtZSxcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBlcnJvci5wYXVzZURhdGEpLFxuICAgICAgICAgICAgZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gcmVjb3JkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvcik7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciwgbm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdsaW5lYXInKTtcblxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICAvLyBGb3J3YXJkIHRoZSBvcHRpb25hbCByZWFzb24gY2FwdHVyZWQgb24gYnJlYWtGbGFnIOKAlCBzZXQgYnkgdGhlXG4gICAgICAgIC8vIHN0YWdlJ3MgJGJyZWFrKHJlYXNvbikgY2FsbCBPUiBieSBhIHN1YmZsb3cncyBwcm9wYWdhdGVCcmVhay5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQsIGJyZWFrRmxhZy5yZWFzb24pO1xuICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA0OiBEWU5BTUlDIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiDilIDilIDilIBcbiAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCBkeW5hbWljTm9kZSA9IHN0YWdlT3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgICByZXR1cm5lZER5bmFtaWNOb2RlID0gdHJ1ZTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2lzRHluYW1pYycsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnU3RhZ2VOb2RlUmV0dXJuJyk7XG5cbiAgICAgICAgLy8gRHluYW1pYyBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLiBUaGUgc3ViZmxvdyBtZXRhIGxhbmRzIGluIHRoZVxuICAgICAgICAvLyB0cmF2ZXJzZXItbG9jYWwgb3ZlcmxheSAoTk9UIG9uIHRoZSBzaGFyZWQgbm9kZSk7IHRoZSBpbW1lZGlhdGVcbiAgICAgICAgLy8gZXhlY3V0ZU5vZGUgcmUtZW50cnkgc2VlcyBpdCB0aHJvdWdoIHRoZSBlZmYqIGFjY2Vzc29ycyBhbmRcbiAgICAgICAgLy8gY2xhc3NpZmllcyB0aGUgbm9kZSBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmlzU3ViZmxvd1Jvb3QgJiYgZHluYW1pY05vZGUuc3ViZmxvd0RlZiAmJiBkeW5hbWljTm9kZS5zdWJmbG93SWQpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1N1YmZsb3dJZCcsIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCk7XG5cbiAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoZHluYW1pY05vZGUuc3ViZmxvd0lkLCBkeW5hbWljTm9kZS5zdWJmbG93RGVmLCBub2RlLmlkKTtcblxuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5zdWJmbG93TWV0YSA9IHtcbiAgICAgICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgICAgICBzdWJmbG93SWQ6IGR5bmFtaWNOb2RlLnN1YmZsb3dJZCxcbiAgICAgICAgICAgIHN1YmZsb3dOYW1lOiBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IGR5bmFtaWNOb2RlLnN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlLWVudGVyIFRISVMgbm9kZSAoc2FtZSBjb250ZXh0KTogdGhlIG92ZXJsYXkgcGF0Y2ggbWFrZXMgdGhlXG4gICAgICAgICAgLy8gbmV4dCBzdGVwIGNsYXNzaWZ5IGl0IGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNoaWxkcmVuIGZvciBzdWJmbG93RGVmXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC5pc1N1YmZsb3dSb290ICYmIGNoaWxkLnN1YmZsb3dEZWYgJiYgY2hpbGQuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihjaGlsZC5zdWJmbG93SWQsIGNoaWxkLnN1YmZsb3dEZWYsIGNoaWxkLmlkKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgIGNoaWxkLmlkLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgY2hpbGRyZW4gKGZvcmsgcGF0dGVybikg4oCUIHBhdGNoZWQgaW50byB0aGUgb3ZlcmxheTtcbiAgICAgICAgLy8gUGhhc2UgNSBiZWxvdyByZWFkcyB0aGVtIGJhY2sgdGhyb3VnaCBlZmZDaGlsZHJlbi9lZmZTZWxlY3Rvci5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuICYmIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY0NoaWxkQ291bnQnLCBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKFxuICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSxcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUuZGVjaWRlckZuKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkubmV4dE5vZGVTZWxlY3RvciA9IGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3I7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzU2VsZWN0b3InLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG5leHQgKGxpbmVhciBjb250aW51YXRpb24pIOKAlCBzdGF5cyBhIExPQ0FMOiBpdCBhcHBsaWVzXG4gICAgICAgIC8vIG9ubHkgdG8gdGhpcyB2aXNpdCAoUGhhc2UgNiByb3V0ZXMgaXQgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gQ29udGludWF0aW9uUmVzb2x2ZXIpLCBzbyB0aGUgc2hhcmVkIG5vZGUncyBuZXh0IGlzIG5ldmVyIHRvdWNoZWRcbiAgICAgICAgLy8gYW5kIGEgbG9vcCByZXZpc2l0IG5hdHVyYWxseSBzZWVzIHRoZSBidWlsdCBjb250aW51YXRpb24uXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5uZXh0KSB7XG4gICAgICAgICAgZHluYW1pY05leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljTmV4dChub2RlLmlkLCBkeW5hbWljTm9kZS5uZXh0KTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzRHluYW1pY05leHQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWdlT3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA1OiBDSElMRFJFTiDigJQgZm9yayBkaXNwYXRjaCDilIDilIDilIBcbiAgICAvLyBSZS1yZWFkIHRocm91Z2ggdGhlIG92ZXJsYXk6IFBoYXNlIDQgbWF5IGhhdmUganVzdCBwYXRjaGVkIGR5bmFtaWNcbiAgICAvLyBjaGlsZHJlbi9zZWxlY3RvciBmb3IgVEhJUyB2aXNpdCAob3IgYW4gZWFybGllciB2aXNpdCBpbiB0aGlzIHJ1bikuXG4gICAgY29uc3QgY2hpbGRyZW5BZnRlclN0YWdlID0gdGhpcy5lZmZDaGlsZHJlbihub2RlKTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbkFmdGVyU3RhZ2UgPSBCb29sZWFuKGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcblxuICAgIGlmIChoYXNDaGlsZHJlbkFmdGVyU3RhZ2UpIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCd0b3RhbENoaWxkcmVuJywgY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuICAgICAgY29udGV4dC5hZGRMb2coJ29yZGVyT2ZFeGVjdXRpb24nLCAnQ2hpbGRyZW5BZnRlclN0YWdlJyk7XG5cbiAgICAgIGxldCBub2RlQ2hpbGRyZW5SZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT47XG5cbiAgICAgIGNvbnN0IGVmZlNlbGVjdG9yRm4gPSB0aGlzLmVmZlNlbGVjdG9yKG5vZGUpO1xuICAgICAgaWYgKGVmZlNlbGVjdG9yRm4pIHtcbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICAgICAgICBlZmZTZWxlY3RvckZuLFxuICAgICAgICAgIGNoaWxkcmVuQWZ0ZXJTdGFnZSEsXG4gICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBicmFuY2hQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgIG5vZGUuZmFpbEZhc3QsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnY2hpbGRyZW4nLCBgRXhlY3V0aW5nIGFsbCAke2NoaWxkQ291bnR9IGNoaWxkcmVuIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCwge1xuICAgICAgICAgIGNvdW50OiBjaGlsZENvdW50LFxuICAgICAgICAgIHRhcmdldFN0YWdlOiBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZWZmTm9kZTogQ2hpbGRyZW5FeGVjdXRvciByZWFkcyBub2RlLmNoaWxkcmVuL25vZGUuZmFpbEZhc3QgaXRzZWxmLlxuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgdGhpcy5lZmZOb2RlKG5vZGUpLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yay1vbmx5OiByZXR1cm4gYnVuZGxlXG4gICAgICBpZiAoIWhhc05leHQgJiYgIWR5bmFtaWNOZXh0KSB7XG4gICAgICAgIHJldHVybiBub2RlQ2hpbGRyZW5SZXN1bHRzITtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FwdHVyZSBkeW5hbWljIGNoaWxkcmVuIGFzIHN5bnRoZXRpYyBzdWJmbG93IHJlc3VsdCBmb3IgVUlcbiAgICAgIC8vIFJ1bnRpbWUgc3RydWN0dXJlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGg7IGRpYWdub3N0aWMgdGV4dCBtYXkgYmVcbiAgICAgIC8vIG1hc2tlZCAob3IgdXNlci13cml0dGVuKSBhbmQgbXVzdCBuZXZlciBkZWNpZGUgY2FwdHVyZSBiZWhhdmlvci5cbiAgICAgIGlmIChyZXR1cm5lZER5bmFtaWNOb2RlICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZSwgY2hpbGRyZW5BZnRlclN0YWdlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgIGlmIChkeW5hbWljTmV4dCkgcmV0dXJuIHRoaXMubG9vcEhvcChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG5cbiAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuXG4gICAgICAvLyBEZXRlY3QgbG9vcCByZWZlcmVuY2Ugbm9kZXMgY3JlYXRlZCBieSBsb29wVG8oKSDigJQgbWFya2VkIHdpdGggaXNMb29wUmVmIGZsYWcuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIENvbnRpbnVhdGlvblJlc29sdmVyIGZvciBwcm9wZXIgSUQgcmVzb2x1dGlvbiwgaXRlcmF0aW9uXG4gICAgICAvLyB0cmFja2luZywgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0aW9uLiBUaGUgcmVzb2x2ZWQgdGFyZ2V0IGNvbWVzIGJhY2tcbiAgICAgIC8vIGFzIGEgaG9wIOKAlCBsb29wIGVkZ2VzIGNvbnN1bWUgbm8gc3RhY2ssIHNvIHRoZSBpdGVyYXRpb24gbGltaXRcbiAgICAgIC8vIChub3QgY2FsbC1zdGFjayBkZXB0aCkgaXMgd2hhdCBib3VuZHMgYSBsb29wLlxuICAgICAgY29uc3QgaXNMb29wUmVmZXJlbmNlID0gbmV4dE5vZGUuaXNMb29wUmVmO1xuXG4gICAgICBpZiAoaXNMb29wUmVmZXJlbmNlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke25leHROb2RlLm5hbWV9IHN0YWdlYCwge1xuICAgICAgICB0YXJnZXRTdGFnZTogbmV4dE5vZGUubmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNzogTEVBRiDigJQgbm8gY29udGludWF0aW9uIOKUgOKUgOKUgFxuICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBQcml2YXRlIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBjYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoaWxkcmVuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdLFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U3RhZ2VJZCA9IGNvbnRleHQuZ2V0U3RhZ2VJZCgpO1xuXG4gICAgY29uc3QgY2hpbGRTdHJ1Y3R1cmU6IGFueSA9IHtcbiAgICAgIGlkOiBgJHtub2RlLmlkfS1jaGlsZHJlbmAsXG4gICAgICBuYW1lOiAnRHluYW1pYyBDaGlsZHJlbicsXG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5pZCxcbiAgICAgICAgbmFtZTogYy5uYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZFN0YWdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBpZiAoY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZEN0eCBvZiBjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gY2hpbGRDdHguZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY2hpbGRTdGFnZXNbc25hcHNob3QubmFtZSB8fCBzbmFwc2hvdC5pZF0gPSB7XG4gICAgICAgICAgbmFtZTogc25hcHNob3QubmFtZSxcbiAgICAgICAgICBvdXRwdXQ6IHNuYXBzaG90LmxvZ3MsXG4gICAgICAgICAgZXJyb3JzOiBzbmFwc2hvdC5lcnJvcnMsXG4gICAgICAgICAgbWV0cmljczogc25hcHNob3QubWV0cmljcyxcbiAgICAgICAgICBzdGF0dXM6IHNuYXBzaG90LmVycm9ycyAmJiBPYmplY3Qua2V5cyhzbmFwc2hvdC5lcnJvcnMpLmxlbmd0aCA+IDAgPyAnZXJyb3InIDogJ3N1Y2Nlc3MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuc2V0KG5vZGUuaWQsIHtcbiAgICAgIHN1YmZsb3dJZDogbm9kZS5pZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBub2RlLm5hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiB7fSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogY2hpbGRTdGFnZXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIGluaXRpYWxTdGF0ZToge30sXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lU3RydWN0dXJlOiBjaGlsZFN0cnVjdHVyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGdlbmVyYXRlZCBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2ggYXMgYSBzdWJmbG93IOKAlCBPVkVSV1JJVElOR1xuICAgKiBhbnkgcmVnaXN0cmF0aW9uIGZyb20gYSBwcmV2aW91cyB2aXNpdC5cbiAgICpcbiAgICogRGVsaWJlcmF0ZSBkaXZlcmdlbmNlIGZyb20gYGF1dG9SZWdpc3RlclN1YmZsb3dEZWZgJ3MgZmlyc3Qtd3JpdGUtd2lucy5cbiAgICogR2VuZXJhdGVkIHNlZ21lbnRzIGFyZSBzdGFibGUgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucyAoYDxzdGFnZUlkPn48aW5kZXg+YFxuICAgKiBpcyBkZXJpdmVkIGZyb20gdGhlIHN0YWdlIGlkIGFuZCB0aGUgYnJhbmNoIGluZGV4LCBuZWl0aGVyIG9mIHdoaWNoXG4gICAqIGNoYW5nZXMpLCBzbyBmaXJzdC13cml0ZS13aW5zIHdvdWxkIG1lYW4gYSBMT09QSU5HIGZhbi1vdXQgc2lsZW50bHlcbiAgICogcmUtZXhlY3V0aW5nIGl0ZXJhdGlvbiAxJ3MgYnJhbmNoIGNoYXJ0cyBmb3JldmVyIOKAlCBldmVuIHdoZW4gdGhlIGJyYW5jaFxuICAgKiBmYWN0b3J5IHJldHVybnMgYSBkaWZmZXJlbnQgY2hhcnQgZWFjaCB0aW1lLiBUaGF0IGlzIHRoZSBcIndvdWxkIG5vdCBjcmFzaCxcbiAgICogd291bGQgc2lsZW50bHkgY29ycnVwdFwiIGZhaWx1cmUgY2xhc3MgdGhpcyB3aG9sZSBkZXNpZ24gaXMgYnVpbHQgdG8gYXZvaWQsXG4gICAqIHNvIGEgcmVnZW5lcmF0ZWQgYnJhbmNoIGFsd2F5cyByZXBsYWNlcyBpdHMgcHJlZGVjZXNzb3IuIFBlci1pdGVyYXRpb25cbiAgICogcmVzdWx0cyBzdGF5IGFkZHJlc3NhYmxlIHZpYSB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgIGtleSwgZXhhY3RseSBhc1xuICAgKiBmb3IgYSBoYW5kLWF1dGhvcmVkIGxvb3Bpbmcgc3ViZmxvdy5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJCcmFuY2hTdWJmbG93KFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoYXJ0OiB7IHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+OyBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlIH0+IH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc3ViZmxvd3Nbc3ViZmxvd0lkXSA9IHsgcm9vdCB9O1xuXG4gICAgLy8gU3RhZ2UgZnVuY3Rpb25zIGxhbmQgdW5kZXIgdGhlIGJyYW5jaCdzIHByZWZpeCwgbWF0Y2hpbmcgdGhlIHByZWZpeGVkIGlkcy5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBjaGFydC5zdGFnZU1hcCkge1xuICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoam9pblBhdGgoc3ViZmxvd0lkLCBrZXkpLCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgIH1cblxuICAgIC8vIE5lc3RlZCBzdWJmbG93cyBpbnNpZGUgdGhlIGJyYW5jaCBjaGFydCwgc2FtZSBwcmVmaXhpbmcuXG4gICAgaWYgKGNoYXJ0LnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcnQuc3ViZmxvd3MpKSB7XG4gICAgICAgIC8vIFByZWZpeGVkIGxpa2UgdGhlIGJ1aWxkZXIncyBgX21vdW50U3ViZmxvd2AgKDkuMzcuMCBmaXgpOiB3aXRob3V0IGl0XG4gICAgICAgIC8vIGV2ZXJ5IGJyYW5jaCByYW4gaXRzIG5lc3RlZCBzdWJmbG93J3Mgc3RhZ2VzIHVuZGVyIE9ORSBpZC5cbiAgICAgICAgdGhpcy5zdWJmbG93c1tqb2luUGF0aChzdWJmbG93SWQsIGtleSldID0ge1xuICAgICAgICAgIHJvb3Q6IHByZWZpeE5vZGVUcmVlKChkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9KS5yb290LCBzdWJmbG93SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggYSBub2RlIHRyZWUgd2l0aCBhIHN1YmZsb3cgcGF0aCBzZWdtZW50IGF0IFJVTiB0aW1lIChsYXp5IHN1YmZsb3dzLFxuICAgKiB0aGUgZ2VuZXJhdGVkIGJyYW5jaGVzIG9mIGBhZGRQYXJhbGxlbEZvckVhY2hgKSDigJQgdGhlIG9uZSBwcmVmaXhlcixcbiAgICogYGVuZ2luZS9ncmFwaC9wcmVmaXhOb2RlVHJlZS50c2AsIHdoaWNoIHRoZSBidWlsZGVyIGNhbGxzIGF0IG1vdW50IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIHByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gcHJlZml4Tm9kZVRyZWUobm9kZSwgcHJlZml4KTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93RGVmOiBOb25OdWxsYWJsZTxTdGFnZU5vZGVbJ3N1YmZsb3dEZWYnXT4sXG4gICAgbW91bnROb2RlSWQ/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIHRoaXMuc3ViZmxvd3MgaXMgYWx3YXlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvcjsgdGhlIG51bGwgZ3VhcmQgYmVsb3cgaXMgdW5yZWFjaGFibGUuXG4gICAgY29uc3Qgc3ViZmxvd3NEaWN0ID0gdGhpcy5zdWJmbG93cztcblxuICAgIC8vIEZpcnN0LXdyaXRlLXdpbnNcbiAgICBjb25zdCBpc05ld1JlZ2lzdHJhdGlvbiA9ICFzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXTtcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24gJiYgc3ViZmxvd0RlZi5yb290KSB7XG4gICAgICBzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXSA9IHtcbiAgICAgICAgcm9vdDogc3ViZmxvd0RlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgICAgICAuLi4oc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgPyB7IGJ1aWxkVGltZVN0cnVjdHVyZTogc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXMgKHBhcmVudCBlbnRyaWVzIHByZXNlcnZlZClcbiAgICBpZiAoc3ViZmxvd0RlZi5zdGFnZU1hcCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgQXJyYXkuZnJvbShzdWJmbG93RGVmLnN0YWdlTWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoa2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgaWYgKHN1YmZsb3dEZWYuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93RGVmLnN1YmZsb3dzKSkge1xuICAgICAgICBpZiAoIXN1YmZsb3dzRGljdFtrZXldKSB7XG4gICAgICAgICAgc3ViZmxvd3NEaWN0W2tleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vdW50Tm9kZUlkKSB7XG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG1vdW50Tm9kZUlkLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IEZsb3dSZWNvcmRlcnMgb25seSBvbiBmaXJzdCByZWdpc3RyYXRpb24gKG1hdGNoZXMgZmlyc3Qtd3JpdGUtd2lucylcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24pIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUgfHwgc3ViZmxvd0lkO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93UmVnaXN0ZXJlZChcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5kZXNjcmlwdGlvbixcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19