footprintjs 9.48.3 → 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 -18
  138. package/dist/esm/lib/capture/ownData.js +0 -36
  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 -947
  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 -52
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -118
  172. package/dist/esm/lib/memory/pathOps.js +0 -293
  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 -151
  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 -41
  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 -951
  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 -56
  249. package/dist/lib/memory/pathOps.js +0 -309
  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 -170
  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 -18
  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 -118
  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,309 +0,0 @@
1
- "use strict";
2
- /**
3
- * pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
4
- *
5
- * The DENIED set is the shared rule for three prototype-pollution selector
6
- * segments (__proto__, constructor, prototype). Each operation's traversal
7
- * contract is explicit below; merely using this module is not a sandbox.
8
- *
9
- * Selector operations read only own fields. Writers preflight the whole path
10
- * before creating or copying any container, then place through putOwn.
11
- * - nativeGet — DENIED check + hasOwnProperty at every step.
12
- * - nativeHas — own-property existence only, including own denied names
13
- * and own undefined values; it does not use the DENIED rule.
14
- * - mergeContextWins — own-enumerable source keys, DENIED check, own-only
15
- * destination precedence. Inherited fields are never destination data.
16
- *
17
- * Diagnostic writers retain their distinct creation/merge laws in utils.ts,
18
- * using the same isDeniedSegment predicate and shared own-slot writer.
19
- *
20
- * Paths may be dot-notation strings or pre-split (string|number)[] arrays.
21
- */
22
- Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.mergeContextWins = exports.nativeHas = exports.adopt = exports.own = exports.ownedRootOf = exports.ownSpine = exports.shallowCopy = exports.ownChild = exports.isContainer = exports.nativeDelete = exports.nativeSet = exports.nativeGet = exports.isDeniedSegment = void 0;
24
- const ownData_js_1 = require("../capture/ownData.js");
25
- const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
26
- /** Is `segment` one of the three denied prototype-pollution selector names? */
27
- function isDeniedSegment(segment) {
28
- return DENIED.has(String(segment));
29
- }
30
- exports.isDeniedSegment = isDeniedSegment;
31
- function toSegments(path) {
32
- return Array.isArray(path) ? path : path.split('.');
33
- }
34
- /**
35
- * Get the value at `path` in `obj`, returning `defaultValue` if absent.
36
- *
37
- * Security: each path segment is checked against the DENIED list and requires
38
- * an own property at every step, preventing prototype-chain reads.
39
- * e.g. nativeGet({}, '__proto__') and nativeGet({}, 'constructor') both return
40
- * `defaultValue` instead of leaking Object.prototype / the Object constructor.
41
- */
42
- function nativeGet(obj, path, defaultValue) {
43
- const segs = toSegments(path);
44
- let curr = obj;
45
- for (const seg of segs) {
46
- if (curr == null)
47
- return defaultValue;
48
- if (DENIED.has(String(seg)))
49
- return defaultValue;
50
- if (!Object.prototype.hasOwnProperty.call(curr, seg))
51
- return defaultValue;
52
- curr = curr[seg];
53
- }
54
- return curr === undefined ? defaultValue : curr;
55
- }
56
- exports.nativeGet = nativeGet;
57
- /**
58
- * Set an own path in a writer-owned container, creating missing intermediates.
59
- * A denied selector is a no-op BEFORE any prefix is created. Inherited values
60
- * and accessors do not participate; existing own accessors keep normal behavior.
61
- */
62
- function nativeSet(obj, path, value) {
63
- const segs = toSegments(path);
64
- if (segs.some(isDeniedSegment))
65
- return obj;
66
- let curr = obj;
67
- for (let i = 0; i < segs.length - 1; i++) {
68
- const k = segs[i];
69
- // Do not read an inherited accessor. For an OWN accessor, retain the
70
- // original null/type/traversal read sequence (including getter calls).
71
- if (!Object.prototype.hasOwnProperty.call(curr, k) || curr[k] == null || typeof curr[k] !== 'object') {
72
- (0, ownData_js_1.putOwn)(curr, k, typeof segs[i + 1] === 'number' ? [] : {});
73
- }
74
- curr = curr[k];
75
- }
76
- const last = segs[segs.length - 1];
77
- (0, ownData_js_1.putOwn)(curr, last, value);
78
- return obj;
79
- }
80
- exports.nativeSet = nativeSet;
81
- /**
82
- * Remove the own property at `path` in `obj` (the replay primitive for the
83
- * `delete` commit verb, #13c-B). No-op when any intermediate segment is
84
- * missing — deleting an absent key has nothing to remove.
85
- *
86
- * Security: same DENIED + hasOwnProperty discipline as nativeGet — every
87
- * segment is checked, so `nativeDelete(obj, '__proto__x')` and
88
- * prototype-chain walks are inert.
89
- */
90
- function nativeDelete(obj, path) {
91
- const segs = toSegments(path);
92
- let curr = obj;
93
- for (let i = 0; i < segs.length - 1; i++) {
94
- const seg = segs[i];
95
- if (DENIED.has(String(seg)))
96
- return;
97
- if (curr == null || typeof curr !== 'object' || !Object.prototype.hasOwnProperty.call(curr, seg))
98
- return;
99
- curr = curr[seg];
100
- }
101
- const last = segs[segs.length - 1];
102
- if (DENIED.has(String(last)))
103
- return;
104
- if (curr != null && typeof curr === 'object') {
105
- delete curr[last];
106
- }
107
- }
108
- exports.nativeDelete = nativeDelete;
109
- // ── Copy-on-write primitives (docs/design/2026-10-copy-on-write-commit.md) ──
110
- //
111
- // THE LAW: a committed generation is never edited. A writer copies the root
112
- // and every container on each path it writes, edits only containers it
113
- // created during the current operation (its `owned` set), and shares every
114
- // other subtree with the generation before it. The same law
115
- // `reactive/structuralWrite.ts · setInPath` applies to a single value.
116
- /** A container a writer may own: anything `typeof 'object'` and not null. */
117
- function isContainer(value) {
118
- return value !== null && typeof value === 'object';
119
- }
120
- exports.isContainer = isContainer;
121
- /**
122
- * `parent[key]` when `parent` is a container that OWNS `key` — the slot
123
- * {@link nativeGet} would read, refusing the same prototype-pollution
124
- * segments — else `undefined`. One step of a path walk.
125
- */
126
- function ownChild(parent, key) {
127
- return isContainer(parent) && !DENIED.has(String(key)) && Object.prototype.hasOwnProperty.call(parent, key)
128
- ? parent[key]
129
- : undefined;
130
- }
131
- exports.ownChild = ownChild;
132
- /** True for an own key of an array that is an array INDEX (`'0'`, `'12'`), not a name (`arr.note`). */
133
- function isArrayIndexKey(key) {
134
- const n = Number(key);
135
- return Number.isInteger(n) && n >= 0 && n < 4294967295 && String(n) === key;
136
- }
137
- /**
138
- * The named (non-index) own keys of an array, in order. Own-key order puts
139
- * every index first, ascending, and names after them — so the names are the
140
- * tail of `Object.keys`, and an array without any is told by its last key.
141
- */
142
- function namedArrayKeys(array) {
143
- const keys = Object.keys(array);
144
- let first = keys.length;
145
- while (first > 0 && !isArrayIndexKey(keys[first - 1]))
146
- first--;
147
- return keys.slice(first);
148
- }
149
- /**
150
- * A SHALLOW copy of one container that keeps every slot the whole-state
151
- * `structuredClone` this replaced kept — so a path copy and a deep clone give
152
- * the same value at every path:
153
- * - a plain object (or a null-prototype one): its own enumerable keys, in
154
- * order, by spread — an own `__proto__` key stays a key; the result has
155
- * `Object.prototype`, as a clone's does;
156
- * - an array: its indices, holes and length (`slice`) AND any named
157
- * property a nested write hung off it (`slice` alone would drop those);
158
- * - anything else — a `Date`, `Map`, `Set`, typed array, a class instance —
159
- * is deep-cloned, which is what the whole-state clone did to it; and the
160
- * own enumerable properties the clone cannot carry (an expando a nested
161
- * write hung on a `Date`) are carried over by reference, so a later write
162
- * through it changes exactly its own path. Rare on a write path.
163
- */
164
- function shallowCopy(container) {
165
- if (Array.isArray(container)) {
166
- const copy = container.slice();
167
- for (const key of namedArrayKeys(container))
168
- (0, ownData_js_1.putOwn)(copy, key, container[key]);
169
- return copy;
170
- }
171
- const proto = Object.getPrototypeOf(container);
172
- if (proto === Object.prototype || proto === null)
173
- return { ...container };
174
- const copy = structuredClone(container);
175
- for (const key of Object.keys(container)) {
176
- if (!Object.prototype.hasOwnProperty.call(copy, key))
177
- (0, ownData_js_1.putOwn)(copy, key, container[key]);
178
- }
179
- return copy;
180
- }
181
- exports.shallowCopy = shallowCopy;
182
- /**
183
- * Make the containers on the way to `path`'s LEAF ones the writer owns, so
184
- * the write that follows (`nativeSet` / `nativeDelete` / a verb arm) edits
185
- * nothing it did not create.
186
- *
187
- * `root` must already be owned. Walking down, every container the writer did
188
- * not create (`owned` does not hold it) is replaced, in its parent, by its
189
- * {@link shallowCopy}, which the writer then owns. A denied segment anywhere
190
- * refuses the entire walk before copying. Otherwise the walk stops at a
191
- * missing / inherited / primitive intermediate (`nativeSet` makes a fresh
192
- * own container from that point on). The leaf itself is never copied — the
193
- * write replaces it.
194
- *
195
- * Cost: one shallow copy per container on the path that this writer has not
196
- * already copied — O(depth × width), independent of everything the write
197
- * does not pass through. A path of one segment (a root key, the common case)
198
- * copies nothing here.
199
- */
200
- function ownSpine(root, path, owned) {
201
- const segs = toSegments(path);
202
- if (segs.some(isDeniedSegment))
203
- return;
204
- let curr = root;
205
- for (let i = 0; i < segs.length - 1; i++) {
206
- const k = segs[i];
207
- const next = ownChild(curr, k);
208
- if (!isContainer(next))
209
- return;
210
- if (owned.has(next)) {
211
- curr = next;
212
- continue;
213
- }
214
- const copy = shallowCopy(next);
215
- owned.add(copy);
216
- (0, ownData_js_1.putOwn)(curr, k, copy);
217
- curr = copy;
218
- }
219
- }
220
- exports.ownSpine = ownSpine;
221
- /**
222
- * The root of a new generation: a shallow copy of `base` when it is a
223
- * container (owned by the writer), else the historical deep clone of a
224
- * non-container base (`undefined`, a primitive) so the callers' behaviour on
225
- * such a base is unchanged.
226
- */
227
- function ownedRootOf(base, owned) {
228
- if (!isContainer(base))
229
- return structuredClone(base);
230
- const root = shallowCopy(base);
231
- owned?.add(root);
232
- return root;
233
- }
234
- exports.ownedRootOf = ownedRootOf;
235
- /** Mark a value the writer just created (a fresh clone, a merge result) as owned. */
236
- function own(value, owned) {
237
- if (owned !== undefined && isContainer(value))
238
- owned.add(value);
239
- }
240
- exports.own = own;
241
- /**
242
- * Mark EVERY container of a tree the writer just created whole (a
243
- * `structuredClone` result) as owned, so a later write through any of them
244
- * edits it in place instead of copying it again. Walks own enumerable keys —
245
- * the slots a path can address; a `Map`'s or `Set`'s entries are not. O(the
246
- * tree's containers); a container already owned is not walked twice (a cycle
247
- * inside the clone ends there).
248
- */
249
- function adopt(tree, owned) {
250
- const stack = [tree];
251
- while (stack.length > 0) {
252
- const value = stack.pop();
253
- if (!isContainer(value) || owned.has(value))
254
- continue;
255
- owned.add(value);
256
- for (const key of Object.keys(value))
257
- stack.push(value[key]);
258
- }
259
- }
260
- exports.adopt = adopt;
261
- /** Returns true if `obj` has an own property at every segment of `path`. */
262
- function nativeHas(obj, path) {
263
- const segs = toSegments(path);
264
- let curr = obj;
265
- for (let i = 0; i < segs.length; i++) {
266
- if (curr == null || !Object.prototype.hasOwnProperty.call(curr, segs[i]))
267
- return false;
268
- if (i < segs.length - 1)
269
- curr = curr[segs[i]];
270
- }
271
- return true;
272
- }
273
- exports.nativeHas = nativeHas;
274
- /**
275
- * Deep merge where destination wins for any defined value.
276
- * Fills missing keys from `src`, but never overwrites defined keys in `dst`.
277
- * Arrays are not recursed — dst array always wins when present.
278
- *
279
- * Replaces: `mergeWith(dst, src, (objValue) => objValue !== undefined ? objValue : undefined)`
280
- */
281
- function mergeContextWins(dst, src) {
282
- if (!src || typeof src !== 'object' || Array.isArray(src)) {
283
- return dst !== undefined ? dst : src;
284
- }
285
- const out = dst != null && typeof dst === 'object' ? { ...dst } : {};
286
- for (const key of Object.keys(src)) {
287
- if (DENIED.has(key))
288
- continue;
289
- const dstVal = ownChild(out, key);
290
- if (dstVal !== undefined) {
291
- // dst wins; recurse only if both sides are plain objects
292
- if (dstVal !== null &&
293
- typeof dstVal === 'object' &&
294
- !Array.isArray(dstVal) &&
295
- src[key] !== null &&
296
- typeof src[key] === 'object' &&
297
- !Array.isArray(src[key])) {
298
- (0, ownData_js_1.putOwn)(out, key, mergeContextWins(dstVal, src[key]));
299
- }
300
- // else keep dstVal unchanged
301
- }
302
- else {
303
- (0, ownData_js_1.putOwn)(out, key, src[key]);
304
- }
305
- }
306
- return out;
307
- }
308
- exports.mergeContextWins = mergeContextWins;
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHOzs7QUFFSCxzREFBK0M7QUFFL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFbEUsK0VBQStFO0FBQy9FLFNBQWdCLGVBQWUsQ0FBQyxPQUF3QjtJQUN0RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUZELDBDQUVDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBa0M7SUFDcEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixTQUFTLENBQUMsR0FBUSxFQUFFLElBQWtDLEVBQUUsWUFBa0I7SUFDeEYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ3RDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFB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Q2YsT0FBTyxNQUFNLEtBQUssUUFBUTtnQkFDMUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDdEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUk7Z0JBQ2pCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDeEIsQ0FBQztnQkFDRCxJQUFBLG1CQUFNLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0QsNkJBQTZCO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBQSxtQkFBTSxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUExQkQsNENBMEJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwYXRoT3BzLnRzIOKAlCBOYXRpdmUgbmVzdGVkLXBhdGggaGVscGVycyAocmVwbGFjZXMgbG9kYXNoLmdldC9zZXQvaGFzL21lcmdld2l0aClcbiAqXG4gKiBUaGUgREVOSUVEIHNldCBpcyB0aGUgc2hhcmVkIHJ1bGUgZm9yIHRocmVlIHByb3RvdHlwZS1wb2xsdXRpb24gc2VsZWN0b3JcbiAqIHNlZ21lbnRzIChfX3Byb3RvX18sIGNvbnN0cnVjdG9yLCBwcm90b3R5cGUpLiBFYWNoIG9wZXJhdGlvbidzIHRyYXZlcnNhbFxuICogY29udHJhY3QgaXMgZXhwbGljaXQgYmVsb3c7IG1lcmVseSB1c2luZyB0aGlzIG1vZHVsZSBpcyBub3QgYSBzYW5kYm94LlxuICpcbiAqIFNlbGVjdG9yIG9wZXJhdGlvbnMgcmVhZCBvbmx5IG93biBmaWVsZHMuIFdyaXRlcnMgcHJlZmxpZ2h0IHRoZSB3aG9sZSBwYXRoXG4gKiBiZWZvcmUgY3JlYXRpbmcgb3IgY29weWluZyBhbnkgY29udGFpbmVyLCB0aGVuIHBsYWNlIHRocm91Z2ggcHV0T3duLlxuICogICAtIG5hdGl2ZUdldCDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgLSBuYXRpdmVIYXMg4oCUIG93bi1wcm9wZXJ0eSBleGlzdGVuY2Ugb25seSwgaW5jbHVkaW5nIG93biBkZW5pZWQgbmFtZXNcbiAqICAgICBhbmQgb3duIHVuZGVmaW5lZCB2YWx1ZXM7IGl0IGRvZXMgbm90IHVzZSB0aGUgREVOSUVEIHJ1bGUuXG4gKiAgIC0gbWVyZ2VDb250ZXh0V2lucyDigJQgb3duLWVudW1lcmFibGUgc291cmNlIGtleXMsIERFTklFRCBjaGVjaywgb3duLW9ubHlcbiAqICAgICBkZXN0aW5hdGlvbiBwcmVjZWRlbmNlLiBJbmhlcml0ZWQgZmllbGRzIGFyZSBuZXZlciBkZXN0aW5hdGlvbiBkYXRhLlxuICpcbiAqIERpYWdub3N0aWMgd3JpdGVycyByZXRhaW4gdGhlaXIgZGlzdGluY3QgY3JlYXRpb24vbWVyZ2UgbGF3cyBpbiB1dGlscy50cyxcbiAqIHVzaW5nIHRoZSBzYW1lIGlzRGVuaWVkU2VnbWVudCBwcmVkaWNhdGUgYW5kIHNoYXJlZCBvd24tc2xvdCB3cml0ZXIuXG4gKlxuICogUGF0aHMgbWF5IGJlIGRvdC1ub3RhdGlvbiBzdHJpbmdzIG9yIHByZS1zcGxpdCAoc3RyaW5nfG51bWJlcilbXSBhcnJheXMuXG4gKi9cblxuaW1wb3J0IHsgcHV0T3duIH0gZnJvbSAnLi4vY2FwdHVyZS9vd25EYXRhLmpzJztcblxuY29uc3QgREVOSUVEID0gbmV3IFNldChbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXSk7XG5cbi8qKiBJcyBgc2VnbWVudGAgb25lIG9mIHRoZSB0aHJlZSBkZW5pZWQgcHJvdG90eXBlLXBvbGx1dGlvbiBzZWxlY3RvciBuYW1lcz8gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlbmllZFNlZ21lbnQoc2VnbWVudDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBERU5JRUQuaGFzKFN0cmluZyhzZWdtZW50KSk7XG59XG5cbmZ1bmN0aW9uIHRvU2VnbWVudHMocGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBwYXRoLnNwbGl0KCcuJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBhdCBgcGF0aGAgaW4gYG9iamAsIHJldHVybmluZyBgZGVmYXVsdFZhbHVlYCBpZiBhYnNlbnQuXG4gKlxuICogU2VjdXJpdHk6IGVhY2ggcGF0aCBzZWdtZW50IGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgREVOSUVEIGxpc3QgYW5kIHJlcXVpcmVzXG4gKiBhbiBvd24gcHJvcGVydHkgYXQgZXZlcnkgc3RlcCwgcHJldmVudGluZyBwcm90b3R5cGUtY2hhaW4gcmVhZHMuXG4gKiBlLmcuIG5hdGl2ZUdldCh7fSwgJ19fcHJvdG9fXycpIGFuZCBuYXRpdmVHZXQoe30sICdjb25zdHJ1Y3RvcicpIGJvdGggcmV0dXJuXG4gKiBgZGVmYXVsdFZhbHVlYCBpbnN0ZWFkIG9mIGxlYWtpbmcgT2JqZWN0LnByb3RvdHlwZSAvIHRoZSBPYmplY3QgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVHZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IGFueSB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2Vncykge1xuICAgIGlmIChjdXJyID09IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKERFTklFRC5oYXMoU3RyaW5nKHNlZykpKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgY3VyciA9IGN1cnJbc2VnXTtcbiAgfVxuICByZXR1cm4gY3VyciA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogY3Vycjtcbn1cblxuLyoqXG4gKiBTZXQgYW4gb3duIHBhdGggaW4gYSB3cml0ZXItb3duZWQgY29udGFpbmVyLCBjcmVhdGluZyBtaXNzaW5nIGludGVybWVkaWF0ZXMuXG4gKiBBIGRlbmllZCBzZWxlY3RvciBpcyBhIG5vLW9wIEJFRk9SRSBhbnkgcHJlZml4IGlzIGNyZWF0ZWQuIEluaGVyaXRlZCB2YWx1ZXNcbiAqIGFuZCBhY2Nlc3NvcnMgZG8gbm90IHBhcnRpY2lwYXRlOyBleGlzdGluZyBvd24gYWNjZXNzb3JzIGtlZXAgbm9ybWFsIGJlaGF2aW9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlU2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGlmIChzZWdzLnNvbWUoaXNEZW5pZWRTZWdtZW50KSkgcmV0dXJuIG9iajtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICAvLyBEbyBub3QgcmVhZCBhbiBpbmhlcml0ZWQgYWNjZXNzb3IuIEZvciBhbiBPV04gYWNjZXNzb3IsIHJldGFpbiB0aGVcbiAgICAvLyBvcmlnaW5hbCBudWxsL3R5cGUvdHJhdmVyc2FsIHJlYWQgc2VxdWVuY2UgKGluY2x1ZGluZyBnZXR0ZXIgY2FsbHMpLlxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIGspIHx8IGN1cnJba10gPT0gbnVsbCB8fCB0eXBlb2YgY3VycltrXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHB1dE93bihjdXJyLCBrLCB0eXBlb2Ygc2Vnc1tpICsgMV0gPT09ICdudW1iZXInID8gW10gOiB7fSk7XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIHB1dE93bihjdXJyLCBsYXN0LCB2YWx1ZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBvd24gcHJvcGVydHkgYXQgYHBhdGhgIGluIGBvYmpgICh0aGUgcmVwbGF5IHByaW1pdGl2ZSBmb3IgdGhlXG4gKiBgZGVsZXRlYCBjb21taXQgdmVyYiwgIzEzYy1CKS4gTm8tb3Agd2hlbiBhbnkgaW50ZXJtZWRpYXRlIHNlZ21lbnQgaXNcbiAqIG1pc3Npbmcg4oCUIGRlbGV0aW5nIGFuIGFic2VudCBrZXkgaGFzIG5vdGhpbmcgdG8gcmVtb3ZlLlxuICpcbiAqIFNlY3VyaXR5OiBzYW1lIERFTklFRCArIGhhc093blByb3BlcnR5IGRpc2NpcGxpbmUgYXMgbmF0aXZlR2V0IOKAlCBldmVyeVxuICogc2VnbWVudCBpcyBjaGVja2VkLCBzbyBgbmF0aXZlRGVsZXRlKG9iaiwgJ19fcHJvdG9fX1x1MDAxZngnKWAgYW5kXG4gKiBwcm90b3R5cGUtY2hhaW4gd2Fsa3MgYXJlIGluZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlRGVsZXRlKG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IHNlZyA9IHNlZ3NbaV07XG4gICAgaWYgKERFTklFRC5oYXMoU3RyaW5nKHNlZykpKSByZXR1cm47XG4gICAgaWYgKGN1cnIgPT0gbnVsbCB8fCB0eXBlb2YgY3VyciAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWcpKSByZXR1cm47XG4gICAgY3VyciA9IGN1cnJbc2VnXTtcbiAgfVxuICBjb25zdCBsYXN0ID0gc2Vnc1tzZWdzLmxlbmd0aCAtIDFdO1xuICBpZiAoREVOSUVELmhhcyhTdHJpbmcobGFzdCkpKSByZXR1cm47XG4gIGlmIChjdXJyICE9IG51bGwgJiYgdHlwZW9mIGN1cnIgPT09ICdvYmplY3QnKSB7XG4gICAgZGVsZXRlIGN1cnJbbGFzdF07XG4gIH1cbn1cblxuLy8g4pSA4pSAIENvcHktb24td3JpdGUgcHJpbWl0aXZlcyAoZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkg4pSA4pSAXG4vL1xuLy8gVEhFIExBVzogYSBjb21taXR0ZWQgZ2VuZXJhdGlvbiBpcyBuZXZlciBlZGl0ZWQuIEEgd3JpdGVyIGNvcGllcyB0aGUgcm9vdFxuLy8gYW5kIGV2ZXJ5IGNvbnRhaW5lciBvbiBlYWNoIHBhdGggaXQgd3JpdGVzLCBlZGl0cyBvbmx5IGNvbnRhaW5lcnMgaXRcbi8vIGNyZWF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IG9wZXJhdGlvbiAoaXRzIGBvd25lZGAgc2V0KSwgYW5kIHNoYXJlcyBldmVyeVxuLy8gb3RoZXIgc3VidHJlZSB3aXRoIHRoZSBnZW5lcmF0aW9uIGJlZm9yZSBpdC4gVGhlIHNhbWUgbGF3XG4vLyBgcmVhY3RpdmUvc3RydWN0dXJhbFdyaXRlLnRzIMK3IHNldEluUGF0aGAgYXBwbGllcyB0byBhIHNpbmdsZSB2YWx1ZS5cblxuLyoqIEEgY29udGFpbmVyIGEgd3JpdGVyIG1heSBvd246IGFueXRoaW5nIGB0eXBlb2YgJ29iamVjdCdgIGFuZCBub3QgbnVsbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRhaW5lcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIGBwYXJlbnRba2V5XWAgd2hlbiBgcGFyZW50YCBpcyBhIGNvbnRhaW5lciB0aGF0IE9XTlMgYGtleWAg4oCUIHRoZSBzbG90XG4gKiB7QGxpbmsgbmF0aXZlR2V0fSB3b3VsZCByZWFkLCByZWZ1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUtcG9sbHV0aW9uXG4gKiBzZWdtZW50cyDigJQgZWxzZSBgdW5kZWZpbmVkYC4gT25lIHN0ZXAgb2YgYSBwYXRoIHdhbGsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25DaGlsZChwYXJlbnQ6IHVua25vd24sIGtleTogc3RyaW5nIHwgbnVtYmVyKTogdW5rbm93biB7XG4gIHJldHVybiBpc0NvbnRhaW5lcihwYXJlbnQpICYmICFERU5JRUQuaGFzKFN0cmluZyhrZXkpKSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyZW50LCBrZXkpXG4gICAgPyAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIHVua25vd24+KVtrZXldXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUcnVlIGZvciBhbiBvd24ga2V5IG9mIGFuIGFycmF5IHRoYXQgaXMgYW4gYXJyYXkgSU5ERVggKGAnMCdgLCBgJzEyJ2ApLCBub3QgYSBuYW1lIChgYXJyLm5vdGVgKS4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlJbmRleEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBuID0gTnVtYmVyKGtleSk7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIG4gPj0gMCAmJiBuIDwgNDI5NDk2NzI5NSAmJiBTdHJpbmcobikgPT09IGtleTtcbn1cblxuLyoqXG4gKiBUaGUgbmFtZWQgKG5vbi1pbmRleCkgb3duIGtleXMgb2YgYW4gYXJyYXksIGluIG9yZGVyLiBPd24ta2V5IG9yZGVyIHB1dHNcbiAqIGV2ZXJ5IGluZGV4IGZpcnN0LCBhc2NlbmRpbmcsIGFuZCBuYW1lcyBhZnRlciB0aGVtIOKAlCBzbyB0aGUgbmFtZXMgYXJlIHRoZVxuICogdGFpbCBvZiBgT2JqZWN0LmtleXNgLCBhbmQgYW4gYXJyYXkgd2l0aG91dCBhbnkgaXMgdG9sZCBieSBpdHMgbGFzdCBrZXkuXG4gKi9cbmZ1bmN0aW9uIG5hbWVkQXJyYXlLZXlzKGFycmF5OiB1bmtub3duW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnJheSk7XG4gIGxldCBmaXJzdCA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoZmlyc3QgPiAwICYmICFpc0FycmF5SW5kZXhLZXkoa2V5c1tmaXJzdCAtIDFdKSkgZmlyc3QtLTtcbiAgcmV0dXJuIGtleXMuc2xpY2UoZmlyc3QpO1xufVxuXG4vKipcbiAqIEEgU0hBTExPVyBjb3B5IG9mIG9uZSBjb250YWluZXIgdGhhdCBrZWVwcyBldmVyeSBzbG90IHRoZSB3aG9sZS1zdGF0ZVxuICogYHN0cnVjdHVyZWRDbG9uZWAgdGhpcyByZXBsYWNlZCBrZXB0IOKAlCBzbyBhIHBhdGggY29weSBhbmQgYSBkZWVwIGNsb25lIGdpdmVcbiAqIHRoZSBzYW1lIHZhbHVlIGF0IGV2ZXJ5IHBhdGg6XG4gKiAgIC0gYSBwbGFpbiBvYmplY3QgKG9yIGEgbnVsbC1wcm90b3R5cGUgb25lKTogaXRzIG93biBlbnVtZXJhYmxlIGtleXMsIGluXG4gKiAgICAgb3JkZXIsIGJ5IHNwcmVhZCDigJQgYW4gb3duIGBfX3Byb3RvX19gIGtleSBzdGF5cyBhIGtleTsgdGhlIHJlc3VsdCBoYXNcbiAqICAgICBgT2JqZWN0LnByb3RvdHlwZWAsIGFzIGEgY2xvbmUncyBkb2VzO1xuICogICAtIGFuIGFycmF5OiBpdHMgaW5kaWNlcywgaG9sZXMgYW5kIGxlbmd0aCAoYHNsaWNlYCkgQU5EIGFueSBuYW1lZFxuICogICAgIHByb3BlcnR5IGEgbmVzdGVkIHdyaXRlIGh1bmcgb2ZmIGl0IChgc2xpY2VgIGFsb25lIHdvdWxkIGRyb3AgdGhvc2UpO1xuICogICAtIGFueXRoaW5nIGVsc2Ug4oCUIGEgYERhdGVgLCBgTWFwYCwgYFNldGAsIHR5cGVkIGFycmF5LCBhIGNsYXNzIGluc3RhbmNlIOKAlFxuICogICAgIGlzIGRlZXAtY2xvbmVkLCB3aGljaCBpcyB3aGF0IHRoZSB3aG9sZS1zdGF0ZSBjbG9uZSBkaWQgdG8gaXQ7IGFuZCB0aGVcbiAqICAgICBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIHRoZSBjbG9uZSBjYW5ub3QgY2FycnkgKGFuIGV4cGFuZG8gYSBuZXN0ZWRcbiAqICAgICB3cml0ZSBodW5nIG9uIGEgYERhdGVgKSBhcmUgY2FycmllZCBvdmVyIGJ5IHJlZmVyZW5jZSwgc28gYSBsYXRlciB3cml0ZVxuICogICAgIHRocm91Z2ggaXQgY2hhbmdlcyBleGFjdGx5IGl0cyBvd24gcGF0aC4gUmFyZSBvbiBhIHdyaXRlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q29weTxUIGV4dGVuZHMgb2JqZWN0Pihjb250YWluZXI6IFQpOiBUIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IGNvcHkgPSBjb250YWluZXIuc2xpY2UoKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG5hbWVkQXJyYXlLZXlzKGNvbnRhaW5lcikpXG4gICAgICBwdXRPd24oY29weSwga2V5LCAoY29udGFpbmVyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICAgIHJldHVybiBjb3B5IGFzIHVua25vd24gYXMgVDtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb250YWluZXIpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiB7IC4uLmNvbnRhaW5lciB9O1xuICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKGNvbnRhaW5lcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbnRhaW5lcikpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBrZXkpKVxuICAgICAgcHV0T3duKGNvcHksIGtleSwgKGNvbnRhaW5lciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gIH1cbiAgcmV0dXJuIGNvcHkgYXMgVDtcbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gYHBhdGhgJ3MgTEVBRiBvbmVzIHRoZSB3cml0ZXIgb3ducywgc29cbiAqIHRoZSB3cml0ZSB0aGF0IGZvbGxvd3MgKGBuYXRpdmVTZXRgIC8gYG5hdGl2ZURlbGV0ZWAgLyBhIHZlcmIgYXJtKSBlZGl0c1xuICogbm90aGluZyBpdCBkaWQgbm90IGNyZWF0ZS5cbiAqXG4gKiBgcm9vdGAgbXVzdCBhbHJlYWR5IGJlIG93bmVkLiBXYWxraW5nIGRvd24sIGV2ZXJ5IGNvbnRhaW5lciB0aGUgd3JpdGVyIGRpZFxuICogbm90IGNyZWF0ZSAoYG93bmVkYCBkb2VzIG5vdCBob2xkIGl0KSBpcyByZXBsYWNlZCwgaW4gaXRzIHBhcmVudCwgYnkgaXRzXG4gKiB7QGxpbmsgc2hhbGxvd0NvcHl9LCB3aGljaCB0aGUgd3JpdGVyIHRoZW4gb3ducy4gQSBkZW5pZWQgc2VnbWVudCBhbnl3aGVyZVxuICogcmVmdXNlcyB0aGUgZW50aXJlIHdhbGsgYmVmb3JlIGNvcHlpbmcuIE90aGVyd2lzZSB0aGUgd2FsayBzdG9wcyBhdCBhXG4gKiBtaXNzaW5nIC8gaW5oZXJpdGVkIC8gcHJpbWl0aXZlIGludGVybWVkaWF0ZSAoYG5hdGl2ZVNldGAgbWFrZXMgYSBmcmVzaFxuICogb3duIGNvbnRhaW5lciBmcm9tIHRoYXQgcG9pbnQgb24pLiBUaGUgbGVhZiBpdHNlbGYgaXMgbmV2ZXIgY29waWVkIOKAlCB0aGVcbiAqIHdyaXRlIHJlcGxhY2VzIGl0LlxuICpcbiAqIENvc3Q6IG9uZSBzaGFsbG93IGNvcHkgcGVyIGNvbnRhaW5lciBvbiB0aGUgcGF0aCB0aGF0IHRoaXMgd3JpdGVyIGhhcyBub3RcbiAqIGFscmVhZHkgY29waWVkIOKAlCBPKGRlcHRoIMOXIHdpZHRoKSwgaW5kZXBlbmRlbnQgb2YgZXZlcnl0aGluZyB0aGUgd3JpdGVcbiAqIGRvZXMgbm90IHBhc3MgdGhyb3VnaC4gQSBwYXRoIG9mIG9uZSBzZWdtZW50IChhIHJvb3Qga2V5LCB0aGUgY29tbW9uIGNhc2UpXG4gKiBjb3BpZXMgbm90aGluZyBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duU3BpbmUocm9vdDogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBpZiAoc2Vncy5zb21lKGlzRGVuaWVkU2VnbWVudCkpIHJldHVybjtcbiAgbGV0IGN1cnIgPSByb290O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgayA9IHNlZ3NbaV07XG4gICAgY29uc3QgbmV4dCA9IG93bkNoaWxkKGN1cnIsIGspO1xuICAgIGlmICghaXNDb250YWluZXIobmV4dCkpIHJldHVybjtcbiAgICBpZiAob3duZWQuaGFzKG5leHQpKSB7XG4gICAgICBjdXJyID0gbmV4dDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjb3B5ID0gc2hhbGxvd0NvcHkobmV4dCk7XG4gICAgb3duZWQuYWRkKGNvcHkpO1xuICAgIHB1dE93bihjdXJyLCBrLCBjb3B5KTtcbiAgICBjdXJyID0gY29weTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb290IG9mIGEgbmV3IGdlbmVyYXRpb246IGEgc2hhbGxvdyBjb3B5IG9mIGBiYXNlYCB3aGVuIGl0IGlzIGFcbiAqIGNvbnRhaW5lciAob3duZWQgYnkgdGhlIHdyaXRlciksIGVsc2UgdGhlIGhpc3RvcmljYWwgZGVlcCBjbG9uZSBvZiBhXG4gKiBub24tY29udGFpbmVyIGJhc2UgKGB1bmRlZmluZWRgLCBhIHByaW1pdGl2ZSkgc28gdGhlIGNhbGxlcnMnIGJlaGF2aW91ciBvblxuICogc3VjaCBhIGJhc2UgaXMgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duZWRSb290T2YoYmFzZTogYW55LCBvd25lZD86IFdlYWtTZXQ8b2JqZWN0Pik6IGFueSB7XG4gIGlmICghaXNDb250YWluZXIoYmFzZSkpIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gIGNvbnN0IHJvb3QgPSBzaGFsbG93Q29weShiYXNlKTtcbiAgb3duZWQ/LmFkZChyb290KTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8qKiBNYXJrIGEgdmFsdWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgKGEgZnJlc2ggY2xvbmUsIGEgbWVyZ2UgcmVzdWx0KSBhcyBvd25lZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd24odmFsdWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKG93bmVkICE9PSB1bmRlZmluZWQgJiYgaXNDb250YWluZXIodmFsdWUpKSBvd25lZC5hZGQodmFsdWUpO1xufVxuXG4vKipcbiAqIE1hcmsgRVZFUlkgY29udGFpbmVyIG9mIGEgdHJlZSB0aGUgd3JpdGVyIGp1c3QgY3JlYXRlZCB3aG9sZSAoYVxuICogYHN0cnVjdHVyZWRDbG9uZWAgcmVzdWx0KSBhcyBvd25lZCwgc28gYSBsYXRlciB3cml0ZSB0aHJvdWdoIGFueSBvZiB0aGVtXG4gKiBlZGl0cyBpdCBpbiBwbGFjZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQgYWdhaW4uIFdhbGtzIG93biBlbnVtZXJhYmxlIGtleXMg4oCUXG4gKiB0aGUgc2xvdHMgYSBwYXRoIGNhbiBhZGRyZXNzOyBhIGBNYXBgJ3Mgb3IgYFNldGAncyBlbnRyaWVzIGFyZSBub3QuIE8odGhlXG4gKiB0cmVlJ3MgY29udGFpbmVycyk7IGEgY29udGFpbmVyIGFscmVhZHkgb3duZWQgaXMgbm90IHdhbGtlZCB0d2ljZSAoYSBjeWNsZVxuICogaW5zaWRlIHRoZSBjbG9uZSBlbmRzIHRoZXJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkb3B0KHRyZWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhY2s6IHVua25vd25bXSA9IFt0cmVlXTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmICghaXNDb250YWluZXIodmFsdWUpIHx8IG93bmVkLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIG93bmVkLmFkZCh2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSBzdGFjay5wdXNoKCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gIH1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgb2JqYCBoYXMgYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHNlZ21lbnQgb2YgYHBhdGhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUhhcyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWdzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpIDwgc2Vncy5sZW5ndGggLSAxKSBjdXJyID0gY3VycltzZWdzW2ldXTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIG1lcmdlIHdoZXJlIGRlc3RpbmF0aW9uIHdpbnMgZm9yIGFueSBkZWZpbmVkIHZhbHVlLlxuICogRmlsbHMgbWlzc2luZyBrZXlzIGZyb20gYHNyY2AsIGJ1dCBuZXZlciBvdmVyd3JpdGVzIGRlZmluZWQga2V5cyBpbiBgZHN0YC5cbiAqIEFycmF5cyBhcmUgbm90IHJlY3Vyc2VkIOKAlCBkc3QgYXJyYXkgYWx3YXlzIHdpbnMgd2hlbiBwcmVzZW50LlxuICpcbiAqIFJlcGxhY2VzOiBgbWVyZ2VXaXRoKGRzdCwgc3JjLCAob2JqVmFsdWUpID0+IG9ialZhbHVlICE9PSB1bmRlZmluZWQgPyBvYmpWYWx1ZSA6IHVuZGVmaW5lZClgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnRleHRXaW5zKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHJldHVybiBkc3QgIT09IHVuZGVmaW5lZCA/IGRzdCA6IHNyYztcbiAgfVxuICBjb25zdCBvdXQ6IGFueSA9IGRzdCAhPSBudWxsICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8geyAuLi5kc3QgfSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgaWYgKERFTklFRC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgZHN0VmFsID0gb3duQ2hpbGQob3V0LCBrZXkpO1xuICAgIGlmIChkc3RWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZHN0IHdpbnM7IHJlY3Vyc2Ugb25seSBpZiBib3RoIHNpZGVzIGFyZSBwbGFpbiBvYmplY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGRzdFZhbCAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZHN0VmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShkc3RWYWwpICYmXG4gICAgICAgIHNyY1trZXldICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBzcmNba2V5XSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc3JjW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgcHV0T3duKG91dCwga2V5LCBtZXJnZUNvbnRleHRXaW5zKGRzdFZhbCwgc3JjW2tleV0pKTtcbiAgICAgIH1cbiAgICAgIC8vIGVsc2Uga2VlcCBkc3RWYWwgdW5jaGFuZ2VkXG4gICAgfSBlbHNlIHtcbiAgICAgIHB1dE93bihvdXQsIGtleSwgc3JjW2tleV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
@@ -1,62 +0,0 @@
1
- "use strict";
2
- /**
3
- * paths.ts — the path codec: how a path of segments is written into a
4
- * `TraceEntry.path` and read back. A leaf (L0, imports nothing): the commit
5
- * log's address format, one owner. Re-exported from `utils.ts`, so no importer
6
- * moved.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.pathSegments = exports.normalisePath = exports.DELIM = void 0;
10
- /**
11
- * The separator that joins path SEGMENTS into a `TraceEntry.path`.
12
- *
13
- * WHY NOT `'.'` — the ambiguity this exists to prevent: a state key may itself
14
- * CONTAIN a dot, and this library creates such keys routinely. `$setValue`
15
- * takes a KEY, not a path, so `$setValue('a.b', v)` makes one top-level key
16
- * literally named `a.b`. With a dot separator that key's path and the nested
17
- * path `['a', 'b']` would both encode as `"a.b"`, and every reader of the
18
- * commit log — `applySmartMerge`, `commitValueAt`, `redactPatch`,
19
- * `findLastWriter`, the slice layer — would have to guess which one a bundle
20
- * meant. Splitting the wrong way writes into (or reads from) the wrong place.
21
- *
22
- * ASCII Unit-Separator is the choice because it cannot appear in a JS
23
- * identifier and is vanishingly unlikely in a hand-written key, so the
24
- * encoding stays unambiguous. It is NOT a display character: a path rendered
25
- * straight to a UI or a log looks like one broken word. Split it with
26
- * {@link pathSegments} — that, not this constant, is the contract consumers
27
- * should hold.
28
- */
29
- exports.DELIM = '\u001F';
30
- /**
31
- * Normalises an array path into a stable string key using DELIM.
32
- */
33
- function normalisePath(path) {
34
- return path.map(String).join(exports.DELIM);
35
- }
36
- exports.normalisePath = normalisePath;
37
- /**
38
- * The inverse of {@link normalisePath}: the SEGMENTS of a `TraceEntry.path`.
39
- *
40
- * A path in the commit log is DELIM-joined (see {@link DELIM}), which is not a
41
- * display encoding — printing one verbatim shows a single broken-looking word,
42
- * as a consumer rendering a path discovered. This is the supported way to take
43
- * it apart; the delimiter itself stays an implementation detail, so a path can
44
- * be read, rendered or re-joined without anyone hard-coding a control
45
- * character.
46
- *
47
- * A single-segment path (the common case — a top-level state key) returns a
48
- * one-element array, so callers need no special case.
49
- *
50
- * ```ts
51
- * import { pathSegments } from 'footprintjs/trace';
52
- *
53
- * for (const entry of bundle.trace) {
54
- * console.log(pathSegments(entry.path).join(' › ')); // 'order › lines'
55
- * }
56
- * ```
57
- */
58
- function pathSegments(path) {
59
- return path.split(exports.DELIM);
60
- }
61
- exports.pathSegments = pathSegments;
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDVSxRQUFBLEtBQUssR0FBRyxRQUFRLENBQUM7QUFFOUI7O0dBRUc7QUFDSCxTQUFnQixhQUFhLENBQUMsSUFBeUI7SUFDckQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFLLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRkQsc0NBRUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFnQixZQUFZLENBQUMsSUFBWTtJQUN2QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBSyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUZELG9DQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwYXRocy50cyDigJQgdGhlIHBhdGggY29kZWM6IGhvdyBhIHBhdGggb2Ygc2VnbWVudHMgaXMgd3JpdHRlbiBpbnRvIGFcbiAqIGBUcmFjZUVudHJ5LnBhdGhgIGFuZCByZWFkIGJhY2suIEEgbGVhZiAoTDAsIGltcG9ydHMgbm90aGluZyk6IHRoZSBjb21taXRcbiAqIGxvZydzIGFkZHJlc3MgZm9ybWF0LCBvbmUgb3duZXIuIFJlLWV4cG9ydGVkIGZyb20gYHV0aWxzLnRzYCwgc28gbm8gaW1wb3J0ZXJcbiAqIG1vdmVkLlxuICovXG5cbi8qKlxuICogVGhlIHNlcGFyYXRvciB0aGF0IGpvaW5zIHBhdGggU0VHTUVOVFMgaW50byBhIGBUcmFjZUVudHJ5LnBhdGhgLlxuICpcbiAqIFdIWSBOT1QgYCcuJ2Ag4oCUIHRoZSBhbWJpZ3VpdHkgdGhpcyBleGlzdHMgdG8gcHJldmVudDogYSBzdGF0ZSBrZXkgbWF5IGl0c2VsZlxuICogQ09OVEFJTiBhIGRvdCwgYW5kIHRoaXMgbGlicmFyeSBjcmVhdGVzIHN1Y2gga2V5cyByb3V0aW5lbHkuIGAkc2V0VmFsdWVgXG4gKiB0YWtlcyBhIEtFWSwgbm90IGEgcGF0aCwgc28gYCRzZXRWYWx1ZSgnYS5iJywgdilgIG1ha2VzIG9uZSB0b3AtbGV2ZWwga2V5XG4gKiBsaXRlcmFsbHkgbmFtZWQgYGEuYmAuIFdpdGggYSBkb3Qgc2VwYXJhdG9yIHRoYXQga2V5J3MgcGF0aCBhbmQgdGhlIG5lc3RlZFxuICogcGF0aCBgWydhJywgJ2InXWAgd291bGQgYm90aCBlbmNvZGUgYXMgYFwiYS5iXCJgLCBhbmQgZXZlcnkgcmVhZGVyIG9mIHRoZVxuICogY29tbWl0IGxvZyDigJQgYGFwcGx5U21hcnRNZXJnZWAsIGBjb21taXRWYWx1ZUF0YCwgYHJlZGFjdFBhdGNoYCxcbiAqIGBmaW5kTGFzdFdyaXRlcmAsIHRoZSBzbGljZSBsYXllciDigJQgd291bGQgaGF2ZSB0byBndWVzcyB3aGljaCBvbmUgYSBidW5kbGVcbiAqIG1lYW50LiBTcGxpdHRpbmcgdGhlIHdyb25nIHdheSB3cml0ZXMgaW50byAob3IgcmVhZHMgZnJvbSkgdGhlIHdyb25nIHBsYWNlLlxuICpcbiAqIEFTQ0lJIFVuaXQtU2VwYXJhdG9yIGlzIHRoZSBjaG9pY2UgYmVjYXVzZSBpdCBjYW5ub3QgYXBwZWFyIGluIGEgSlNcbiAqIGlkZW50aWZpZXIgYW5kIGlzIHZhbmlzaGluZ2x5IHVubGlrZWx5IGluIGEgaGFuZC13cml0dGVuIGtleSwgc28gdGhlXG4gKiBlbmNvZGluZyBzdGF5cyB1bmFtYmlndW91cy4gSXQgaXMgTk9UIGEgZGlzcGxheSBjaGFyYWN0ZXI6IGEgcGF0aCByZW5kZXJlZFxuICogc3RyYWlnaHQgdG8gYSBVSSBvciBhIGxvZyBsb29rcyBsaWtlIG9uZSBicm9rZW4gd29yZC4gU3BsaXQgaXQgd2l0aFxuICoge0BsaW5rIHBhdGhTZWdtZW50c30g4oCUIHRoYXQsIG5vdCB0aGlzIGNvbnN0YW50LCBpcyB0aGUgY29udHJhY3QgY29uc3VtZXJzXG4gKiBzaG91bGQgaG9sZC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFTElNID0gJ1xcdTAwMUYnO1xuXG4vKipcbiAqIE5vcm1hbGlzZXMgYW4gYXJyYXkgcGF0aCBpbnRvIGEgc3RhYmxlIHN0cmluZyBrZXkgdXNpbmcgREVMSU0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpc2VQYXRoKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5tYXAoU3RyaW5nKS5qb2luKERFTElNKTtcbn1cblxuLyoqXG4gKiBUaGUgaW52ZXJzZSBvZiB7QGxpbmsgbm9ybWFsaXNlUGF0aH06IHRoZSBTRUdNRU5UUyBvZiBhIGBUcmFjZUVudHJ5LnBhdGhgLlxuICpcbiAqIEEgcGF0aCBpbiB0aGUgY29tbWl0IGxvZyBpcyBERUxJTS1qb2luZWQgKHNlZSB7QGxpbmsgREVMSU19KSwgd2hpY2ggaXMgbm90IGFcbiAqIGRpc3BsYXkgZW5jb2Rpbmcg4oCUIHByaW50aW5nIG9uZSB2ZXJiYXRpbSBzaG93cyBhIHNpbmdsZSBicm9rZW4tbG9va2luZyB3b3JkLFxuICogYXMgYSBjb25zdW1lciByZW5kZXJpbmcgYSBwYXRoIGRpc2NvdmVyZWQuIFRoaXMgaXMgdGhlIHN1cHBvcnRlZCB3YXkgdG8gdGFrZVxuICogaXQgYXBhcnQ7IHRoZSBkZWxpbWl0ZXIgaXRzZWxmIHN0YXlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgc28gYSBwYXRoIGNhblxuICogYmUgcmVhZCwgcmVuZGVyZWQgb3IgcmUtam9pbmVkIHdpdGhvdXQgYW55b25lIGhhcmQtY29kaW5nIGEgY29udHJvbFxuICogY2hhcmFjdGVyLlxuICpcbiAqIEEgc2luZ2xlLXNlZ21lbnQgcGF0aCAodGhlIGNvbW1vbiBjYXNlIOKAlCBhIHRvcC1sZXZlbCBzdGF0ZSBrZXkpIHJldHVybnMgYVxuICogb25lLWVsZW1lbnQgYXJyYXksIHNvIGNhbGxlcnMgbmVlZCBubyBzcGVjaWFsIGNhc2UuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHBhdGhTZWdtZW50cyB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBmb3IgKGNvbnN0IGVudHJ5IG9mIGJ1bmRsZS50cmFjZSkge1xuICogICBjb25zb2xlLmxvZyhwYXRoU2VnbWVudHMoZW50cnkucGF0aCkuam9pbignIOKAuiAnKSk7IC8vICdvcmRlciDigLogbGluZXMnXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhTZWdtZW50cyhwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KERFTElNKTtcbn1cbiJdfQ==
@@ -1,43 +0,0 @@
1
- "use strict";
2
- /**
3
- * placeholders.ts — the string a redaction leaves where a value was, in the RECORD.
4
- *
5
- * WHY THIS FILE EXISTS. Before F4a six files each spelled a placeholder as a literal, and a spelling
6
- * kept in six places is a placeholder a reader can no longer match on. Every `src/` file that writes
7
- * the log's placeholder imports it from here, and `test/architecture/placeholders.test.ts` pins that
8
- * no other `src/` file spells it.
9
- *
10
- * ONE STRING HERE, ITS TWIN ON THE VERDICT'S SIDE (C4, review N2). A redaction leaves one of two
11
- * strings, and both are historical, so neither may change (stored recordings hold this one). Which
12
- * one a reader sees depends on WHERE it reads, and each has the owner its reader has:
13
- * - {@link LOG_PLACEHOLDER} (`'REDACTED'`, here) is a RECORD byte: the commit log and everything
14
- * served from it — written into the log by the record's scrub (`memory/scrub.ts`, L2), and
15
- * passed by the two places that serve a mirror (`runner/ExecutionRuntime.ts`, the mirror's
16
- * seed; `engine/handlers/SubflowExecutor.ts`, a subflow's served state). The readers
17
- * (`slice/`, `time-travel/`) only name it in their docs: they meet it as data in the log;
18
- * - `SCOPE_PLACEHOLDER` (`'[REDACTED]'`) is the ENGINE's: the scope channel's retained reads and
19
- * writes, recorder events, the narrative. It lives beside the verdict that writes it
20
- * (`memory/redaction.ts`, L4). Until C4 both sat in this file ("two placeholders, one leaf");
21
- * the record took the engine's string with it.
22
- *
23
- * WHY A LEAF OF ITS OWN (and not beside `honesty.ts · HONESTY_CODES`). Different readers, different
24
- * reasons to change: this string is written on the engine's WRITE path on every redacted run, the
25
- * honesty registry is read by a reader that explains a recording — and the registry's sentences have
26
- * no business in the bundle of an app that only runs charts. This file imports NOTHING, so it is L0
27
- * (the layer table is `scripts/layering.config.cjs`).
28
- */
29
- Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.LOG_PLACEHOLDER = void 0;
31
- /**
32
- * What the COMMIT LOG and the redacted MIRROR carry where a value was scrubbed.
33
- *
34
- * `memory/scrub.ts · scrubPatch` writes it into the patch the log records (both encodings), and the
35
- * mirror's seed is scrubbed with the same string (`runner/ExecutionRuntime.ts`), so a fold of the log
36
- * reproduces it (`stateAt` → `FoldedState.redactedPaths`) and a slice or an element birth, which
37
- * re-serve the log's bytes, show it too. A subflow's SERVED state is the subflow's own nested mirror
38
- * (9.20.0): `subflowResults[*].treeContext.globalContext` under `getSnapshot({ redact: true })`, and
39
- * `onSubflowExit.outputState` whenever a policy keeps that mirror — so those carry this string as
40
- * well, not the scope channel's `SCOPE_PLACEHOLDER` (`memory/redaction.ts`).
41
- */
42
- exports.LOG_PLACEHOLDER = 'REDACTED';
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcGxhY2Vob2xkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7OztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFDVSxRQUFBLGVBQWUsR0FBRyxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBsYWNlaG9sZGVycy50cyDigJQgdGhlIHN0cmluZyBhIHJlZGFjdGlvbiBsZWF2ZXMgd2hlcmUgYSB2YWx1ZSB3YXMsIGluIHRoZSBSRUNPUkQuXG4gKlxuICogV0hZIFRISVMgRklMRSBFWElTVFMuIEJlZm9yZSBGNGEgc2l4IGZpbGVzIGVhY2ggc3BlbGxlZCBhIHBsYWNlaG9sZGVyIGFzIGEgbGl0ZXJhbCwgYW5kIGEgc3BlbGxpbmdcbiAqIGtlcHQgaW4gc2l4IHBsYWNlcyBpcyBhIHBsYWNlaG9sZGVyIGEgcmVhZGVyIGNhbiBubyBsb25nZXIgbWF0Y2ggb24uIEV2ZXJ5IGBzcmMvYCBmaWxlIHRoYXQgd3JpdGVzXG4gKiB0aGUgbG9nJ3MgcGxhY2Vob2xkZXIgaW1wb3J0cyBpdCBmcm9tIGhlcmUsIGFuZCBgdGVzdC9hcmNoaXRlY3R1cmUvcGxhY2Vob2xkZXJzLnRlc3QudHNgIHBpbnMgdGhhdFxuICogbm8gb3RoZXIgYHNyYy9gIGZpbGUgc3BlbGxzIGl0LlxuICpcbiAqIE9ORSBTVFJJTkcgSEVSRSwgSVRTIFRXSU4gT04gVEhFIFZFUkRJQ1QnUyBTSURFIChDNCwgcmV2aWV3IE4yKS4gQSByZWRhY3Rpb24gbGVhdmVzIG9uZSBvZiB0d29cbiAqIHN0cmluZ3MsIGFuZCBib3RoIGFyZSBoaXN0b3JpY2FsLCBzbyBuZWl0aGVyIG1heSBjaGFuZ2UgKHN0b3JlZCByZWNvcmRpbmdzIGhvbGQgdGhpcyBvbmUpLiBXaGljaFxuICogb25lIGEgcmVhZGVyIHNlZXMgZGVwZW5kcyBvbiBXSEVSRSBpdCByZWFkcywgYW5kIGVhY2ggaGFzIHRoZSBvd25lciBpdHMgcmVhZGVyIGhhczpcbiAqICAgLSB7QGxpbmsgTE9HX1BMQUNFSE9MREVSfSAoYCdSRURBQ1RFRCdgLCBoZXJlKSBpcyBhIFJFQ09SRCBieXRlOiB0aGUgY29tbWl0IGxvZyBhbmQgZXZlcnl0aGluZ1xuICogICAgIHNlcnZlZCBmcm9tIGl0IOKAlCB3cml0dGVuIGludG8gdGhlIGxvZyBieSB0aGUgcmVjb3JkJ3Mgc2NydWIgKGBtZW1vcnkvc2NydWIudHNgLCBMMiksIGFuZFxuICogICAgIHBhc3NlZCBieSB0aGUgdHdvIHBsYWNlcyB0aGF0IHNlcnZlIGEgbWlycm9yIChgcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHNgLCB0aGUgbWlycm9yJ3NcbiAqICAgICBzZWVkOyBgZW5naW5lL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci50c2AsIGEgc3ViZmxvdydzIHNlcnZlZCBzdGF0ZSkuIFRoZSByZWFkZXJzXG4gKiAgICAgKGBzbGljZS9gLCBgdGltZS10cmF2ZWwvYCkgb25seSBuYW1lIGl0IGluIHRoZWlyIGRvY3M6IHRoZXkgbWVldCBpdCBhcyBkYXRhIGluIHRoZSBsb2c7XG4gKiAgIC0gYFNDT1BFX1BMQUNFSE9MREVSYCAoYCdbUkVEQUNURURdJ2ApIGlzIHRoZSBFTkdJTkUnczogdGhlIHNjb3BlIGNoYW5uZWwncyByZXRhaW5lZCByZWFkcyBhbmRcbiAqICAgICB3cml0ZXMsIHJlY29yZGVyIGV2ZW50cywgdGhlIG5hcnJhdGl2ZS4gSXQgbGl2ZXMgYmVzaWRlIHRoZSB2ZXJkaWN0IHRoYXQgd3JpdGVzIGl0XG4gKiAgICAgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCwgTDQpLiBVbnRpbCBDNCBib3RoIHNhdCBpbiB0aGlzIGZpbGUgKFwidHdvIHBsYWNlaG9sZGVycywgb25lIGxlYWZcIik7XG4gKiAgICAgdGhlIHJlY29yZCB0b29rIHRoZSBlbmdpbmUncyBzdHJpbmcgd2l0aCBpdC5cbiAqXG4gKiBXSFkgQSBMRUFGIE9GIElUUyBPV04gKGFuZCBub3QgYmVzaWRlIGBob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgKS4gRGlmZmVyZW50IHJlYWRlcnMsIGRpZmZlcmVudFxuICogcmVhc29ucyB0byBjaGFuZ2U6IHRoaXMgc3RyaW5nIGlzIHdyaXR0ZW4gb24gdGhlIGVuZ2luZSdzIFdSSVRFIHBhdGggb24gZXZlcnkgcmVkYWN0ZWQgcnVuLCB0aGVcbiAqIGhvbmVzdHkgcmVnaXN0cnkgaXMgcmVhZCBieSBhIHJlYWRlciB0aGF0IGV4cGxhaW5zIGEgcmVjb3JkaW5nIOKAlCBhbmQgdGhlIHJlZ2lzdHJ5J3Mgc2VudGVuY2VzIGhhdmVcbiAqIG5vIGJ1c2luZXNzIGluIHRoZSBidW5kbGUgb2YgYW4gYXBwIHRoYXQgb25seSBydW5zIGNoYXJ0cy4gVGhpcyBmaWxlIGltcG9ydHMgTk9USElORywgc28gaXQgaXMgTDBcbiAqICh0aGUgbGF5ZXIgdGFibGUgaXMgYHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqc2ApLlxuICovXG5cbi8qKlxuICogV2hhdCB0aGUgQ09NTUlUIExPRyBhbmQgdGhlIHJlZGFjdGVkIE1JUlJPUiBjYXJyeSB3aGVyZSBhIHZhbHVlIHdhcyBzY3J1YmJlZC5cbiAqXG4gKiBgbWVtb3J5L3NjcnViLnRzIMK3IHNjcnViUGF0Y2hgIHdyaXRlcyBpdCBpbnRvIHRoZSBwYXRjaCB0aGUgbG9nIHJlY29yZHMgKGJvdGggZW5jb2RpbmdzKSwgYW5kIHRoZVxuICogbWlycm9yJ3Mgc2VlZCBpcyBzY3J1YmJlZCB3aXRoIHRoZSBzYW1lIHN0cmluZyAoYHJ1bm5lci9FeGVjdXRpb25SdW50aW1lLnRzYCksIHNvIGEgZm9sZCBvZiB0aGUgbG9nXG4gKiByZXByb2R1Y2VzIGl0IChgc3RhdGVBdGAg4oaSIGBGb2xkZWRTdGF0ZS5yZWRhY3RlZFBhdGhzYCkgYW5kIGEgc2xpY2Ugb3IgYW4gZWxlbWVudCBiaXJ0aCwgd2hpY2hcbiAqIHJlLXNlcnZlIHRoZSBsb2cncyBieXRlcywgc2hvdyBpdCB0b28uIEEgc3ViZmxvdydzIFNFUlZFRCBzdGF0ZSBpcyB0aGUgc3ViZmxvdydzIG93biBuZXN0ZWQgbWlycm9yXG4gKiAoOS4yMC4wKTogYHN1YmZsb3dSZXN1bHRzWypdLnRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIHVuZGVyIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAsIGFuZFxuICogYG9uU3ViZmxvd0V4aXQub3V0cHV0U3RhdGVgIHdoZW5ldmVyIGEgcG9saWN5IGtlZXBzIHRoYXQgbWlycm9yIOKAlCBzbyB0aG9zZSBjYXJyeSB0aGlzIHN0cmluZyBhc1xuICogd2VsbCwgbm90IHRoZSBzY29wZSBjaGFubmVsJ3MgYFNDT1BFX1BMQUNFSE9MREVSYCAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IExPR19QTEFDRUhPTERFUiA9ICdSRURBQ1RFRCc7XG4iXX0=
@@ -1,65 +0,0 @@
1
- "use strict";
2
- /**
3
- * recordCommit — one stage's commit onto the record (C1, L3). The one owner of a bundle's bytes and
4
- * of where a commit lands: live state, the redacted mirror, the log.
5
- *
6
- * THE LAW:
7
- * 1. No payload (the stage staged no write) → an EMPTY bundle goes to the log, and nothing else
8
- * moves: live state and the mirror keep their generation. Every executed stage is a cursor stop.
9
- * 2. A payload → its names are read first, so a stamp that cannot be read fails the commit before
10
- * anything moves; then its raw rows build live state's next generation, `scrubPatch`
11
- * (`scrub.ts`, the record's own) puts the placeholder at each redacted path that holds a value
12
- * (in a spine copy, never in the raw patch), and the mirror and the log take the scrubbed rows —
13
- * never the raw ones. The redacted paths are data by now: the engine decided them per write
14
- * (`RecordFrame · write`); nothing here imports the engine's verdict (C4).
15
- * 3. The bundle's KEY ORDER is the record's bytes: `overwrite`, `updates`, `redactedPaths`, `trace`,
16
- * `stage`, `stageId`, `runtimeStageId`, then `untrackedSources`, `tags` and `phase`, each only
17
- * when it has something to say (absent, never empty). `EventLog · record` appends `idx`. The
18
- * names are names: no redaction reads them, and no encoding (`commitValues`) changes them.
19
- *
20
- * The frame (`StageContext`) decides WHAT is committed — the payload, the names, whether the bundle
21
- * is a continuation — and keeps what is not the record: retention, diagnostics, the dev-mode
22
- * warnings and the commit observer.
23
- */
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.recordCommit = void 0;
26
- const scrub_js_1 = require("./scrub.js");
27
- /** Record one commit (the module law). `payload` absent = the empty commit. */
28
- function recordCommit(payload, stamp, into) {
29
- if (payload === undefined) {
30
- into.log?.record(bundleOf({}, {}, [], [], namesOf(stamp)));
31
- return;
32
- }
33
- const names = namesOf(stamp);
34
- const { redactedPaths, trace } = payload;
35
- into.state.applyPatch(payload.overwrite, payload.updates, trace);
36
- const overwrite = (0, scrub_js_1.scrubPatch)(payload.overwrite, redactedPaths);
37
- const updates = (0, scrub_js_1.scrubPatch)(payload.updates, redactedPaths);
38
- into.mirror?.applyPatch(overwrite, updates, trace);
39
- into.log?.record(bundleOf(overwrite, updates, [...redactedPaths], trace, names));
40
- }
41
- exports.recordCommit = recordCommit;
42
- /** THE bundle (law 3): the payload's four keys, the three names, then each optional name that has something to say. */
43
- function bundleOf(overwrite, updates, redactedPaths, trace, names) {
44
- const { stage, stageId, runtimeStageId, untrackedSources, tags, phase } = names;
45
- const bundle = { overwrite, updates, redactedPaths, trace, stage, stageId, runtimeStageId };
46
- if (untrackedSources)
47
- bundle.untrackedSources = untrackedSources;
48
- if (tags)
49
- bundle.tags = tags;
50
- if (phase)
51
- bundle.phase = phase;
52
- return bundle;
53
- }
54
- /** The names, read once — before anything moves (law 2). An optional one with nothing to say is `undefined`. */
55
- function namesOf({ stage, stageId, runtimeStageId, untrackedSources, tags, phase }) {
56
- return {
57
- stage,
58
- stageId,
59
- runtimeStageId,
60
- untrackedSources: !untrackedSources || untrackedSources.size === 0 ? undefined : [...untrackedSources],
61
- tags: !tags || tags.length === 0 ? undefined : tags,
62
- phase: phase || undefined,
63
- };
64
- }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkQ29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVjb3JkQ29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHOzs7QUFHSCx5Q0FBd0M7QUEyQnhDLCtFQUErRTtBQUMvRSxTQUFnQixZQUFZLENBQUMsT0FBa0MsRUFBRSxLQUFrQixFQUFFLElBQW1CO0lBQ3RHLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRCxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakUsTUFBTSxTQUFTLEdBQUcsSUFBQSxxQkFBVSxFQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQkFBVSxFQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQVpELG9DQVlDO0FBRUQsdUhBQXVIO0FBQ3ZILFNBQVMsUUFBUSxDQUNmLFNBQXNCLEVBQ3RCLE9BQW9CLEVBQ3BCLGFBQXVCLEVBQ3ZCLEtBQW1CLEVBQ25CLEtBQVk7SUFFWixNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQztJQUNoRixNQUFNLE1BQU0sR0FBaUIsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUMxRyxJQUFJLGdCQUFnQjtRQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUNqRSxJQUFJLElBQUk7UUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUM3QixJQUFJLEtBQUs7UUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNoQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsZ0hBQWdIO0FBQ2hILFNBQVMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBZTtJQUM3RixPQUFPO1FBQ0wsS0FBSztRQUNMLE9BQU87UUFDUCxjQUFjO1FBQ2QsZ0JBQWdCLEVBQUUsQ0FBQyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztRQUN0RyxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNuRCxLQUFLLEVBQUUsS0FBSyxJQUFJLFNBQVM7S0FDMUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlY29yZENvbW1pdCDigJQgb25lIHN0YWdlJ3MgY29tbWl0IG9udG8gdGhlIHJlY29yZCAoQzEsIEwzKS4gVGhlIG9uZSBvd25lciBvZiBhIGJ1bmRsZSdzIGJ5dGVzIGFuZFxuICogb2Ygd2hlcmUgYSBjb21taXQgbGFuZHM6IGxpdmUgc3RhdGUsIHRoZSByZWRhY3RlZCBtaXJyb3IsIHRoZSBsb2cuXG4gKlxuICogVEhFIExBVzpcbiAqICAgMS4gTm8gcGF5bG9hZCAodGhlIHN0YWdlIHN0YWdlZCBubyB3cml0ZSkg4oaSIGFuIEVNUFRZIGJ1bmRsZSBnb2VzIHRvIHRoZSBsb2csIGFuZCBub3RoaW5nIGVsc2VcbiAqICAgICAgbW92ZXM6IGxpdmUgc3RhdGUgYW5kIHRoZSBtaXJyb3Iga2VlcCB0aGVpciBnZW5lcmF0aW9uLiBFdmVyeSBleGVjdXRlZCBzdGFnZSBpcyBhIGN1cnNvciBzdG9wLlxuICogICAyLiBBIHBheWxvYWQg4oaSIGl0cyBuYW1lcyBhcmUgcmVhZCBmaXJzdCwgc28gYSBzdGFtcCB0aGF0IGNhbm5vdCBiZSByZWFkIGZhaWxzIHRoZSBjb21taXQgYmVmb3JlXG4gKiAgICAgIGFueXRoaW5nIG1vdmVzOyB0aGVuIGl0cyByYXcgcm93cyBidWlsZCBsaXZlIHN0YXRlJ3MgbmV4dCBnZW5lcmF0aW9uLCBgc2NydWJQYXRjaGBcbiAqICAgICAgKGBzY3J1Yi50c2AsIHRoZSByZWNvcmQncyBvd24pIHB1dHMgdGhlIHBsYWNlaG9sZGVyIGF0IGVhY2ggcmVkYWN0ZWQgcGF0aCB0aGF0IGhvbGRzIGEgdmFsdWVcbiAqICAgICAgKGluIGEgc3BpbmUgY29weSwgbmV2ZXIgaW4gdGhlIHJhdyBwYXRjaCksIGFuZCB0aGUgbWlycm9yIGFuZCB0aGUgbG9nIHRha2UgdGhlIHNjcnViYmVkIHJvd3Mg4oCUXG4gKiAgICAgIG5ldmVyIHRoZSByYXcgb25lcy4gVGhlIHJlZGFjdGVkIHBhdGhzIGFyZSBkYXRhIGJ5IG5vdzogdGhlIGVuZ2luZSBkZWNpZGVkIHRoZW0gcGVyIHdyaXRlXG4gKiAgICAgIChgUmVjb3JkRnJhbWUgwrcgd3JpdGVgKTsgbm90aGluZyBoZXJlIGltcG9ydHMgdGhlIGVuZ2luZSdzIHZlcmRpY3QgKEM0KS5cbiAqICAgMy4gVGhlIGJ1bmRsZSdzIEtFWSBPUkRFUiBpcyB0aGUgcmVjb3JkJ3MgYnl0ZXM6IGBvdmVyd3JpdGVgLCBgdXBkYXRlc2AsIGByZWRhY3RlZFBhdGhzYCwgYHRyYWNlYCxcbiAqICAgICAgYHN0YWdlYCwgYHN0YWdlSWRgLCBgcnVudGltZVN0YWdlSWRgLCB0aGVuIGB1bnRyYWNrZWRTb3VyY2VzYCwgYHRhZ3NgIGFuZCBgcGhhc2VgLCBlYWNoIG9ubHlcbiAqICAgICAgd2hlbiBpdCBoYXMgc29tZXRoaW5nIHRvIHNheSAoYWJzZW50LCBuZXZlciBlbXB0eSkuIGBFdmVudExvZyDCtyByZWNvcmRgIGFwcGVuZHMgYGlkeGAuIFRoZVxuICogICAgICBuYW1lcyBhcmUgbmFtZXM6IG5vIHJlZGFjdGlvbiByZWFkcyB0aGVtLCBhbmQgbm8gZW5jb2RpbmcgKGBjb21taXRWYWx1ZXNgKSBjaGFuZ2VzIHRoZW0uXG4gKlxuICogVGhlIGZyYW1lIChgU3RhZ2VDb250ZXh0YCkgZGVjaWRlcyBXSEFUIGlzIGNvbW1pdHRlZCDigJQgdGhlIHBheWxvYWQsIHRoZSBuYW1lcywgd2hldGhlciB0aGUgYnVuZGxlXG4gKiBpcyBhIGNvbnRpbnVhdGlvbiDigJQgYW5kIGtlZXBzIHdoYXQgaXMgbm90IHRoZSByZWNvcmQ6IHJldGVudGlvbiwgZGlhZ25vc3RpY3MsIHRoZSBkZXYtbW9kZVxuICogd2FybmluZ3MgYW5kIHRoZSBjb21taXQgb2JzZXJ2ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgc2NydWJQYXRjaCB9IGZyb20gJy4vc2NydWIuanMnO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICcuL1NoYXJlZE1lbW9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0UGhhc2UsIE1lbW9yeVBhdGNoLCBUcmFjZUVudHJ5LCBVbnRyYWNrZWRTb3VyY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIE9uZSBzdGFnZSdzIG5ldCBjaGFuZ2UsIGFzIGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBjb21taXRgIGhhbmRzIGl0IG92ZXIuICovXG5leHBvcnQgdHlwZSBDb21taXRQYXlsb2FkID0gUmV0dXJuVHlwZTxUcmFuc2FjdGlvbkJ1ZmZlclsnY29tbWl0J10+O1xuXG4vKiogV2hhdCBuYW1lcyBhIGNvbW1pdCBvbiB0aGUgcmVjb3JkLCBiZXNpZGUgaXRzIHBheWxvYWQgKGxhdyAzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0U3RhbXAge1xuICBzdGFnZTogc3RyaW5nO1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIHVudHJhY2tlZFNvdXJjZXM/OiBSZWFkb25seVNldDxVbnRyYWNrZWRTb3VyY2U+O1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHBoYXNlPzogQ29tbWl0UGhhc2U7XG59XG5cbi8qKiBXaGVyZSBhIGNvbW1pdCBsYW5kczogbGl2ZSBzdGF0ZSBhbHdheXM7IHRoZSBtaXJyb3IgYW5kIHRoZSBsb2cgd2hlbiB0aGUgcnVuIGtlZXBzIHRoZW0uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1pdFRhcmdldHMge1xuICBzdGF0ZTogU2hhcmVkTWVtb3J5O1xuICBtaXJyb3I/OiBTaGFyZWRNZW1vcnk7XG4gIGxvZz86IEV2ZW50TG9nO1xufVxuXG50eXBlIE5hbWVzID0gUGljazxDb21taXRCdW5kbGUsICdzdGFnZScgfCAnc3RhZ2VJZCcgfCAncnVudGltZVN0YWdlSWQnIHwgJ3VudHJhY2tlZFNvdXJjZXMnIHwgJ3RhZ3MnIHwgJ3BoYXNlJz47XG5cbi8qKiBSZWNvcmQgb25lIGNvbW1pdCAodGhlIG1vZHVsZSBsYXcpLiBgcGF5bG9hZGAgYWJzZW50ID0gdGhlIGVtcHR5IGNvbW1pdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRDb21taXQocGF5bG9hZDogQ29tbWl0UGF5bG9hZCB8IHVuZGVmaW5lZCwgc3RhbXA6IENvbW1pdFN0YW1wLCBpbnRvOiBDb21taXRUYXJnZXRzKTogdm9pZCB7XG4gIGlmIChwYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICBpbnRvLmxvZz8ucmVjb3JkKGJ1bmRsZU9mKHt9LCB7fSwgW10sIFtdLCBuYW1lc09mKHN0YW1wKSkpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuYW1lcyA9IG5hbWVzT2Yoc3RhbXApO1xuICBjb25zdCB7IHJlZGFjdGVkUGF0aHMsIHRyYWNlIH0gPSBwYXlsb2FkO1xuICBpbnRvLnN0YXRlLmFwcGx5UGF0Y2gocGF5bG9hZC5vdmVyd3JpdGUsIHBheWxvYWQudXBkYXRlcywgdHJhY2UpO1xuICBjb25zdCBvdmVyd3JpdGUgPSBzY3J1YlBhdGNoKHBheWxvYWQub3ZlcndyaXRlLCByZWRhY3RlZFBhdGhzKTtcbiAgY29uc3QgdXBkYXRlcyA9IHNjcnViUGF0Y2gocGF5bG9hZC51cGRhdGVzLCByZWRhY3RlZFBhdGhzKTtcbiAgaW50by5taXJyb3I/LmFwcGx5UGF0Y2gob3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSk7XG4gIGludG8ubG9nPy5yZWNvcmQoYnVuZGxlT2Yob3ZlcndyaXRlLCB1cGRhdGVzLCBbLi4ucmVkYWN0ZWRQYXRoc10sIHRyYWNlLCBuYW1lcykpO1xufVxuXG4vKiogVEhFIGJ1bmRsZSAobGF3IDMpOiB0aGUgcGF5bG9hZCdzIGZvdXIga2V5cywgdGhlIHRocmVlIG5hbWVzLCB0aGVuIGVhY2ggb3B0aW9uYWwgbmFtZSB0aGF0IGhhcyBzb21ldGhpbmcgdG8gc2F5LiAqL1xuZnVuY3Rpb24gYnVuZGxlT2YoXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLFxuICByZWRhY3RlZFBhdGhzOiBzdHJpbmdbXSxcbiAgdHJhY2U6IFRyYWNlRW50cnlbXSxcbiAgbmFtZXM6IE5hbWVzLFxuKTogQ29tbWl0QnVuZGxlIHtcbiAgY29uc3QgeyBzdGFnZSwgc3RhZ2VJZCwgcnVudGltZVN0YWdlSWQsIHVudHJhY2tlZFNvdXJjZXMsIHRhZ3MsIHBoYXNlIH0gPSBuYW1lcztcbiAgY29uc3QgYnVuZGxlOiBDb21taXRCdW5kbGUgPSB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgcmVkYWN0ZWRQYXRocywgdHJhY2UsIHN0YWdlLCBzdGFnZUlkLCBydW50aW1lU3RhZ2VJZCB9O1xuICBpZiAodW50cmFja2VkU291cmNlcykgYnVuZGxlLnVudHJhY2tlZFNvdXJjZXMgPSB1bnRyYWNrZWRTb3VyY2VzO1xuICBpZiAodGFncykgYnVuZGxlLnRhZ3MgPSB0YWdzO1xuICBpZiAocGhhc2UpIGJ1bmRsZS5waGFzZSA9IHBoYXNlO1xuICByZXR1cm4gYnVuZGxlO1xufVxuXG4vKiogVGhlIG5hbWVzLCByZWFkIG9uY2Ug4oCUIGJlZm9yZSBhbnl0aGluZyBtb3ZlcyAobGF3IDIpLiBBbiBvcHRpb25hbCBvbmUgd2l0aCBub3RoaW5nIHRvIHNheSBpcyBgdW5kZWZpbmVkYC4gKi9cbmZ1bmN0aW9uIG5hbWVzT2YoeyBzdGFnZSwgc3RhZ2VJZCwgcnVudGltZVN0YWdlSWQsIHVudHJhY2tlZFNvdXJjZXMsIHRhZ3MsIHBoYXNlIH06IENvbW1pdFN0YW1wKTogTmFtZXMge1xuICByZXR1cm4ge1xuICAgIHN0YWdlLFxuICAgIHN0YWdlSWQsXG4gICAgcnVudGltZVN0YWdlSWQsXG4gICAgdW50cmFja2VkU291cmNlczogIXVudHJhY2tlZFNvdXJjZXMgfHwgdW50cmFja2VkU291cmNlcy5zaXplID09PSAwID8gdW5kZWZpbmVkIDogWy4uLnVudHJhY2tlZFNvdXJjZXNdLFxuICAgIHRhZ3M6ICF0YWdzIHx8IHRhZ3MubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogdGFncyxcbiAgICBwaGFzZTogcGhhc2UgfHwgdW5kZWZpbmVkLFxuICB9O1xufVxuIl19