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
@@ -1,266 +0,0 @@
1
- "use strict";
2
- /**
3
- * equality.ts — structural equality of committed-state values: THE owner of
4
- * "what counts as a change". What `TransactionBuffer`'s net-change filter, the
5
- * admitted record's compare, the read model's writer rule and the
6
- * borrowed-mutation guard all ask. Its one import is the classifier of value
7
- * kinds (`capture/valueKinds.ts`, a leaf); re-exported from `utils.ts`, so no
8
- * importer moved.
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.deepEqual = void 0;
12
- const valueKinds_js_1 = require("../capture/valueKinds.js");
13
- /**
14
- * Structural deep equality for committed-state values.
15
- *
16
- * Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
17
- * a path or merely re-wrote / reverted it to the value it already held (a
18
- * "no-op write"), and by `borrowedMutation.firstDifferingPath` to find where a
19
- * borrowed read moved. Committed state must survive `structuredClone`, so the
20
- * values it can hold are the kinds the clone keeps, and two values are equal
21
- * when a record holds the same thing for both. Every kind has ONE arm below
22
- * (`equalPairs`' switch over `ValueKind` — a kind added to the union does not
23
- * compile until it is compared). Before 9.22.0 a Date, Map or Set was compared
24
- * as an object with no own keys, and until 9.44.2 so were a RegExp, an Error,
25
- * a boxed primitive, an ArrayBuffer, a DataView and a Blob: any two of a kind
26
- * were "equal", so `$setValue('re', /y/g)` over `/x/g` committed no row and
27
- * live state kept the OLD value.
28
- *
29
- * Semantics:
30
- * - reference / identical-primitive short-circuits first (cheap fast path)
31
- * - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
32
- * - two values of different KINDS are never equal (a `Date` is never `{}`,
33
- * an array never `{ 0: … }`)
34
- * - `Date`: same `getTime()` (two invalid dates are equal)
35
- * - `RegExp`: same `source` and `flags` (the clone resets `lastIndex`)
36
- * - `Error`: the same restored kind (one of the six built-in error names,
37
- * else `Error`), own `message`, `stack` and own `cause` (deep) — what the
38
- * clone keeps; any other own field is dropped by it, so it never counts
39
- * (the admitted record's law)
40
- * - a boxed primitive: the same wrapper type and the same primitive inside
41
- * - an `ArrayBuffer`: length, resizability and bytes; a typed array or a
42
- * `DataView`: its type and the bytes IT views — never the rest of its
43
- * buffer (a Node `Buffer` views a slice of a shared pool, and the record
44
- * keeps the view's bytes only: `capture/freeze.ts · freezeRecord`)
45
- * - `Map`: same size AND, per key of `a`, `b` holds a deep-equal value —
46
- * keys by `Map` identity (`SameValueZero`), values deep
47
- * - `Set`: same size AND every member of `a` is deep-equal to SOME member
48
- * of `b` (order-insensitive — a Set has no order to compare by)
49
- * - an OPAQUE value (a Blob, a `DOMException` — content this library cannot
50
- * read): by the caller's {@link OpaqueRule} — equal only to itself by
51
- * default (replacing one is always a change), or, when both sides are
52
- * copies of one record, equal to any other of its kind
53
- * - arrays: equal length AND deep-equal element-wise (order-sensitive; an
54
- * array's expando keys are out of contract and not compared)
55
- * - objects: identical set of keys that HOLD a value AND deep-equal per key.
56
- * An own key whose value is `undefined` counts as ABSENT: it is this
57
- * library's other spelling of a deleted key (`'full'` mode flattens
58
- * `delete` into `key: undefined`; `'delta'` mode's `delete` verb removes
59
- * the key), and every consumer — JSON, the fold, `commitValueAt`, the
60
- * mirror — reads the two spellings as one state. So must the net-change
61
- * filter (9.19.1): `{}` and `{ k: undefined }` are not a change. Arrays
62
- * are untouched — a slot holding `undefined` is still a slot.
63
- *
64
- * Cost & safety:
65
- * - Allocates only transient `Object.keys` arrays, an error's property
66
- * descriptors and a byte view per compared buffer — no clones (but one
67
- * probe clone per class prototype, remembered: `capture/valueKinds.ts ·
68
- * kindOf`). It is strictly cheaper than the `structuredClone` the commit
69
- * already performs.
70
- * - Primitive comparisons (the bulk of state) are O(1) via the `===` /
71
- * `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
72
- * by the value's own size.
73
- * - Terminates on CYCLIC values (9.18.1): a state value must survive
74
- * `structuredClone`, and `structuredClone` preserves cycles — so a
75
- * self-referencing value is a legal value, not an out-of-contract one. A
76
- * pair of objects already under comparison is treated as equal (the
77
- * structural answer, lodash `isEqual` semantics); acyclic inputs see no
78
- * change. Dev mode still warns about cycles at write time
79
- * (`ScopeFacade.setValue`) because they surprise narrative and JSON.
80
- */
81
- function deepEqual(a, b, opaque = 'identity') {
82
- return equalPairs(a, b, undefined, opaque);
83
- }
84
- exports.deepEqual = deepEqual;
85
- function equalPairs(a, b, seen, opaque) {
86
- if (a === b)
87
- return true; // same reference or identical primitive
88
- if (typeof a !== typeof b)
89
- return false;
90
- if (a === null || b === null)
91
- return a === b; // one is null, the other isn't
92
- if (typeof a !== 'object')
93
- return Object.is(a, b); // NaN-safe primitive compare
94
- const kind = (0, valueKinds_js_1.kindOf)(a);
95
- if (kind !== (0, valueKinds_js_1.kindOf)(b))
96
- return false;
97
- switch (kind) {
98
- // Atoms: their content is a slot, not their keys.
99
- case 'date':
100
- return Object.is(Date.prototype.getTime.call(a), Date.prototype.getTime.call(b));
101
- case 'regexp':
102
- return a.source === b.source && a.flags === b.flags;
103
- case 'boxed':
104
- return tagOf(a) === tagOf(b) && equalPairs(a.valueOf(), b.valueOf(), seen, opaque);
105
- case 'buffer':
106
- return equalBuffers(a, b);
107
- case 'view':
108
- return equalViews(a, b);
109
- case 'opaque':
110
- return opaque === 'copies' && tagOf(a) === tagOf(b); // `a === b` was answered above
111
- case 'plain':
112
- case 'array':
113
- case 'map':
114
- case 'set':
115
- case 'error':
116
- return equalContainers(a, b, kind, seen, opaque);
117
- default:
118
- return unknownKind(kind);
119
- }
120
- }
121
- /** The kinds whose content is other values: compared part by part, under the cycle guard. */
122
- function equalContainers(a, b, kind, seen, opaque) {
123
- // Cycle guard — a pair we are already inside is equal by assumption.
124
- seen ??= new WeakMap();
125
- let partners = seen.get(a);
126
- if (partners?.has(b))
127
- return true;
128
- if (!partners)
129
- seen.set(a, (partners = new WeakSet()));
130
- partners.add(b);
131
- if (kind === 'map')
132
- return equalMaps(a, b, seen, opaque);
133
- if (kind === 'set')
134
- return equalSets(a, b, seen, opaque);
135
- if (kind === 'error')
136
- return equalErrors(a, b, seen, opaque);
137
- if (kind === 'array') {
138
- if (a.length !== b.length)
139
- return false;
140
- for (let i = 0; i < a.length; i++) {
141
- if (!equalPairs(a[i], b[i], seen, opaque))
142
- return false;
143
- }
144
- return true;
145
- }
146
- // Objects: only keys that HOLD a value take part — an own `undefined` is a
147
- // deleted key, the same state as an absent one (see the contract above).
148
- let aHeld = 0;
149
- for (const key of Object.keys(a)) {
150
- if (a[key] === undefined)
151
- continue;
152
- aHeld++;
153
- if (!Object.prototype.hasOwnProperty.call(b, key))
154
- return false;
155
- if (!equalPairs(a[key], b[key], seen, opaque))
156
- return false;
157
- }
158
- let bHeld = 0;
159
- for (const key of Object.keys(b))
160
- if (b[key] !== undefined)
161
- bHeld++;
162
- return aHeld === bHeld;
163
- }
164
- function unknownKind(kind) {
165
- throw new TypeError(`deepEqual: no comparison for the value kind '${String(kind)}'`);
166
- }
167
- /** `[object Number]`, `[object Uint8Array]` … — the built-in type a boxed value or a view carries. */
168
- function tagOf(value) {
169
- return Object.prototype.toString.call(value);
170
- }
171
- /** The same view type over the same bytes — the bytes the view sees, wherever they sit in its buffer. */
172
- function equalViews(a, b) {
173
- if (tagOf(a) !== tagOf(b) || a.byteLength !== b.byteLength)
174
- return false;
175
- if (a.buffer === b.buffer && a.byteOffset === b.byteOffset)
176
- return true;
177
- const p = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
178
- const q = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
179
- for (let i = 0; i < p.length; i++)
180
- if (p[i] !== q[i])
181
- return false;
182
- return true;
183
- }
184
- /** The same length, resizability and bytes. */
185
- function equalBuffers(a, b) {
186
- if (a === b)
187
- return true;
188
- const x = a;
189
- const y = b;
190
- if (x.byteLength !== y.byteLength || x.resizable !== y.resizable || x.maxByteLength !== y.maxByteLength) {
191
- return false;
192
- }
193
- const p = new Uint8Array(a);
194
- const q = new Uint8Array(b);
195
- for (let i = 0; i < p.length; i++)
196
- if (p[i] !== q[i])
197
- return false;
198
- return true;
199
- }
200
- /** The six error names `structuredClone` restores; any other name comes back an `Error`. */
201
- const ERROR_NAMES = new Set(['EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError']);
202
- /**
203
- * Two errors as the clone keeps them: the restored kind, the own `message`,
204
- * the `stack` and the own `cause` (deep). Any other own field is dropped by
205
- * the clone, so it never counts.
206
- */
207
- function equalErrors(a, b, seen, opaque) {
208
- if (errorKindOf(a) !== errorKindOf(b) || stackOf(a) !== stackOf(b))
209
- return false;
210
- const aMessage = ownData(a, 'message');
211
- const bMessage = ownData(b, 'message');
212
- if (String(aMessage?.value) !== String(bMessage?.value) || !aMessage !== !bMessage)
213
- return false;
214
- const aCause = ownData(a, 'cause');
215
- const bCause = ownData(b, 'cause');
216
- if (!aCause || !bCause)
217
- return !aCause === !bCause;
218
- return equalPairs(aCause.value, bCause.value, seen, opaque);
219
- }
220
- function errorKindOf(error) {
221
- const name = String(error.name);
222
- return ERROR_NAMES.has(name) ? name : 'Error';
223
- }
224
- function stackOf(error) {
225
- const stack = error.stack;
226
- return typeof stack === 'string' ? stack : undefined;
227
- }
228
- /** An own DATA property, boxed — how the clone reads an error's `message` and `cause`. */
229
- function ownData(value, key) {
230
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
231
- return descriptor !== undefined && Object.prototype.hasOwnProperty.call(descriptor, 'value')
232
- ? { value: descriptor.value }
233
- : undefined;
234
- }
235
- function equalMaps(a, b, seen, opaque) {
236
- if (a.size !== b.size)
237
- return false;
238
- for (const [key, value] of a) {
239
- if (!b.has(key))
240
- return false;
241
- if (!equalPairs(value, b.get(key), seen, opaque))
242
- return false;
243
- }
244
- return true;
245
- }
246
- /**
247
- * Order-insensitive, deep per member. Quadratic in the worst case for sets of
248
- * objects — a set of primitives (the common shape) is one `has` per member.
249
- */
250
- function equalSets(a, b, seen, opaque) {
251
- if (a.size !== b.size)
252
- return false;
253
- const unmatched = [...b];
254
- for (const member of a) {
255
- // SameValueZero first — primitives and shared references, one `has`.
256
- // Each match retires its slot so two structurally-equal members of `a`
257
- // cannot both claim the same member of `b`.
258
- const at = unmatched.indexOf(member);
259
- const found = at >= 0 ? at : unmatched.findIndex((candidate) => equalPairs(member, candidate, seen, opaque));
260
- if (found < 0)
261
- return false;
262
- unmatched.splice(found, 1);
263
- }
264
- return true;
265
- }
266
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9lcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNERBQWtFO0FBRWxFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUVHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUUsU0FBcUIsVUFBVTtJQUN2RSxPQUFPLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRkQsOEJBRUM7QUE0QkQsU0FBUyxVQUFVLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxJQUEyQixFQUFFLE1BQWtCO0lBQ2pGLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztJQUNsRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO0lBRWhGLE1BQU0sSUFBSSxHQUFHLElBQUEsc0JBQU0sRUFBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixJQUFJLElBQUksS0FBSyxJQUFBLHNCQUFNLEVBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLGtEQUFrRDtRQUNsRCxLQUFLLE1B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LEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0csSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGVxdWFsaXR5LnRzIOKAlCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IG9mIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXM6IFRIRSBvd25lciBvZlxuICogXCJ3aGF0IGNvdW50cyBhcyBhIGNoYW5nZVwiLiBXaGF0IGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBuZXQtY2hhbmdlIGZpbHRlciwgdGhlXG4gKiBhZG1pdHRlZCByZWNvcmQncyBjb21wYXJlLCB0aGUgcmVhZCBtb2RlbCdzIHdyaXRlciBydWxlIGFuZCB0aGVcbiAqIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFsbCBhc2suIEl0cyBvbmUgaW1wb3J0IGlzIHRoZSBjbGFzc2lmaWVyIG9mIHZhbHVlXG4gKiBraW5kcyAoYGNhcHR1cmUvdmFsdWVLaW5kcy50c2AsIGEgbGVhZik7IHJlLWV4cG9ydGVkIGZyb20gYHV0aWxzLnRzYCwgc28gbm9cbiAqIGltcG9ydGVyIG1vdmVkLlxuICovXG5cbmltcG9ydCB7IHR5cGUgVmFsdWVLaW5kLCBraW5kT2YgfSBmcm9tICcuLi9jYXB0dXJlL3ZhbHVlS2luZHMuanMnO1xuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcCBlcXVhbGl0eSBmb3IgY29tbWl0dGVkLXN0YXRlIHZhbHVlcy5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlcn0gdG8gZGVjaWRlIHdoZXRoZXIgYSBzdGFnZSBhY3R1YWxseSBDSEFOR0VEXG4gKiBhIHBhdGggb3IgbWVyZWx5IHJlLXdyb3RlIC8gcmV2ZXJ0ZWQgaXQgdG8gdGhlIHZhbHVlIGl0IGFscmVhZHkgaGVsZCAoYVxuICogXCJuby1vcCB3cml0ZVwiKSwgYW5kIGJ5IGBib3Jyb3dlZE11dGF0aW9uLmZpcnN0RGlmZmVyaW5nUGF0aGAgdG8gZmluZCB3aGVyZSBhXG4gKiBib3Jyb3dlZCByZWFkIG1vdmVkLiBDb21taXR0ZWQgc3RhdGUgbXVzdCBzdXJ2aXZlIGBzdHJ1Y3R1cmVkQ2xvbmVgLCBzbyB0aGVcbiAqIHZhbHVlcyBpdCBjYW4gaG9sZCBhcmUgdGhlIGtpbmRzIHRoZSBjbG9uZSBrZWVwcywgYW5kIHR3byB2YWx1ZXMgYXJlIGVxdWFsXG4gKiB3aGVuIGEgcmVjb3JkIGhvbGRzIHRoZSBzYW1lIHRoaW5nIGZvciBib3RoLiBFdmVyeSBraW5kIGhhcyBPTkUgYXJtIGJlbG93XG4gKiAoYGVxdWFsUGFpcnNgJyBzd2l0Y2ggb3ZlciBgVmFsdWVLaW5kYCDigJQgYSBraW5kIGFkZGVkIHRvIHRoZSB1bmlvbiBkb2VzIG5vdFxuICogY29tcGlsZSB1bnRpbCBpdCBpcyBjb21wYXJlZCkuIEJlZm9yZSA5LjIyLjAgYSBEYXRlLCBNYXAgb3IgU2V0IHdhcyBjb21wYXJlZFxuICogYXMgYW4gb2JqZWN0IHdpdGggbm8gb3duIGtleXMsIGFuZCB1bnRpbCA5LjQ0LjIgc28gd2VyZSBhIFJlZ0V4cCwgYW4gRXJyb3IsXG4gKiBhIGJveGVkIHByaW1pdGl2ZSwgYW4gQXJyYXlCdWZmZXIsIGEgRGF0YVZpZXcgYW5kIGEgQmxvYjogYW55IHR3byBvZiBhIGtpbmRcbiAqIHdlcmUgXCJlcXVhbFwiLCBzbyBgJHNldFZhbHVlKCdyZScsIC95L2cpYCBvdmVyIGAveC9nYCBjb21taXR0ZWQgbm8gcm93IGFuZFxuICogbGl2ZSBzdGF0ZSBrZXB0IHRoZSBPTEQgdmFsdWUuXG4gKlxuICogU2VtYW50aWNzOlxuICogICAtIHJlZmVyZW5jZSAvIGlkZW50aWNhbC1wcmltaXRpdmUgc2hvcnQtY2lyY3VpdHMgZmlyc3QgKGNoZWFwIGZhc3QgcGF0aClcbiAqICAgLSBgTmFOYCBlcXVhbHMgYE5hTmAgKHByaW1pdGl2ZSBjb21wYXJlIGZhbGxzIGJhY2sgdG8gYE9iamVjdC5pc2ApXG4gKiAgIC0gdHdvIHZhbHVlcyBvZiBkaWZmZXJlbnQgS0lORFMgYXJlIG5ldmVyIGVxdWFsIChhIGBEYXRlYCBpcyBuZXZlciBge31gLFxuICogICAgIGFuIGFycmF5IG5ldmVyIGB7IDA6IOKApiB9YClcbiAqICAgLSBgRGF0ZWA6IHNhbWUgYGdldFRpbWUoKWAgKHR3byBpbnZhbGlkIGRhdGVzIGFyZSBlcXVhbClcbiAqICAgLSBgUmVnRXhwYDogc2FtZSBgc291cmNlYCBhbmQgYGZsYWdzYCAodGhlIGNsb25lIHJlc2V0cyBgbGFzdEluZGV4YClcbiAqICAgLSBgRXJyb3JgOiB0aGUgc2FtZSByZXN0b3JlZCBraW5kIChvbmUgb2YgdGhlIHNpeCBidWlsdC1pbiBlcnJvciBuYW1lcyxcbiAqICAgICBlbHNlIGBFcnJvcmApLCBvd24gYG1lc3NhZ2VgLCBgc3RhY2tgIGFuZCBvd24gYGNhdXNlYCAoZGVlcCkg4oCUIHdoYXQgdGhlXG4gKiAgICAgY2xvbmUga2VlcHM7IGFueSBvdGhlciBvd24gZmllbGQgaXMgZHJvcHBlZCBieSBpdCwgc28gaXQgbmV2ZXIgY291bnRzXG4gKiAgICAgKHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXcpXG4gKiAgIC0gYSBib3hlZCBwcmltaXRpdmU6IHRoZSBzYW1lIHdyYXBwZXIgdHlwZSBhbmQgdGhlIHNhbWUgcHJpbWl0aXZlIGluc2lkZVxuICogICAtIGFuIGBBcnJheUJ1ZmZlcmA6IGxlbmd0aCwgcmVzaXphYmlsaXR5IGFuZCBieXRlczsgYSB0eXBlZCBhcnJheSBvciBhXG4gKiAgICAgYERhdGFWaWV3YDogaXRzIHR5cGUgYW5kIHRoZSBieXRlcyBJVCB2aWV3cyDigJQgbmV2ZXIgdGhlIHJlc3Qgb2YgaXRzXG4gKiAgICAgYnVmZmVyIChhIE5vZGUgYEJ1ZmZlcmAgdmlld3MgYSBzbGljZSBvZiBhIHNoYXJlZCBwb29sLCBhbmQgdGhlIHJlY29yZFxuICogICAgIGtlZXBzIHRoZSB2aWV3J3MgYnl0ZXMgb25seTogYGNhcHR1cmUvZnJlZXplLnRzIMK3IGZyZWV6ZVJlY29yZGApXG4gKiAgIC0gYE1hcGA6IHNhbWUgc2l6ZSBBTkQsIHBlciBrZXkgb2YgYGFgLCBgYmAgaG9sZHMgYSBkZWVwLWVxdWFsIHZhbHVlIOKAlFxuICogICAgIGtleXMgYnkgYE1hcGAgaWRlbnRpdHkgKGBTYW1lVmFsdWVaZXJvYCksIHZhbHVlcyBkZWVwXG4gKiAgIC0gYFNldGA6IHNhbWUgc2l6ZSBBTkQgZXZlcnkgbWVtYmVyIG9mIGBhYCBpcyBkZWVwLWVxdWFsIHRvIFNPTUUgbWVtYmVyXG4gKiAgICAgb2YgYGJgIChvcmRlci1pbnNlbnNpdGl2ZSDigJQgYSBTZXQgaGFzIG5vIG9yZGVyIHRvIGNvbXBhcmUgYnkpXG4gKiAgIC0gYW4gT1BBUVVFIHZhbHVlIChhIEJsb2IsIGEgYERPTUV4Y2VwdGlvbmAg4oCUIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdFxuICogICAgIHJlYWQpOiBieSB0aGUgY2FsbGVyJ3Mge0BsaW5rIE9wYXF1ZVJ1bGV9IOKAlCBlcXVhbCBvbmx5IHRvIGl0c2VsZiBieVxuICogICAgIGRlZmF1bHQgKHJlcGxhY2luZyBvbmUgaXMgYWx3YXlzIGEgY2hhbmdlKSwgb3IsIHdoZW4gYm90aCBzaWRlcyBhcmVcbiAqICAgICBjb3BpZXMgb2Ygb25lIHJlY29yZCwgZXF1YWwgdG8gYW55IG90aGVyIG9mIGl0cyBraW5kXG4gKiAgIC0gYXJyYXlzOiBlcXVhbCBsZW5ndGggQU5EIGRlZXAtZXF1YWwgZWxlbWVudC13aXNlIChvcmRlci1zZW5zaXRpdmU7IGFuXG4gKiAgICAgYXJyYXkncyBleHBhbmRvIGtleXMgYXJlIG91dCBvZiBjb250cmFjdCBhbmQgbm90IGNvbXBhcmVkKVxuICogICAtIG9iamVjdHM6IGlkZW50aWNhbCBzZXQgb2Yga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSBBTkQgZGVlcC1lcXVhbCBwZXIga2V5LlxuICogICAgIEFuIG93biBrZXkgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAgY291bnRzIGFzIEFCU0VOVDogaXQgaXMgdGhpc1xuICogICAgIGxpYnJhcnkncyBvdGhlciBzcGVsbGluZyBvZiBhIGRlbGV0ZWQga2V5IChgJ2Z1bGwnYCBtb2RlIGZsYXR0ZW5zXG4gKiAgICAgYGRlbGV0ZWAgaW50byBga2V5OiB1bmRlZmluZWRgOyBgJ2RlbHRhJ2AgbW9kZSdzIGBkZWxldGVgIHZlcmIgcmVtb3Zlc1xuICogICAgIHRoZSBrZXkpLCBhbmQgZXZlcnkgY29uc3VtZXIg4oCUIEpTT04sIHRoZSBmb2xkLCBgY29tbWl0VmFsdWVBdGAsIHRoZVxuICogICAgIG1pcnJvciDigJQgcmVhZHMgdGhlIHR3byBzcGVsbGluZ3MgYXMgb25lIHN0YXRlLiBTbyBtdXN0IHRoZSBuZXQtY2hhbmdlXG4gKiAgICAgZmlsdGVyICg5LjE5LjEpOiBge31gIGFuZCBgeyBrOiB1bmRlZmluZWQgfWAgYXJlIG5vdCBhIGNoYW5nZS4gQXJyYXlzXG4gKiAgICAgYXJlIHVudG91Y2hlZCDigJQgYSBzbG90IGhvbGRpbmcgYHVuZGVmaW5lZGAgaXMgc3RpbGwgYSBzbG90LlxuICpcbiAqIENvc3QgJiBzYWZldHk6XG4gKiAgIC0gQWxsb2NhdGVzIG9ubHkgdHJhbnNpZW50IGBPYmplY3Qua2V5c2AgYXJyYXlzLCBhbiBlcnJvcidzIHByb3BlcnR5XG4gKiAgICAgZGVzY3JpcHRvcnMgYW5kIGEgYnl0ZSB2aWV3IHBlciBjb21wYXJlZCBidWZmZXIg4oCUIG5vIGNsb25lcyAoYnV0IG9uZVxuICogICAgIHByb2JlIGNsb25lIHBlciBjbGFzcyBwcm90b3R5cGUsIHJlbWVtYmVyZWQ6IGBjYXB0dXJlL3ZhbHVlS2luZHMudHMgwrdcbiAqICAgICBraW5kT2ZgKS4gSXQgaXMgc3RyaWN0bHkgY2hlYXBlciB0aGFuIHRoZSBgc3RydWN0dXJlZENsb25lYCB0aGUgY29tbWl0XG4gKiAgICAgYWxyZWFkeSBwZXJmb3Jtcy5cbiAqICAgLSBQcmltaXRpdmUgY29tcGFyaXNvbnMgKHRoZSBidWxrIG9mIHN0YXRlKSBhcmUgTygxKSB2aWEgdGhlIGA9PT1gIC9cbiAqICAgICBgT2JqZWN0LmlzYCBmYXN0IHBhdGhzOyBvbmx5IG5lc3RlZCBvYmplY3RzL2FycmF5cyBpbmN1ciBhIHdhbGssIGJvdW5kZWRcbiAqICAgICBieSB0aGUgdmFsdWUncyBvd24gc2l6ZS5cbiAqICAgLSBUZXJtaW5hdGVzIG9uIENZQ0xJQyB2YWx1ZXMgKDkuMTguMSk6IGEgc3RhdGUgdmFsdWUgbXVzdCBzdXJ2aXZlXG4gKiAgICAgYHN0cnVjdHVyZWRDbG9uZWAsIGFuZCBgc3RydWN0dXJlZENsb25lYCBwcmVzZXJ2ZXMgY3ljbGVzIOKAlCBzbyBhXG4gKiAgICAgc2VsZi1yZWZlcmVuY2luZyB2YWx1ZSBpcyBhIGxlZ2FsIHZhbHVlLCBub3QgYW4gb3V0LW9mLWNvbnRyYWN0IG9uZS4gQVxuICogICAgIHBhaXIgb2Ygb2JqZWN0cyBhbHJlYWR5IHVuZGVyIGNvbXBhcmlzb24gaXMgdHJlYXRlZCBhcyBlcXVhbCAodGhlXG4gKiAgICAgc3RydWN0dXJhbCBhbnN3ZXIsIGxvZGFzaCBgaXNFcXVhbGAgc2VtYW50aWNzKTsgYWN5Y2xpYyBpbnB1dHMgc2VlIG5vXG4gKiAgICAgY2hhbmdlLiBEZXYgbW9kZSBzdGlsbCB3YXJucyBhYm91dCBjeWNsZXMgYXQgd3JpdGUgdGltZVxuICogICAgIChgU2NvcGVGYWNhZGUuc2V0VmFsdWVgKSBiZWNhdXNlIHRoZXkgc3VycHJpc2UgbmFycmF0aXZlIGFuZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55LCBvcGFxdWU6IE9wYXF1ZVJ1bGUgPSAnaWRlbnRpdHknKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcXVhbFBhaXJzKGEsIGIsIHVuZGVmaW5lZCwgb3BhcXVlKTtcbn1cblxuLyoqXG4gKiBIb3cge0BsaW5rIGRlZXBFcXVhbH0gY29tcGFyZXMgdHdvIE9QQVFVRSB2YWx1ZXMgKGEgQmxvYiwgYSBgRE9NRXhjZXB0aW9uYCDigJRcbiAqIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdCByZWFkKTpcbiAqXG4gKiAgIC0gYCdpZGVudGl0eSdgICh0aGUgZGVmYXVsdCkg4oCUIGVxdWFsIG9ubHkgdG8gaXRzZWxmLiBUaGUgYW5zd2VyIHdoZW4gb25lXG4gKiAgICAgc2lkZSBpcyBhIHZhbHVlIGEgc3RhZ2UgaGFuZGVkIGluOiB0aGUgbmV0LWNoYW5nZSBmaWx0ZXJcbiAqICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyYCksIHRoZSBhcHBlbmQgY2hlY2sgKGBkZWx0YUVuY29kaW5nYCkuIEEgbmV3IG9iamVjdFxuICogICAgIGlzIGEgY2hhbmdlLCBiZWNhdXNlIG5vdGhpbmcgY2FuIHNheSBpdCBpcyBub3QuXG4gKiAgIC0gYCdjb3BpZXMnYCDigJQgZXF1YWwgdG8gYW55IG90aGVyIG9mIGl0cyBraW5kLiBUaGUgYW5zd2VyIHdoZW4gQk9USCBzaWRlc1xuICogICAgIGFyZSBjb3BpZXMgb2Ygb25lIHJlY29yZGVkIHZhbHVlIOKAlCBhIGZvbGQncyBnZW5lcmF0aW9ucyAoYGxvZ01vZGVsYCxcbiAqICAgICBgZWxlbWVudFByb3ZlbmFuY2VgKSwgYSByZXRhaW5lZCByZWFkIGFnYWluc3QgbGl2ZSBzdGF0ZVxuICogICAgIChgYm9ycm93ZWRNdXRhdGlvbmApLCB0aGUgcmVjb3JkIHJlcGxheWVkIGFnYWluc3QgdGhlIHJlYWQtYmFja1xuICogICAgIChgYWRtaXNzaW9uYCk6IGNvcGllcyBuZXZlciBzaGFyZSBpZGVudGl0eSwgc28gaWRlbnRpdHkgd291bGQgY2FsbCBldmVyeVxuICogICAgIG9wYXF1ZSB2YWx1ZSBjaGFuZ2VkLlxuICovXG5leHBvcnQgdHlwZSBPcGFxdWVSdWxlID0gJ2lkZW50aXR5JyB8ICdjb3BpZXMnO1xuXG4vKipcbiAqIE9iamVjdCBwYWlycyBtZXQgc28gZmFyLCBrZXllZCBgYSDihpIgdGhlIGIncyBpdCBoYXMgYmVlbiBwYWlyZWQgd2l0aGAuIENyZWF0ZWRcbiAqIGxhemlseSBieSB0aGUgZmlyc3Qgb2JqZWN0IHBhaXIsIHNvIHByaW1pdGl2ZSBjb21wYXJlcyBhbGxvY2F0ZSBub3RoaW5nLlxuICogTmV2ZXIgcHJ1bmVkOiBldmVyeSBgZmFsc2VgIHJldHVybnMgc3RyYWlnaHQgdXAgdG8gdGhlIGNhbGxlciAoZWFjaCByZWN1cnNpdmVcbiAqIGNhbGwgc2hvcnQtY2lyY3VpdHMgb24gaXQpLCBzbyBub3RoaW5nIGlzIGxvb2tlZCB1cCBhZnRlciBhIG1pc21hdGNoIOKAlCBhXG4gKiBzdG9yZWQgcGFpciBpcyBlaXRoZXIgc3RpbGwgdW5kZXIgY29tcGFyaXNvbiBvciBhbHJlYWR5IGtub3duIGVxdWFsLlxuICovXG50eXBlIFNlZW5QYWlycyA9IFdlYWtNYXA8b2JqZWN0LCBXZWFrU2V0PG9iamVjdD4+O1xuXG5mdW5jdGlvbiBlcXVhbFBhaXJzKGE6IGFueSwgYjogYW55LCBzZWVuOiBTZWVuUGFpcnMgfCB1bmRlZmluZWQsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7IC8vIHNhbWUgcmVmZXJlbmNlIG9yIGlkZW50aWNhbCBwcmltaXRpdmVcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gYSA9PT0gYjsgLy8gb25lIGlzIG51bGwsIHRoZSBvdGhlciBpc24ndFxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnKSByZXR1cm4gT2JqZWN0LmlzKGEsIGIpOyAvLyBOYU4tc2FmZSBwcmltaXRpdmUgY29tcGFyZVxuXG4gIGNvbnN0IGtpbmQgPSBraW5kT2YoYSk7XG4gIGlmIChraW5kICE9PSBraW5kT2YoYikpIHJldHVybiBmYWxzZTtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgLy8gQXRvbXM6IHRoZWlyIGNvbnRlbnQgaXMgYSBzbG90LCBub3QgdGhlaXIga2V5cy5cbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiBPYmplY3QuaXMoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZS5jYWxsKGEpLCBEYXRlLnByb3RvdHlwZS5nZXRUaW1lLmNhbGwoYikpO1xuICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgY2FzZSAnYm94ZWQnOlxuICAgICAgcmV0dXJuIHRhZ09mKGEpID09PSB0YWdPZihiKSAmJiBlcXVhbFBhaXJzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSwgc2Vlbiwgb3BhcXVlKTtcbiAgICBjYXNlICdidWZmZXInOlxuICAgICAgcmV0dXJuIGVxdWFsQnVmZmVycyhhLCBiKTtcbiAgICBjYXNlICd2aWV3JzpcbiAgICAgIHJldHVybiBlcXVhbFZpZXdzKGEsIGIpO1xuICAgIGNhc2UgJ29wYXF1ZSc6XG4gICAgICByZXR1cm4gb3BhcXVlID09PSAnY29waWVzJyAmJiB0YWdPZihhKSA9PT0gdGFnT2YoYik7IC8vIGBhID09PSBiYCB3YXMgYW5zd2VyZWQgYWJvdmVcbiAgICBjYXNlICdwbGFpbic6XG4gICAgY2FzZSAnYXJyYXknOlxuICAgIGNhc2UgJ21hcCc6XG4gICAgY2FzZSAnc2V0JzpcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICByZXR1cm4gZXF1YWxDb250YWluZXJzKGEsIGIsIGtpbmQsIHNlZW4sIG9wYXF1ZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmtub3duS2luZChraW5kKTtcbiAgfVxufVxuXG4vKiogVGhlIGtpbmRzIHdob3NlIGNvbnRlbnQgaXMgb3RoZXIgdmFsdWVzOiBjb21wYXJlZCBwYXJ0IGJ5IHBhcnQsIHVuZGVyIHRoZSBjeWNsZSBndWFyZC4gKi9cbmZ1bmN0aW9uIGVxdWFsQ29udGFpbmVycyhhOiBhbnksIGI6IGFueSwga2luZDogVmFsdWVLaW5kLCBzZWVuOiBTZWVuUGFpcnMgfCB1bmRlZmluZWQsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICAvLyBDeWNsZSBndWFyZCDigJQgYSBwYWlyIHdlIGFyZSBhbHJlYWR5IGluc2lkZSBpcyBlcXVhbCBieSBhc3N1bXB0aW9uLlxuICBzZWVuID8/PSBuZXcgV2Vha01hcCgpO1xuICBsZXQgcGFydG5lcnMgPSBzZWVuLmdldChhKTtcbiAgaWYgKHBhcnRuZXJzPy5oYXMoYikpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhcnRuZXJzKSBzZWVuLnNldChhLCAocGFydG5lcnMgPSBuZXcgV2Vha1NldCgpKSk7XG4gIHBhcnRuZXJzLmFkZChiKTtcblxuICBpZiAoa2luZCA9PT0gJ21hcCcpIHJldHVybiBlcXVhbE1hcHMoYSwgYiwgc2Vlbiwgb3BhcXVlKTtcbiAgaWYgKGtpbmQgPT09ICdzZXQnKSByZXR1cm4gZXF1YWxTZXRzKGEsIGIsIHNlZW4sIG9wYXF1ZSk7XG4gIGlmIChraW5kID09PSAnZXJyb3InKSByZXR1cm4gZXF1YWxFcnJvcnMoYSwgYiwgc2Vlbiwgb3BhcXVlKTtcbiAgaWYgKGtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWVxdWFsUGFpcnMoYVtpXSwgYltpXSwgc2Vlbiwgb3BhcXVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9iamVjdHM6IG9ubHkga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSB0YWtlIHBhcnQg4oCUIGFuIG93biBgdW5kZWZpbmVkYCBpcyBhXG4gIC8vIGRlbGV0ZWQga2V5LCB0aGUgc2FtZSBzdGF0ZSBhcyBhbiBhYnNlbnQgb25lIChzZWUgdGhlIGNvbnRyYWN0IGFib3ZlKS5cbiAgbGV0IGFIZWxkID0gMDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYSkpIHtcbiAgICBpZiAoYVtrZXldID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGFIZWxkKys7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghZXF1YWxQYWlycyhhW2tleV0sIGJba2V5XSwgc2Vlbiwgb3BhcXVlKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBiSGVsZCA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpKSBpZiAoYltrZXldICE9PSB1bmRlZmluZWQpIGJIZWxkKys7XG4gIHJldHVybiBhSGVsZCA9PT0gYkhlbGQ7XG59XG5cbmZ1bmN0aW9uIHVua25vd25LaW5kKGtpbmQ6IG5ldmVyKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBkZWVwRXF1YWw6IG5vIGNvbXBhcmlzb24gZm9yIHRoZSB2YWx1ZSBraW5kICcke1N0cmluZyhraW5kKX0nYCk7XG59XG5cbi8qKiBgW29iamVjdCBOdW1iZXJdYCwgYFtvYmplY3QgVWludDhBcnJheV1gIOKApiDigJQgdGhlIGJ1aWx0LWluIHR5cGUgYSBib3hlZCB2YWx1ZSBvciBhIHZpZXcgY2Fycmllcy4gKi9cbmZ1bmN0aW9uIHRhZ09mKHZhbHVlOiBvYmplY3QpOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxuLyoqIFRoZSBzYW1lIHZpZXcgdHlwZSBvdmVyIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgYnl0ZXMgdGhlIHZpZXcgc2Vlcywgd2hlcmV2ZXIgdGhleSBzaXQgaW4gaXRzIGJ1ZmZlci4gKi9cbmZ1bmN0aW9uIGVxdWFsVmlld3MoYTogQXJyYXlCdWZmZXJWaWV3LCBiOiBBcnJheUJ1ZmZlclZpZXcpOiBib29sZWFuIHtcbiAgaWYgKHRhZ09mKGEpICE9PSB0YWdPZihiKSB8fCBhLmJ5dGVMZW5ndGggIT09IGIuYnl0ZUxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5idWZmZXIgPT09IGIuYnVmZmVyICYmIGEuYnl0ZU9mZnNldCA9PT0gYi5ieXRlT2Zmc2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcCA9IG5ldyBVaW50OEFycmF5KGEuYnVmZmVyLCBhLmJ5dGVPZmZzZXQsIGEuYnl0ZUxlbmd0aCk7XG4gIGNvbnN0IHEgPSBuZXcgVWludDhBcnJheShiLmJ1ZmZlciwgYi5ieXRlT2Zmc2V0LCBiLmJ5dGVMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChwW2ldICE9PSBxW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVGhlIHNhbWUgbGVuZ3RoLCByZXNpemFiaWxpdHkgYW5kIGJ5dGVzLiAqL1xuZnVuY3Rpb24gZXF1YWxCdWZmZXJzKGE6IEFycmF5QnVmZmVyTGlrZSwgYjogQXJyYXlCdWZmZXJMaWtlKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgeCA9IGEgYXMgQXJyYXlCdWZmZXJMaWtlICYgeyByZXNpemFibGU/OiBib29sZWFuOyBtYXhCeXRlTGVuZ3RoPzogbnVtYmVyIH07XG4gIGNvbnN0IHkgPSBiIGFzIHR5cGVvZiB4O1xuICBpZiAoeC5ieXRlTGVuZ3RoICE9PSB5LmJ5dGVMZW5ndGggfHwgeC5yZXNpemFibGUgIT09IHkucmVzaXphYmxlIHx8IHgubWF4Qnl0ZUxlbmd0aCAhPT0geS5tYXhCeXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHAgPSBuZXcgVWludDhBcnJheShhKTtcbiAgY29uc3QgcSA9IG5ldyBVaW50OEFycmF5KGIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChwW2ldICE9PSBxW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVGhlIHNpeCBlcnJvciBuYW1lcyBgc3RydWN0dXJlZENsb25lYCByZXN0b3JlczsgYW55IG90aGVyIG5hbWUgY29tZXMgYmFjayBhbiBgRXJyb3JgLiAqL1xuY29uc3QgRVJST1JfTkFNRVMgPSBuZXcgU2V0KFsnRXZhbEVycm9yJywgJ1JhbmdlRXJyb3InLCAnUmVmZXJlbmNlRXJyb3InLCAnU3ludGF4RXJyb3InLCAnVHlwZUVycm9yJywgJ1VSSUVycm9yJ10pO1xuXG4vKipcbiAqIFR3byBlcnJvcnMgYXMgdGhlIGNsb25lIGtlZXBzIHRoZW06IHRoZSByZXN0b3JlZCBraW5kLCB0aGUgb3duIGBtZXNzYWdlYCxcbiAqIHRoZSBgc3RhY2tgIGFuZCB0aGUgb3duIGBjYXVzZWAgKGRlZXApLiBBbnkgb3RoZXIgb3duIGZpZWxkIGlzIGRyb3BwZWQgYnlcbiAqIHRoZSBjbG9uZSwgc28gaXQgbmV2ZXIgY291bnRzLlxuICovXG5mdW5jdGlvbiBlcXVhbEVycm9ycyhhOiBFcnJvciwgYjogRXJyb3IsIHNlZW46IFNlZW5QYWlycywgb3BhcXVlOiBPcGFxdWVSdWxlKTogYm9vbGVhbiB7XG4gIGlmIChlcnJvcktpbmRPZihhKSAhPT0gZXJyb3JLaW5kT2YoYikgfHwgc3RhY2tPZihhKSAhPT0gc3RhY2tPZihiKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBhTWVzc2FnZSA9IG93bkRhdGEoYSwgJ21lc3NhZ2UnKTtcbiAgY29uc3QgYk1lc3NhZ2UgPSBvd25EYXRhKGIsICdtZXNzYWdlJyk7XG4gIGlmIChTdHJpbmcoYU1lc3NhZ2U/LnZhbHVlKSAhPT0gU3RyaW5nKGJNZXNzYWdlPy52YWx1ZSkgfHwgIWFNZXNzYWdlICE9PSAhYk1lc3NhZ2UpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYUNhdXNlID0gb3duRGF0YShhLCAnY2F1c2UnKTtcbiAgY29uc3QgYkNhdXNlID0gb3duRGF0YShiLCAnY2F1c2UnKTtcbiAgaWYgKCFhQ2F1c2UgfHwgIWJDYXVzZSkgcmV0dXJuICFhQ2F1c2UgPT09ICFiQ2F1c2U7XG4gIHJldHVybiBlcXVhbFBhaXJzKGFDYXVzZS52YWx1ZSwgYkNhdXNlLnZhbHVlLCBzZWVuLCBvcGFxdWUpO1xufVxuXG5mdW5jdGlvbiBlcnJvcktpbmRPZihlcnJvcjogRXJyb3IpOiBzdHJpbmcge1xuICBjb25zdCBuYW1lID0gU3RyaW5nKGVycm9yLm5hbWUpO1xuICByZXR1cm4gRVJST1JfTkFNRVMuaGFzKG5hbWUpID8gbmFtZSA6ICdFcnJvcic7XG59XG5cbmZ1bmN0aW9uIHN0YWNrT2YoZXJyb3I6IEVycm9yKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgcmV0dXJuIHR5cGVvZiBzdGFjayA9PT0gJ3N0cmluZycgPyBzdGFjayA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEFuIG93biBEQVRBIHByb3BlcnR5LCBib3hlZCDigJQgaG93IHRoZSBjbG9uZSByZWFkcyBhbiBlcnJvcidzIGBtZXNzYWdlYCBhbmQgYGNhdXNlYC4gKi9cbmZ1bmN0aW9uIG93bkRhdGEodmFsdWU6IG9iamVjdCwga2V5OiBzdHJpbmcpOiB7IHZhbHVlOiB1bmtub3duIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVzY3JpcHRvciwgJ3ZhbHVlJylcbiAgICA/IHsgdmFsdWU6IGRlc2NyaXB0b3IudmFsdWUgfVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBlcXVhbE1hcHMoYTogTWFwPHVua25vd24sIHVua25vd24+LCBiOiBNYXA8dW5rbm93biwgdW5rbm93bj4sIHNlZW46IFNlZW5QYWlycywgb3BhcXVlOiBPcGFxdWVSdWxlKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKHZhbHVlLCBiLmdldChrZXkpLCBzZWVuLCBvcGFxdWUpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogT3JkZXItaW5zZW5zaXRpdmUsIGRlZXAgcGVyIG1lbWJlci4gUXVhZHJhdGljIGluIHRoZSB3b3JzdCBjYXNlIGZvciBzZXRzIG9mXG4gKiBvYmplY3RzIOKAlCBhIHNldCBvZiBwcmltaXRpdmVzICh0aGUgY29tbW9uIHNoYXBlKSBpcyBvbmUgYGhhc2AgcGVyIG1lbWJlci5cbiAqL1xuZnVuY3Rpb24gZXF1YWxTZXRzKGE6IFNldDx1bmtub3duPiwgYjogU2V0PHVua25vd24+LCBzZWVuOiBTZWVuUGFpcnMsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdW5tYXRjaGVkID0gWy4uLmJdO1xuICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhKSB7XG4gICAgLy8gU2FtZVZhbHVlWmVybyBmaXJzdCDigJQgcHJpbWl0aXZlcyBhbmQgc2hhcmVkIHJlZmVyZW5jZXMsIG9uZSBgaGFzYC5cbiAgICAvLyBFYWNoIG1hdGNoIHJldGlyZXMgaXRzIHNsb3Qgc28gdHdvIHN0cnVjdHVyYWxseS1lcXVhbCBtZW1iZXJzIG9mIGBhYFxuICAgIC8vIGNhbm5vdCBib3RoIGNsYWltIHRoZSBzYW1lIG1lbWJlciBvZiBgYmAuXG4gICAgY29uc3QgYXQgPSB1bm1hdGNoZWQuaW5kZXhPZihtZW1iZXIpO1xuICAgIGNvbnN0IGZvdW5kID0gYXQgPj0gMCA/IGF0IDogdW5tYXRjaGVkLmZpbmRJbmRleCgoY2FuZGlkYXRlKSA9PiBlcXVhbFBhaXJzKG1lbWJlciwgY2FuZGlkYXRlLCBzZWVuLCBvcGFxdWUpKTtcbiAgICBpZiAoZm91bmQgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgdW5tYXRjaGVkLnNwbGljZShmb3VuZCwgMSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRQb3NpdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2V2ZW50UG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb29yZGluYXRlcyBvZiBhbiBleGlzdGluZyBsb2cgd2l0aGluIGEgcmVjb3JkaW5nL3Nlc3Npb24sIG5vdCBhIHNlY29uZCBldmVudCB0aW1lbGluZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nQWRkcmVzcyB7XG4gIC8qKiBFbmdpbmUgbGVnIHRoYXQgZmlyc3Qgb3duZWQgdGhpcyBsb2c7IHVuY2hhbmdlZCBieSBhIHNhbWUtZXhlY3V0b3Igcm9vdCByZXN1bWUuICovXG4gIHJlYWRvbmx5IGxvZ1J1bklkOiBzdHJpbmc7XG4gIC8qKiBBY3R1YWwgbW91bnQgcnVudGltZSBJRHMsIG91dGVybW9zdCBmaXJzdC4gUm9vdCBsb2c6IFtdLiBOZXZlciBzdGF0aWMgc3ViZmxvdyBJRHMuICovXG4gIHJlYWRvbmx5IGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIGNvbW1pdHRlZCBwcmVmaXggcHJlc2VudCB3aGVuIGFuIGV2ZW50IHdhcyBlbWl0dGVkLiBEb2VzIE5PVCBkZXNjcmliZVxuICogdGhlIGVtaXR0ZXIncyBzdGFnZWQgd3JpdGVzLCBmaXJzdC10b3VjaCByZWFkIHZpZXcsIG9yIGV2ZW50dWFsIG93biBjb21taXQuXG4gKiBTZXZlcmFsIGV2ZW50cyBjYW4gc2hhcmUgYSBwb3NpdGlvbjsgdGhpcyBpcyBub3QgYSB0b3RhbCBldmVudCBvcmRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWl0U291cmNlUG9zaXRpb24gZXh0ZW5kcyBMb2dBZGRyZXNzIHtcbiAgLyoqIEVuZ2luZSBsZWcgdGhhdCBjcmVhdGVkIHRoZSBlbWl0dGluZyBmcmFtZSAobm90IHRoZSBzY29wZSdzIG1lbW9yeSBuYW1lc3BhY2UpLiAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKiogSW5jbHVzaXZlIGluZGV4IGluIHRoZSBhZGRyZXNzZWQgbG9nOyAtMSBtZWFucyBvbmx5IGl0cyBmb2xkIGJhc2UgZXhpc3RlZC4gKi9cbiAgcmVhZG9ubHkgY29tbWl0dGVkVGhyb3VnaElkeDogbnVtYmVyO1xufVxuIl19
@@ -1,95 +0,0 @@
1
- "use strict";
2
- /**
3
- * honesty.ts — the ONE vocabulary for what a reader cannot see.
4
- *
5
- * WHY THIS FILE EXISTS. A recording cannot always answer what it is asked, and the library says
6
- * so in several places, each in its own words: a slice carries `HonestyNote`s and, when it has no
7
- * answer, a `missing` reason; a fed edge and an element birth carry a `basis`; a fold carries a
8
- * `basis` and its `redacted` paths; a stored log reports `LogGap`s; a causal node carries
9
- * `incompleteSources` and `truncated`. A reader that wants to EXPLAIN any of them to a person (a
10
- * why-panel, an agent tool) kept its own table of code → sentence, and tables kept apart drift.
11
- * This file is that table, once.
12
- *
13
- * WHAT IT HOLDS.
14
- * - `HONESTY_CODES` — a frozen, closed registry: code → the ONE sentence that says what the code
15
- * means. The shape of rustc's `--explain` and LSP's `Diagnostic.code`: the code is the stable
16
- * key a consumer BRANCHES on; the sentence is for whoever reads the screen. It is not the
17
- * per-instance `detail` a note carries (that names the key, the budget, the rows).
18
- * - `HonestyCode` / `RegisteredCode` — what makes the registry the owner and not a suggestion:
19
- * each public union of these codes (`HonestyNoteCode`, `MissingSliceReason`,
20
- * `MissingProvenanceReason`, `FedBasis`, `AttributionBasis`, `FoldBasis`, and since 9.33.0 `ValueBasis` /
21
- * `WriterBasis` — the basis twins of `commitValueAt` / `findLastWriter`) declares its members
22
- * through `RegisteredCode`, so a member the registry does not hold fails to COMPILE. And
23
- * `test/architecture/honesty-vocabulary.test.ts` asks the type checker for every exported type
24
- * alias of `footprintjs/trace` that is a union of string literals: each one is inside the
25
- * registry or is named, with its reason, as not an honesty vocabulary.
26
- *
27
- * NO OBJECT GAINS A FIELD from being registered. Three signals carry no code of their own — a
28
- * `LogGap` (`'log-gap'`), `CausalNode.incompleteSources` (`'incomplete-sources'`) and
29
- * `FoldedState.redacted` / `redactedPaths` (`'redacted'`) — and a `truncated: { byDepth, byNodes }`
30
- * field means `'truncated'`; they are registered so a reader explains them from the same place.
31
- *
32
- * NOT HERE: the two strings a redaction leaves where a value was. The engine writes those on every
33
- * redacted run; the log's lives in its own leaf, `memory/placeholders.ts` (the scope channel's with
34
- * the verdict, `memory/redaction.ts`), so that an app which only runs charts does not carry these
35
- * sentences in its bundle (`HONESTY_CODES` is a pure expression, so a bundler drops it wherever
36
- * nothing reads it).
37
- *
38
- * WHY L0. This file imports NOTHING, and `slice/` and `time-travel/` (L3) type their codes through
39
- * it, so it sits below them — the layer table is `scripts/layering.config.cjs`.
40
- *
41
- * @example
42
- * ```typescript
43
- * import { HONESTY_CODES } from 'footprintjs/trace';
44
- *
45
- * for (const { code } of forwardSlice.notes) console.log(code, '→', HONESTY_CODES[code]);
46
- * // reads-not-recorded → This log carries no recorded read at all (the readTracking: 'off' signature), …
47
- * HONESTY_CODES[foldedState.basis]; // 'log-only' → No initialState travelled with this log (…), …
48
- * ```
49
- */
50
- Object.defineProperty(exports, "__esModule", { value: true });
51
- exports.HONESTY_CODES = void 0;
52
- /**
53
- * Every honesty code the trace readers (`footprintjs/trace`) speak, with the one sentence that says
54
- * what it means.
55
- *
56
- * Frozen and closed: the keys are exactly the codes below, and {@link HonestyCode} is derived from
57
- * them. A new code is one new line here: a union declared through {@link RegisteredCode} cannot hold
58
- * a code that is not on it, and `test/architecture/honesty-vocabulary.test.ts` fails on an exported
59
- * type alias of `footprintjs/trace` that is a union of string literals neither inside the registry
60
- * nor named there as not an honesty vocabulary. The values are typed `string`, not literal types,
61
- * on purpose: the sentences are for a screen and may be reworded; a consumer branches on the KEY.
62
- */
63
- exports.HONESTY_CODES = Object.freeze({
64
- // ── a slice's notes — `HonestyNote.code` (slice/) ─────────────────────────
65
- 'conservative-fed-edges': "At least one 'fed' edge is stage-level (conservative): its write carries no per-write read provenance, so the edge may not be real — turn on writeProvenance: 'reads-prefix' for exact edges.",
66
- 'nested-rows': "A write this answer rests on reached the key only through paths inside it (a subflow's input seed, an outputMapper merge-back, a fork child's namespace), so it changed part of the key's value, not the whole: earlier writes may account for the rest, and a reader of the key may not have read the part that write changed.",
67
- 'pre-run-origin': 'The value being followed was absent or already there before the first write this log can see (initial state, frozen run input or a closure), so who put it there is outside the commit log.',
68
- 'reads-not-recorded': "This log carries no recorded read at all (the readTracking: 'off' signature), so 'nothing read this value' is unknowable here, not true.",
69
- 'unknown-key': "This log has no write and no recorded read of the key, which is most likely a typo or the wrong run's log rather than a variable with no history.",
70
- truncated: 'A budget (maxDepth or maxNodes) cut the walk, so more of the answer exists beyond the horizon it stopped at.',
71
- // ── why a slice has no answer — `missing` (slice/: MissingSliceReason, MissingProvenanceReason) ─
72
- 'empty-log': 'The commit log holds no commit at all (nothing has executed, or the log handed in is empty), so there is no history to answer from.',
73
- 'never-written': 'No commit in the range asked about wrote the key — not its whole value, not a path inside it, and not a container around it in a way that changed it (a forward slice or a timeline also found no recorded read on, inside or around it) — so there is no write to start from: any value it has came from the initial state, the frozen run input or a closure, none of which the commit log can see.',
74
- 'not-an-array': 'The key was written, but its value at the point asked about is not an array (a scalar or object key, a deleted key, or a merge that degraded it), so element provenance does not apply: sliceForKey is the query for it.',
75
- // ── how a fed edge was attributed — `ForwardEdge.basis` (slice/: FedBasis) ─
76
- 'per-write': "This fed edge is exact: the downstream write carries per-write read provenance (TraceEntry.readKeys, recorded under writeProvenance: 'reads-prefix') and that list names the key, so the value was read before the write it feeds.",
77
- stage: 'This fed edge is conservative: the downstream write carries no per-write read provenance (the writeProvenance dial was off, or the log is mixed), so all that is known is that its stage read this key and wrote that path in some order, and the edge may not be real.',
78
- // ── how an element's birth was attributed — `ElementBirth.basis` (slice/: AttributionBasis) ─
79
- 'append-verb': "The engine recorded the element in an append row's tail (how commitValues: 'delta' records an array's growth), so the commit that added it is known exactly, not inferred.",
80
- 'prefix-inference': 'A whole-value write (a set or a merge) kept the previous array as its prefix, so the new tail is attributed to that commit by inference: a write that replaced the array with one that happens to begin the same way looks identical.',
81
- 'whole-value': "This commit placed the array wholesale (there was no earlier array, or the new one does not begin with it), so every element's birth resets to this commit: exact, but coarse.",
82
- // ── how a fold was derived — `FoldedState.basis` (time-travel/) ───────────
83
- 'initial+log': 'The fold started from the fold base that travelled with the log (initialState) and replayed the commit log onto it, so nothing seeded before the run is missing; rows it could not read are listed apart, in skipped.',
84
- 'log-only': 'No initialState travelled with this log (a snapshot stored before 9.17, a redacted snapshot or a hand-built log), so the fold started from an empty object: a key seeded before the run is whole only once a commit since wrote its whole value, and until then it holds just what its merges, appends and nested writes added, or nothing.',
85
- // ── a row of a stored log that is not a commit bundle — `LogGap` ──────────
86
- 'log-gap': 'A row of the stored log could not be read as a commit bundle, so it keeps its index but contributes no state, and any fold that crosses it is missing whatever that row wrote.',
87
- // ── untracked reads a stage also consumed — `CausalNode.incompleteSources` ─
88
- 'incomplete-sources': 'The stage also consumed read paths that bypass read tracking (args, env or an unshadowed silent read), so a slice through it may be incomplete: those reads produce no read-to-write edge to follow.',
89
- // ── values scrubbed at write time — `FoldedState.redacted` / `redactedPaths`, a value basis ─
90
- redacted: "Values at the paths listed in redactedPaths (a fold's, or a commit's in the range a key's value rests on) were scrubbed when they were written (by a redaction policy, or a write marked redacted), so where the answer holds the log's placeholder 'REDACTED', or lost a key under a container the placeholder replaced, it stands in for a value the log never recorded.",
91
- // ── how one key's value was read off the log — `ValueBasis` (commitValueAtWithBasis) ─
92
- deleted: "The key's last write in the range asked about left it absent (a delete of the key or of a container around it, or a set of a container that no longer holds it), so the answer is undefined because the record says the key was gone at that point, not because nothing was recorded.",
93
- 'from-initial-state': "No set or delete of the key, or of a container around it, is in the range asked about, so the answer rests on the value the key had before the run: folded from the initialState passed in when there was one, and otherwise only what the log's merges, appends and nested writes added to it (or nothing), which is partial for a key seeded before the run.",
94
- });
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9uZXN0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2hvbmVzdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStDRzs7O0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUNVLFFBQUEsYUFBYSxHQUFtQixNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3pELDZFQUE2RTtJQUM3RSx3QkFBd0IsRUFDdEIsK0xBQStMO0lBQ2pNLGFBQWEsRUFDWCxpVUFBaVU7SUFDblUsZ0JBQWdCLEVBQ2QsNkxBQTZMO0lBQy9MLG9CQUFvQixFQUNsQiwwSUFBMEk7SUFDNUksYUFBYSxFQUNYLG1KQUFtSjtJQUNySixTQUFTLEVBQ1AsOEdBQThHO0lBQ2hILG1HQUFtRztJQUNuRyxXQUFXLEVBQ1QscUlBQXFJO0lBQ3ZJLGVBQWUsRUFDYix1WUFBdVk7SUFDelksY0FBYyxFQUNaLDBOQUEwTjtJQUM1Tiw4RUFBOEU7SUFDOUUsV0FBVyxFQUNULG9PQUFvTztJQUN0TyxLQUFLLEVBQ0gseVFBQXlRO0lBQzNRLCtGQUErRjtJQUMvRixhQUFhLEVBQ1gsNEtBQTRLO0lBQzlLLGtCQUFrQixFQUNoQix1T0FBdU87SUFDek8sYUFBYSxFQUNYLGdMQUFnTDtJQUNsTCw2RUFBNkU7SUFDN0UsYUFBYSxFQUNYLHVOQUF1TjtJQUN6TixVQUFVLEVBQ1IsNlVBQTZVO0lBQy9VLDZFQUE2RTtJQUM3RSxTQUFTLEVBQ1AsZ0xBQWdMO0lBQ2xMLDhFQUE4RTtJQUM5RSxvQkFBb0IsRUFDbEIsc01BQXNNO0lBQ3hNLCtGQUErRjtJQUMvRixRQUFRLEVBQ04sNFdBQTRXO0lBQzlXLHdGQUF3RjtJQUN4RixPQUFPLEVBQ0wsdVJBQXVSO0lBQ3pSLG9CQUFvQixFQUNsQixnV0FBZ1c7Q0FDbFUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBob25lc3R5LnRzIOKAlCB0aGUgT05FIHZvY2FidWxhcnkgZm9yIHdoYXQgYSByZWFkZXIgY2Fubm90IHNlZS5cbiAqXG4gKiBXSFkgVEhJUyBGSUxFIEVYSVNUUy4gQSByZWNvcmRpbmcgY2Fubm90IGFsd2F5cyBhbnN3ZXIgd2hhdCBpdCBpcyBhc2tlZCwgYW5kIHRoZSBsaWJyYXJ5IHNheXNcbiAqIHNvIGluIHNldmVyYWwgcGxhY2VzLCBlYWNoIGluIGl0cyBvd24gd29yZHM6IGEgc2xpY2UgY2FycmllcyBgSG9uZXN0eU5vdGVgcyBhbmQsIHdoZW4gaXQgaGFzIG5vXG4gKiBhbnN3ZXIsIGEgYG1pc3NpbmdgIHJlYXNvbjsgYSBmZWQgZWRnZSBhbmQgYW4gZWxlbWVudCBiaXJ0aCBjYXJyeSBhIGBiYXNpc2A7IGEgZm9sZCBjYXJyaWVzIGFcbiAqIGBiYXNpc2AgYW5kIGl0cyBgcmVkYWN0ZWRgIHBhdGhzOyBhIHN0b3JlZCBsb2cgcmVwb3J0cyBgTG9nR2FwYHM7IGEgY2F1c2FsIG5vZGUgY2Fycmllc1xuICogYGluY29tcGxldGVTb3VyY2VzYCBhbmQgYHRydW5jYXRlZGAuIEEgcmVhZGVyIHRoYXQgd2FudHMgdG8gRVhQTEFJTiBhbnkgb2YgdGhlbSB0byBhIHBlcnNvbiAoYVxuICogd2h5LXBhbmVsLCBhbiBhZ2VudCB0b29sKSBrZXB0IGl0cyBvd24gdGFibGUgb2YgY29kZSDihpIgc2VudGVuY2UsIGFuZCB0YWJsZXMga2VwdCBhcGFydCBkcmlmdC5cbiAqIFRoaXMgZmlsZSBpcyB0aGF0IHRhYmxlLCBvbmNlLlxuICpcbiAqIFdIQVQgSVQgSE9MRFMuXG4gKiAgIC0gYEhPTkVTVFlfQ09ERVNgIOKAlCBhIGZyb3plbiwgY2xvc2VkIHJlZ2lzdHJ5OiBjb2RlIOKGkiB0aGUgT05FIHNlbnRlbmNlIHRoYXQgc2F5cyB3aGF0IHRoZSBjb2RlXG4gKiAgICAgbWVhbnMuIFRoZSBzaGFwZSBvZiBydXN0YydzIGAtLWV4cGxhaW5gIGFuZCBMU1AncyBgRGlhZ25vc3RpYy5jb2RlYDogdGhlIGNvZGUgaXMgdGhlIHN0YWJsZVxuICogICAgIGtleSBhIGNvbnN1bWVyIEJSQU5DSEVTIG9uOyB0aGUgc2VudGVuY2UgaXMgZm9yIHdob2V2ZXIgcmVhZHMgdGhlIHNjcmVlbi4gSXQgaXMgbm90IHRoZVxuICogICAgIHBlci1pbnN0YW5jZSBgZGV0YWlsYCBhIG5vdGUgY2FycmllcyAodGhhdCBuYW1lcyB0aGUga2V5LCB0aGUgYnVkZ2V0LCB0aGUgcm93cykuXG4gKiAgIC0gYEhvbmVzdHlDb2RlYCAvIGBSZWdpc3RlcmVkQ29kZWAg4oCUIHdoYXQgbWFrZXMgdGhlIHJlZ2lzdHJ5IHRoZSBvd25lciBhbmQgbm90IGEgc3VnZ2VzdGlvbjpcbiAqICAgICBlYWNoIHB1YmxpYyB1bmlvbiBvZiB0aGVzZSBjb2RlcyAoYEhvbmVzdHlOb3RlQ29kZWAsIGBNaXNzaW5nU2xpY2VSZWFzb25gLFxuICogICAgIGBNaXNzaW5nUHJvdmVuYW5jZVJlYXNvbmAsIGBGZWRCYXNpc2AsIGBBdHRyaWJ1dGlvbkJhc2lzYCwgYEZvbGRCYXNpc2AsIGFuZCBzaW5jZSA5LjMzLjAgYFZhbHVlQmFzaXNgIC9cbiAqICAgICBgV3JpdGVyQmFzaXNgIOKAlCB0aGUgYmFzaXMgdHdpbnMgb2YgYGNvbW1pdFZhbHVlQXRgIC8gYGZpbmRMYXN0V3JpdGVyYCkgZGVjbGFyZXMgaXRzIG1lbWJlcnNcbiAqICAgICB0aHJvdWdoIGBSZWdpc3RlcmVkQ29kZWAsIHNvIGEgbWVtYmVyIHRoZSByZWdpc3RyeSBkb2VzIG5vdCBob2xkIGZhaWxzIHRvIENPTVBJTEUuIEFuZFxuICogICAgIGB0ZXN0L2FyY2hpdGVjdHVyZS9ob25lc3R5LXZvY2FidWxhcnkudGVzdC50c2AgYXNrcyB0aGUgdHlwZSBjaGVja2VyIGZvciBldmVyeSBleHBvcnRlZCB0eXBlXG4gKiAgICAgYWxpYXMgb2YgYGZvb3RwcmludGpzL3RyYWNlYCB0aGF0IGlzIGEgdW5pb24gb2Ygc3RyaW5nIGxpdGVyYWxzOiBlYWNoIG9uZSBpcyBpbnNpZGUgdGhlXG4gKiAgICAgcmVnaXN0cnkgb3IgaXMgbmFtZWQsIHdpdGggaXRzIHJlYXNvbiwgYXMgbm90IGFuIGhvbmVzdHkgdm9jYWJ1bGFyeS5cbiAqXG4gKiBOTyBPQkpFQ1QgR0FJTlMgQSBGSUVMRCBmcm9tIGJlaW5nIHJlZ2lzdGVyZWQuIFRocmVlIHNpZ25hbHMgY2Fycnkgbm8gY29kZSBvZiB0aGVpciBvd24g4oCUIGFcbiAqIGBMb2dHYXBgIChgJ2xvZy1nYXAnYCksIGBDYXVzYWxOb2RlLmluY29tcGxldGVTb3VyY2VzYCAoYCdpbmNvbXBsZXRlLXNvdXJjZXMnYCkgYW5kXG4gKiBgRm9sZGVkU3RhdGUucmVkYWN0ZWRgIC8gYHJlZGFjdGVkUGF0aHNgIChgJ3JlZGFjdGVkJ2ApIOKAlCBhbmQgYSBgdHJ1bmNhdGVkOiB7IGJ5RGVwdGgsIGJ5Tm9kZXMgfWBcbiAqIGZpZWxkIG1lYW5zIGAndHJ1bmNhdGVkJ2A7IHRoZXkgYXJlIHJlZ2lzdGVyZWQgc28gYSByZWFkZXIgZXhwbGFpbnMgdGhlbSBmcm9tIHRoZSBzYW1lIHBsYWNlLlxuICpcbiAqIE5PVCBIRVJFOiB0aGUgdHdvIHN0cmluZ3MgYSByZWRhY3Rpb24gbGVhdmVzIHdoZXJlIGEgdmFsdWUgd2FzLiBUaGUgZW5naW5lIHdyaXRlcyB0aG9zZSBvbiBldmVyeVxuICogcmVkYWN0ZWQgcnVuOyB0aGUgbG9nJ3MgbGl2ZXMgaW4gaXRzIG93biBsZWFmLCBgbWVtb3J5L3BsYWNlaG9sZGVycy50c2AgKHRoZSBzY29wZSBjaGFubmVsJ3Mgd2l0aFxuICogdGhlIHZlcmRpY3QsIGBtZW1vcnkvcmVkYWN0aW9uLnRzYCksIHNvIHRoYXQgYW4gYXBwIHdoaWNoIG9ubHkgcnVucyBjaGFydHMgZG9lcyBub3QgY2FycnkgdGhlc2VcbiAqIHNlbnRlbmNlcyBpbiBpdHMgYnVuZGxlIChgSE9ORVNUWV9DT0RFU2AgaXMgYSBwdXJlIGV4cHJlc3Npb24sIHNvIGEgYnVuZGxlciBkcm9wcyBpdCB3aGVyZXZlclxuICogbm90aGluZyByZWFkcyBpdCkuXG4gKlxuICogV0hZIEwwLiBUaGlzIGZpbGUgaW1wb3J0cyBOT1RISU5HLCBhbmQgYHNsaWNlL2AgYW5kIGB0aW1lLXRyYXZlbC9gIChMMykgdHlwZSB0aGVpciBjb2RlcyB0aHJvdWdoXG4gKiBpdCwgc28gaXQgc2l0cyBiZWxvdyB0aGVtIOKAlCB0aGUgbGF5ZXIgdGFibGUgaXMgYHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqc2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEhPTkVTVFlfQ09ERVMgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogZm9yIChjb25zdCB7IGNvZGUgfSBvZiBmb3J3YXJkU2xpY2Uubm90ZXMpIGNvbnNvbGUubG9nKGNvZGUsICfihpInLCBIT05FU1RZX0NPREVTW2NvZGVdKTtcbiAqIC8vIHJlYWRzLW5vdC1yZWNvcmRlZCDihpIgVGhpcyBsb2cgY2FycmllcyBubyByZWNvcmRlZCByZWFkIGF0IGFsbCAodGhlIHJlYWRUcmFja2luZzogJ29mZicgc2lnbmF0dXJlKSwg4oCmXG4gKiBIT05FU1RZX0NPREVTW2ZvbGRlZFN0YXRlLmJhc2lzXTsgLy8gJ2xvZy1vbmx5JyDihpIgTm8gaW5pdGlhbFN0YXRlIHRyYXZlbGxlZCB3aXRoIHRoaXMgbG9nICjigKYpLCDigKZcbiAqIGBgYFxuICovXG5cbi8qKlxuICogRXZlcnkgaG9uZXN0eSBjb2RlIHRoZSB0cmFjZSByZWFkZXJzIChgZm9vdHByaW50anMvdHJhY2VgKSBzcGVhaywgd2l0aCB0aGUgb25lIHNlbnRlbmNlIHRoYXQgc2F5c1xuICogd2hhdCBpdCBtZWFucy5cbiAqXG4gKiBGcm96ZW4gYW5kIGNsb3NlZDogdGhlIGtleXMgYXJlIGV4YWN0bHkgdGhlIGNvZGVzIGJlbG93LCBhbmQge0BsaW5rIEhvbmVzdHlDb2RlfSBpcyBkZXJpdmVkIGZyb21cbiAqIHRoZW0uIEEgbmV3IGNvZGUgaXMgb25lIG5ldyBsaW5lIGhlcmU6IGEgdW5pb24gZGVjbGFyZWQgdGhyb3VnaCB7QGxpbmsgUmVnaXN0ZXJlZENvZGV9IGNhbm5vdCBob2xkXG4gKiBhIGNvZGUgdGhhdCBpcyBub3Qgb24gaXQsIGFuZCBgdGVzdC9hcmNoaXRlY3R1cmUvaG9uZXN0eS12b2NhYnVsYXJ5LnRlc3QudHNgIGZhaWxzIG9uIGFuIGV4cG9ydGVkXG4gKiB0eXBlIGFsaWFzIG9mIGBmb290cHJpbnRqcy90cmFjZWAgdGhhdCBpcyBhIHVuaW9uIG9mIHN0cmluZyBsaXRlcmFscyBuZWl0aGVyIGluc2lkZSB0aGUgcmVnaXN0cnlcbiAqIG5vciBuYW1lZCB0aGVyZSBhcyBub3QgYW4gaG9uZXN0eSB2b2NhYnVsYXJ5LiBUaGUgdmFsdWVzIGFyZSB0eXBlZCBgc3RyaW5nYCwgbm90IGxpdGVyYWwgdHlwZXMsXG4gKiBvbiBwdXJwb3NlOiB0aGUgc2VudGVuY2VzIGFyZSBmb3IgYSBzY3JlZW4gYW5kIG1heSBiZSByZXdvcmRlZDsgYSBjb25zdW1lciBicmFuY2hlcyBvbiB0aGUgS0VZLlxuICovXG5leHBvcnQgY29uc3QgSE9ORVNUWV9DT0RFUyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuZnJlZXplKHtcbiAgLy8g4pSA4pSAIGEgc2xpY2UncyBub3RlcyDigJQgYEhvbmVzdHlOb3RlLmNvZGVgIChzbGljZS8pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAnY29uc2VydmF0aXZlLWZlZC1lZGdlcyc6XG4gICAgXCJBdCBsZWFzdCBvbmUgJ2ZlZCcgZWRnZSBpcyBzdGFnZS1sZXZlbCAoY29uc2VydmF0aXZlKTogaXRzIHdyaXRlIGNhcnJpZXMgbm8gcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZSwgc28gdGhlIGVkZ2UgbWF5IG5vdCBiZSByZWFsIOKAlCB0dXJuIG9uIHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCcgZm9yIGV4YWN0IGVkZ2VzLlwiLFxuICAnbmVzdGVkLXJvd3MnOlxuICAgIFwiQSB3cml0ZSB0aGlzIGFuc3dlciByZXN0cyBvbiByZWFjaGVkIHRoZSBrZXkgb25seSB0aHJvdWdoIHBhdGhzIGluc2lkZSBpdCAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2ssIGEgZm9yayBjaGlsZCdzIG5hbWVzcGFjZSksIHNvIGl0IGNoYW5nZWQgcGFydCBvZiB0aGUga2V5J3MgdmFsdWUsIG5vdCB0aGUgd2hvbGU6IGVhcmxpZXIgd3JpdGVzIG1heSBhY2NvdW50IGZvciB0aGUgcmVzdCwgYW5kIGEgcmVhZGVyIG9mIHRoZSBrZXkgbWF5IG5vdCBoYXZlIHJlYWQgdGhlIHBhcnQgdGhhdCB3cml0ZSBjaGFuZ2VkLlwiLFxuICAncHJlLXJ1bi1vcmlnaW4nOlxuICAgICdUaGUgdmFsdWUgYmVpbmcgZm9sbG93ZWQgd2FzIGFic2VudCBvciBhbHJlYWR5IHRoZXJlIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgdGhpcyBsb2cgY2FuIHNlZSAoaW5pdGlhbCBzdGF0ZSwgZnJvemVuIHJ1biBpbnB1dCBvciBhIGNsb3N1cmUpLCBzbyB3aG8gcHV0IGl0IHRoZXJlIGlzIG91dHNpZGUgdGhlIGNvbW1pdCBsb2cuJyxcbiAgJ3JlYWRzLW5vdC1yZWNvcmRlZCc6XG4gICAgXCJUaGlzIGxvZyBjYXJyaWVzIG5vIHJlY29yZGVkIHJlYWQgYXQgYWxsICh0aGUgcmVhZFRyYWNraW5nOiAnb2ZmJyBzaWduYXR1cmUpLCBzbyAnbm90aGluZyByZWFkIHRoaXMgdmFsdWUnIGlzIHVua25vd2FibGUgaGVyZSwgbm90IHRydWUuXCIsXG4gICd1bmtub3duLWtleSc6XG4gICAgXCJUaGlzIGxvZyBoYXMgbm8gd3JpdGUgYW5kIG5vIHJlY29yZGVkIHJlYWQgb2YgdGhlIGtleSwgd2hpY2ggaXMgbW9zdCBsaWtlbHkgYSB0eXBvIG9yIHRoZSB3cm9uZyBydW4ncyBsb2cgcmF0aGVyIHRoYW4gYSB2YXJpYWJsZSB3aXRoIG5vIGhpc3RvcnkuXCIsXG4gIHRydW5jYXRlZDpcbiAgICAnQSBidWRnZXQgKG1heERlcHRoIG9yIG1heE5vZGVzKSBjdXQgdGhlIHdhbGssIHNvIG1vcmUgb2YgdGhlIGFuc3dlciBleGlzdHMgYmV5b25kIHRoZSBob3Jpem9uIGl0IHN0b3BwZWQgYXQuJyxcbiAgLy8g4pSA4pSAIHdoeSBhIHNsaWNlIGhhcyBubyBhbnN3ZXIg4oCUIGBtaXNzaW5nYCAoc2xpY2UvOiBNaXNzaW5nU2xpY2VSZWFzb24sIE1pc3NpbmdQcm92ZW5hbmNlUmVhc29uKSDilIBcbiAgJ2VtcHR5LWxvZyc6XG4gICAgJ1RoZSBjb21taXQgbG9nIGhvbGRzIG5vIGNvbW1pdCBhdCBhbGwgKG5vdGhpbmcgaGFzIGV4ZWN1dGVkLCBvciB0aGUgbG9nIGhhbmRlZCBpbiBpcyBlbXB0eSksIHNvIHRoZXJlIGlzIG5vIGhpc3RvcnkgdG8gYW5zd2VyIGZyb20uJyxcbiAgJ25ldmVyLXdyaXR0ZW4nOlxuICAgICdObyBjb21taXQgaW4gdGhlIHJhbmdlIGFza2VkIGFib3V0IHdyb3RlIHRoZSBrZXkg4oCUIG5vdCBpdHMgd2hvbGUgdmFsdWUsIG5vdCBhIHBhdGggaW5zaWRlIGl0LCBhbmQgbm90IGEgY29udGFpbmVyIGFyb3VuZCBpdCBpbiBhIHdheSB0aGF0IGNoYW5nZWQgaXQgKGEgZm9yd2FyZCBzbGljZSBvciBhIHRpbWVsaW5lIGFsc28gZm91bmQgbm8gcmVjb3JkZWQgcmVhZCBvbiwgaW5zaWRlIG9yIGFyb3VuZCBpdCkg4oCUIHNvIHRoZXJlIGlzIG5vIHdyaXRlIHRvIHN0YXJ0IGZyb206IGFueSB2YWx1ZSBpdCBoYXMgY2FtZSBmcm9tIHRoZSBpbml0aWFsIHN0YXRlLCB0aGUgZnJvemVuIHJ1biBpbnB1dCBvciBhIGNsb3N1cmUsIG5vbmUgb2Ygd2hpY2ggdGhlIGNvbW1pdCBsb2cgY2FuIHNlZS4nLFxuICAnbm90LWFuLWFycmF5JzpcbiAgICAnVGhlIGtleSB3YXMgd3JpdHRlbiwgYnV0IGl0cyB2YWx1ZSBhdCB0aGUgcG9pbnQgYXNrZWQgYWJvdXQgaXMgbm90IGFuIGFycmF5IChhIHNjYWxhciBvciBvYmplY3Qga2V5LCBhIGRlbGV0ZWQga2V5LCBvciBhIG1lcmdlIHRoYXQgZGVncmFkZWQgaXQpLCBzbyBlbGVtZW50IHByb3ZlbmFuY2UgZG9lcyBub3QgYXBwbHk6IHNsaWNlRm9yS2V5IGlzIHRoZSBxdWVyeSBmb3IgaXQuJyxcbiAgLy8g4pSA4pSAIGhvdyBhIGZlZCBlZGdlIHdhcyBhdHRyaWJ1dGVkIOKAlCBgRm9yd2FyZEVkZ2UuYmFzaXNgIChzbGljZS86IEZlZEJhc2lzKSDilIBcbiAgJ3Blci13cml0ZSc6XG4gICAgXCJUaGlzIGZlZCBlZGdlIGlzIGV4YWN0OiB0aGUgZG93bnN0cmVhbSB3cml0ZSBjYXJyaWVzIHBlci13cml0ZSByZWFkIHByb3ZlbmFuY2UgKFRyYWNlRW50cnkucmVhZEtleXMsIHJlY29yZGVkIHVuZGVyIHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCcpIGFuZCB0aGF0IGxpc3QgbmFtZXMgdGhlIGtleSwgc28gdGhlIHZhbHVlIHdhcyByZWFkIGJlZm9yZSB0aGUgd3JpdGUgaXQgZmVlZHMuXCIsXG4gIHN0YWdlOlxuICAgICdUaGlzIGZlZCBlZGdlIGlzIGNvbnNlcnZhdGl2ZTogdGhlIGRvd25zdHJlYW0gd3JpdGUgY2FycmllcyBubyBwZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICh0aGUgd3JpdGVQcm92ZW5hbmNlIGRpYWwgd2FzIG9mZiwgb3IgdGhlIGxvZyBpcyBtaXhlZCksIHNvIGFsbCB0aGF0IGlzIGtub3duIGlzIHRoYXQgaXRzIHN0YWdlIHJlYWQgdGhpcyBrZXkgYW5kIHdyb3RlIHRoYXQgcGF0aCBpbiBzb21lIG9yZGVyLCBhbmQgdGhlIGVkZ2UgbWF5IG5vdCBiZSByZWFsLicsXG4gIC8vIOKUgOKUgCBob3cgYW4gZWxlbWVudCdzIGJpcnRoIHdhcyBhdHRyaWJ1dGVkIOKAlCBgRWxlbWVudEJpcnRoLmJhc2lzYCAoc2xpY2UvOiBBdHRyaWJ1dGlvbkJhc2lzKSDilIBcbiAgJ2FwcGVuZC12ZXJiJzpcbiAgICBcIlRoZSBlbmdpbmUgcmVjb3JkZWQgdGhlIGVsZW1lbnQgaW4gYW4gYXBwZW5kIHJvdydzIHRhaWwgKGhvdyBjb21taXRWYWx1ZXM6ICdkZWx0YScgcmVjb3JkcyBhbiBhcnJheSdzIGdyb3d0aCksIHNvIHRoZSBjb21taXQgdGhhdCBhZGRlZCBpdCBpcyBrbm93biBleGFjdGx5LCBub3QgaW5mZXJyZWQuXCIsXG4gICdwcmVmaXgtaW5mZXJlbmNlJzpcbiAgICAnQSB3aG9sZS12YWx1ZSB3cml0ZSAoYSBzZXQgb3IgYSBtZXJnZSkga2VwdCB0aGUgcHJldmlvdXMgYXJyYXkgYXMgaXRzIHByZWZpeCwgc28gdGhlIG5ldyB0YWlsIGlzIGF0dHJpYnV0ZWQgdG8gdGhhdCBjb21taXQgYnkgaW5mZXJlbmNlOiBhIHdyaXRlIHRoYXQgcmVwbGFjZWQgdGhlIGFycmF5IHdpdGggb25lIHRoYXQgaGFwcGVucyB0byBiZWdpbiB0aGUgc2FtZSB3YXkgbG9va3MgaWRlbnRpY2FsLicsXG4gICd3aG9sZS12YWx1ZSc6XG4gICAgXCJUaGlzIGNvbW1pdCBwbGFjZWQgdGhlIGFycmF5IHdob2xlc2FsZSAodGhlcmUgd2FzIG5vIGVhcmxpZXIgYXJyYXksIG9yIHRoZSBuZXcgb25lIGRvZXMgbm90IGJlZ2luIHdpdGggaXQpLCBzbyBldmVyeSBlbGVtZW50J3MgYmlydGggcmVzZXRzIHRvIHRoaXMgY29tbWl0OiBleGFjdCwgYnV0IGNvYXJzZS5cIixcbiAgLy8g4pSA4pSAIGhvdyBhIGZvbGQgd2FzIGRlcml2ZWQg4oCUIGBGb2xkZWRTdGF0ZS5iYXNpc2AgKHRpbWUtdHJhdmVsLykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICdpbml0aWFsK2xvZyc6XG4gICAgJ1RoZSBmb2xkIHN0YXJ0ZWQgZnJvbSB0aGUgZm9sZCBiYXNlIHRoYXQgdHJhdmVsbGVkIHdpdGggdGhlIGxvZyAoaW5pdGlhbFN0YXRlKSBhbmQgcmVwbGF5ZWQgdGhlIGNvbW1pdCBsb2cgb250byBpdCwgc28gbm90aGluZyBzZWVkZWQgYmVmb3JlIHRoZSBydW4gaXMgbWlzc2luZzsgcm93cyBpdCBjb3VsZCBub3QgcmVhZCBhcmUgbGlzdGVkIGFwYXJ0LCBpbiBza2lwcGVkLicsXG4gICdsb2ctb25seSc6XG4gICAgJ05vIGluaXRpYWxTdGF0ZSB0cmF2ZWxsZWQgd2l0aCB0aGlzIGxvZyAoYSBzbmFwc2hvdCBzdG9yZWQgYmVmb3JlIDkuMTcsIGEgcmVkYWN0ZWQgc25hcHNob3Qgb3IgYSBoYW5kLWJ1aWx0IGxvZyksIHNvIHRoZSBmb2xkIHN0YXJ0ZWQgZnJvbSBhbiBlbXB0eSBvYmplY3Q6IGEga2V5IHNlZWRlZCBiZWZvcmUgdGhlIHJ1biBpcyB3aG9sZSBvbmx5IG9uY2UgYSBjb21taXQgc2luY2Ugd3JvdGUgaXRzIHdob2xlIHZhbHVlLCBhbmQgdW50aWwgdGhlbiBpdCBob2xkcyBqdXN0IHdoYXQgaXRzIG1lcmdlcywgYXBwZW5kcyBhbmQgbmVzdGVkIHdyaXRlcyBhZGRlZCwgb3Igbm90aGluZy4nLFxuICAvLyDilIDilIAgYSByb3cgb2YgYSBzdG9yZWQgbG9nIHRoYXQgaXMgbm90IGEgY29tbWl0IGJ1bmRsZSDigJQgYExvZ0dhcGAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICdsb2ctZ2FwJzpcbiAgICAnQSByb3cgb2YgdGhlIHN0b3JlZCBsb2cgY291bGQgbm90IGJlIHJlYWQgYXMgYSBjb21taXQgYnVuZGxlLCBzbyBpdCBrZWVwcyBpdHMgaW5kZXggYnV0IGNvbnRyaWJ1dGVzIG5vIHN0YXRlLCBhbmQgYW55IGZvbGQgdGhhdCBjcm9zc2VzIGl0IGlzIG1pc3Npbmcgd2hhdGV2ZXIgdGhhdCByb3cgd3JvdGUuJyxcbiAgLy8g4pSA4pSAIHVudHJhY2tlZCByZWFkcyBhIHN0YWdlIGFsc28gY29uc3VtZWQg4oCUIGBDYXVzYWxOb2RlLmluY29tcGxldGVTb3VyY2VzYCDilIBcbiAgJ2luY29tcGxldGUtc291cmNlcyc6XG4gICAgJ1RoZSBzdGFnZSBhbHNvIGNvbnN1bWVkIHJlYWQgcGF0aHMgdGhhdCBieXBhc3MgcmVhZCB0cmFja2luZyAoYXJncywgZW52IG9yIGFuIHVuc2hhZG93ZWQgc2lsZW50IHJlYWQpLCBzbyBhIHNsaWNlIHRocm91Z2ggaXQgbWF5IGJlIGluY29tcGxldGU6IHRob3NlIHJlYWRzIHByb2R1Y2Ugbm8gcmVhZC10by13cml0ZSBlZGdlIHRvIGZvbGxvdy4nLFxuICAvLyDilIDilIAgdmFsdWVzIHNjcnViYmVkIGF0IHdyaXRlIHRpbWUg4oCUIGBGb2xkZWRTdGF0ZS5yZWRhY3RlZGAgLyBgcmVkYWN0ZWRQYXRoc2AsIGEgdmFsdWUgYmFzaXMg4pSAXG4gIHJlZGFjdGVkOlxuICAgIFwiVmFsdWVzIGF0IHRoZSBwYXRocyBsaXN0ZWQgaW4gcmVkYWN0ZWRQYXRocyAoYSBmb2xkJ3MsIG9yIGEgY29tbWl0J3MgaW4gdGhlIHJhbmdlIGEga2V5J3MgdmFsdWUgcmVzdHMgb24pIHdlcmUgc2NydWJiZWQgd2hlbiB0aGV5IHdlcmUgd3JpdHRlbiAoYnkgYSByZWRhY3Rpb24gcG9saWN5LCBvciBhIHdyaXRlIG1hcmtlZCByZWRhY3RlZCksIHNvIHdoZXJlIHRoZSBhbnN3ZXIgaG9sZHMgdGhlIGxvZydzIHBsYWNlaG9sZGVyICdSRURBQ1RFRCcsIG9yIGxvc3QgYSBrZXkgdW5kZXIgYSBjb250YWluZXIgdGhlIHBsYWNlaG9sZGVyIHJlcGxhY2VkLCBpdCBzdGFuZHMgaW4gZm9yIGEgdmFsdWUgdGhlIGxvZyBuZXZlciByZWNvcmRlZC5cIixcbiAgLy8g4pSA4pSAIGhvdyBvbmUga2V5J3MgdmFsdWUgd2FzIHJlYWQgb2ZmIHRoZSBsb2cg4oCUIGBWYWx1ZUJhc2lzYCAoY29tbWl0VmFsdWVBdFdpdGhCYXNpcykg4pSAXG4gIGRlbGV0ZWQ6XG4gICAgXCJUaGUga2V5J3MgbGFzdCB3cml0ZSBpbiB0aGUgcmFuZ2UgYXNrZWQgYWJvdXQgbGVmdCBpdCBhYnNlbnQgKGEgZGVsZXRlIG9mIHRoZSBrZXkgb3Igb2YgYSBjb250YWluZXIgYXJvdW5kIGl0LCBvciBhIHNldCBvZiBhIGNvbnRhaW5lciB0aGF0IG5vIGxvbmdlciBob2xkcyBpdCksIHNvIHRoZSBhbnN3ZXIgaXMgdW5kZWZpbmVkIGJlY2F1c2UgdGhlIHJlY29yZCBzYXlzIHRoZSBrZXkgd2FzIGdvbmUgYXQgdGhhdCBwb2ludCwgbm90IGJlY2F1c2Ugbm90aGluZyB3YXMgcmVjb3JkZWQuXCIsXG4gICdmcm9tLWluaXRpYWwtc3RhdGUnOlxuICAgIFwiTm8gc2V0IG9yIGRlbGV0ZSBvZiB0aGUga2V5LCBvciBvZiBhIGNvbnRhaW5lciBhcm91bmQgaXQsIGlzIGluIHRoZSByYW5nZSBhc2tlZCBhYm91dCwgc28gdGhlIGFuc3dlciByZXN0cyBvbiB0aGUgdmFsdWUgdGhlIGtleSBoYWQgYmVmb3JlIHRoZSBydW46IGZvbGRlZCBmcm9tIHRoZSBpbml0aWFsU3RhdGUgcGFzc2VkIGluIHdoZW4gdGhlcmUgd2FzIG9uZSwgYW5kIG90aGVyd2lzZSBvbmx5IHdoYXQgdGhlIGxvZydzIG1lcmdlcywgYXBwZW5kcyBhbmQgbmVzdGVkIHdyaXRlcyBhZGRlZCB0byBpdCAob3Igbm90aGluZyksIHdoaWNoIGlzIHBhcnRpYWwgZm9yIGEga2V5IHNlZWRlZCBiZWZvcmUgdGhlIHJ1bi5cIixcbn0gc2F0aXNmaWVzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuXG4vKiogQW55IGNvZGUgaW4ge0BsaW5rIEhPTkVTVFlfQ09ERVN9IOKAlCB0aGUga2V5IGEgcmVhZGVyIGxvb2tzIGFuIGV4cGxhbmF0aW9uIHVwIGJ5LiAqL1xuZXhwb3J0IHR5cGUgSG9uZXN0eUNvZGUgPSBrZXlvZiB0eXBlb2YgSE9ORVNUWV9DT0RFUztcblxuLyoqXG4gKiBBIHVuaW9uIG9mIGhvbmVzdHkgY29kZXMgYSB0eXBlIERFQ0xBUkVTOiBgVGAgbXVzdCBiZSBhIHN1YnNldCBvZiB7QGxpbmsgSG9uZXN0eUNvZGV9LCBvciB0aGVcbiAqIGRlY2xhcmF0aW9uIGZhaWxzIHRvIGNvbXBpbGUgKFRTMjM0NCkuXG4gKlxuICogYFJlZ2lzdGVyZWRDb2RlPFQ+YCBpcyBgVGAg4oCUIGFuIGlkZW50aXR5IGF0IHRoZSB0eXBlIGxldmVsIOKAlCBzbyB0aGUgdW5pb24ga2VlcHMgZXhhY3RseSB0aGVcbiAqIG1lbWJlcnMgaXQgd2FzIHdyaXR0ZW4gd2l0aCBhbmQgZG9lcyBOT1Qgd2lkZW4gdG8gZXZlcnkgY29kZTpcbiAqIGB0eXBlIEZvbGRCYXNpcyA9IFJlZ2lzdGVyZWRDb2RlPCdpbml0aWFsK2xvZycgfCAnbG9nLW9ubHknPmAuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZ2lzdGVyZWRDb2RlPFQgZXh0ZW5kcyBIb25lc3R5Q29kZT4gPSBUO1xuIl19