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
package/dist/esm/write.js DELETED
@@ -1,46 +0,0 @@
1
- /**
2
- * footprintjs/write — the public way to write a record.
3
- *
4
- * A record is what a run wrote: a frozen base and an append-only log of bundles, one per step
5
- * (docs/guides/record-contract.md). This door hands out the classes the engine itself writes one
6
- * with — there is no wrapper, so a record written here and one a flowchart wrote come from the same
7
- * code and the same bytes:
8
- *
9
- * - `SharedMemory` — the heap: live state, one generation per commit (copy-on-write);
10
- * - `EventLog` — the log: the fold base and the bundles, frozen as they are recorded;
11
- * - `RecordFrame` — one step's frame: what it read (`read`, `noteRead`), what it staged
12
- * (`write`, with a redaction verdict's bytes as `WriteScrub`), and its
13
- * commit onto the heap and the log (`commit`, named by a `CommitStamp`).
14
- *
15
- * The step's encoding is two dials (`RecordEncoding`): `commitValues` (`'full'` | `'delta'`) and
16
- * `writeProvenance` (`'off'` | `'reads-prefix'`, `WriteProvenanceMode`).
17
- *
18
- * Every type this door names is the record's own: nothing here loads or names the engine
19
- * (test/architecture/write-door.test.ts). Its names and the bytes they write are promised under the
20
- * record fixtures' re-pin policy (test/fixtures/README.md): a refactor never moves a byte.
21
- *
22
- * @example
23
- * ```typescript
24
- * import { EventLog, RecordFrame, SharedMemory } from 'footprintjs/write';
25
- * import { stateAt } from 'footprintjs/trace';
26
- *
27
- * const state = new SharedMemory(undefined, { count: 0 }); // the heap, seeded
28
- * const log = new EventLog(state.getState()); // its fold base is the seed
29
- *
30
- * const frame = new RecordFrame(state, log); // one step, at the root
31
- * frame.useEncoding({ commitValues: 'full', writeProvenance: 'reads-prefix' });
32
- * const count = frame.read([], 'count') as number;
33
- * frame.noteRead([], 'count'); // the bundle names the read
34
- * frame.write(frame.at([], 'count'), count + 1, 'set');
35
- * frame.commit(() => ({ stage: 'Increment', stageId: 'increment', runtimeStageId: 'increment#0' }));
36
- *
37
- * stateAt({ initialState: log.getInitialState(), commitLog: log.list() }, 0).state; // { count: 1 }
38
- * ```
39
- *
40
- * @module write
41
- */
42
- // The heap and the log.
43
- export { EventLog } from './lib/memory/EventLog.js';
44
- export { SharedMemory } from './lib/memory/SharedMemory.js';
45
- export { RecordFrame } from './lib/memory/RecordFrame.js';
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd3JpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFFSCx3QkFBd0I7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUs1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL3dyaXRlIOKAlCB0aGUgcHVibGljIHdheSB0byB3cml0ZSBhIHJlY29yZC5cbiAqXG4gKiBBIHJlY29yZCBpcyB3aGF0IGEgcnVuIHdyb3RlOiBhIGZyb3plbiBiYXNlIGFuZCBhbiBhcHBlbmQtb25seSBsb2cgb2YgYnVuZGxlcywgb25lIHBlciBzdGVwXG4gKiAoZG9jcy9ndWlkZXMvcmVjb3JkLWNvbnRyYWN0Lm1kKS4gVGhpcyBkb29yIGhhbmRzIG91dCB0aGUgY2xhc3NlcyB0aGUgZW5naW5lIGl0c2VsZiB3cml0ZXMgb25lXG4gKiB3aXRoIOKAlCB0aGVyZSBpcyBubyB3cmFwcGVyLCBzbyBhIHJlY29yZCB3cml0dGVuIGhlcmUgYW5kIG9uZSBhIGZsb3djaGFydCB3cm90ZSBjb21lIGZyb20gdGhlIHNhbWVcbiAqIGNvZGUgYW5kIHRoZSBzYW1lIGJ5dGVzOlxuICpcbiAqICAgLSBgU2hhcmVkTWVtb3J5YCDigJQgdGhlIGhlYXA6IGxpdmUgc3RhdGUsIG9uZSBnZW5lcmF0aW9uIHBlciBjb21taXQgKGNvcHktb24td3JpdGUpO1xuICogICAtIGBFdmVudExvZ2AgICAgIOKAlCB0aGUgbG9nOiB0aGUgZm9sZCBiYXNlIGFuZCB0aGUgYnVuZGxlcywgZnJvemVuIGFzIHRoZXkgYXJlIHJlY29yZGVkO1xuICogICAtIGBSZWNvcmRGcmFtZWAgIOKAlCBvbmUgc3RlcCdzIGZyYW1lOiB3aGF0IGl0IHJlYWQgKGByZWFkYCwgYG5vdGVSZWFkYCksIHdoYXQgaXQgc3RhZ2VkXG4gKiAgICAgICAgICAgICAgICAgICAgICAoYHdyaXRlYCwgd2l0aCBhIHJlZGFjdGlvbiB2ZXJkaWN0J3MgYnl0ZXMgYXMgYFdyaXRlU2NydWJgKSwgYW5kIGl0c1xuICogICAgICAgICAgICAgICAgICAgICAgY29tbWl0IG9udG8gdGhlIGhlYXAgYW5kIHRoZSBsb2cgKGBjb21taXRgLCBuYW1lZCBieSBhIGBDb21taXRTdGFtcGApLlxuICpcbiAqIFRoZSBzdGVwJ3MgZW5jb2RpbmcgaXMgdHdvIGRpYWxzIChgUmVjb3JkRW5jb2RpbmdgKTogYGNvbW1pdFZhbHVlc2AgKGAnZnVsbCdgIHwgYCdkZWx0YSdgKSBhbmRcbiAqIGB3cml0ZVByb3ZlbmFuY2VgIChgJ29mZidgIHwgYCdyZWFkcy1wcmVmaXgnYCwgYFdyaXRlUHJvdmVuYW5jZU1vZGVgKS5cbiAqXG4gKiBFdmVyeSB0eXBlIHRoaXMgZG9vciBuYW1lcyBpcyB0aGUgcmVjb3JkJ3Mgb3duOiBub3RoaW5nIGhlcmUgbG9hZHMgb3IgbmFtZXMgdGhlIGVuZ2luZVxuICogKHRlc3QvYXJjaGl0ZWN0dXJlL3dyaXRlLWRvb3IudGVzdC50cykuIEl0cyBuYW1lcyBhbmQgdGhlIGJ5dGVzIHRoZXkgd3JpdGUgYXJlIHByb21pc2VkIHVuZGVyIHRoZVxuICogcmVjb3JkIGZpeHR1cmVzJyByZS1waW4gcG9saWN5ICh0ZXN0L2ZpeHR1cmVzL1JFQURNRS5tZCk6IGEgcmVmYWN0b3IgbmV2ZXIgbW92ZXMgYSBieXRlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFdmVudExvZywgUmVjb3JkRnJhbWUsIFNoYXJlZE1lbW9yeSB9IGZyb20gJ2Zvb3RwcmludGpzL3dyaXRlJztcbiAqIGltcG9ydCB7IHN0YXRlQXQgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3Qgc3RhdGUgPSBuZXcgU2hhcmVkTWVtb3J5KHVuZGVmaW5lZCwgeyBjb3VudDogMCB9KTsgLy8gdGhlIGhlYXAsIHNlZWRlZFxuICogY29uc3QgbG9nID0gbmV3IEV2ZW50TG9nKHN0YXRlLmdldFN0YXRlKCkpOyAgICAgICAgICAgICAgLy8gaXRzIGZvbGQgYmFzZSBpcyB0aGUgc2VlZFxuICpcbiAqIGNvbnN0IGZyYW1lID0gbmV3IFJlY29yZEZyYW1lKHN0YXRlLCBsb2cpOyAgICAgICAgICAgICAgIC8vIG9uZSBzdGVwLCBhdCB0aGUgcm9vdFxuICogZnJhbWUudXNlRW5jb2RpbmcoeyBjb21taXRWYWx1ZXM6ICdmdWxsJywgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4JyB9KTtcbiAqIGNvbnN0IGNvdW50ID0gZnJhbWUucmVhZChbXSwgJ2NvdW50JykgYXMgbnVtYmVyO1xuICogZnJhbWUubm90ZVJlYWQoW10sICdjb3VudCcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJ1bmRsZSBuYW1lcyB0aGUgcmVhZFxuICogZnJhbWUud3JpdGUoZnJhbWUuYXQoW10sICdjb3VudCcpLCBjb3VudCArIDEsICdzZXQnKTtcbiAqIGZyYW1lLmNvbW1pdCgoKSA9PiAoeyBzdGFnZTogJ0luY3JlbWVudCcsIHN0YWdlSWQ6ICdpbmNyZW1lbnQnLCBydW50aW1lU3RhZ2VJZDogJ2luY3JlbWVudCMwJyB9KSk7XG4gKlxuICogc3RhdGVBdCh7IGluaXRpYWxTdGF0ZTogbG9nLmdldEluaXRpYWxTdGF0ZSgpLCBjb21taXRMb2c6IGxvZy5saXN0KCkgfSwgMCkuc3RhdGU7IC8vIHsgY291bnQ6IDEgfVxuICogYGBgXG4gKlxuICogQG1vZHVsZSB3cml0ZVxuICovXG5cbi8vIFRoZSBoZWFwIGFuZCB0aGUgbG9nLlxuZXhwb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL2xpYi9tZW1vcnkvRXZlbnRMb2cuanMnO1xuZXhwb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9saWIvbWVtb3J5L1NoYXJlZE1lbW9yeS5qcyc7XG5cbi8vIE9uZSBzdGVwJ3MgZnJhbWUsIGFuZCB3aGF0IGl0IHRha2VzOiB0aGUgZGlhbHMsIHRoZSB2ZXJicywgYSB2ZXJkaWN0J3MgYnl0ZXMsIHRoZSBuYW1lcyBvbiBpdHMgYnVuZGxlLlxuZXhwb3J0IHR5cGUgeyBDb21taXRTdGFtcCB9IGZyb20gJy4vbGliL21lbW9yeS9yZWNvcmRDb21taXQuanMnO1xuZXhwb3J0IHR5cGUgeyBSZWNvcmRFbmNvZGluZywgV3JpdGVTY3J1YiwgV3JpdGVWZXJiIH0gZnJvbSAnLi9saWIvbWVtb3J5L1JlY29yZEZyYW1lLmpzJztcbmV4cG9ydCB7IFJlY29yZEZyYW1lIH0gZnJvbSAnLi9saWIvbWVtb3J5L1JlY29yZEZyYW1lLmpzJztcbmV4cG9ydCB0eXBlIHsgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS90eXBlcy5qcyc7XG4iXX0=
@@ -1,320 +0,0 @@
1
- "use strict";
2
- /**
3
- * freeze.ts — the ONE deep-freeze walk (moved here from `scope/protection/readonlyInput.ts` in F3),
4
- * and the serve-time law for the commit log (9.44.2).
5
- *
6
- * WHY HERE. Saved trees freeze through this walk: the fold base served as
7
- * `initialState` (`ExecutionRuntime · getFoldBase`), the
8
- * dev-mode snapshot (`runner/snapshot.ts · servedSnapshot`), every state `stateAt` hands out
9
- * (`time-travel/stateAt.ts`) and, since F3, every commit bundle (`EventLog · record`). `memory/` must
10
- * not import `scope/` (that edge closed the memory ⇄ scope ⇄ recorder module cycle F0 removed), so the
11
- * walk lives in this leaf folder, which imports nothing outside itself. Args use an ownership snapshot
12
- * instead (`scope/protection/readonlyInput.ts · createFrozenArgs`): never freeze borrowed caller values.
13
- *
14
- * FREEZE WHAT CAN BE FROZEN, COPY WHAT CAN'T (9.44.2). `Object.freeze` cannot seal a Date's time, a
15
- * Map's or Set's entries, a buffer's bytes, a RegExp (`compile()` rewrites a frozen one) or an Error
16
- * (V8's own `stack` accessor writes through a frozen one). A fresh tree handed to one caller (a `stateAt`
17
- * state, the dev-mode snapshot) is that caller's own, so freezing it is a guard and nothing more. The
18
- * COMMIT LOG — each bundle, and the fold base — is served to every reader, so {@link freezeRecord}
19
- * remembers that a record holds such a value, its first serve maps the containers on the way to each
20
- * one (its open PATHS), and {@link serveRecord} hands a reader a copy of those paths only: a fresh copy
21
- * of each such value, fresh frozen containers on the way to it, and every other part shared, frozen, as
22
- * it is. Until 9.44.2 `snapshot.commitLog[i].overwrite.when.setTime(0)` rewrote every later snapshot,
23
- * `stateAt`, `commitValueAt`, slice and cursor answer.
24
- *
25
- * Every walk here is ITERATIVE (an explicit stack): a record's depth is not bounded by the call stack.
26
- *
27
- * @example
28
- * ```typescript
29
- * import { deepFreeze, freezeRecord, serveRecord } from './freeze.js';
30
- *
31
- * const args = deepFreeze({ order: { lines: [{ sku: 'A' }] }, bytes: new Uint8Array([1]) });
32
- * Object.isFrozen(args.order.lines[0]); // true
33
- * Object.isFrozen(args.bytes); // false — a typed array cannot be frozen; it is skipped
34
- *
35
- * const record = freezeRecord({ when: new Date(0), tags: ['a'] });
36
- * const served = serveRecord(record);
37
- * served.when.setTime(5); // changes the reader's copy
38
- * serveRecord(record).when.getTime(); // 0 — every serve is the record as recorded
39
- * served.tags === record.tags; // true — the sealed part is shared, not copied
40
- * serveRecord(freezeRecord({ n: 1 })); // a record freezing sealed whole: served as itself
41
- * ```
42
- */
43
- Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.serveRecord = exports.freezeRecord = exports.deepFreeze = void 0;
45
- const ownData_js_1 = require("./ownData.js");
46
- const valueKinds_js_1 = require("./valueKinds.js");
47
- /**
48
- * Freezes `obj` and every object reachable through its own properties, and returns `obj`.
49
- *
50
- * - An object that is ALREADY frozen is left as it is, and not descended — 9.32.0's contract, kept:
51
- * args may hold a caller's frozen object with live parts inside (a class instance a stage calls),
52
- * and freezing past it would break them. It is also what ends a cycle. The commit log never meets
53
- * one: its payloads are fresh `structuredClone`s.
54
- * - ArrayBuffer views (typed arrays, `DataView`) are skipped: `Object.freeze` throws on a non-empty
55
- * typed array, so a `Uint8Array` in state, args or the fold base used to fail the run or the
56
- * snapshot here.
57
- * - What `Object.freeze` cannot reach stays mutable — Map and Set contents, a Date's time, the
58
- * bytes behind a buffer. A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y` regex
59
- * taken from a frozen tree throws when `exec` or `replace` advance it. The commit log goes through
60
- * {@link freezeRecord} and {@link serveRecord} instead.
61
- * - Functions are not descended (they are not values the engine stores).
62
- */
63
- function deepFreeze(obj, arrays = 'every-key') {
64
- if (obj !== null && typeof obj === 'object')
65
- walkAndFreeze(obj, arrays === 'indices', false);
66
- return obj;
67
- }
68
- exports.deepFreeze = deepFreeze;
69
- /**
70
- * Containers of a record that hold — on some path below them — a value freezing cannot seal: `true` once
71
- * mapped (the container is on an open path), `false` for a record {@link freezeRecord} found open whose
72
- * paths no serve has mapped yet. A container absent here is sealed whole.
73
- */
74
- const OPEN = new WeakMap();
75
- /**
76
- * {@link deepFreeze} for a record many readers are SERVED (a commit bundle, the fold base), and two more
77
- * things on the same walk:
78
- *
79
- * - it remembers THAT the record holds a value freezing cannot seal — one flag; the record's first
80
- * serve maps WHERE (the containers on the way to each such value, its open paths), so the run pays
81
- * nothing more and {@link serveRecord} copies those paths and nothing else;
82
- * - a typed array or `DataView` that views a SLICE of a bigger buffer (a Node `Buffer` views its
83
- * shared pool) is replaced, in the record, by a copy of the bytes it views — the record keeps the
84
- * view's bytes, never the rest of the buffer (a resizable or shared buffer is kept as it is).
85
- *
86
- * A part frozen before is not frozen past (deepFreeze's contract) but is looked through, so a value
87
- * freezing cannot seal inside it still opens the record. Returns `record`.
88
- */
89
- function freezeRecord(record, arrays = 'every-key') {
90
- if (!OPEN.has(record) && walkAndFreeze(record, arrays === 'indices', true))
91
- OPEN.set(record, false);
92
- return record;
93
- }
94
- exports.freezeRecord = freezeRecord;
95
- /**
96
- * The record as a reader may hold it — THE serve-time law: a record freezing sealed whole is served as
97
- * itself (shared, no cost); any other as a copy of its open paths ({@link freezeRecord}): fresh frozen
98
- * containers down to each value freezing cannot seal, a fresh copy of that value, and every other part
99
- * shared, frozen, as it is. A copy is served the same way again.
100
- */
101
- function serveRecord(record) {
102
- if (record === null || typeof record !== 'object')
103
- return record;
104
- const mapped = OPEN.get(record);
105
- if (mapped === undefined)
106
- return record;
107
- if (!mapped)
108
- mapOpenPaths(record);
109
- return OPEN.get(record) === true ? copyOpenPaths(record) : record;
110
- }
111
- exports.serveRecord = serveRecord;
112
- /** A value freezing cannot seal — a view, or a kind `SEALABLE` says no to (a Date, a Map, an Error …). */
113
- function isUnsealable(value) {
114
- return ArrayBuffer.isView(value) || !valueKinds_js_1.SEALABLE[(0, valueKinds_js_1.kindOf)(value)];
115
- }
116
- /**
117
- * Freeze `root` and every container under it, iteratively; `record` adds the look-through of parts
118
- * frozen before and the compaction of views over a slice. `true` when something under `root` (or `root`
119
- * itself) cannot be sealed.
120
- */
121
- function walkAndFreeze(root, indices, record) {
122
- let open = false;
123
- let lookedThrough;
124
- const stack = [root];
125
- while (stack.length > 0) {
126
- const node = stack.pop();
127
- if (ArrayBuffer.isView(node)) {
128
- open = true; // its bytes — and a non-empty one cannot be frozen at all
129
- continue;
130
- }
131
- const frozenBefore = Object.isFrozen(node);
132
- if (frozenBefore) {
133
- if (!record || OPEN.has(node)) {
134
- open ||= record;
135
- continue;
136
- }
137
- if ((lookedThrough ??= new Set()).has(node))
138
- continue;
139
- lookedThrough.add(node); // a part frozen before: looked through, never frozen past
140
- }
141
- if (record && !open && !valueKinds_js_1.SEALABLE[(0, valueKinds_js_1.kindOf)(node)])
142
- open = true;
143
- // Children first, while `node` is still open to the compaction below; then the freeze.
144
- const compacting = record && !frozenBefore;
145
- if (indices && Array.isArray(node)) {
146
- for (let i = 0; i < node.length; i++) {
147
- const child = node[i];
148
- if (child === null || typeof child !== 'object')
149
- continue;
150
- stack.push(compacting && ArrayBuffer.isView(child) ? compact(node, i, child) : child);
151
- }
152
- }
153
- else {
154
- const names = Object.getOwnPropertyNames(node);
155
- for (let i = 0; i < names.length; i++) {
156
- const child = node[names[i]];
157
- if (child === null || typeof child !== 'object')
158
- continue;
159
- stack.push(compacting && ArrayBuffer.isView(child) ? compact(node, names[i], child) : child);
160
- }
161
- }
162
- if (!frozenBefore)
163
- Object.freeze(node);
164
- }
165
- return open;
166
- }
167
- /**
168
- * A view over a SLICE of a bigger buffer, replaced in `container` by a copy of the bytes it views
169
- * (the type it is — a Node `Buffer` comes out a `Uint8Array`, as a clone of it does). Anything else is
170
- * returned as it is. A resizable or shared buffer is kept: a copy would change what it is.
171
- */
172
- function compact(container, key, child) {
173
- const buffer = child.buffer;
174
- if (child.byteOffset === 0 && child.byteLength === buffer.byteLength)
175
- return child;
176
- if (buffer.resizable === true || !(buffer instanceof ArrayBuffer))
177
- return child;
178
- const bytes = buffer.slice(child.byteOffset, child.byteOffset + child.byteLength);
179
- const tag = Object.prototype.toString.call(child).slice(8, -1);
180
- const Ctor = globalThis[tag];
181
- if (typeof Ctor !== 'function')
182
- return child;
183
- const copy = new Ctor(bytes);
184
- try {
185
- container[key] = copy;
186
- }
187
- catch {
188
- return child; // a property the record does not let be replaced (a hand-built bundle)
189
- }
190
- return copy;
191
- }
192
- /**
193
- * Map the open paths of `root` — mark every container that reaches a value freezing cannot seal, so a
194
- * serve copies exactly those (DAGs and cycles included: the marks run UP the reverse edges from each
195
- * such value). Runs once per open record, at its first serve. A node's first holder is kept in one map;
196
- * any other holder (a shared part, a cycle) in a second, made only when there is one.
197
- */
198
- function mapOpenPaths(root) {
199
- const holder = new Map();
200
- let moreHolders;
201
- const leaves = [];
202
- const stack = [root];
203
- while (stack.length > 0) {
204
- const node = stack.pop();
205
- if (isUnsealable(node)) {
206
- leaves.push(node); // a leaf: its contents are copied with it
207
- continue;
208
- }
209
- const names = Object.keys(node);
210
- for (let i = 0; i < names.length; i++) {
211
- const child = node[names[i]];
212
- if (child === null || typeof child !== 'object')
213
- continue;
214
- if (child !== root && !holder.has(child)) {
215
- holder.set(child, node);
216
- stack.push(child);
217
- continue;
218
- }
219
- const more = (moreHolders ??= new Map()).get(child);
220
- if (more === undefined)
221
- moreHolders.set(child, [node]);
222
- else
223
- more.push(node);
224
- }
225
- }
226
- // Marked in THIS map, not by an earlier one: a part another record already mapped still opens
227
- // every container of this record on the way to it.
228
- const marked = new Set();
229
- const up = [];
230
- const holdersOf = (node) => {
231
- const first = holder.get(node);
232
- if (first !== undefined)
233
- up.push(first);
234
- const more = moreHolders?.get(node);
235
- // One push per holder: a spread passes every holder as a call argument, and one object held by
236
- // 120,000 containers overflowed the stack.
237
- if (more !== undefined)
238
- for (let i = 0; i < more.length; i++)
239
- up.push(more[i]);
240
- };
241
- for (const leaf of leaves) {
242
- if (leaf === root)
243
- marked.add(root);
244
- holdersOf(leaf);
245
- }
246
- while (up.length > 0) {
247
- const node = up.pop();
248
- if (marked.has(node))
249
- continue;
250
- marked.add(node);
251
- holdersOf(node);
252
- }
253
- // Only now, the walk done, does the record's flag give way to its map: a mapping that throws leaves
254
- // the record flagged, so the next serve maps again — it never hands out the record itself.
255
- if (!marked.has(root))
256
- OPEN.delete(root);
257
- for (const node of marked)
258
- OPEN.set(node, true);
259
- }
260
- /**
261
- * The served copy of an open record: its open containers copied (fresh, then frozen, and themselves
262
- * open — a copy is served by copy again), each value freezing cannot seal copied, every sealed part
263
- * shared. Iterative; one copy per original, so containers shared or cyclic stay shared in the copy. The
264
- * values freezing cannot seal are copied ONE BY ONE: two of them that share a part (an `ArrayBuffer`
265
- * and a view of it, an error whose `cause` is another key's Date) come out as separate copies — equal
266
- * values, the sharing between them not kept.
267
- */
268
- function copyOpenPaths(root) {
269
- const copies = new Map();
270
- const shells = [];
271
- const copyOf = (value, pending) => {
272
- const done = copies.get(value);
273
- if (done !== undefined)
274
- return done;
275
- let copy;
276
- if (isUnsealable(value)) {
277
- copy = copyLeaf(value);
278
- }
279
- else {
280
- copy = Array.isArray(value) ? new Array(value.length) : {};
281
- shells.push(copy);
282
- pending.push(value);
283
- }
284
- copies.set(value, copy);
285
- return copy;
286
- };
287
- const pending = [];
288
- const out = copyOf(root, pending);
289
- while (pending.length > 0) {
290
- const node = pending.pop();
291
- const copy = copies.get(node);
292
- for (const name of Object.keys(node)) {
293
- const child = node[name];
294
- (0, ownData_js_1.putOwn)(copy, name, child !== null && typeof child === 'object' && (OPEN.has(child) || isUnsealable(child))
295
- ? copyOf(child, pending)
296
- : child);
297
- }
298
- }
299
- for (const shell of shells) {
300
- Object.freeze(shell);
301
- OPEN.set(shell, true);
302
- }
303
- // A leaf copy is the reader's own; frozen where freezing reaches, as the record's parts are.
304
- for (const copy of copies.values())
305
- if (!ArrayBuffer.isView(copy))
306
- Object.freeze(copy);
307
- return out;
308
- }
309
- /** A fresh copy of a value freezing cannot seal. One the clone refuses (hand-built) is served as it is. */
310
- function copyLeaf(value) {
311
- if ((0, valueKinds_js_1.kindOf)(value) === 'date')
312
- return new Date(Date.prototype.getTime.call(value));
313
- try {
314
- return structuredClone(value);
315
- }
316
- catch {
317
- return value;
318
- }
319
- }
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL2ZyZWV6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7OztBQUVILDZDQUFzQztBQUN0QyxtREFBbUQ7QUFjbkQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFJLEdBQU0sRUFBRSxTQUFvQixXQUFXO0lBQ25FLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdGLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUhELGdDQUdDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFtQixDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFnQixZQUFZLENBQW1CLE1BQVMsRUFBRSxTQUFvQixXQUFXO0lBQ3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxJQUFJLENBQUM7UUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBSEQsb0NBR0M7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FBSSxNQUFTO0lBQ3RDLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJ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S0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckYsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO2dCQUN4QixDQUFDLENBQUMsS0FBSyxDQUNWLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUNELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsNkZBQTZGO0lBQzdGLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkYsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsMkdBQTJHO0FBQzNHLFNBQVMsUUFBUSxDQUFDLEtBQWE7SUFDN0IsSUFBSSxJQUFBLHNCQUFNLEVBQUMsS0FBSyxDQUFDLEtBQUssTUFBTTtRQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEYsSUFBSSxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZyZWV6ZS50cyDigJQgdGhlIE9ORSBkZWVwLWZyZWV6ZSB3YWxrIChtb3ZlZCBoZXJlIGZyb20gYHNjb3BlL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC50c2AgaW4gRjMpLFxuICogYW5kIHRoZSBzZXJ2ZS10aW1lIGxhdyBmb3IgdGhlIGNvbW1pdCBsb2cgKDkuNDQuMikuXG4gKlxuICogV0hZIEhFUkUuIFNhdmVkIHRyZWVzIGZyZWV6ZSB0aHJvdWdoIHRoaXMgd2FsazogdGhlIGZvbGQgYmFzZSBzZXJ2ZWQgYXNcbiAqIGBpbml0aWFsU3RhdGVgIChgRXhlY3V0aW9uUnVudGltZSDCtyBnZXRGb2xkQmFzZWApLCB0aGVcbiAqIGRldi1tb2RlIHNuYXBzaG90IChgcnVubmVyL3NuYXBzaG90LnRzIMK3IHNlcnZlZFNuYXBzaG90YCksIGV2ZXJ5IHN0YXRlIGBzdGF0ZUF0YCBoYW5kcyBvdXRcbiAqIChgdGltZS10cmF2ZWwvc3RhdGVBdC50c2ApIGFuZCwgc2luY2UgRjMsIGV2ZXJ5IGNvbW1pdCBidW5kbGUgKGBFdmVudExvZyDCtyByZWNvcmRgKS4gYG1lbW9yeS9gIG11c3RcbiAqIG5vdCBpbXBvcnQgYHNjb3BlL2AgKHRoYXQgZWRnZSBjbG9zZWQgdGhlIG1lbW9yeSDih4Qgc2NvcGUg4oeEIHJlY29yZGVyIG1vZHVsZSBjeWNsZSBGMCByZW1vdmVkKSwgc28gdGhlXG4gKiB3YWxrIGxpdmVzIGluIHRoaXMgbGVhZiBmb2xkZXIsIHdoaWNoIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZi4gQXJncyB1c2UgYW4gb3duZXJzaGlwIHNuYXBzaG90XG4gKiBpbnN0ZWFkIChgc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LnRzIMK3IGNyZWF0ZUZyb3plbkFyZ3NgKTogbmV2ZXIgZnJlZXplIGJvcnJvd2VkIGNhbGxlciB2YWx1ZXMuXG4gKlxuICogRlJFRVpFIFdIQVQgQ0FOIEJFIEZST1pFTiwgQ09QWSBXSEFUIENBTidUICg5LjQ0LjIpLiBgT2JqZWN0LmZyZWV6ZWAgY2Fubm90IHNlYWwgYSBEYXRlJ3MgdGltZSwgYVxuICogTWFwJ3Mgb3IgU2V0J3MgZW50cmllcywgYSBidWZmZXIncyBieXRlcywgYSBSZWdFeHAgKGBjb21waWxlKClgIHJld3JpdGVzIGEgZnJvemVuIG9uZSkgb3IgYW4gRXJyb3JcbiAqIChWOCdzIG93biBgc3RhY2tgIGFjY2Vzc29yIHdyaXRlcyB0aHJvdWdoIGEgZnJvemVuIG9uZSkuIEEgZnJlc2ggdHJlZSBoYW5kZWQgdG8gb25lIGNhbGxlciAoYSBgc3RhdGVBdGBcbiAqIHN0YXRlLCB0aGUgZGV2LW1vZGUgc25hcHNob3QpIGlzIHRoYXQgY2FsbGVyJ3Mgb3duLCBzbyBmcmVlemluZyBpdCBpcyBhIGd1YXJkIGFuZCBub3RoaW5nIG1vcmUuIFRoZVxuICogQ09NTUlUIExPRyDigJQgZWFjaCBidW5kbGUsIGFuZCB0aGUgZm9sZCBiYXNlIOKAlCBpcyBzZXJ2ZWQgdG8gZXZlcnkgcmVhZGVyLCBzbyB7QGxpbmsgZnJlZXplUmVjb3JkfVxuICogcmVtZW1iZXJzIHRoYXQgYSByZWNvcmQgaG9sZHMgc3VjaCBhIHZhbHVlLCBpdHMgZmlyc3Qgc2VydmUgbWFwcyB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGVhY2hcbiAqIG9uZSAoaXRzIG9wZW4gUEFUSFMpLCBhbmQge0BsaW5rIHNlcnZlUmVjb3JkfSBoYW5kcyBhIHJlYWRlciBhIGNvcHkgb2YgdGhvc2UgcGF0aHMgb25seTogYSBmcmVzaCBjb3B5XG4gKiBvZiBlYWNoIHN1Y2ggdmFsdWUsIGZyZXNoIGZyb3plbiBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gaXQsIGFuZCBldmVyeSBvdGhlciBwYXJ0IHNoYXJlZCwgZnJvemVuLCBhc1xuICogaXQgaXMuIFVudGlsIDkuNDQuMiBgc25hcHNob3QuY29tbWl0TG9nW2ldLm92ZXJ3cml0ZS53aGVuLnNldFRpbWUoMClgIHJld3JvdGUgZXZlcnkgbGF0ZXIgc25hcHNob3QsXG4gKiBgc3RhdGVBdGAsIGBjb21taXRWYWx1ZUF0YCwgc2xpY2UgYW5kIGN1cnNvciBhbnN3ZXIuXG4gKlxuICogRXZlcnkgd2FsayBoZXJlIGlzIElURVJBVElWRSAoYW4gZXhwbGljaXQgc3RhY2spOiBhIHJlY29yZCdzIGRlcHRoIGlzIG5vdCBib3VuZGVkIGJ5IHRoZSBjYWxsIHN0YWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBkZWVwRnJlZXplLCBmcmVlemVSZWNvcmQsIHNlcnZlUmVjb3JkIH0gZnJvbSAnLi9mcmVlemUuanMnO1xuICpcbiAqIGNvbnN0IGFyZ3MgPSBkZWVwRnJlZXplKHsgb3JkZXI6IHsgbGluZXM6IFt7IHNrdTogJ0EnIH1dIH0sIGJ5dGVzOiBuZXcgVWludDhBcnJheShbMV0pIH0pO1xuICogT2JqZWN0LmlzRnJvemVuKGFyZ3Mub3JkZXIubGluZXNbMF0pOyAvLyB0cnVlXG4gKiBPYmplY3QuaXNGcm96ZW4oYXJncy5ieXRlcyk7IC8vIGZhbHNlIOKAlCBhIHR5cGVkIGFycmF5IGNhbm5vdCBiZSBmcm96ZW47IGl0IGlzIHNraXBwZWRcbiAqXG4gKiBjb25zdCByZWNvcmQgPSBmcmVlemVSZWNvcmQoeyB3aGVuOiBuZXcgRGF0ZSgwKSwgdGFnczogWydhJ10gfSk7XG4gKiBjb25zdCBzZXJ2ZWQgPSBzZXJ2ZVJlY29yZChyZWNvcmQpO1xuICogc2VydmVkLndoZW4uc2V0VGltZSg1KTsgLy8gY2hhbmdlcyB0aGUgcmVhZGVyJ3MgY29weVxuICogc2VydmVSZWNvcmQocmVjb3JkKS53aGVuLmdldFRpbWUoKTsgLy8gMCDigJQgZXZlcnkgc2VydmUgaXMgdGhlIHJlY29yZCBhcyByZWNvcmRlZFxuICogc2VydmVkLnRhZ3MgPT09IHJlY29yZC50YWdzOyAvLyB0cnVlIOKAlCB0aGUgc2VhbGVkIHBhcnQgaXMgc2hhcmVkLCBub3QgY29waWVkXG4gKiBzZXJ2ZVJlY29yZChmcmVlemVSZWNvcmQoeyBuOiAxIH0pKTsgLy8gYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlOiBzZXJ2ZWQgYXMgaXRzZWxmXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBwdXRPd24gfSBmcm9tICcuL293bkRhdGEuanMnO1xuaW1wb3J0IHsga2luZE9mLCBTRUFMQUJMRSB9IGZyb20gJy4vdmFsdWVLaW5kcy5qcyc7XG5cbi8qKlxuICogSG93IHtAbGluayBkZWVwRnJlZXplfSB3YWxrcyBhbiBBUlJBWS5cbiAqXG4gKiAtIGAnZXZlcnkta2V5J2AgKHRoZSBkZWZhdWx0KSDigJQgZXZlcnkgb3duIHByb3BlcnR5LCBhcyBmb3IgYW55IG90aGVyIG9iamVjdDogdGhlIGluZGV4IGVsZW1lbnRzXG4gKiAgIEFORCBhbnkgZXhwYW5kbyAoYGFyci5ub3RlID0geyDigKYgfWApLiBUaGUgZGV2LW1vZGUgc25hcHNob3QgcmVsaWVzIG9uIHRoaXMgY29udHJhY3QuXG4gKiAtIGAnaW5kaWNlcydgIOKAlCB0aGUgaW5kZXggZWxlbWVudHMgb25seSwgc28gbm8ga2V5IHN0cmluZyBpcyBhbGxvY2F0ZWQgcGVyIGVsZW1lbnQ7IHRoaXMgaXMgd2hhdFxuICogICBrZWVwcyBmcmVlemluZyBhIDEwLDAwMC1lbGVtZW50IGNvbW1pdCBpbnNpZGUgaXRzIGJ1ZGdldCAoYGJlbmNoL2VsZW1lbnQtd3JpdGVzLnRzYCkuIEFuIG9iamVjdFxuICogICBodW5nIG9uIGFuIGFycmF5IEVYUEFORE8gaXMgdGhlbiBsZWZ0IHVuZnJvemVuLCBhbmQgdW5zZWVuIGJ5IHtAbGluayBzZXJ2ZVJlY29yZH0g4oCUIHRoZSBjb21taXRcbiAqICAgbG9nJ3MgbmFtZWQgaG9sZSAoYEV2ZW50TG9nIMK3IHJlY29yZGA7IGFuIGFycmF5IGV4cGFuZG8gaXMgb3V0IG9mIGNvbnRyYWN0IGZvciBzdGF0ZSkuXG4gKi9cbmV4cG9ydCB0eXBlIEFycmF5V2FsayA9ICdldmVyeS1rZXknIHwgJ2luZGljZXMnO1xuXG4vKipcbiAqIEZyZWV6ZXMgYG9iamAgYW5kIGV2ZXJ5IG9iamVjdCByZWFjaGFibGUgdGhyb3VnaCBpdHMgb3duIHByb3BlcnRpZXMsIGFuZCByZXR1cm5zIGBvYmpgLlxuICpcbiAqIC0gQW4gb2JqZWN0IHRoYXQgaXMgQUxSRUFEWSBmcm96ZW4gaXMgbGVmdCBhcyBpdCBpcywgYW5kIG5vdCBkZXNjZW5kZWQg4oCUIDkuMzIuMCdzIGNvbnRyYWN0LCBrZXB0OlxuICogICBhcmdzIG1heSBob2xkIGEgY2FsbGVyJ3MgZnJvemVuIG9iamVjdCB3aXRoIGxpdmUgcGFydHMgaW5zaWRlIChhIGNsYXNzIGluc3RhbmNlIGEgc3RhZ2UgY2FsbHMpLFxuICogICBhbmQgZnJlZXppbmcgcGFzdCBpdCB3b3VsZCBicmVhayB0aGVtLiBJdCBpcyBhbHNvIHdoYXQgZW5kcyBhIGN5Y2xlLiBUaGUgY29tbWl0IGxvZyBuZXZlciBtZWV0c1xuICogICBvbmU6IGl0cyBwYXlsb2FkcyBhcmUgZnJlc2ggYHN0cnVjdHVyZWRDbG9uZWBzLlxuICogLSBBcnJheUJ1ZmZlciB2aWV3cyAodHlwZWQgYXJyYXlzLCBgRGF0YVZpZXdgKSBhcmUgc2tpcHBlZDogYE9iamVjdC5mcmVlemVgIHRocm93cyBvbiBhIG5vbi1lbXB0eVxuICogICB0eXBlZCBhcnJheSwgc28gYSBgVWludDhBcnJheWAgaW4gc3RhdGUsIGFyZ3Mgb3IgdGhlIGZvbGQgYmFzZSB1c2VkIHRvIGZhaWwgdGhlIHJ1biBvciB0aGVcbiAqICAgc25hcHNob3QgaGVyZS5cbiAqIC0gV2hhdCBgT2JqZWN0LmZyZWV6ZWAgY2Fubm90IHJlYWNoIHN0YXlzIG11dGFibGUg4oCUIE1hcCBhbmQgU2V0IGNvbnRlbnRzLCBhIERhdGUncyB0aW1lLCB0aGVcbiAqICAgYnl0ZXMgYmVoaW5kIGEgYnVmZmVyLiBBIGZyb3plbiBSZWdFeHAncyBgbGFzdEluZGV4YCBpcyByZWFkLW9ubHksIHNvIGEgYC9nYCBvciBgL3lgIHJlZ2V4XG4gKiAgIHRha2VuIGZyb20gYSBmcm96ZW4gdHJlZSB0aHJvd3Mgd2hlbiBgZXhlY2Agb3IgYHJlcGxhY2VgIGFkdmFuY2UgaXQuIFRoZSBjb21taXQgbG9nIGdvZXMgdGhyb3VnaFxuICogICB7QGxpbmsgZnJlZXplUmVjb3JkfSBhbmQge0BsaW5rIHNlcnZlUmVjb3JkfSBpbnN0ZWFkLlxuICogLSBGdW5jdGlvbnMgYXJlIG5vdCBkZXNjZW5kZWQgKHRoZXkgYXJlIG5vdCB2YWx1ZXMgdGhlIGVuZ2luZSBzdG9yZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZTxUPihvYmo6IFQsIGFycmF5czogQXJyYXlXYWxrID0gJ2V2ZXJ5LWtleScpOiBUIHtcbiAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykgd2Fsa0FuZEZyZWV6ZShvYmosIGFycmF5cyA9PT0gJ2luZGljZXMnLCBmYWxzZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQ29udGFpbmVycyBvZiBhIHJlY29yZCB0aGF0IGhvbGQg4oCUIG9uIHNvbWUgcGF0aCBiZWxvdyB0aGVtIOKAlCBhIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsOiBgdHJ1ZWAgb25jZVxuICogbWFwcGVkICh0aGUgY29udGFpbmVyIGlzIG9uIGFuIG9wZW4gcGF0aCksIGBmYWxzZWAgZm9yIGEgcmVjb3JkIHtAbGluayBmcmVlemVSZWNvcmR9IGZvdW5kIG9wZW4gd2hvc2VcbiAqIHBhdGhzIG5vIHNlcnZlIGhhcyBtYXBwZWQgeWV0LiBBIGNvbnRhaW5lciBhYnNlbnQgaGVyZSBpcyBzZWFsZWQgd2hvbGUuXG4gKi9cbmNvbnN0IE9QRU4gPSBuZXcgV2Vha01hcDxvYmplY3QsIGJvb2xlYW4+KCk7XG5cbi8qKlxuICoge0BsaW5rIGRlZXBGcmVlemV9IGZvciBhIHJlY29yZCBtYW55IHJlYWRlcnMgYXJlIFNFUlZFRCAoYSBjb21taXQgYnVuZGxlLCB0aGUgZm9sZCBiYXNlKSwgYW5kIHR3byBtb3JlXG4gKiB0aGluZ3Mgb24gdGhlIHNhbWUgd2FsazpcbiAqXG4gKiAgIC0gaXQgcmVtZW1iZXJzIFRIQVQgdGhlIHJlY29yZCBob2xkcyBhIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsIOKAlCBvbmUgZmxhZzsgdGhlIHJlY29yZCdzIGZpcnN0XG4gKiAgICAgc2VydmUgbWFwcyBXSEVSRSAodGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSB0byBlYWNoIHN1Y2ggdmFsdWUsIGl0cyBvcGVuIHBhdGhzKSwgc28gdGhlIHJ1biBwYXlzXG4gKiAgICAgbm90aGluZyBtb3JlIGFuZCB7QGxpbmsgc2VydmVSZWNvcmR9IGNvcGllcyB0aG9zZSBwYXRocyBhbmQgbm90aGluZyBlbHNlO1xuICogICAtIGEgdHlwZWQgYXJyYXkgb3IgYERhdGFWaWV3YCB0aGF0IHZpZXdzIGEgU0xJQ0Ugb2YgYSBiaWdnZXIgYnVmZmVyIChhIE5vZGUgYEJ1ZmZlcmAgdmlld3MgaXRzXG4gKiAgICAgc2hhcmVkIHBvb2wpIGlzIHJlcGxhY2VkLCBpbiB0aGUgcmVjb3JkLCBieSBhIGNvcHkgb2YgdGhlIGJ5dGVzIGl0IHZpZXdzIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHRoZVxuICogICAgIHZpZXcncyBieXRlcywgbmV2ZXIgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciAoYSByZXNpemFibGUgb3Igc2hhcmVkIGJ1ZmZlciBpcyBrZXB0IGFzIGl0IGlzKS5cbiAqXG4gKiBBIHBhcnQgZnJvemVuIGJlZm9yZSBpcyBub3QgZnJvemVuIHBhc3QgKGRlZXBGcmVlemUncyBjb250cmFjdCkgYnV0IGlzIGxvb2tlZCB0aHJvdWdoLCBzbyBhIHZhbHVlXG4gKiBmcmVlemluZyBjYW5ub3Qgc2VhbCBpbnNpZGUgaXQgc3RpbGwgb3BlbnMgdGhlIHJlY29yZC4gUmV0dXJucyBgcmVjb3JkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyZWV6ZVJlY29yZDxUIGV4dGVuZHMgb2JqZWN0PihyZWNvcmQ6IFQsIGFycmF5czogQXJyYXlXYWxrID0gJ2V2ZXJ5LWtleScpOiBUIHtcbiAgaWYgKCFPUEVOLmhhcyhyZWNvcmQpICYmIHdhbGtBbmRGcmVlemUocmVjb3JkLCBhcnJheXMgPT09ICdpbmRpY2VzJywgdHJ1ZSkpIE9QRU4uc2V0KHJlY29yZCwgZmFsc2UpO1xuICByZXR1cm4gcmVjb3JkO1xufVxuXG4vKipcbiAqIFRoZSByZWNvcmQgYXMgYSByZWFkZXIgbWF5IGhvbGQgaXQg4oCUIFRIRSBzZXJ2ZS10aW1lIGxhdzogYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlIGlzIHNlcnZlZCBhc1xuICogaXRzZWxmIChzaGFyZWQsIG5vIGNvc3QpOyBhbnkgb3RoZXIgYXMgYSBjb3B5IG9mIGl0cyBvcGVuIHBhdGhzICh7QGxpbmsgZnJlZXplUmVjb3JkfSk6IGZyZXNoIGZyb3plblxuICogY29udGFpbmVycyBkb3duIHRvIGVhY2ggdmFsdWUgZnJlZXppbmcgY2Fubm90IHNlYWwsIGEgZnJlc2ggY29weSBvZiB0aGF0IHZhbHVlLCBhbmQgZXZlcnkgb3RoZXIgcGFydFxuICogc2hhcmVkLCBmcm96ZW4sIGFzIGl0IGlzLiBBIGNvcHkgaXMgc2VydmVkIHRoZSBzYW1lIHdheSBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlUmVjb3JkPFQ+KHJlY29yZDogVCk6IFQge1xuICBpZiAocmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnKSByZXR1cm4gcmVjb3JkO1xuICBjb25zdCBtYXBwZWQgPSBPUEVOLmdldChyZWNvcmQpO1xuICBpZiAobWFwcGVkID09PSB1bmRlZmluZWQpIHJldHVybiByZWNvcmQ7XG4gIGlmICghbWFwcGVkKSBtYXBPcGVuUGF0aHMocmVjb3JkKTtcbiAgcmV0dXJuIE9QRU4uZ2V0KHJlY29yZCkgPT09IHRydWUgPyAoY29weU9wZW5QYXRocyhyZWNvcmQpIGFzIFQpIDogcmVjb3JkO1xufVxuXG4vKiogQSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbCDigJQgYSB2aWV3LCBvciBhIGtpbmQgYFNFQUxBQkxFYCBzYXlzIG5vIHRvIChhIERhdGUsIGEgTWFwLCBhbiBFcnJvciDigKYpLiAqL1xuZnVuY3Rpb24gaXNVbnNlYWxhYmxlKHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkgfHwgIVNFQUxBQkxFW2tpbmRPZih2YWx1ZSldO1xufVxuXG4vKipcbiAqIEZyZWV6ZSBgcm9vdGAgYW5kIGV2ZXJ5IGNvbnRhaW5lciB1bmRlciBpdCwgaXRlcmF0aXZlbHk7IGByZWNvcmRgIGFkZHMgdGhlIGxvb2stdGhyb3VnaCBvZiBwYXJ0c1xuICogZnJvemVuIGJlZm9yZSBhbmQgdGhlIGNvbXBhY3Rpb24gb2Ygdmlld3Mgb3ZlciBhIHNsaWNlLiBgdHJ1ZWAgd2hlbiBzb21ldGhpbmcgdW5kZXIgYHJvb3RgIChvciBgcm9vdGBcbiAqIGl0c2VsZikgY2Fubm90IGJlIHNlYWxlZC5cbiAqL1xuZnVuY3Rpb24gd2Fsa0FuZEZyZWV6ZShyb290OiBvYmplY3QsIGluZGljZXM6IGJvb2xlYW4sIHJlY29yZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBsZXQgb3BlbiA9IGZhbHNlO1xuICBsZXQgbG9va2VkVGhyb3VnaDogU2V0PG9iamVjdD4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcobm9kZSkpIHtcbiAgICAgIG9wZW4gPSB0cnVlOyAvLyBpdHMgYnl0ZXMg4oCUIGFuZCBhIG5vbi1lbXB0eSBvbmUgY2Fubm90IGJlIGZyb3plbiBhdCBhbGxcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmcm96ZW5CZWZvcmUgPSBPYmplY3QuaXNGcm96ZW4obm9kZSk7XG4gICAgaWYgKGZyb3plbkJlZm9yZSkge1xuICAgICAgaWYgKCFyZWNvcmQgfHwgT1BFTi5oYXMobm9kZSkpIHtcbiAgICAgICAgb3BlbiB8fD0gcmVjb3JkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICgobG9va2VkVGhyb3VnaCA/Pz0gbmV3IFNldCgpKS5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgbG9va2VkVGhyb3VnaC5hZGQobm9kZSk7IC8vIGEgcGFydCBmcm96ZW4gYmVmb3JlOiBsb29rZWQgdGhyb3VnaCwgbmV2ZXIgZnJvemVuIHBhc3RcbiAgICB9XG4gICAgaWYgKHJlY29yZCAmJiAhb3BlbiAmJiAhU0VBTEFCTEVba2luZE9mKG5vZGUpXSkgb3BlbiA9IHRydWU7XG4gICAgLy8gQ2hpbGRyZW4gZmlyc3QsIHdoaWxlIGBub2RlYCBpcyBzdGlsbCBvcGVuIHRvIHRoZSBjb21wYWN0aW9uIGJlbG93OyB0aGVuIHRoZSBmcmVlemUuXG4gICAgY29uc3QgY29tcGFjdGluZyA9IHJlY29yZCAmJiAhZnJvemVuQmVmb3JlO1xuICAgIGlmIChpbmRpY2VzICYmIEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZDogdW5rbm93biA9IG5vZGVbaV07XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaChjb21wYWN0aW5nICYmIEFycmF5QnVmZmVyLmlzVmlldyhjaGlsZCkgPyBjb21wYWN0KG5vZGUsIGksIGNoaWxkKSA6IGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhub2RlKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZXNbaV1dO1xuICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goY29tcGFjdGluZyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoY2hpbGQpID8gY29tcGFjdChub2RlLCBuYW1lc1tpXSwgY2hpbGQpIDogY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZyb3plbkJlZm9yZSkgT2JqZWN0LmZyZWV6ZShub2RlKTtcbiAgfVxuICByZXR1cm4gb3Blbjtcbn1cblxuLyoqXG4gKiBBIHZpZXcgb3ZlciBhIFNMSUNFIG9mIGEgYmlnZ2VyIGJ1ZmZlciwgcmVwbGFjZWQgaW4gYGNvbnRhaW5lcmAgYnkgYSBjb3B5IG9mIHRoZSBieXRlcyBpdCB2aWV3c1xuICogKHRoZSB0eXBlIGl0IGlzIOKAlCBhIE5vZGUgYEJ1ZmZlcmAgY29tZXMgb3V0IGEgYFVpbnQ4QXJyYXlgLCBhcyBhIGNsb25lIG9mIGl0IGRvZXMpLiBBbnl0aGluZyBlbHNlIGlzXG4gKiByZXR1cm5lZCBhcyBpdCBpcy4gQSByZXNpemFibGUgb3Igc2hhcmVkIGJ1ZmZlciBpcyBrZXB0OiBhIGNvcHkgd291bGQgY2hhbmdlIHdoYXQgaXQgaXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhY3QoY29udGFpbmVyOiBvYmplY3QsIGtleTogc3RyaW5nIHwgbnVtYmVyLCBjaGlsZDogQXJyYXlCdWZmZXJWaWV3KTogb2JqZWN0IHtcbiAgY29uc3QgYnVmZmVyID0gY2hpbGQuYnVmZmVyIGFzIEFycmF5QnVmZmVyICYgeyByZXNpemFibGU/OiBib29sZWFuIH07XG4gIGlmIChjaGlsZC5ieXRlT2Zmc2V0ID09PSAwICYmIGNoaWxkLmJ5dGVMZW5ndGggPT09IGJ1ZmZlci5ieXRlTGVuZ3RoKSByZXR1cm4gY2hpbGQ7XG4gIGlmIChidWZmZXIucmVzaXphYmxlID09PSB0cnVlIHx8ICEoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSByZXR1cm4gY2hpbGQ7XG4gIGNvbnN0IGJ5dGVzID0gYnVmZmVyLnNsaWNlKGNoaWxkLmJ5dGVPZmZzZXQsIGNoaWxkLmJ5dGVPZmZzZXQgKyBjaGlsZC5ieXRlTGVuZ3RoKTtcbiAgY29uc3QgdGFnID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNoaWxkKS5zbGljZSg4LCAtMSk7XG4gIGNvbnN0IEN0b3IgPSAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIG5ldyAoYnVmZmVyOiBBcnJheUJ1ZmZlcikgPT4gQXJyYXlCdWZmZXJWaWV3PilbdGFnXTtcbiAgaWYgKHR5cGVvZiBDdG9yICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gY2hpbGQ7XG4gIGNvbnN0IGNvcHkgPSBuZXcgQ3RvcihieXRlcyk7XG4gIHRyeSB7XG4gICAgKGNvbnRhaW5lciBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XSA9IGNvcHk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjaGlsZDsgLy8gYSBwcm9wZXJ0eSB0aGUgcmVjb3JkIGRvZXMgbm90IGxldCBiZSByZXBsYWNlZCAoYSBoYW5kLWJ1aWx0IGJ1bmRsZSlcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLyoqXG4gKiBNYXAgdGhlIG9wZW4gcGF0aHMgb2YgYHJvb3RgIOKAlCBtYXJrIGV2ZXJ5IGNvbnRhaW5lciB0aGF0IHJlYWNoZXMgYSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbCwgc28gYVxuICogc2VydmUgY29waWVzIGV4YWN0bHkgdGhvc2UgKERBR3MgYW5kIGN5Y2xlcyBpbmNsdWRlZDogdGhlIG1hcmtzIHJ1biBVUCB0aGUgcmV2ZXJzZSBlZGdlcyBmcm9tIGVhY2hcbiAqIHN1Y2ggdmFsdWUpLiBSdW5zIG9uY2UgcGVyIG9wZW4gcmVjb3JkLCBhdCBpdHMgZmlyc3Qgc2VydmUuIEEgbm9kZSdzIGZpcnN0IGhvbGRlciBpcyBrZXB0IGluIG9uZSBtYXA7XG4gKiBhbnkgb3RoZXIgaG9sZGVyIChhIHNoYXJlZCBwYXJ0LCBhIGN5Y2xlKSBpbiBhIHNlY29uZCwgbWFkZSBvbmx5IHdoZW4gdGhlcmUgaXMgb25lLlxuICovXG5mdW5jdGlvbiBtYXBPcGVuUGF0aHMocm9vdDogb2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IGhvbGRlciA9IG5ldyBNYXA8b2JqZWN0LCBvYmplY3Q+KCk7XG4gIGxldCBtb3JlSG9sZGVyczogTWFwPG9iamVjdCwgb2JqZWN0W10+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBsZWF2ZXM6IG9iamVjdFtdID0gW107XG4gIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgIGlmIChpc1Vuc2VhbGFibGUobm9kZSkpIHtcbiAgICAgIGxlYXZlcy5wdXNoKG5vZGUpOyAvLyBhIGxlYWY6IGl0cyBjb250ZW50cyBhcmUgY29waWVkIHdpdGggaXRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKG5vZGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVzW2ldXTtcbiAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZCAhPT0gcm9vdCAmJiAhaG9sZGVyLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgaG9sZGVyLnNldChjaGlsZCwgbm9kZSk7XG4gICAgICAgIHN0YWNrLnB1c2goY2hpbGQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vcmUgPSAobW9yZUhvbGRlcnMgPz89IG5ldyBNYXAoKSkuZ2V0KGNoaWxkKTtcbiAgICAgIGlmIChtb3JlID09PSB1bmRlZmluZWQpIG1vcmVIb2xkZXJzLnNldChjaGlsZCwgW25vZGVdKTtcbiAgICAgIGVsc2UgbW9yZS5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICAvLyBNYXJrZWQgaW4gVEhJUyBtYXAsIG5vdCBieSBhbiBlYXJsaWVyIG9uZTogYSBwYXJ0IGFub3RoZXIgcmVjb3JkIGFscmVhZHkgbWFwcGVkIHN0aWxsIG9wZW5zXG4gIC8vIGV2ZXJ5IGNvbnRhaW5lciBvZiB0aGlzIHJlY29yZCBvbiB0aGUgd2F5IHRvIGl0LlxuICBjb25zdCBtYXJrZWQgPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgdXA6IG9iamVjdFtdID0gW107XG4gIGNvbnN0IGhvbGRlcnNPZiA9IChub2RlOiBvYmplY3QpOiB2b2lkID0+IHtcbiAgICBjb25zdCBmaXJzdCA9IGhvbGRlci5nZXQobm9kZSk7XG4gICAgaWYgKGZpcnN0ICE9PSB1bmRlZmluZWQpIHVwLnB1c2goZmlyc3QpO1xuICAgIGNvbnN0IG1vcmUgPSBtb3JlSG9sZGVycz8uZ2V0KG5vZGUpO1xuICAgIC8vIE9uZSBwdXNoIHBlciBob2xkZXI6IGEgc3ByZWFkIHBhc3NlcyBldmVyeSBob2xkZXIgYXMgYSBjYWxsIGFyZ3VtZW50LCBhbmQgb25lIG9iamVjdCBoZWxkIGJ5XG4gICAgLy8gMTIwLDAwMCBjb250YWluZXJzIG92ZXJmbG93ZWQgdGhlIHN0YWNrLlxuICAgIGlmIChtb3JlICE9PSB1bmRlZmluZWQpIGZvciAobGV0IGkgPSAwOyBpIDwgbW9yZS5sZW5ndGg7IGkrKykgdXAucHVzaChtb3JlW2ldKTtcbiAgfTtcbiAgZm9yIChjb25zdCBsZWFmIG9mIGxlYXZlcykge1xuICAgIGlmIChsZWFmID09PSByb290KSBtYXJrZWQuYWRkKHJvb3QpO1xuICAgIGhvbGRlcnNPZihsZWFmKTtcbiAgfVxuICB3aGlsZSAodXAubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSB1cC5wb3AoKSE7XG4gICAgaWYgKG1hcmtlZC5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgIG1hcmtlZC5hZGQobm9kZSk7XG4gICAgaG9sZGVyc09mKG5vZGUpO1xuICB9XG4gIC8vIE9ubHkgbm93LCB0aGUgd2FsayBkb25lLCBkb2VzIHRoZSByZWNvcmQncyBmbGFnIGdpdmUgd2F5IHRvIGl0cyBtYXA6IGEgbWFwcGluZyB0aGF0IHRocm93cyBsZWF2ZXNcbiAgLy8gdGhlIHJlY29yZCBmbGFnZ2VkLCBzbyB0aGUgbmV4dCBzZXJ2ZSBtYXBzIGFnYWluIOKAlCBpdCBuZXZlciBoYW5kcyBvdXQgdGhlIHJlY29yZCBpdHNlbGYuXG4gIGlmICghbWFya2VkLmhhcyhyb290KSkgT1BFTi5kZWxldGUocm9vdCk7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBtYXJrZWQpIE9QRU4uc2V0KG5vZGUsIHRydWUpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgY29weSBvZiBhbiBvcGVuIHJlY29yZDogaXRzIG9wZW4gY29udGFpbmVycyBjb3BpZWQgKGZyZXNoLCB0aGVuIGZyb3plbiwgYW5kIHRoZW1zZWx2ZXNcbiAqIG9wZW4g4oCUIGEgY29weSBpcyBzZXJ2ZWQgYnkgY29weSBhZ2FpbiksIGVhY2ggdmFsdWUgZnJlZXppbmcgY2Fubm90IHNlYWwgY29waWVkLCBldmVyeSBzZWFsZWQgcGFydFxuICogc2hhcmVkLiBJdGVyYXRpdmU7IG9uZSBjb3B5IHBlciBvcmlnaW5hbCwgc28gY29udGFpbmVycyBzaGFyZWQgb3IgY3ljbGljIHN0YXkgc2hhcmVkIGluIHRoZSBjb3B5LiBUaGVcbiAqIHZhbHVlcyBmcmVlemluZyBjYW5ub3Qgc2VhbCBhcmUgY29waWVkIE9ORSBCWSBPTkU6IHR3byBvZiB0aGVtIHRoYXQgc2hhcmUgYSBwYXJ0IChhbiBgQXJyYXlCdWZmZXJgXG4gKiBhbmQgYSB2aWV3IG9mIGl0LCBhbiBlcnJvciB3aG9zZSBgY2F1c2VgIGlzIGFub3RoZXIga2V5J3MgRGF0ZSkgY29tZSBvdXQgYXMgc2VwYXJhdGUgY29waWVzIOKAlCBlcXVhbFxuICogdmFsdWVzLCB0aGUgc2hhcmluZyBiZXR3ZWVuIHRoZW0gbm90IGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPcGVuUGF0aHMocm9vdDogb2JqZWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29waWVzID0gbmV3IE1hcDxvYmplY3QsIG9iamVjdD4oKTtcbiAgY29uc3Qgc2hlbGxzOiBvYmplY3RbXSA9IFtdO1xuICBjb25zdCBjb3B5T2YgPSAodmFsdWU6IG9iamVjdCwgcGVuZGluZzogb2JqZWN0W10pOiBvYmplY3QgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBjb3BpZXMuZ2V0KHZhbHVlKTtcbiAgICBpZiAoZG9uZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZG9uZTtcbiAgICBsZXQgY29weTogb2JqZWN0O1xuICAgIGlmIChpc1Vuc2VhbGFibGUodmFsdWUpKSB7XG4gICAgICBjb3B5ID0gY29weUxlYWYodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3B5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBuZXcgQXJyYXkodmFsdWUubGVuZ3RoKSA6IHt9O1xuICAgICAgc2hlbGxzLnB1c2goY29weSk7XG4gICAgICBwZW5kaW5nLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBjb3BpZXMuc2V0KHZhbHVlLCBjb3B5KTtcbiAgICByZXR1cm4gY29weTtcbiAgfTtcbiAgY29uc3QgcGVuZGluZzogb2JqZWN0W10gPSBbXTtcbiAgY29uc3Qgb3V0ID0gY29weU9mKHJvb3QsIHBlbmRpbmcpO1xuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBlbmRpbmcucG9wKCkhO1xuICAgIGNvbnN0IGNvcHkgPSBjb3BpZXMuZ2V0KG5vZGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgY29uc3QgY2hpbGQgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZV07XG4gICAgICBwdXRPd24oXG4gICAgICAgIGNvcHksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgKE9QRU4uaGFzKGNoaWxkKSB8fCBpc1Vuc2VhbGFibGUoY2hpbGQpKVxuICAgICAgICAgID8gY29weU9mKGNoaWxkLCBwZW5kaW5nKVxuICAgICAgICAgIDogY2hpbGQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IHNoZWxsIG9mIHNoZWxscykge1xuICAgIE9iamVjdC5mcmVlemUoc2hlbGwpO1xuICAgIE9QRU4uc2V0KHNoZWxsLCB0cnVlKTtcbiAgfVxuICAvLyBBIGxlYWYgY29weSBpcyB0aGUgcmVhZGVyJ3Mgb3duOyBmcm96ZW4gd2hlcmUgZnJlZXppbmcgcmVhY2hlcywgYXMgdGhlIHJlY29yZCdzIHBhcnRzIGFyZS5cbiAgZm9yIChjb25zdCBjb3B5IG9mIGNvcGllcy52YWx1ZXMoKSkgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcoY29weSkpIE9iamVjdC5mcmVlemUoY29weSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBBIGZyZXNoIGNvcHkgb2YgYSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbC4gT25lIHRoZSBjbG9uZSByZWZ1c2VzIChoYW5kLWJ1aWx0KSBpcyBzZXJ2ZWQgYXMgaXQgaXMuICovXG5mdW5jdGlvbiBjb3B5TGVhZih2YWx1ZTogb2JqZWN0KTogb2JqZWN0IHtcbiAgaWYgKGtpbmRPZih2YWx1ZSkgPT09ICdkYXRlJykgcmV0dXJuIG5ldyBEYXRlKERhdGUucHJvdG90eXBlLmdldFRpbWUuY2FsbCh2YWx1ZSkpO1xuICB0cnkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdfQ==
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.putOwn = void 0;
4
- /**
5
- * `target[name] = value`, preserving existing own-slot behavior while making
6
- * a missing inherited name an OWN data property. Payload names such as
7
- * `__proto__` are data, not setters or selector instructions. Shared by the
8
- * record-serving and copy-on-write copies; this is not a public helper.
9
- */
10
- function putOwn(target, name, value) {
11
- if (!Object.prototype.hasOwnProperty.call(target, name) && Reflect.has(target, name)) {
12
- Object.defineProperty(target, name, { value, enumerable: true, writable: true, configurable: true });
13
- }
14
- else {
15
- target[name] = value;
16
- }
17
- }
18
- exports.putOwn = putOwn;
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3duRGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9vd25EYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7OztHQUtHO0FBQ0gsU0FBZ0IsTUFBTSxDQUFDLE1BQStCLEVBQUUsSUFBWSxFQUFFLEtBQWM7SUFDbEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyRixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQztBQU5ELHdCQU1DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgdGFyZ2V0W25hbWVdID0gdmFsdWVgLCBwcmVzZXJ2aW5nIGV4aXN0aW5nIG93bi1zbG90IGJlaGF2aW9yIHdoaWxlIG1ha2luZ1xuICogYSBtaXNzaW5nIGluaGVyaXRlZCBuYW1lIGFuIE9XTiBkYXRhIHByb3BlcnR5LiBQYXlsb2FkIG5hbWVzIHN1Y2ggYXNcbiAqIGBfX3Byb3RvX19gIGFyZSBkYXRhLCBub3Qgc2V0dGVycyBvciBzZWxlY3RvciBpbnN0cnVjdGlvbnMuIFNoYXJlZCBieSB0aGVcbiAqIHJlY29yZC1zZXJ2aW5nIGFuZCBjb3B5LW9uLXdyaXRlIGNvcGllczsgdGhpcyBpcyBub3QgYSBwdWJsaWMgaGVscGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHV0T3duKHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBuYW1lKSAmJiBSZWZsZWN0Lmhhcyh0YXJnZXQsIG5hbWUpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgbmFtZSwgeyB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgfVxufVxuIl19
@@ -1,146 +0,0 @@
1
- "use strict";
2
- /**
3
- * valueKinds.ts — what KIND of value a record holds: the one classifier.
4
- *
5
- * WHY. Committed state is what survives `structuredClone` (an engine invariant), so the values a
6
- * record holds are the kinds the clone keeps. Two laws need the kind, and both ask here:
7
- *
8
- * - what counts as a CHANGE (`memory/equality.ts · deepEqual`): two values are equal when a record
9
- * holds the same thing for both, compared kind by kind. Until 9.44.2 only Date, Map and Set had a
10
- * kind; a RegExp, an Error, a boxed number, a buffer, a DataView or a Blob was compared as an
11
- * object with no own keys — equal to any other of its kind — so replacing one committed no row
12
- * and live state kept the old value;
13
- * - what a served record must COPY (`capture/freeze.ts · freezeRecord` / `serveRecord`):
14
- * `Object.freeze` seals only the kinds whose content is their own properties ({@link SEALABLE}).
15
- *
16
- * A leaf: imports nothing (`capture/` is L0, below `memory/`).
17
- *
18
- * @example
19
- * ```typescript
20
- * kindOf(new Date(0)); // 'date'
21
- * kindOf(new (class Point { x = 1 })()); // 'plain' — its clone is a plain object
22
- * kindOf(new Blob(['a'])); // 'opaque' — its clone keeps content this library cannot read
23
- * SEALABLE.date; // false — setTime writes a slot Object.freeze cannot reach
24
- * ```
25
- */
26
- Object.defineProperty(exports, "__esModule", { value: true });
27
- exports.kindOf = exports.SEALABLE = void 0;
28
- /**
29
- * Does `Object.freeze` seal every part of a value of this kind? True only where the content is the
30
- * value's own properties (or a slot nothing can write). A `Record`, so a new kind does not compile
31
- * until it is decided here.
32
- */
33
- exports.SEALABLE = Object.freeze({
34
- plain: true,
35
- array: true,
36
- boxed: true,
37
- date: false, // setTime & co. write its time value
38
- regexp: false, // compile() rewrites source and flags, even on a frozen one
39
- map: false, // set / delete / clear
40
- set: false, // add / delete / clear
41
- error: false, // V8's own `stack` accessor writes through a frozen error
42
- buffer: false, // its bytes, through any view; transfer() detaches it
43
- view: false, // index writes, set, fill, sort, copyWithin …
44
- opaque: false, // content this library cannot read — never assumed sealed
45
- });
46
- /** What a brand check returns, when it does not throw, for a value without the slot. */
47
- const NOT_BRAND = Symbol('not the brand');
48
- /**
49
- * A built-in kind is known by its BRAND — an internal slot only the real thing has — never by its
50
- * prototype: `Object.create(RegExp.prototype)` is not a RegExp (its clone is `{}`), and reading
51
- * `source` from it throws. The candidate comes from `Object.prototype.toString` (one call), then ONE
52
- * brand-checked read confirms it; a value that fails it is classified by its clone instead.
53
- */
54
- const BRANDS =
55
- /* @__PURE__ */ brandTable();
56
- function brandTable() {
57
- const getter = (proto, key) => {
58
- const get = proto && Object.getOwnPropertyDescriptor(proto, key)?.get;
59
- return get ? (value) => get.call(value) : undefined;
60
- };
61
- const global = globalThis;
62
- const isError = Error.isError;
63
- const rows = [
64
- ['Date', 'date', (value) => Date.prototype.getTime.call(value)],
65
- ['RegExp', 'regexp', getter(RegExp.prototype, 'source')],
66
- ['Map', 'map', getter(Map.prototype, 'size')],
67
- ['Set', 'set', getter(Set.prototype, 'size')],
68
- // An error's tag comes from its own [[ErrorData]] slot: no Error prototype carries a toStringTag. Where
69
- // the brand check `Error.isError` is missing (Node 22), a tag a getter supplies is therefore a spoof.
70
- ['Error', 'error', (value) => ((isError ? isError(value) : untagged(value)) ? true : NOT_BRAND)],
71
- ['Number', 'boxed', (value) => Number.prototype.valueOf.call(value)],
72
- ['String', 'boxed', (value) => String.prototype.valueOf.call(value)],
73
- ['Boolean', 'boxed', (value) => Boolean.prototype.valueOf.call(value)],
74
- ['BigInt', 'boxed', (value) => (global.BigInt?.prototype).valueOf.call(value)],
75
- ['ArrayBuffer', 'buffer', getter(ArrayBuffer.prototype, 'byteLength')],
76
- ['SharedArrayBuffer', 'buffer', getter(global.SharedArrayBuffer?.prototype, 'byteLength')],
77
- ];
78
- const table = new Map();
79
- for (const [name, kind, check] of rows)
80
- if (check)
81
- table.set(`[object ${name}]`, { kind, check });
82
- return table;
83
- }
84
- /** No `Symbol.toStringTag` on the value or its prototypes: its tag came from a slot. */
85
- function untagged(value) {
86
- return value[Symbol.toStringTag] === undefined;
87
- }
88
- /** The kind of a built-in value, by its brand — `undefined` for anything else. */
89
- function builtinKind(value) {
90
- if (ArrayBuffer.isView(value))
91
- return 'view'; // a brand check of its own: [[ViewedArrayBuffer]]
92
- const brand = BRANDS.get(Object.prototype.toString.call(value));
93
- if (brand === undefined)
94
- return undefined;
95
- try {
96
- return brand.check(value) === NOT_BRAND ? undefined : brand.kind;
97
- }
98
- catch {
99
- return undefined; // the prototype without the slot
100
- }
101
- }
102
- /** Prototypes classified by a probe clone of their first instance (see {@link kindOf}). */
103
- const PROBED = new WeakMap();
104
- /**
105
- * The kind of an object, as a record holds it. A plain object or an array — the bulk of state —
106
- * costs one `Array.isArray` and one `getPrototypeOf`; a built-in a tag and one brand-checked read.
107
- * The brand is the value's own slot, so a subclass (a `Map` subclass is a `'map'`, Node's `Buffer` a
108
- * `'view'`) and a value from another realm land on their kind.
109
- *
110
- * Any other object is classified by WHAT ITS CLONE IS, once per prototype: a class instance comes
111
- * back a plain object (`'plain'`), a fake built-in (`Object.create(Date.prototype)`, or a class whose
112
- * `Symbol.toStringTag` says `'Date'`) comes back `{}` (`'plain'`), and a host object comes back as
113
- * itself (`'opaque'`). A prototype whose instance the clone refuses is `'opaque'` — remembered too:
114
- * it cannot be held, and its commit will refuse it.
115
- */
116
- function kindOf(value) {
117
- if (Array.isArray(value))
118
- return 'array';
119
- const proto = Object.getPrototypeOf(value);
120
- if (proto === Object.prototype || proto === null)
121
- return 'plain';
122
- return builtinKind(value) ?? PROBED.get(proto) ?? probe(value, proto);
123
- }
124
- exports.kindOf = kindOf;
125
- function probe(value, proto) {
126
- let kind;
127
- try {
128
- const clone = structuredClone(value);
129
- kind = clone === null || typeof clone !== 'object' ? 'opaque' : kindOfClone(clone);
130
- }
131
- catch {
132
- kind = 'opaque';
133
- }
134
- PROBED.set(proto, kind);
135
- return kind;
136
- }
137
- /** The kind of a CLONE — a value of this realm, so its prototype or its brand decides it. */
138
- function kindOfClone(clone) {
139
- if (Array.isArray(clone))
140
- return 'array';
141
- const proto = Object.getPrototypeOf(clone);
142
- if (proto === Object.prototype || proto === null)
143
- return 'plain';
144
- return builtinKind(clone) ?? 'opaque';
145
- }
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVLaW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS92YWx1ZUtpbmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7OztBQXFCSDs7OztHQUlHO0FBQ1UsUUFBQSxRQUFRLEdBQTJELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDNUYsS0FBSyxFQUFFLElBQUk7SUFDWCxLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsSUFBSSxFQUFFLEtBQUssRUFBRSxxQ0FBcUM7SUFDbEQsTUFBTSxFQUFFLEtBQUssRUFBRSw0REFBNEQ7SUFDM0UsR0FBRyxFQUFFLEtBQUssRUFBRSx1QkFBdUI7SUFDbkMsR0FBRyxFQUFFLEtBQUssRUFBRSx1QkFBdUI7SUFDbkMsS0FBSyxFQUFFLEtBQUssRUFBRSwwREFBMEQ7SUFDeEUsTUFBTSxFQUFFLEtBQUssRUFBRSxzREFBc0Q7SUFDckUsSUFBSSxFQUFFLEtBQUssRUFBRSw4Q0FBOEM7SUFDM0QsTUFBTSxFQUFFLEtBQUssRUFBRSwwREFBMEQ7Q0FDMUUsQ0FBQyxDQUFDO0FBRUgsd0ZBQXdGO0FBQ3hGLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUUxQzs7Ozs7R0FLRztBQUNILE1BQU0sTUFBTTtBQUNWLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUUvQixTQUFTLFVBQVU7SUFDakIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUF5QixFQUFFLEdBQVcsRUFBNEMsRUFBRTtRQUNsRyxNQUFNLEdBQUcsR0FBRyxLQUFLLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUM7UUFDdEUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMs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LEdBQUcsS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCw2RkFBNkY7QUFDN0YsU0FBUyxXQUFXLENBQUMsS0FBYTtJQUNoQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDekMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDakUsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHZhbHVlS2luZHMudHMg4oCUIHdoYXQgS0lORCBvZiB2YWx1ZSBhIHJlY29yZCBob2xkczogdGhlIG9uZSBjbGFzc2lmaWVyLlxuICpcbiAqIFdIWS4gQ29tbWl0dGVkIHN0YXRlIGlzIHdoYXQgc3Vydml2ZXMgYHN0cnVjdHVyZWRDbG9uZWAgKGFuIGVuZ2luZSBpbnZhcmlhbnQpLCBzbyB0aGUgdmFsdWVzIGFcbiAqIHJlY29yZCBob2xkcyBhcmUgdGhlIGtpbmRzIHRoZSBjbG9uZSBrZWVwcy4gVHdvIGxhd3MgbmVlZCB0aGUga2luZCwgYW5kIGJvdGggYXNrIGhlcmU6XG4gKlxuICogICAtIHdoYXQgY291bnRzIGFzIGEgQ0hBTkdFIChgbWVtb3J5L2VxdWFsaXR5LnRzIMK3IGRlZXBFcXVhbGApOiB0d28gdmFsdWVzIGFyZSBlcXVhbCB3aGVuIGEgcmVjb3JkXG4gKiAgICAgaG9sZHMgdGhlIHNhbWUgdGhpbmcgZm9yIGJvdGgsIGNvbXBhcmVkIGtpbmQgYnkga2luZC4gVW50aWwgOS40NC4yIG9ubHkgRGF0ZSwgTWFwIGFuZCBTZXQgaGFkIGFcbiAqICAgICBraW5kOyBhIFJlZ0V4cCwgYW4gRXJyb3IsIGEgYm94ZWQgbnVtYmVyLCBhIGJ1ZmZlciwgYSBEYXRhVmlldyBvciBhIEJsb2Igd2FzIGNvbXBhcmVkIGFzIGFuXG4gKiAgICAgb2JqZWN0IHdpdGggbm8gb3duIGtleXMg4oCUIGVxdWFsIHRvIGFueSBvdGhlciBvZiBpdHMga2luZCDigJQgc28gcmVwbGFjaW5nIG9uZSBjb21taXR0ZWQgbm8gcm93XG4gKiAgICAgYW5kIGxpdmUgc3RhdGUga2VwdCB0aGUgb2xkIHZhbHVlO1xuICogICAtIHdoYXQgYSBzZXJ2ZWQgcmVjb3JkIG11c3QgQ09QWSAoYGNhcHR1cmUvZnJlZXplLnRzIMK3IGZyZWV6ZVJlY29yZGAgLyBgc2VydmVSZWNvcmRgKTpcbiAqICAgICBgT2JqZWN0LmZyZWV6ZWAgc2VhbHMgb25seSB0aGUga2luZHMgd2hvc2UgY29udGVudCBpcyB0aGVpciBvd24gcHJvcGVydGllcyAoe0BsaW5rIFNFQUxBQkxFfSkuXG4gKlxuICogQSBsZWFmOiBpbXBvcnRzIG5vdGhpbmcgKGBjYXB0dXJlL2AgaXMgTDAsIGJlbG93IGBtZW1vcnkvYCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGtpbmRPZihuZXcgRGF0ZSgwKSk7ICAgICAgICAgICAgICAgICAgICAvLyAnZGF0ZSdcbiAqIGtpbmRPZihuZXcgKGNsYXNzIFBvaW50IHsgeCA9IDEgfSkoKSk7ICAvLyAncGxhaW4nIOKAlCBpdHMgY2xvbmUgaXMgYSBwbGFpbiBvYmplY3RcbiAqIGtpbmRPZihuZXcgQmxvYihbJ2EnXSkpOyAgICAgICAgICAgICAgICAvLyAnb3BhcXVlJyDigJQgaXRzIGNsb25lIGtlZXBzIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdCByZWFkXG4gKiBTRUFMQUJMRS5kYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2Ug4oCUIHNldFRpbWUgd3JpdGVzIGEgc2xvdCBPYmplY3QuZnJlZXplIGNhbm5vdCByZWFjaFxuICogYGBgXG4gKi9cblxuLyoqIEV2ZXJ5IGtpbmQgYSByZWNvcmQgY2FuIGhvbGQuICovXG5leHBvcnQgdHlwZSBWYWx1ZUtpbmQgPVxuICAvKiogQW4gb2JqZWN0IHRoZSBjbG9uZSBrZWVwcyBhcyBpdHMgb3duIGVudW1lcmFibGUga2V5cyDigJQgYSBjbGFzcyBpbnN0YW5jZSBpbmNsdWRlZC4gKi9cbiAgfCAncGxhaW4nXG4gIHwgJ2FycmF5J1xuICB8ICdkYXRlJ1xuICB8ICdyZWdleHAnXG4gIHwgJ21hcCdcbiAgfCAnc2V0J1xuICB8ICdlcnJvcidcbiAgLyoqIEEgYm94ZWQgcHJpbWl0aXZlOiBgbmV3IE51bWJlcigxKWAsIGBuZXcgU3RyaW5nKCdhJylgLCBgbmV3IEJvb2xlYW4odHJ1ZSlgLCBgT2JqZWN0KDFuKWAuICovXG4gIHwgJ2JveGVkJ1xuICAvKiogQW4gYEFycmF5QnVmZmVyYCAoYSBgU2hhcmVkQXJyYXlCdWZmZXJgIHRvbzogc2hhcmVkIG1lbW9yeSBpcyBvdXQgb2YgY29udHJhY3QgZm9yIHN0YXRlKS4gKi9cbiAgfCAnYnVmZmVyJ1xuICAvKiogQSB0eXBlZCBhcnJheSBvciBhIGBEYXRhVmlld2AuICovXG4gIHwgJ3ZpZXcnXG4gIC8qKiBBbnkgb3RoZXIgb2JqZWN0IHRoZSBjbG9uZSBrZWVwcyBhcyBpdHNlbGYgKGEgQmxvYiwgYSBGaWxlLCBhIGBET01FeGNlcHRpb25gKTogY29udGVudCB1bnJlYWQgaGVyZS4gKi9cbiAgfCAnb3BhcXVlJztcblxuLyoqXG4gKiBEb2VzIGBPYmplY3QuZnJlZXplYCBzZWFsIGV2ZXJ5IHBhcnQgb2YgYSB2YWx1ZSBvZiB0aGlzIGtpbmQ/IFRydWUgb25seSB3aGVyZSB0aGUgY29udGVudCBpcyB0aGVcbiAqIHZhbHVlJ3Mgb3duIHByb3BlcnRpZXMgKG9yIGEgc2xvdCBub3RoaW5nIGNhbiB3cml0ZSkuIEEgYFJlY29yZGAsIHNvIGEgbmV3IGtpbmQgZG9lcyBub3QgY29tcGlsZVxuICogdW50aWwgaXQgaXMgZGVjaWRlZCBoZXJlLlxuICovXG5leHBvcnQgY29uc3QgU0VBTEFCTEU6IHsgcmVhZG9ubHkgW0sgaW4gVmFsdWVLaW5kXTogYm9vbGVhbiB9ID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5mcmVlemUoe1xuICBwbGFpbjogdHJ1ZSxcbiAgYXJyYXk6IHRydWUsXG4gIGJveGVkOiB0cnVlLFxuICBkYXRlOiBmYWxzZSwgLy8gc2V0VGltZSAmIGNvLiB3cml0ZSBpdHMgdGltZSB2YWx1ZVxuICByZWdleHA6IGZhbHNlLCAvLyBjb21waWxlKCkgcmV3cml0ZXMgc291cmNlIGFuZCBmbGFncywgZXZlbiBvbiBhIGZyb3plbiBvbmVcbiAgbWFwOiBmYWxzZSwgLy8gc2V0IC8gZGVsZXRlIC8gY2xlYXJcbiAgc2V0OiBmYWxzZSwgLy8gYWRkIC8gZGVsZXRlIC8gY2xlYXJcbiAgZXJyb3I6IGZhbHNlLCAvLyBWOCdzIG93biBgc3RhY2tgIGFjY2Vzc29yIHdyaXRlcyB0aHJvdWdoIGEgZnJvemVuIGVycm9yXG4gIGJ1ZmZlcjogZmFsc2UsIC8vIGl0cyBieXRlcywgdGhyb3VnaCBhbnkgdmlldzsgdHJhbnNmZXIoKSBkZXRhY2hlcyBpdFxuICB2aWV3OiBmYWxzZSwgLy8gaW5kZXggd3JpdGVzLCBzZXQsIGZpbGwsIHNvcnQsIGNvcHlXaXRoaW4g4oCmXG4gIG9wYXF1ZTogZmFsc2UsIC8vIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdCByZWFkIOKAlCBuZXZlciBhc3N1bWVkIHNlYWxlZFxufSk7XG5cbi8qKiBXaGF0IGEgYnJhbmQgY2hlY2sgcmV0dXJucywgd2hlbiBpdCBkb2VzIG5vdCB0aHJvdywgZm9yIGEgdmFsdWUgd2l0aG91dCB0aGUgc2xvdC4gKi9cbmNvbnN0IE5PVF9CUkFORCA9IFN5bWJvbCgnbm90IHRoZSBicmFuZCcpO1xuXG4vKipcbiAqIEEgYnVpbHQtaW4ga2luZCBpcyBrbm93biBieSBpdHMgQlJBTkQg4oCUIGFuIGludGVybmFsIHNsb3Qgb25seSB0aGUgcmVhbCB0aGluZyBoYXMg4oCUIG5ldmVyIGJ5IGl0c1xuICogcHJvdG90eXBlOiBgT2JqZWN0LmNyZWF0ZShSZWdFeHAucHJvdG90eXBlKWAgaXMgbm90IGEgUmVnRXhwIChpdHMgY2xvbmUgaXMgYHt9YCksIGFuZCByZWFkaW5nXG4gKiBgc291cmNlYCBmcm9tIGl0IHRocm93cy4gVGhlIGNhbmRpZGF0ZSBjb21lcyBmcm9tIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCAob25lIGNhbGwpLCB0aGVuIE9ORVxuICogYnJhbmQtY2hlY2tlZCByZWFkIGNvbmZpcm1zIGl0OyBhIHZhbHVlIHRoYXQgZmFpbHMgaXQgaXMgY2xhc3NpZmllZCBieSBpdHMgY2xvbmUgaW5zdGVhZC5cbiAqL1xuY29uc3QgQlJBTkRTOiBSZWFkb25seU1hcDxzdHJpbmcsIHsgcmVhZG9ubHkga2luZDogVmFsdWVLaW5kOyByZWFkb25seSBjaGVjazogKHZhbHVlOiBvYmplY3QpID0+IHVua25vd24gfT4gPVxuICAvKiBAX19QVVJFX18gKi8gYnJhbmRUYWJsZSgpO1xuXG5mdW5jdGlvbiBicmFuZFRhYmxlKCk6IE1hcDxzdHJpbmcsIHsga2luZDogVmFsdWVLaW5kOyBjaGVjazogKHZhbHVlOiBvYmplY3QpID0+IHVua25vd24gfT4ge1xuICBjb25zdCBnZXR0ZXIgPSAocHJvdG86IG9iamVjdCB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiAoKHZhbHVlOiBvYmplY3QpID0+IHVua25vd24pIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBnZXQgPSBwcm90byAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBrZXkpPy5nZXQ7XG4gICAgcmV0dXJuIGdldCA/ICh2YWx1ZSkgPT4gZ2V0LmNhbGwodmFsdWUpIDogdW5kZWZpbmVkO1xuICB9O1xuICBjb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgeyBwcm90b3R5cGU/OiBvYmplY3QgfSB8IHVuZGVmaW5lZD47XG4gIGNvbnN0IGlzRXJyb3IgPSAoRXJyb3IgYXMgdW5rbm93biBhcyB7IGlzRXJyb3I/OiAodmFsdWU6IHVua25vd24pID0+IGJvb2xlYW4gfSkuaXNFcnJvcjtcbiAgY29uc3Qgcm93czogQXJyYXk8W3N0cmluZywgVmFsdWVLaW5kLCAoKHZhbHVlOiBvYmplY3QpID0+IHVua25vd24pIHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgWydEYXRlJywgJ2RhdGUnLCAodmFsdWUpID0+IERhdGUucHJvdG90eXBlLmdldFRpbWUuY2FsbCh2YWx1ZSldLFxuICAgIFsnUmVnRXhwJywgJ3JlZ2V4cCcsIGdldHRlcihSZWdFeHAucHJvdG90eXBlLCAnc291cmNlJyldLFxuICAgIFsnTWFwJywgJ21hcCcsIGdldHRlcihNYXAucHJvdG90eXBlLCAnc2l6ZScpXSxcbiAgICBbJ1NldCcsICdzZXQnLCBnZXR0ZXIoU2V0LnByb3RvdHlwZSwgJ3NpemUnKV0sXG4gICAgLy8gQW4gZXJyb3IncyB0YWcgY29tZXMgZnJvbSBpdHMgb3duIFtbRXJyb3JEYXRhXV0gc2xvdDogbm8gRXJyb3IgcHJvdG90eXBlIGNhcnJpZXMgYSB0b1N0cmluZ1RhZy4gV2hlcmVcbiAgICAvLyB0aGUgYnJhbmQgY2hlY2sgYEVycm9yLmlzRXJyb3JgIGlzIG1pc3NpbmcgKE5vZGUgMjIpLCBhIHRhZyBhIGdldHRlciBzdXBwbGllcyBpcyB0aGVyZWZvcmUgYSBzcG9vZi5cbiAgICBbJ0Vycm9yJywgJ2Vycm9yJywgKHZhbHVlKSA9PiAoKGlzRXJyb3IgPyBpc0Vycm9yKHZhbHVlKSA6IHVudGFnZ2VkKHZhbHVlKSkgPyB0cnVlIDogTk9UX0JSQU5EKV0sXG4gICAgWydOdW1iZXInLCAnYm94ZWQnLCAodmFsdWUpID0+IE51bWJlci5wcm90b3R5cGUudmFsdWVPZi5jYWxsKHZhbHVlKV0sXG4gICAgWydTdHJpbmcnLCAnYm94ZWQnLCAodmFsdWUpID0+IFN0cmluZy5wcm90b3R5cGUudmFsdWVPZi5jYWxsKHZhbHVlKV0sXG4gICAgWydCb29sZWFuJywgJ2JveGVkJywgKHZhbHVlKSA9PiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwodmFsdWUpXSxcbiAgICBbJ0JpZ0ludCcsICdib3hlZCcsICh2YWx1ZSkgPT4gKGdsb2JhbC5CaWdJbnQ/LnByb3RvdHlwZSBhcyB7IHZhbHVlT2YoKTogdW5rbm93biB9KS52YWx1ZU9mLmNhbGwodmFsdWUpXSxcbiAgICBbJ0FycmF5QnVmZmVyJywgJ2J1ZmZlcicsIGdldHRlcihBcnJheUJ1ZmZlci5wcm90b3R5cGUsICdieXRlTGVuZ3RoJyldLFxuICAgIFsnU2hhcmVkQXJyYXlCdWZmZXInLCAnYnVmZmVyJywgZ2V0dGVyKGdsb2JhbC5TaGFyZWRBcnJheUJ1ZmZlcj8ucHJvdG90eXBlLCAnYnl0ZUxlbmd0aCcpXSxcbiAgXTtcbiAgY29uc3QgdGFibGUgPSBuZXcgTWFwPHN0cmluZywgeyBraW5kOiBWYWx1ZUtpbmQ7IGNoZWNrOiAodmFsdWU6IG9iamVjdCkgPT4gdW5rbm93biB9PigpO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBraW5kLCBjaGVja10gb2Ygcm93cykgaWYgKGNoZWNrKSB0YWJsZS5zZXQoYFtvYmplY3QgJHtuYW1lfV1gLCB7IGtpbmQsIGNoZWNrIH0pO1xuICByZXR1cm4gdGFibGU7XG59XG5cbi8qKiBObyBgU3ltYm9sLnRvU3RyaW5nVGFnYCBvbiB0aGUgdmFsdWUgb3IgaXRzIHByb3RvdHlwZXM6IGl0cyB0YWcgY2FtZSBmcm9tIGEgc2xvdC4gKi9cbmZ1bmN0aW9uIHVudGFnZ2VkKHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICh2YWx1ZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIGtpbmQgb2YgYSBidWlsdC1pbiB2YWx1ZSwgYnkgaXRzIGJyYW5kIOKAlCBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmcgZWxzZS4gKi9cbmZ1bmN0aW9uIGJ1aWx0aW5LaW5kKHZhbHVlOiBvYmplY3QpOiBWYWx1ZUtpbmQgfCB1bmRlZmluZWQge1xuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkgcmV0dXJuICd2aWV3JzsgLy8gYSBicmFuZCBjaGVjayBvZiBpdHMgb3duOiBbW1ZpZXdlZEFycmF5QnVmZmVyXV1cbiAgY29uc3QgYnJhbmQgPSBCUkFORFMuZ2V0KE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkpO1xuICBpZiAoYnJhbmQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYnJhbmQuY2hlY2sodmFsdWUpID09PSBOT1RfQlJBTkQgPyB1bmRlZmluZWQgOiBicmFuZC5raW5kO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyB0aGUgcHJvdG90eXBlIHdpdGhvdXQgdGhlIHNsb3RcbiAgfVxufVxuXG4vKiogUHJvdG90eXBlcyBjbGFzc2lmaWVkIGJ5IGEgcHJvYmUgY2xvbmUgb2YgdGhlaXIgZmlyc3QgaW5zdGFuY2UgKHNlZSB7QGxpbmsga2luZE9mfSkuICovXG5jb25zdCBQUk9CRUQgPSBuZXcgV2Vha01hcDxvYmplY3QsIFZhbHVlS2luZD4oKTtcblxuLyoqXG4gKiBUaGUga2luZCBvZiBhbiBvYmplY3QsIGFzIGEgcmVjb3JkIGhvbGRzIGl0LiBBIHBsYWluIG9iamVjdCBvciBhbiBhcnJheSDigJQgdGhlIGJ1bGsgb2Ygc3RhdGUg4oCUXG4gKiBjb3N0cyBvbmUgYEFycmF5LmlzQXJyYXlgIGFuZCBvbmUgYGdldFByb3RvdHlwZU9mYDsgYSBidWlsdC1pbiBhIHRhZyBhbmQgb25lIGJyYW5kLWNoZWNrZWQgcmVhZC5cbiAqIFRoZSBicmFuZCBpcyB0aGUgdmFsdWUncyBvd24gc2xvdCwgc28gYSBzdWJjbGFzcyAoYSBgTWFwYCBzdWJjbGFzcyBpcyBhIGAnbWFwJ2AsIE5vZGUncyBgQnVmZmVyYCBhXG4gKiBgJ3ZpZXcnYCkgYW5kIGEgdmFsdWUgZnJvbSBhbm90aGVyIHJlYWxtIGxhbmQgb24gdGhlaXIga2luZC5cbiAqXG4gKiBBbnkgb3RoZXIgb2JqZWN0IGlzIGNsYXNzaWZpZWQgYnkgV0hBVCBJVFMgQ0xPTkUgSVMsIG9uY2UgcGVyIHByb3RvdHlwZTogYSBjbGFzcyBpbnN0YW5jZSBjb21lc1xuICogYmFjayBhIHBsYWluIG9iamVjdCAoYCdwbGFpbidgKSwgYSBmYWtlIGJ1aWx0LWluIChgT2JqZWN0LmNyZWF0ZShEYXRlLnByb3RvdHlwZSlgLCBvciBhIGNsYXNzIHdob3NlXG4gKiBgU3ltYm9sLnRvU3RyaW5nVGFnYCBzYXlzIGAnRGF0ZSdgKSBjb21lcyBiYWNrIGB7fWAgKGAncGxhaW4nYCksIGFuZCBhIGhvc3Qgb2JqZWN0IGNvbWVzIGJhY2sgYXNcbiAqIGl0c2VsZiAoYCdvcGFxdWUnYCkuIEEgcHJvdG90eXBlIHdob3NlIGluc3RhbmNlIHRoZSBjbG9uZSByZWZ1c2VzIGlzIGAnb3BhcXVlJ2Ag4oCUIHJlbWVtYmVyZWQgdG9vOlxuICogaXQgY2Fubm90IGJlIGhlbGQsIGFuZCBpdHMgY29tbWl0IHdpbGwgcmVmdXNlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24ga2luZE9mKHZhbHVlOiBvYmplY3QpOiBWYWx1ZUtpbmQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiAnYXJyYXknO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbCkgcmV0dXJuICdwbGFpbic7XG4gIHJldHVybiBidWlsdGluS2luZCh2YWx1ZSkgPz8gUFJPQkVELmdldChwcm90bykgPz8gcHJvYmUodmFsdWUsIHByb3RvKTtcbn1cblxuZnVuY3Rpb24gcHJvYmUodmFsdWU6IG9iamVjdCwgcHJvdG86IG9iamVjdCk6IFZhbHVlS2luZCB7XG4gIGxldCBraW5kOiBWYWx1ZUtpbmQ7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xvbmU6IHVua25vd24gPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICAgIGtpbmQgPSBjbG9uZSA9PT0gbnVsbCB8fCB0eXBlb2YgY2xvbmUgIT09ICdvYmplY3QnID8gJ29wYXF1ZScgOiBraW5kT2ZDbG9uZShjbG9uZSk7XG4gIH0gY2F0Y2gge1xuICAgIGtpbmQgPSAnb3BhcXVlJztcbiAgfVxuICBQUk9CRUQuc2V0KHByb3RvLCBraW5kKTtcbiAgcmV0dXJuIGtpbmQ7XG59XG5cbi8qKiBUaGUga2luZCBvZiBhIENMT05FIOKAlCBhIHZhbHVlIG9mIHRoaXMgcmVhbG0sIHNvIGl0cyBwcm90b3R5cGUgb3IgaXRzIGJyYW5kIGRlY2lkZXMgaXQuICovXG5mdW5jdGlvbiBraW5kT2ZDbG9uZShjbG9uZTogb2JqZWN0KTogVmFsdWVLaW5kIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2xvbmUpKSByZXR1cm4gJ2FycmF5JztcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xvbmUpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiAncGxhaW4nO1xuICByZXR1cm4gYnVpbHRpbktpbmQoY2xvbmUpID8/ICdvcGFxdWUnO1xufVxuIl19