upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlog <log@invalid>2026-10-09 04:22:14 +0000
committerlog <log@invalid>2026-10-09 04:22:14 +0000
commit5eb0172fa014c3d55c57358224387b7de20dafe3 (patch)
tree34e4ded4b5db2f9b470f0a4da0010c1fdb1ea904
parent9a697b4c154a83cc1f22822667cc2d1ccfcda875 (diff)
size 96095
-rw-r--r--reveal/v5-000012/check.py319
-rw-r--r--reveal/v5-000012/manifest.txt21
-rw-r--r--reveal/v5-000012/manifest.txt.otsbin0 -> 654 bytes
-rw-r--r--reveal/v5-000012/r33533812.ctbin0 -> 19533 bytes
-rw-r--r--reveal/v5-000012/r33533812.nostr.json1
-rw-r--r--reveal/v5-000012/r33533812.tlock11
-rw-r--r--reveal/v5-000012/r33562612.ctbin0 -> 1017 bytes
-rw-r--r--reveal/v5-000012/r33562612.nostr.json1
-rw-r--r--reveal/v5-000012/r33562612.tlock11
-rw-r--r--reveal/v5-000012/r33620212.ctbin0 -> 1756 bytes
-rw-r--r--reveal/v5-000012/r33620212.nostr.json1
-rw-r--r--reveal/v5-000012/r33620212.tlock11
-rw-r--r--reveal/v5-000012/r33649012.ctbin0 -> 6483 bytes
-rw-r--r--reveal/v5-000012/r33649012.nostr.json1
-rw-r--r--reveal/v5-000012/r33649012.tlock11
-rw-r--r--reveal/v5-000012/r33735412.ctbin0 -> 1730 bytes
-rw-r--r--reveal/v5-000012/r33735412.nostr.json1
-rw-r--r--reveal/v5-000012/r33735412.tlock11
-rw-r--r--reveal/v5-000012/r33793012.ctbin0 -> 2050 bytes
-rw-r--r--reveal/v5-000012/r33793012.nostr.json1
-rw-r--r--reveal/v5-000012/r33793012.tlock11
-rw-r--r--reveal/v5-000012/r34685812.ctbin0 -> 20211 bytes
-rw-r--r--reveal/v5-000012/r34685812.nostr.json1
-rw-r--r--reveal/v5-000012/r34685812.tlock11
-rw-r--r--reveal/v5-000012/r34714612.ctbin0 -> 999 bytes
-rw-r--r--reveal/v5-000012/r34714612.nostr.json1
-rw-r--r--reveal/v5-000012/r34714612.tlock11
-rw-r--r--reveal/v5-000012/r34772212.ctbin0 -> 1761 bytes
-rw-r--r--reveal/v5-000012/r34772212.nostr.json1
-rw-r--r--reveal/v5-000012/r34772212.tlock11
-rw-r--r--reveal/v5-000012/r34801012.ctbin0 -> 6357 bytes
-rw-r--r--reveal/v5-000012/r34801012.nostr.json1
-rw-r--r--reveal/v5-000012/r34801012.tlock11
-rw-r--r--reveal/v5-000012/r34887412.ctbin0 -> 1739 bytes
-rw-r--r--reveal/v5-000012/r34887412.nostr.json1
-rw-r--r--reveal/v5-000012/r34887412.tlock11
-rw-r--r--reveal/v5-000012/r34945012.ctbin0 -> 2094 bytes
-rw-r--r--reveal/v5-000012/r34945012.nostr.json1
-rw-r--r--reveal/v5-000012/r34945012.tlock11
-rw-r--r--reveal/v5-000012/r35837812.ctbin0 -> 1027 bytes
-rw-r--r--reveal/v5-000012/r35837812.nostr.json1
-rw-r--r--reveal/v5-000012/r35837812.tlock11
-rw-r--r--reveal/v5-000012/r35866612.ctbin0 -> 669 bytes
-rw-r--r--reveal/v5-000012/r35866612.nostr.json1
-rw-r--r--reveal/v5-000012/r35866612.tlock11
-rw-r--r--reveal/v5-000012/r37018612.ctbin0 -> 666 bytes
-rw-r--r--reveal/v5-000012/r37018612.nostr.json1
-rw-r--r--reveal/v5-000012/r37018612.tlock11
-rw-r--r--reveal/v5-000012/seal.json43
49 files changed, 563 insertions, 0 deletions
diff --git a/reveal/v5-000012/check.py b/reveal/v5-000012/check.py
new file mode 100644
index 0000000..7f86b8d
--- /dev/null
+++ b/reveal/v5-000012/check.py
@@ -0,0 +1,319 @@
1#!/usr/bin/env python3
2"""
3Check Echo's self-revealing ledger seals (`sha256-live-v5`) without trusting Echo.
4
5 python3 check.py SEAL_DIR [SEAL_DIR ...] [--tle PATH] [--offline]
6
7Needs Python 3.11+, the `cryptography` package (ChaCha20-Poly1305) and drand's `tle` binary
8(`go install github.com/drand/tlock/cmd/tle@v1.2.0`). It imports nothing of Echo's: a checker that needs the thing it
9checks is not a checker, which is why it is copied, whole, into every seal directory.
10
11Each SEAL_DIR is one seal: `manifest.txt` (the exact text the seal's digest is the sha256 of), `seal.json`, and per
12reveal group `r<ROUND>.tlock` (the group's key, time-locked to that drand round) and `r<ROUND>.ct` (the group,
13encrypted under that key), and, once the group has been revealed, `r<ROUND>.held.json` (how many of its withheld
14lines Echo publishes no salt for, and why) and any number of `r<ROUND>.salts.<N>.json`: each the salts of withheld
15lines Echo decided to open and had not erased, each with its line. `manifest.txt.ots`, when present, is an
16OpenTimestamps proof over the manifest: `ots verify manifest.txt.ots` checks it against Bitcoin.
17
18What it checks, from the files alone and the beacon:
19 1. the manifest hashes to the seal's digest, and each seal names the one before it (when several are given);
20 2. each group's ciphertext and locked key hash to what the manifest commits, and the key is locked to the
21 manifest's round of the manifest's chain;
22 3. for every group whose round the beacon has signed: the round's signature as each relay serves it, the key
23 unlocked with it, the group decrypted, its bytes hashed to the committed digest, its lines and withheld lines
24 counted against the committed counts, its lines in id order, and every line's reveal day recomputed from its
25 own settling instant under the seal's named rule (`utc-day-after-close`: the first 00:00 UTC after
26 `settles_at`, else after the deadline);
27 4. for every opened group with releases: each names this seal, round and group and its own number; each released
28 salt and line hash to the withheld line's committed hash; no line is settled twice; and a hold, where there is
29 one, names the group and counts no more lines than are withheld;
30 5. once every group of every seal from the first is open and every withheld line released: the union of their v4
31 lines, sorted by id, rehashes to the v4 digest the last seal follows, so no sealed forecast was left out of a
32 reveal. Where a withheld line has no released salt (held, erased, or not yet released) that digest cannot be
33 rebuilt, and this says so and why: what is checked then is only that every forecast the v4 seal covers is in a
34 group, counted. A withheld line is never called verified.
35
36A group whose round is not yet signed, or whose withheld lines have no release yet, is reported as pending or held,
37not as a failure. Exit 0 when everything checkable passed, 1 when anything did not match.
38"""
39from __future__ import annotations
40
41import argparse
42import base64
43import hashlib
44import json
45import re
46import subprocess
47import sys
48import urllib.request
49import zlib
50from datetime import datetime, timedelta, timezone
51from pathlib import Path
52
53
54def sha(b: bytes) -> str:
55 return hashlib.sha256(b).hexdigest()
56
57
58def parse_manifest(text: str) -> dict:
59 lines = text.split("\n")
60 if lines[0] != "sha256-live-v5":
61 raise ValueError(f"not a v5 manifest: {lines[0]!r}")
62 m = {"groups": []}
63 for ln in lines[1:]:
64 word, _, rest = ln.partition(" ")
65 if word == "prev":
66 m["prev"] = None if rest == "-" else rest
67 elif word == "follows":
68 seq, digest, n = rest.split(" ")
69 m["follows"] = {"seq": int(seq), "digest": digest, "n": int(n)}
70 elif word == "covers":
71 m["covers"] = rest.split(" ")
72 elif word == "variant":
73 m["variant"] = json.loads(rest)
74 elif word == "counts":
75 m["n"], m["n_withheld"], m["n_groups"] = map(int, rest.split(" "))
76 elif word == "group":
77 r, at, n, w, digest, ct, key, late = rest.split(" ")
78 m["groups"].append({"round": int(r), "reveal_at": at, "n": int(n), "n_withheld": int(w),
79 "digest": digest, "ct": ct, "key": key, "late": late == "1"})
80 else:
81 raise ValueError(f"unknown manifest line {ln!r}")
82 return m
83
84
85def stanza(locked: str) -> tuple[int, str] | None:
86 body = "".join(ln for ln in locked.strip().splitlines() if not ln.startswith("-----"))
87 m = re.search(rb"-> tlock (\d+) ([0-9a-f]{64})", base64.b64decode(body))
88 return (int(m.group(1)), m.group(2).decode()) if m else None
89
90
91def round_at(beacon: dict, at: datetime) -> int:
92 t = at.timestamp()
93 whole = int(t) + (t != int(t))
94 if whole <= beacon["genesis_time"]:
95 return 1
96 return -(-(whole - beacon["genesis_time"]) // beacon["period"]) + 1
97
98
99def reveal_day(closes: datetime) -> datetime:
100 d = closes.astimezone(timezone.utc).date() + timedelta(days=1)
101 return datetime(d.year, d.month, d.day, tzinfo=timezone.utc)
102
103
104def parse_line(ln: str) -> dict:
105 """One line: `id|issued_at|deadline|forecaster|p|settlement|anchor<TAB>open:<v4>` or `...<TAB>withheld:<hex>`."""
106 numeric, tab, text = ln.partition("\t")
107 if not tab:
108 raise ValueError("a line without its text layer")
109 fid, issued, deadline, forecaster, p, rest = numeric.split("|", 5)
110 dec = json.JSONDecoder()
111 settle, end = dec.raw_decode(rest)
112 if rest[end] != "|":
113 raise ValueError("settlement not followed by the anchor")
114 anchor, end2 = dec.raw_decode(rest, end + 1)
115 if end2 != len(rest):
116 raise ValueError("trailing bytes after the anchor")
117 out = {"id": int(fid), "issued_at": issued, "deadline": deadline, "forecaster": forecaster, "p": float(p),
118 "settlement": settle, "anchor": anchor}
119 if text.startswith("open:"):
120 out["v4"] = text[5:]
121 if not out["v4"].startswith(f"{fid}|"):
122 raise ValueError("the text layer is another forecast's line")
123 elif re.fullmatch(r"withheld:[0-9a-f]{64}", text):
124 out["withheld"] = text[9:]
125 else:
126 raise ValueError(f"unknown text layer {text[:20]!r}")
127 return out
128
129
130def beacon_round(beacon: dict, rnd: int) -> dict:
131 """What each relay serves for the round: its signature, or why there is none."""
132 out = {}
133 for relay in beacon["relays"]:
134 url = f"{relay.rstrip('/')}/{beacon['chain_hash']}/public/{rnd}"
135 try:
136 with urllib.request.urlopen(url, timeout=20) as r: # noqa: S310 — the seal's own relays
137 out[relay] = json.loads(r.read()).get("signature")
138 except Exception as exc: # noqa: BLE001 — report, go on
139 out[relay] = f"unavailable ({type(exc).__name__})"
140 return out
141
142
143def unlock(tle: str, beacon: dict, locked: str) -> bytes | None:
144 """The key, or None while the round is unsigned. Each relay is tried in turn."""
145 errors = []
146 for relay in beacon["relays"]:
147 r = subprocess.run([tle, "-d", "-n", relay.rstrip("/") + "/", "-c", beacon["chain_hash"]],
148 input=locked.encode(), capture_output=True, timeout=120, check=False)
149 if r.returncode == 0:
150 return r.stdout
151 if b"too early" in r.stderr:
152 return None
153 errors.append(f"{relay}: {r.stderr.decode(errors='replace').strip()[-160:]}")
154 raise RuntimeError("; ".join(errors))
155
156
157def release(d: Path, seal_digest: str, g: dict, lines: list[dict], say) -> tuple[dict[int, str], int, str | None]:
158 """An opened group's releases and hold, checked against the group: (id -> the v4 line each released salt opens,
159 how many withheld lines were opened and found erased, and the hold's reason where Echo published one)."""
160 r = g["round"]
161 shut = {x["id"]: x["withheld"] for x in lines if "withheld" in x}
162 out, erased, seen, bad = {}, set(), set(), []
163 files = sorted(d.glob(f"r{r}.salts.*.json"), key=lambda p: int(p.name.split(".")[-2]))
164 for k, path in enumerate(files):
165 rel = json.loads(path.read_text())
166 say(rel.get("format") == "echo-reveal-salts/1" and rel.get("seal") == seal_digest
167 and rel.get("round") == r and rel.get("group") == g["digest"] and rel.get("n") == k
168 and path.name == f"r{r}.salts.{k}.json",
169 f"round {r}: release {k} names this seal, round and group, and follows the one before")
170 for x in rel.get("released", []):
171 i, line = x["id"], x["line"]
172 opens = (i in shut and i not in seen and line.startswith(f"{i}|")
173 and sha(bytes.fromhex(x["salt"]) + line.encode()) == shut[i])
174 if opens:
175 out[i] = line
176 else:
177 bad.append(i)
178 seen.add(i)
179 for i in rel.get("erased", []):
180 if i not in shut or i in seen:
181 bad.append(i)
182 erased.add(i)
183 seen.add(i)
184 if files:
185 say(not bad, f"round {r}: {len(out)} released lines open their committed hashes, {len(erased)} opened lines "
186 f"found erased, none settled twice" + (f" ({len(bad)} do not, e.g. {bad[:3]})" if bad else ""))
187 why = None
188 hold = d / f"r{r}.held.json"
189 if hold.exists():
190 h = json.loads(hold.read_text())
191 say(h.get("format") == "echo-reveal-held/1" and h.get("seal") == seal_digest and h.get("round") == r
192 and h.get("group") == g["digest"] and 0 <= h.get("held", -1) <= len(shut),
193 f"round {r}: the hold names this seal, round and group, and counts at most its withheld lines")
194 why = str(h.get("why") or "no reason given")
195 left = len(shut) - len(out) - len(erased)
196 if left:
197 print(f" .... round {r}: {left} withheld lines have no released salt: counted, not rehashed"
198 + (f" (Echo publishes none: {why})" if why else " (no release or hold published yet)"))
199 return out, len(erased), why
200
201
202def check(dirs: list[Path], tle: str = "tle", offline: bool = False) -> int:
203 from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
204
205 failed, pending, withheld, held, erased, union = 0, 0, 0, 0, 0, {}
206 reasons: set[str] = set()
207 first_prev = "unset"
208
209 def say(ok: bool, what: str) -> None:
210 nonlocal failed
211 failed += not ok
212 print(f" {'PASS' if ok else 'FAIL'} {what}")
213
214 prev_digest = None
215 seals = []
216 for d in dirs:
217 text = (d / "manifest.txt").read_bytes()
218 row = json.loads((d / "seal.json").read_text())
219 seals.append((d, text, row, parse_manifest(text.decode())))
220 seals.sort(key=lambda s: s[2]["seq"])
221 last = None
222 for i, (d, text, row, m) in enumerate(seals):
223 print(f"v5 seal {row['seq']}: {m['n']} forecasts in {m['n_groups']} reveal groups, {m['n_withheld']} withheld, "
224 f"follows v4 seal {m['follows']['seq']}")
225 say(sha(text) == row["digest"], f"sha256(manifest.txt) is the seal's digest {row['digest'][:16]}…")
226 say(len(m["groups"]) == m["n_groups"] and sum(g["n"] for g in m["groups"]) == m["n"]
227 and sum(g["n_withheld"] for g in m["groups"]) == m["n_withheld"], "the manifest's counts add up")
228 if i == 0:
229 first_prev = m["prev"]
230 else:
231 say(m["prev"] == prev_digest, "it names the seal before it")
232 prev_digest, last = row["digest"], m
233 b = m["variant"]["beacon"]
234 for g in m["groups"]:
235 r = g["round"]
236 ct, locked = (d / f"r{r}.ct").read_bytes(), (d / f"r{r}.tlock").read_text()
237 say(sha(ct) == g["ct"] and sha(locked.encode()) == g["key"],
238 f"round {r}: the ciphertext and the locked key are the committed ones")
239 say(stanza(locked) == (r, b["chain_hash"]), f"round {r}: the key is locked to that round of that chain")
240 say(round_at(b, datetime.fromisoformat(g["reveal_at"])) == r, f"round {r} is signed at {g['reveal_at']}")
241 if not offline:
242 sigs = beacon_round(b, r)
243 good = {s for s in sigs.values() if s and not s.startswith("unavailable")}
244 print(f" .... round {r} signature from {len(sigs)} relays: "
245 + ("not yet signed" if not good else f"{len(good)} distinct: {min(good)[:24]}…"))
246 if len(good) > 1:
247 say(False, f"round {r}: relays disagree on its signature")
248 key = unlock(tle, b, locked)
249 if key is None:
250 pending += 1
251 print(f" .... round {r} ({g['reveal_at']}) not yet signed: {g['n']} forecasts stay locked")
252 continue
253 try:
254 plain = zlib.decompress(ChaCha20Poly1305(key).decrypt(b"\x00" * 12, ct, None))
255 except Exception as exc: # noqa: BLE001 — a finding, not a crash
256 say(False, f"round {r}: the ciphertext does not open under its key ({type(exc).__name__})")
257 continue
258 say(sha(plain) == g["digest"], f"round {r}: the opened group hashes to its committed digest")
259 lines = [parse_line(ln) for ln in plain.decode().split("\n")]
260 ids = [x["id"] for x in lines]
261 say(len(lines) == g["n"] and sum("withheld" in x for x in lines) == g["n_withheld"],
262 f"round {r}: {len(lines)} lines, {g['n_withheld']} withheld, as committed")
263 say(ids == sorted(set(ids)), f"round {r}: lines in id order, none twice")
264 due = datetime.fromisoformat(g["reveal_at"])
265 if m["variant"].get("reveal") == "utc-day-after-close":
266 wrong = [x["id"] for x in lines if reveal_day(datetime.fromisoformat(
267 (x["settlement"] or {}).get("settles_at") or x["deadline"])) != due]
268 say(not wrong, f"round {r}: every line belongs to this reveal day"
269 + (f" ({len(wrong)} do not, e.g. {wrong[:3]})" if wrong else ""))
270 else:
271 print(f" .... round {r}: reveal rule {m['variant'].get('reveal')!r} is not one this checker "
272 "recomputes; which lines belong to the day is unchecked")
273 opened, gone, why = release(d, row["digest"], g, lines, say)
274 for x in lines:
275 if x["id"] in union:
276 say(False, f"forecast {x['id']} is in two groups")
277 union[x["id"]] = x.get("v4") or opened.get(x["id"])
278 shut = sum(1 for x in lines if "withheld" in x and x["id"] not in opened) - gone
279 erased += gone
280 if why is None:
281 withheld += shut
282 else:
283 held += shut
284 reasons.add(why)
285 if last is not None:
286 if first_prev is not None:
287 print(" .... completeness: the first seal given is not the chain's first; give every seal from it")
288 elif pending:
289 print(f" .... completeness: {pending} groups still locked; it is checkable once all have opened")
290 elif withheld or held or erased:
291 told = [f"{withheld} withheld lines not yet released"] if withheld else []
292 told += ([f"{held} withheld lines held, for which Echo publishes no salt ({'; '.join(sorted(reasons))})"]
293 if held else [])
294 told += [f"{erased} erased stay hashes"] if erased else []
295 print(f" .... completeness: {', '.join(told)}: those lines can be counted but not rehashed, so the v4 "
296 f"lines cannot all be rebuilt and the v4 digest is NOT checked; {len(union)} forecasts against "
297 f"the v4 seal's {last['follows']['n']}")
298 say(len(union) == last["follows"]["n"], "every forecast the v4 seal covers is in a group, counted")
299 else:
300 got = sha("\n".join(union[k] for k in sorted(union)).encode())
301 say(got == last["follows"]["digest"] and len(union) == last["follows"]["n"],
302 f"the union of {len(union)} lines rehashes to v4 seal {last['follows']['seq']}'s digest")
303 print("\nNOT VERIFIED" if failed else f"\nVERIFIED{f' ({pending} groups not yet revealed)' if pending else ''}")
304 return 1 if failed else 0
305
306
307def main(argv: list[str]) -> int:
308 ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
309 ap.add_argument("dirs", nargs="*", default=[str(Path(__file__).resolve().parent)],
310 help="seal directories, any order (default: the one this script sits in)")
311 ap.add_argument("--tle", default="tle", help="the tle binary that unlocks a key once its round is signed")
312 ap.add_argument("--offline", action="store_true",
313 help="do not fetch each round's signature from the relays for display; tle still asks them")
314 args = ap.parse_args(argv)
315 return check([Path(d) for d in args.dirs], tle=args.tle, offline=args.offline)
316
317
318if __name__ == "__main__":
319 raise SystemExit(main(sys.argv[1:]))
diff --git a/reveal/v5-000012/manifest.txt b/reveal/v5-000012/manifest.txt
new file mode 100644
index 0000000..4fd141d
--- /dev/null
+++ b/reveal/v5-000012/manifest.txt
@@ -0,0 +1,21 @@
1sha256-live-v5
2prev aecbc94f76fab78030adf1714ed7145e7b4424b9abcf620d6fe047aaf058c5c9
3follows 42 669cee27a9520024a88572f2b03084805e58a44c86e789ae1a459ad6556154c7 51118
4covers 2026-10-08T22:30:20.258717Z 2026-10-09T04:21:12.160694Z
5variant {"beacon":{"chain_hash":"52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971","genesis_time":1692803367,"period":3,"relays":["https://api.drand.sh","https://api2.drand.sh","https://api3.drand.sh","https://drand.cloudflare.com"],"scheme":"bls-unchained-g1-rfc9380"},"cipher":"chacha20poly1305-zlib6-nonce0","gate":{"default":"withheld: a kept salt can be released later; an opened text can never be withdrawn","opened":"none","why":"no decision by Echo yet"},"line":"numeric<TAB>open:<v4 line> | numeric<TAB>withheld:sha256(salt||v4 line)","reveal":"utc-day-after-close","salts":"key ring: one content a seal, one part a line","tool":{"name":"tle","sha256":"69157d8c14a1d390d1b7744946288f83d4b10748471d5447f9abb77a5902c541","version":"tlock v1.2.0 -- github.com/drand/tlock"}}
6counts 1113 1113 15
7group 33533812 2026-10-31T00:00:00.000000Z 342 342 f78a72f35210d49498513f3987ab90902b5123d04b8381cc04f99f653e5119ad 42c20bc357be967a1c65d388b4ef0f84fe8fb29ec468ba13ffd8114fc6532153 30ae75f6d498353341c65896ee047a8bd202f353360442e99c29fe26a5510f34 0
8group 33562612 2026-11-01T00:00:00.000000Z 12 12 32b8de38aebd053c773897a9f1020c1c19ae080894c2067c70191f90546d2a94 5e6427ae5b5ca61faa6909cbe301e05979d5b2ef5c3b27ba72e4e1416f580b73 d71527beb7133ef9ef6cc677055049f86f5b05652157350559c4e871ac44c993 0
9group 33620212 2026-11-03T00:00:00.000000Z 24 24 2972b261b7e6b8b1cf8d32f64f1d06796331666fe0e7284287e6d833d150346a 6968f89939333b8e54362a7a1155778fdd539fb99a6fe544d5fc439f576fe058 32467eb1bb67459fc0223c4cb17152102c4f4e441d4d0c1f7adc4896a56ab5f4 0
10group 33649012 2026-11-04T00:00:00.000000Z 108 108 e4948d52466baa7f660fd6001cebdc83dbefe26e63cb09df5d80efd0c481b664 fe6302873f88acc9603a866bd2c945f98a7534e5673e616950d1a2faed72982d a3dadd67eefd0559eb0e4df35c4843eb494bde6131c126f2099a7e5652c27f61 0
11group 33735412 2026-11-07T00:00:00.000000Z 24 24 e64965078c44730d052443958d65b42a719c874323419e8631ac66d7e5cd6d3a 0b4f92741797b416b074b8f9d7ad782a49301748ae1483b85bf310d5f956dabc a9528f7d7af03fa54c0eb528c75e5438a47418d570171253b3fca68a6945b722 0
12group 33793012 2026-11-09T00:00:00.000000Z 30 30 aedd10f9090427643fd8baf7ccdc39329ffd8a91f58dfddbb5f220f3b0a30be2 2475e0e0ecf8580bfe551106c83e274c0c264dd01c3972c3440cdd8a43636417 0a7c52358d6bf3be4e631401ca5c6d4a59fecfb50f7fe6a506664297d2875c2b 0
13group 34685812 2026-12-10T00:00:00.000000Z 354 354 330ae89875d75832f0fa82b1b5aa218481b10d5f2f9156654e09c4b74dff414b b8bb2d523122247502f722af17757d09f07e0003c8d3844003d4af3efd607e6e 843b24bc281fb968314a0d54bec28ba48ff9b9d66ccf6d23490634abde12b921 0
14group 34714612 2026-12-11T00:00:00.000000Z 12 12 dea74fc7a2770ce8d566e12333f8c07be4a30689a19eed124974f59495de3a4d e6d2534fc0d9d6d208b0c141cbceff30973ed9018051a9c33e7845b28b810220 81dbf3985b388bc5c9bcc40a63a6e14b784a6b3d5cd39c5447627158424c74af 0
15group 34772212 2026-12-13T00:00:00.000000Z 24 24 c3c42a2abc966abe284a49209d3032fddaf72220818876cdb525bb9e8980fb63 d4a8c0ee46e3be2683c9deea845bb2ee1b95ae8e88621b2d9445cfd54506e3fb 4cba05872b25885a0eb1a8fb7d76a60c6a88ecce6f5cf432b5f97d0def668b47 0
16group 34801012 2026-12-14T00:00:00.000000Z 105 105 93926795e16a7ad8f3c664b20259335381352dee7df2beb68a8f528b14ed7004 6c7cfd3b1e24a99de19cc647a7e8e486b03149ad9985f1a1dd3341f4c790eb52 9104d6f9709fa4412d392c5618eb98e9a46de1bbd04293964005527c581e7058 0
17group 34887412 2026-12-17T00:00:00.000000Z 24 24 300a448068754af9bda5e5cb02e3aa0f0bb54ba64c5b14eb3507f96892d767e3 aec6dbf1384121897f21735371c89e8a92ec48be464490ef508a8843e67ac793 1e1f2bfb3a59bd9eb39b9eea9438cd6c9ca046f3aee3335aaa5282851b5a323c 0
18group 34945012 2026-12-19T00:00:00.000000Z 30 30 0b90abe73f31616fcce78865f4741553ac5c71299450bee68c9422f929db7057 3293e0f613b7af07804f5968776699f18a69e9c83034db133ca8bf9a2bb3bdd1 05f0a7be62802bf5b4b95ce1da3cfe825135cbdc403caf8b3bed4b38163c7158 0
19group 35837812 2027-01-19T00:00:00.000000Z 12 12 36108425509aa07491095abf26a08e40cb414669d3307f3b8c195cea58f0a559 8c143777e08b1076dd550397d6f85ec0da6dfedd77030e95b028ced4a32b9e6d 92dca92e7aa456d35abcee856323e78c7e9b1a04387a1fbf45cad20fefafbf98 0
20group 35866612 2027-01-20T00:00:00.000000Z 6 6 a62dfcd713e7c06bec057bcfa220bbf5b19285ec350e5f6e7431a2d403b1a6d4 c0670fb9b283752606f429f53a2ed3207a560ffec794371e1f2c1c9e9134b45b b8814d8bce5e5e4cbe2e3dcaca05f1322948db7b3de1ddff30c925f1884888ba 0
21group 37018612 2027-03-01T00:00:00.000000Z 6 6 ca8c432222d03c095a029ced1e17db474a372fa11611fa365b50074c9e7c1443 a4fff5e67c0fa30537d0f91cdcb113b2a1346b19f349d398a88e2a930d688c7f fc5aceb27c28df58d13133f6dccc15b8a09675b1724ba6fd2edd61f30a26b472 0 \ No newline at end of file
diff --git a/reveal/v5-000012/manifest.txt.ots b/reveal/v5-000012/manifest.txt.ots
new file mode 100644
index 0000000..9624982
--- /dev/null
+++ b/reveal/v5-000012/manifest.txt.ots
Binary files differ
diff --git a/reveal/v5-000012/r33533812.ct b/reveal/v5-000012/r33533812.ct
new file mode 100644
index 0000000..1693a77
--- /dev/null
+++ b/reveal/v5-000012/r33533812.ct
Binary files differ
diff --git a/reveal/v5-000012/r33533812.nostr.json b/reveal/v5-000012/r33533812.nostr.json
new file mode 100644
index 0000000..8034e6f
--- /dev/null
+++ b/reveal/v5-000012/r33533812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNTMzODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKalRhcFBsaFRnNVpyWGdMNlVEVlNLbE13M3NydlpaQUE2VkQxd21V\nMkNqWlY0bFBBalFMK21PU1VNUjhkTDRvZQpCU2cxWDFwVmVBRnlNRWp3NXp3clIz\nVnNZMnErYXJqUVRhdXBFOFpmelVYaVFxLy8xZDhWNFNPaDFjZURDcy9OCkQ5b3dZ\nN3RaVjE2RjlRd25SeUVvSjQwUmJGTHF6czNydnpBV0xEZzNOcXcKLS0tIFVxRlFn\nNlJxdHgwZVVwMFpVeU9WWkhnY21QOGhEM2RZdXdmWWFPN1dmRE0KkejdBeW2pULC\nWNman0i3RssqTR3HhHw73nlt6ARpujILnAclSWHl5gj/rdbipZg7QjfDo+34FtPq\nkSUC4jn89Q==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33533812"],["reveal_at","2026-10-31T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","f78a72f35210d49498513f3987ab90902b5123d04b8381cc04f99f653e5119ad"],["ct","42c20bc357be967a1c65d388b4ef0f84fe8fb29ec468ba13ffd8114fc6532153"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r33533812.tlock b/reveal/v5-000012/r33533812.tlock
new file mode 100644
index 0000000..4c00c7d
--- /dev/null
+++ b/reveal/v5-000012/r33533812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNTMzODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKalRhcFBsaFRnNVpyWGdMNlVEVlNLbE13M3NydlpaQUE2VkQxd21V
5MkNqWlY0bFBBalFMK21PU1VNUjhkTDRvZQpCU2cxWDFwVmVBRnlNRWp3NXp3clIz
6VnNZMnErYXJqUVRhdXBFOFpmelVYaVFxLy8xZDhWNFNPaDFjZURDcy9OCkQ5b3dZ
7N3RaVjE2RjlRd25SeUVvSjQwUmJGTHF6czNydnpBV0xEZzNOcXcKLS0tIFVxRlFn
8NlJxdHgwZVVwMFpVeU9WWkhnY21QOGhEM2RZdXdmWWFPN1dmRE0KkejdBeW2pULC
9WNman0i3RssqTR3HhHw73nlt6ARpujILnAclSWHl5gj/rdbipZg7QjfDo+34FtPq
10kSUC4jn89Q==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r33562612.ct b/reveal/v5-000012/r33562612.ct
new file mode 100644
index 0000000..d2928e7
--- /dev/null
+++ b/reveal/v5-000012/r33562612.ct
Binary files differ
diff --git a/reveal/v5-000012/r33562612.nostr.json b/reveal/v5-000012/r33562612.nostr.json
new file mode 100644
index 0000000..a6e8463
--- /dev/null
+++ b/reveal/v5-000012/r33562612.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNTYyNjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKbU4yZCtocnpBcEp0enBxZ0xSQUFlNG5QdzdzTG4zbnJvY1UrMXVw\ncFdyUWVMekxrL1RSNTYxdndlK2xqZTlQMQpCMGpvQjFEamlVWkxjRU1kY1ltODgr\neTRXcnZFU21SMFY4TXh3Z1R2LzdNQk5uekxJTnF5aTFIaEFMQnpKUmVjClpqOU52\nNWhXalVieFpDNWdRT09tdTJxREN3TDd3aDBMQ0dBUzRjYlpZaUkKLS0tIE54SGsv\nZUJPc3Z0S3BuR0xpMXdkb2dKRDFXSnlSSDJNbzEvUHVBaC8wancK/ZMKahLF2tvg\nmCV3KJpG8SuY8XCwAsfslMI5iwsin8Q3lSWxUl1BJYDhbRb/8LBqA3UvHWgOAIXp\nI7iSA8Cacg==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33562612"],["reveal_at","2026-11-01T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","32b8de38aebd053c773897a9f1020c1c19ae080894c2067c70191f90546d2a94"],["ct","5e6427ae5b5ca61faa6909cbe301e05979d5b2ef5c3b27ba72e4e1416f580b73"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r33562612.tlock b/reveal/v5-000012/r33562612.tlock
new file mode 100644
index 0000000..8275995
--- /dev/null
+++ b/reveal/v5-000012/r33562612.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNTYyNjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKbU4yZCtocnpBcEp0enBxZ0xSQUFlNG5QdzdzTG4zbnJvY1UrMXVw
5cFdyUWVMekxrL1RSNTYxdndlK2xqZTlQMQpCMGpvQjFEamlVWkxjRU1kY1ltODgr
6eTRXcnZFU21SMFY4TXh3Z1R2LzdNQk5uekxJTnF5aTFIaEFMQnpKUmVjClpqOU52
7NWhXalVieFpDNWdRT09tdTJxREN3TDd3aDBMQ0dBUzRjYlpZaUkKLS0tIE54SGsv
8ZUJPc3Z0S3BuR0xpMXdkb2dKRDFXSnlSSDJNbzEvUHVBaC8wancK/ZMKahLF2tvg
9mCV3KJpG8SuY8XCwAsfslMI5iwsin8Q3lSWxUl1BJYDhbRb/8LBqA3UvHWgOAIXp
10I7iSA8Cacg==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r33620212.ct b/reveal/v5-000012/r33620212.ct
new file mode 100644
index 0000000..cb5585a
--- /dev/null
+++ b/reveal/v5-000012/r33620212.ct
Binary files differ
diff --git a/reveal/v5-000012/r33620212.nostr.json b/reveal/v5-000012/r33620212.nostr.json
new file mode 100644
index 0000000..90cea7e
--- /dev/null
+++ b/reveal/v5-000012/r33620212.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNjIwMjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKaG1CY3ljSGRsQUd1UThoSkdTQ3FrekxMcnI0K09ZRDdDMWpOQlNN\nWGkxZmNpUThwbU9zTHo5WXZCTExUOVpQLwpBbEdKeUgya1ptb1hEbUpaS0tjS3A3\nNHp2elY3VDZKODZmMStjM0ZPRW9rNk9mYldDR2lLK0hQRFFYUEduOFJsCmE1M3VT\nL3ZRVlM1MENmd2F0WFJpY0VZZXdUMllsMXJmc3VjbzhlVEdhaDgKLS0tIGZkNm96\na1h3V3BDZUNyOFRhREx5Ykd2b2RKUGxvMHhTNmhQOXZVR2JCVG8KtB+sIGWWkDKW\nevnkT/eC+Bm5xJ2b698x4RtjHB9gS0tecPuPDA+zTaj7bg7qkTUsUhfkQt7w+Ion\nujM+RQNK0w==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33620212"],["reveal_at","2026-11-03T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","2972b261b7e6b8b1cf8d32f64f1d06796331666fe0e7284287e6d833d150346a"],["ct","6968f89939333b8e54362a7a1155778fdd539fb99a6fe544d5fc439f576fe058"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r33620212.tlock b/reveal/v5-000012/r33620212.tlock
new file mode 100644
index 0000000..f9b0e67
--- /dev/null
+++ b/reveal/v5-000012/r33620212.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNjIwMjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKaG1CY3ljSGRsQUd1UThoSkdTQ3FrekxMcnI0K09ZRDdDMWpOQlNN
5WGkxZmNpUThwbU9zTHo5WXZCTExUOVpQLwpBbEdKeUgya1ptb1hEbUpaS0tjS3A3
6NHp2elY3VDZKODZmMStjM0ZPRW9rNk9mYldDR2lLK0hQRFFYUEduOFJsCmE1M3VT
7L3ZRVlM1MENmd2F0WFJpY0VZZXdUMllsMXJmc3VjbzhlVEdhaDgKLS0tIGZkNm96
8a1h3V3BDZUNyOFRhREx5Ykd2b2RKUGxvMHhTNmhQOXZVR2JCVG8KtB+sIGWWkDKW
9evnkT/eC+Bm5xJ2b698x4RtjHB9gS0tecPuPDA+zTaj7bg7qkTUsUhfkQt7w+Ion
10ujM+RQNK0w==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r33649012.ct b/reveal/v5-000012/r33649012.ct
new file mode 100644
index 0000000..5f9c070
--- /dev/null
+++ b/reveal/v5-000012/r33649012.ct
Binary files differ
diff --git a/reveal/v5-000012/r33649012.nostr.json b/reveal/v5-000012/r33649012.nostr.json
new file mode 100644
index 0000000..3c3fe23
--- /dev/null
+++ b/reveal/v5-000012/r33649012.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNjQ5MDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcmJmM0tKcjZyQ2V3eStQbEdEcCtqa0lxTUREdnp0bGU1Qk5XVkRX\nMkI5V0MvUGNVNXJMNjFBQW9MWkNKdGQ2KwpHUUYxUEo4aUxrM1RlL3dMSktrc1ds\nUStEWlBSb0U5cG9ma3l0L1VWaDFuQWU1SlZIK01uWGlBVENwSUxlMnYxClhhUEls\naDRoMGNJQzN0QkVPSGRMb3RPcGp0MjI4VUUrWWJCU1QrOFlobW8KLS0tIFcvbDcv\nYTNQMmhKYVI1ODRIQUR3cTBBTUcvU2xselJHSFp1aVFmcHVrcUEKBAy9bfqkrFLn\n5HmfIKbEF64oBI3qMBuji1BtkPRRz4VHuHaogCTDpeD283um7wAokGe2Wgyh7EgM\nejmxdGHiSQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33649012"],["reveal_at","2026-11-04T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","e4948d52466baa7f660fd6001cebdc83dbefe26e63cb09df5d80efd0c481b664"],["ct","fe6302873f88acc9603a866bd2c945f98a7534e5673e616950d1a2faed72982d"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r33649012.tlock b/reveal/v5-000012/r33649012.tlock
new file mode 100644
index 0000000..5f15bec
--- /dev/null
+++ b/reveal/v5-000012/r33649012.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNjQ5MDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcmJmM0tKcjZyQ2V3eStQbEdEcCtqa0lxTUREdnp0bGU1Qk5XVkRX
5MkI5V0MvUGNVNXJMNjFBQW9MWkNKdGQ2KwpHUUYxUEo4aUxrM1RlL3dMSktrc1ds
6UStEWlBSb0U5cG9ma3l0L1VWaDFuQWU1SlZIK01uWGlBVENwSUxlMnYxClhhUEls
7aDRoMGNJQzN0QkVPSGRMb3RPcGp0MjI4VUUrWWJCU1QrOFlobW8KLS0tIFcvbDcv
8YTNQMmhKYVI1ODRIQUR3cTBBTUcvU2xselJHSFp1aVFmcHVrcUEKBAy9bfqkrFLn
95HmfIKbEF64oBI3qMBuji1BtkPRRz4VHuHaogCTDpeD283um7wAokGe2Wgyh7EgM
10ejmxdGHiSQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r33735412.ct b/reveal/v5-000012/r33735412.ct
new file mode 100644
index 0000000..5c60e94
--- /dev/null
+++ b/reveal/v5-000012/r33735412.ct
Binary files differ
diff --git a/reveal/v5-000012/r33735412.nostr.json b/reveal/v5-000012/r33735412.nostr.json
new file mode 100644
index 0000000..d5eeb51
--- /dev/null
+++ b/reveal/v5-000012/r33735412.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNzM1NDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKaTlMd1hqWUNjQ2Iwa0h4NzdWckx0cFFGMUxGSXdRSEZhYlpvcnJU\nMFBrcVN4Tkorbk50eGpGOUdYbXZDaHVRLwpFMGlUWUJzQnZNMi9EeVEwWFZPNFRy\nNFFkL0Jza2Y2bmNWRGN2dkxRZ05wS1dzaURoKys1WXRrM3lQSVpnaWtjCkJYNE0v\na1hFS2VVcFFMN1JjVjdJNVJOYVhkYVFhN2htZXVGRmVxQTZxemsKLS0tIFJISTZL\nUmd6YlppUmM0ZVp0U1dvdXYwSkNIZDI5ZlFZNldzZXFFMHBrTmsKXdWD1Lj1GU0m\ntaCUnIy8R1WTosHVVPH9DSEOfNvs/qqx/gw30HVDUZ1JJgeMCKOq8K2ILVZI3NF1\nD2vNrITAkA==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33735412"],["reveal_at","2026-11-07T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","e64965078c44730d052443958d65b42a719c874323419e8631ac66d7e5cd6d3a"],["ct","0b4f92741797b416b074b8f9d7ad782a49301748ae1483b85bf310d5f956dabc"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r33735412.tlock b/reveal/v5-000012/r33735412.tlock
new file mode 100644
index 0000000..5038408
--- /dev/null
+++ b/reveal/v5-000012/r33735412.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNzM1NDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKaTlMd1hqWUNjQ2Iwa0h4NzdWckx0cFFGMUxGSXdRSEZhYlpvcnJU
5MFBrcVN4Tkorbk50eGpGOUdYbXZDaHVRLwpFMGlUWUJzQnZNMi9EeVEwWFZPNFRy
6NFFkL0Jza2Y2bmNWRGN2dkxRZ05wS1dzaURoKys1WXRrM3lQSVpnaWtjCkJYNE0v
7a1hFS2VVcFFMN1JjVjdJNVJOYVhkYVFhN2htZXVGRmVxQTZxemsKLS0tIFJISTZL
8Umd6YlppUmM0ZVp0U1dvdXYwSkNIZDI5ZlFZNldzZXFFMHBrTmsKXdWD1Lj1GU0m
9taCUnIy8R1WTosHVVPH9DSEOfNvs/qqx/gw30HVDUZ1JJgeMCKOq8K2ILVZI3NF1
10D2vNrITAkA==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r33793012.ct b/reveal/v5-000012/r33793012.ct
new file mode 100644
index 0000000..b3c81a5
--- /dev/null
+++ b/reveal/v5-000012/r33793012.ct
Binary files differ
diff --git a/reveal/v5-000012/r33793012.nostr.json b/reveal/v5-000012/r33793012.nostr.json
new file mode 100644
index 0000000..f1eb0d6
--- /dev/null
+++ b/reveal/v5-000012/r33793012.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNzkzMDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKb0dKTG11c1drZE9KQjRGTnFnYml6Tnd1cElBaDBreWhJZkdyMUpi\nY0NRV3hFOEhKS2FNTFNHS3l6MCtCUnB4YwpBRmpBL1RveUp2ZHNlc3NUODB6d2V5\nNGhieXBpNUxVWDNsc2IrSWdSbG8xZXc3SzlXS242ZGVBRmV2NEVQWkFlCm5MMjZL\nekl2L2ZRallBekFrQkgxVkZmMGI3VEpqS05pQVpqSGxFaHJWTEEKLS0tIG9PR0hi\ncTZ1TnZTaFM5OFBrT3JSQVhHYS9kZkdjb2JUWFJTNDFyQ21qUFUKCjgVYpbJGOSU\nIwdj8r+jxO9yWuGKQA++5cgLirdt7egSlhEY6i3P1MNaUdkRLbHXDf62BB5K8iIM\nFJkb4cfIvA==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33793012"],["reveal_at","2026-11-09T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","aedd10f9090427643fd8baf7ccdc39329ffd8a91f58dfddbb5f220f3b0a30be2"],["ct","2475e0e0ecf8580bfe551106c83e274c0c264dd01c3972c3440cdd8a43636417"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r33793012.tlock b/reveal/v5-000012/r33793012.tlock
new file mode 100644
index 0000000..94e1eb2
--- /dev/null
+++ b/reveal/v5-000012/r33793012.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNzkzMDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKb0dKTG11c1drZE9KQjRGTnFnYml6Tnd1cElBaDBreWhJZkdyMUpi
5Y0NRV3hFOEhKS2FNTFNHS3l6MCtCUnB4YwpBRmpBL1RveUp2ZHNlc3NUODB6d2V5
6NGhieXBpNUxVWDNsc2IrSWdSbG8xZXc3SzlXS242ZGVBRmV2NEVQWkFlCm5MMjZL
7ekl2L2ZRallBekFrQkgxVkZmMGI3VEpqS05pQVpqSGxFaHJWTEEKLS0tIG9PR0hi
8cTZ1TnZTaFM5OFBrT3JSQVhHYS9kZkdjb2JUWFJTNDFyQ21qUFUKCjgVYpbJGOSU
9Iwdj8r+jxO9yWuGKQA++5cgLirdt7egSlhEY6i3P1MNaUdkRLbHXDf62BB5K8iIM
10FJkb4cfIvA==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r34685812.ct b/reveal/v5-000012/r34685812.ct
new file mode 100644
index 0000000..fda89a8
--- /dev/null
+++ b/reveal/v5-000012/r34685812.ct
Binary files differ
diff --git a/reveal/v5-000012/r34685812.nostr.json b/reveal/v5-000012/r34685812.nostr.json
new file mode 100644
index 0000000..4b9d592
--- /dev/null
+++ b/reveal/v5-000012/r34685812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0Njg1ODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcGh0VDhheWRCUEYyTHlFVnphNkxlN3lPa1VSSWJnZWhxNVpjc3VT\nOGlNNGhsMFpoYkhpU3RtRXJFQW12eW1RMQpFbjd5dDEvMytPMXZKUW4rMTJ3T1hG\nUFdwaWVxclE2Qld3VDZyTWxFSFNuQitHVmZHZzVWRzg1RUk0N3JRUXBLCkVVc3lH\nZ0tYTVhFdkQxQzBTNEF1Y3laUm1WRmhzaDJzVzF5WWlFcUV4RTQKLS0tIFNiWEJP\nbWxRVUpvKzFlSTd3czI3Q2UwcWFMc2hSYzViTnNjS0N3ZmtTV0UKb1MIi113HAHN\nCa+5P49CDyY+e46PWzpwg4hdxMMblxI2eFLHtxjklnTfqiDLLSsaPB0uPeK+XagL\nSKQPUFBZSw==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34685812"],["reveal_at","2026-12-10T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","330ae89875d75832f0fa82b1b5aa218481b10d5f2f9156654e09c4b74dff414b"],["ct","b8bb2d523122247502f722af17757d09f07e0003c8d3844003d4af3efd607e6e"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r34685812.tlock b/reveal/v5-000012/r34685812.tlock
new file mode 100644
index 0000000..bcc4301
--- /dev/null
+++ b/reveal/v5-000012/r34685812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0Njg1ODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcGh0VDhheWRCUEYyTHlFVnphNkxlN3lPa1VSSWJnZWhxNVpjc3VT
5OGlNNGhsMFpoYkhpU3RtRXJFQW12eW1RMQpFbjd5dDEvMytPMXZKUW4rMTJ3T1hG
6UFdwaWVxclE2Qld3VDZyTWxFSFNuQitHVmZHZzVWRzg1RUk0N3JRUXBLCkVVc3lH
7Z0tYTVhFdkQxQzBTNEF1Y3laUm1WRmhzaDJzVzF5WWlFcUV4RTQKLS0tIFNiWEJP
8bWxRVUpvKzFlSTd3czI3Q2UwcWFMc2hSYzViTnNjS0N3ZmtTV0UKb1MIi113HAHN
9Ca+5P49CDyY+e46PWzpwg4hdxMMblxI2eFLHtxjklnTfqiDLLSsaPB0uPeK+XagL
10SKQPUFBZSw==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r34714612.ct b/reveal/v5-000012/r34714612.ct
new file mode 100644
index 0000000..748f040
--- /dev/null
+++ b/reveal/v5-000012/r34714612.ct
Binary files differ
diff --git a/reveal/v5-000012/r34714612.nostr.json b/reveal/v5-000012/r34714612.nostr.json
new file mode 100644
index 0000000..a13b2cb
--- /dev/null
+++ b/reveal/v5-000012/r34714612.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0NzE0NjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcVV4c0JYMnRNbnpaU3pVS2I2dWlRTkliRHhLL2k5WTZmVjRPNjRN\nSGlYbFZLSis4bmdjMlAyWmFaSXRTY0RCLwpHUXoxbUg2YTluYlhVVitoQ1VaVitN\nMUhoWlp3ZExjQlRRQkM3YUxyaTVGTk5tZ09vem5PdGs5ZXdnUjFGWFNpCnlBWllW\nOUEzMXc3aHNkNWpjTGIrVjdUa2dsZU94U3VLT0VuWWJXbkxwWDgKLS0tIExrVzJz\naERSZ3RTU2Q5RUZ6WmRwL3VkanM4OFZzTDdxcFdqTkFVaHpmMk0K9jr4geibl8rP\nB+m01Kfe8ulyGOn2l/Dc9wmp6R/vJEFmgMnx1ikw9/PeUjvZO8Qiwem2f5XzvQVX\nA4qtMPNpFg==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34714612"],["reveal_at","2026-12-11T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","dea74fc7a2770ce8d566e12333f8c07be4a30689a19eed124974f59495de3a4d"],["ct","e6d2534fc0d9d6d208b0c141cbceff30973ed9018051a9c33e7845b28b810220"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r34714612.tlock b/reveal/v5-000012/r34714612.tlock
new file mode 100644
index 0000000..5856fa7
--- /dev/null
+++ b/reveal/v5-000012/r34714612.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0NzE0NjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcVV4c0JYMnRNbnpaU3pVS2I2dWlRTkliRHhLL2k5WTZmVjRPNjRN
5SGlYbFZLSis4bmdjMlAyWmFaSXRTY0RCLwpHUXoxbUg2YTluYlhVVitoQ1VaVitN
6MUhoWlp3ZExjQlRRQkM3YUxyaTVGTk5tZ09vem5PdGs5ZXdnUjFGWFNpCnlBWllW
7OUEzMXc3aHNkNWpjTGIrVjdUa2dsZU94U3VLT0VuWWJXbkxwWDgKLS0tIExrVzJz
8aERSZ3RTU2Q5RUZ6WmRwL3VkanM4OFZzTDdxcFdqTkFVaHpmMk0K9jr4geibl8rP
9B+m01Kfe8ulyGOn2l/Dc9wmp6R/vJEFmgMnx1ikw9/PeUjvZO8Qiwem2f5XzvQVX
10A4qtMPNpFg==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r34772212.ct b/reveal/v5-000012/r34772212.ct
new file mode 100644
index 0000000..cdbfe92
--- /dev/null
+++ b/reveal/v5-000012/r34772212.ct
Binary files differ
diff --git a/reveal/v5-000012/r34772212.nostr.json b/reveal/v5-000012/r34772212.nostr.json
new file mode 100644
index 0000000..d9a7b83
--- /dev/null
+++ b/reveal/v5-000012/r34772212.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0NzcyMjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKbEFwLzFWclV5VFB0eU9vQmRzQnZ0anI0eWRPWFNXZ1hKb1E3c1Jx\nMThNYk5RUXNYZ3BCTGdnZUQ4ZmRpendDcgpFUkNlWFhOTXZjTkZuYmVJQkhmYURi\nMlV2MDNtVTJLcFV4U0tkT1JRaEp2Y0RjOVg2VmVMRWNJWWhVc2t1ckdkCitmeVZ4\nZ3g1RXhBYmtFKys0MFpWbktyWjc3Zmw5RHlGdHAyWkl5dklTNFUKLS0tIG1VNjRw\nMkdZaW8zTC9jZkk2akFJZVlXZk9lRk9PaVBZdnpCUmx0YXhDcGsKXimJE7x6Lqco\nyli3GNv+Up8SCu9F+KjHug0B/1Pfe4pqbWVaGAPHU7vM7LoS4UdzgKuwOLVa5wJw\nMNuEOKQTkw==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34772212"],["reveal_at","2026-12-13T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","c3c42a2abc966abe284a49209d3032fddaf72220818876cdb525bb9e8980fb63"],["ct","d4a8c0ee46e3be2683c9deea845bb2ee1b95ae8e88621b2d9445cfd54506e3fb"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r34772212.tlock b/reveal/v5-000012/r34772212.tlock
new file mode 100644
index 0000000..f4c8ac2
--- /dev/null
+++ b/reveal/v5-000012/r34772212.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0NzcyMjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKbEFwLzFWclV5VFB0eU9vQmRzQnZ0anI0eWRPWFNXZ1hKb1E3c1Jx
5MThNYk5RUXNYZ3BCTGdnZUQ4ZmRpendDcgpFUkNlWFhOTXZjTkZuYmVJQkhmYURi
6MlV2MDNtVTJLcFV4U0tkT1JRaEp2Y0RjOVg2VmVMRWNJWWhVc2t1ckdkCitmeVZ4
7Z3g1RXhBYmtFKys0MFpWbktyWjc3Zmw5RHlGdHAyWkl5dklTNFUKLS0tIG1VNjRw
8MkdZaW8zTC9jZkk2akFJZVlXZk9lRk9PaVBZdnpCUmx0YXhDcGsKXimJE7x6Lqco
9yli3GNv+Up8SCu9F+KjHug0B/1Pfe4pqbWVaGAPHU7vM7LoS4UdzgKuwOLVa5wJw
10MNuEOKQTkw==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r34801012.ct b/reveal/v5-000012/r34801012.ct
new file mode 100644
index 0000000..1c86522
--- /dev/null
+++ b/reveal/v5-000012/r34801012.ct
Binary files differ
diff --git a/reveal/v5-000012/r34801012.nostr.json b/reveal/v5-000012/r34801012.nostr.json
new file mode 100644
index 0000000..97b0280
--- /dev/null
+++ b/reveal/v5-000012/r34801012.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0ODAxMDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcFUycVhQcUJqTlhSSitBYUtyTzBYZW5rWFI5MGdkZDh0c25SQktH\nOS9DbUtFejNEbGoySGZ3TUVFTldBM3NuZApGTEFiTVhvQzVSOURmSEJJVlNObm5E\nOWl3Q2hUUk9kSlRudTVTZm9ZUGR1V2kxL3Y2eXMrbmlFU1B4Sk5mdzFDCnd5eXJ2\nWnJUUzJmNUhpeEsrSnFkMkgyTGxBUktzT0QyZitDb3N3c3QwL3MKLS0tIGxvYjZk\ndmM2YVpnUEs2UHdRZ2tGTGpIdHp3WUdTWGkwRkx3dXhKZGFiTU0Ks3dnoEi+BVoQ\nEAxnqk83D+joafe07nNFfTS3gVz2C/lN4x7nVdYGXmysPi8IWQ+GJL4bG9yeE20o\nSt1jDsfLGw==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34801012"],["reveal_at","2026-12-14T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","93926795e16a7ad8f3c664b20259335381352dee7df2beb68a8f528b14ed7004"],["ct","6c7cfd3b1e24a99de19cc647a7e8e486b03149ad9985f1a1dd3341f4c790eb52"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r34801012.tlock b/reveal/v5-000012/r34801012.tlock
new file mode 100644
index 0000000..f2724f9
--- /dev/null
+++ b/reveal/v5-000012/r34801012.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0ODAxMDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcFUycVhQcUJqTlhSSitBYUtyTzBYZW5rWFI5MGdkZDh0c25SQktH
5OS9DbUtFejNEbGoySGZ3TUVFTldBM3NuZApGTEFiTVhvQzVSOURmSEJJVlNObm5E
6OWl3Q2hUUk9kSlRudTVTZm9ZUGR1V2kxL3Y2eXMrbmlFU1B4Sk5mdzFDCnd5eXJ2
7WnJUUzJmNUhpeEsrSnFkMkgyTGxBUktzT0QyZitDb3N3c3QwL3MKLS0tIGxvYjZk
8dmM2YVpnUEs2UHdRZ2tGTGpIdHp3WUdTWGkwRkx3dXhKZGFiTU0Ks3dnoEi+BVoQ
9EAxnqk83D+joafe07nNFfTS3gVz2C/lN4x7nVdYGXmysPi8IWQ+GJL4bG9yeE20o
10St1jDsfLGw==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r34887412.ct b/reveal/v5-000012/r34887412.ct
new file mode 100644
index 0000000..b694e5b
--- /dev/null
+++ b/reveal/v5-000012/r34887412.ct
Binary files differ
diff --git a/reveal/v5-000012/r34887412.nostr.json b/reveal/v5-000012/r34887412.nostr.json
new file mode 100644
index 0000000..5e1af11
--- /dev/null
+++ b/reveal/v5-000012/r34887412.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0ODg3NDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKalZQdldsVlJUOFpEUHNDUmI4bWVxZEJvem16citBTHBLdjJyMUwx\nSHpiQ2J4bFQ2dnUrOUJ0RlRGZEJhWnJhVApCQ2tCUUlqT2dXQTc4T2NuV2hpZzVD\ncmdRYkZYTFNDc2I5UjhMdmx1bDdUTUl6a1VwNGhPdWJVTjRSSlhPQWlVCmxXcUVq\ndSt2aldwbEw3Nno2RHdIZk5OeEdJZ2RVSDYxVTRGYXcrTUJaMFEKLS0tIGdkQW1v\nS090ZXFkem04MzZkNDY2b3h0clBmWnVLdlNFTU52YjRzMG9qRWMK3kxLcwQ1bY9l\n4k3wQlJuJwoXS6uNQUFppxlRmS3W6BFts3WkNEmAlgdR8wj568KycbR5TSf4QVhq\nCYRJg0PHBQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34887412"],["reveal_at","2026-12-17T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","300a448068754af9bda5e5cb02e3aa0f0bb54ba64c5b14eb3507f96892d767e3"],["ct","aec6dbf1384121897f21735371c89e8a92ec48be464490ef508a8843e67ac793"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r34887412.tlock b/reveal/v5-000012/r34887412.tlock
new file mode 100644
index 0000000..14b2956
--- /dev/null
+++ b/reveal/v5-000012/r34887412.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0ODg3NDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKalZQdldsVlJUOFpEUHNDUmI4bWVxZEJvem16citBTHBLdjJyMUwx
5SHpiQ2J4bFQ2dnUrOUJ0RlRGZEJhWnJhVApCQ2tCUUlqT2dXQTc4T2NuV2hpZzVD
6cmdRYkZYTFNDc2I5UjhMdmx1bDdUTUl6a1VwNGhPdWJVTjRSSlhPQWlVCmxXcUVq
7dSt2aldwbEw3Nno2RHdIZk5OeEdJZ2RVSDYxVTRGYXcrTUJaMFEKLS0tIGdkQW1v
8S090ZXFkem04MzZkNDY2b3h0clBmWnVLdlNFTU52YjRzMG9qRWMK3kxLcwQ1bY9l
94k3wQlJuJwoXS6uNQUFppxlRmS3W6BFts3WkNEmAlgdR8wj568KycbR5TSf4QVhq
10CYRJg0PHBQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r34945012.ct b/reveal/v5-000012/r34945012.ct
new file mode 100644
index 0000000..92bb543
--- /dev/null
+++ b/reveal/v5-000012/r34945012.ct
Binary files differ
diff --git a/reveal/v5-000012/r34945012.nostr.json b/reveal/v5-000012/r34945012.nostr.json
new file mode 100644
index 0000000..613632e
--- /dev/null
+++ b/reveal/v5-000012/r34945012.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0OTQ1MDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKaWgwbGtHRHhXa1RLZHJ3NWx6Q1hmbm50Q3hodlVqMlptZHJMUVdX\nOWNNbHpKZHdMaWgyd2lSa0NEZHFoQllDQgpCeUhGdTkvYnBWcmlQSFVndTlvYzBJ\naUo2TUMwWWVpWGJGMGxneXUreUJTZ0dkVjZwVWx6M240ZjhJVVkyRmdSCkhxaWdl\nRmZzakZxTE82bFJzNE5qamNkVWhyeWtWRUdUWlNvVlpqZi84WHMKLS0tIEllRG1L\nV044Z3dEc3dPU3N5c3VJdkNhQXdlQ2RVY3lkT3lCMFY1TFJmTzgKptNnP7dXyEnP\nYt9BXBmUJGoE/oqTw8h+1Xt3imcrtfa8Uw6aEQE6FZEva8mSESgtJpBGZq7cj59x\nhwbD3bntzA==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34945012"],["reveal_at","2026-12-19T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","0b90abe73f31616fcce78865f4741553ac5c71299450bee68c9422f929db7057"],["ct","3293e0f613b7af07804f5968776699f18a69e9c83034db133ca8bf9a2bb3bdd1"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r34945012.tlock b/reveal/v5-000012/r34945012.tlock
new file mode 100644
index 0000000..f897bd4
--- /dev/null
+++ b/reveal/v5-000012/r34945012.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0OTQ1MDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKaWgwbGtHRHhXa1RLZHJ3NWx6Q1hmbm50Q3hodlVqMlptZHJMUVdX
5OWNNbHpKZHdMaWgyd2lSa0NEZHFoQllDQgpCeUhGdTkvYnBWcmlQSFVndTlvYzBJ
6aUo2TUMwWWVpWGJGMGxneXUreUJTZ0dkVjZwVWx6M240ZjhJVVkyRmdSCkhxaWdl
7RmZzakZxTE82bFJzNE5qamNkVWhyeWtWRUdUWlNvVlpqZi84WHMKLS0tIEllRG1L
8V044Z3dEc3dPU3N5c3VJdkNhQXdlQ2RVY3lkT3lCMFY1TFJmTzgKptNnP7dXyEnP
9Yt9BXBmUJGoE/oqTw8h+1Xt3imcrtfa8Uw6aEQE6FZEva8mSESgtJpBGZq7cj59x
10hwbD3bntzA==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r35837812.ct b/reveal/v5-000012/r35837812.ct
new file mode 100644
index 0000000..3e997a3
--- /dev/null
+++ b/reveal/v5-000012/r35837812.ct
Binary files differ
diff --git a/reveal/v5-000012/r35837812.nostr.json b/reveal/v5-000012/r35837812.nostr.json
new file mode 100644
index 0000000..945ac40
--- /dev/null
+++ b/reveal/v5-000012/r35837812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM1ODM3ODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKbHVTRG5MUi9CeVJNREVmSTdUKzJnMzN6NVRzbW1xL3dxYVcwcUlM\nQUQwbC9lbEVxdUk5b20xMi9zSStnYUI1MApCNk14eTVxdE5rZEt2bms3WlF4dUFW\nQWpRSEJKTTRUN0hGZ25qQ2VscFAvT3dsRm82SjRTM0ZDc04rTmRndTJoCnNCSGIv\nSFhkbU52RGg0dTlXUUg0T1hLZTU5Qkh2TEdMeUh4U2tUR293bkUKLS0tIElmU1Vp\nMXQ3NThDQ3pkMmJIajJ0Z205N3E4Y1JDT1VlMjlUblBVVDJTYUUK8pKHS7kRpnH5\ndKdu731ypYVcvFCvQESwsjxc049BeRaWEVxKH5SzpyFoNlbSDk9ZMexL1tDQ2UW2\noYllGJ+YHw==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","35837812"],["reveal_at","2027-01-19T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","36108425509aa07491095abf26a08e40cb414669d3307f3b8c195cea58f0a559"],["ct","8c143777e08b1076dd550397d6f85ec0da6dfedd77030e95b028ced4a32b9e6d"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r35837812.tlock b/reveal/v5-000012/r35837812.tlock
new file mode 100644
index 0000000..7c4da26
--- /dev/null
+++ b/reveal/v5-000012/r35837812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM1ODM3ODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKbHVTRG5MUi9CeVJNREVmSTdUKzJnMzN6NVRzbW1xL3dxYVcwcUlM
5QUQwbC9lbEVxdUk5b20xMi9zSStnYUI1MApCNk14eTVxdE5rZEt2bms3WlF4dUFW
6QWpRSEJKTTRUN0hGZ25qQ2VscFAvT3dsRm82SjRTM0ZDc04rTmRndTJoCnNCSGIv
7SFhkbU52RGg0dTlXUUg0T1hLZTU5Qkh2TEdMeUh4U2tUR293bkUKLS0tIElmU1Vp
8MXQ3NThDQ3pkMmJIajJ0Z205N3E4Y1JDT1VlMjlUblBVVDJTYUUK8pKHS7kRpnH5
9dKdu731ypYVcvFCvQESwsjxc049BeRaWEVxKH5SzpyFoNlbSDk9ZMexL1tDQ2UW2
10oYllGJ+YHw==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r35866612.ct b/reveal/v5-000012/r35866612.ct
new file mode 100644
index 0000000..23eb9c1
--- /dev/null
+++ b/reveal/v5-000012/r35866612.ct
Binary files differ
diff --git a/reveal/v5-000012/r35866612.nostr.json b/reveal/v5-000012/r35866612.nostr.json
new file mode 100644
index 0000000..5fdd48e
--- /dev/null
+++ b/reveal/v5-000012/r35866612.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM1ODY2NjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKajBpNGZvTDFTN0kvRDJMeXJlTkY4SUt4eTRaRXRPZWJ5UDNXM1k5\nTFpHaWMxS0NwZEp0U3pzL3ZLRXVsTlBHcgpDbWMwM3ZDQ08xd1kxekk5WXBGM1Mv\nTWFJcUt0VThRYlRhWEVXOXEzaVAwb215cU5Eb0ZVYXdxa0wvdVpBSjhRCnExOENL\neWlnamg5amVuZThHamFSTTFTeGQ1MVRuTENrSFpXdlB3L05YZDAKLS0tIExpWDhE\nNmhzeXhsQjZxVzFLWDlPSmxHb2pYMVEvR0JKbjd0SGV2VExEOVUKHf0HtNiRUZ7N\nstXXEHJw5gmryVXp+g7CjyR1bc7RQgB8smLclaof51GTC4NqKsKzfLVKb2dPhA9d\njECZVZ4MZQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","35866612"],["reveal_at","2027-01-20T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","a62dfcd713e7c06bec057bcfa220bbf5b19285ec350e5f6e7431a2d403b1a6d4"],["ct","c0670fb9b283752606f429f53a2ed3207a560ffec794371e1f2c1c9e9134b45b"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r35866612.tlock b/reveal/v5-000012/r35866612.tlock
new file mode 100644
index 0000000..0a8048d
--- /dev/null
+++ b/reveal/v5-000012/r35866612.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM1ODY2NjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKajBpNGZvTDFTN0kvRDJMeXJlTkY4SUt4eTRaRXRPZWJ5UDNXM1k5
5TFpHaWMxS0NwZEp0U3pzL3ZLRXVsTlBHcgpDbWMwM3ZDQ08xd1kxekk5WXBGM1Mv
6TWFJcUt0VThRYlRhWEVXOXEzaVAwb215cU5Eb0ZVYXdxa0wvdVpBSjhRCnExOENL
7eWlnamg5amVuZThHamFSTTFTeGQ1MVRuTENrSFpXdlB3L05YZDAKLS0tIExpWDhE
8NmhzeXhsQjZxVzFLWDlPSmxHb2pYMVEvR0JKbjd0SGV2VExEOVUKHf0HtNiRUZ7N
9stXXEHJw5gmryVXp+g7CjyR1bc7RQgB8smLclaof51GTC4NqKsKzfLVKb2dPhA9d
10jECZVZ4MZQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/r37018612.ct b/reveal/v5-000012/r37018612.ct
new file mode 100644
index 0000000..7828171
--- /dev/null
+++ b/reveal/v5-000012/r37018612.ct
Binary files differ
diff --git a/reveal/v5-000012/r37018612.nostr.json b/reveal/v5-000012/r37018612.nostr.json
new file mode 100644
index 0000000..51cc7a6
--- /dev/null
+++ b/reveal/v5-000012/r37018612.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM3MDE4NjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcmdOQTNtN3d0TEVBZng0bHg3bS9KREtudlRLYVEyUGQyY2FhVHNI\nM1ZNTGxmN1oxdGJSZVFPbHREUmpIYWduVApCdVBtdnY3Q2NXcDZzRGV5Y1UzaGto\nM0U0a2tZV3R1THVFRURNN1BLeXlFOVZkTzcrZDF1YjE3OXgyR0ZwdEdqCkFldE9O\nWU1FRk1iWUE3YWwwbFMzSTZkNVRIZGlMb0I4dmsrVHVMUG5JNEkKLS0tIGVTR2g5\nVmZhZmxzSStWLzEvcUZtc25YSnN6S3RoKzhsU2g2dHg2TlNsSDAK3chH0IduG47+\n1BsUVxOf+RCaWpCdtJjdaRGtcoeJeeEoyQlcqQtWok+Rdgkoiij0lx0NhnefAYrX\nC9Mn2P2wJQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","37018612"],["reveal_at","2027-03-01T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","ca8c432222d03c095a029ced1e17db474a372fa11611fa365b50074c9e7c1443"],["ct","a4fff5e67c0fa30537d0f91cdcb113b2a1346b19f349d398a88e2a930d688c7f"],["seal","573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47"]]}
diff --git a/reveal/v5-000012/r37018612.tlock b/reveal/v5-000012/r37018612.tlock
new file mode 100644
index 0000000..472d341
--- /dev/null
+++ b/reveal/v5-000012/r37018612.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM3MDE4NjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcmdOQTNtN3d0TEVBZng0bHg3bS9KREtudlRLYVEyUGQyY2FhVHNI
5M1ZNTGxmN1oxdGJSZVFPbHREUmpIYWduVApCdVBtdnY3Q2NXcDZzRGV5Y1UzaGto
6M0U0a2tZV3R1THVFRURNN1BLeXlFOVZkTzcrZDF1YjE3OXgyR0ZwdEdqCkFldE9O
7WU1FRk1iWUE3YWwwbFMzSTZkNVRIZGlMb0I4dmsrVHVMUG5JNEkKLS0tIGVTR2g5
8VmZhZmxzSStWLzEvcUZtc25YSnN6S3RoKzhsU2g2dHg2TlNsSDAK3chH0IduG47+
91BsUVxOf+RCaWpCdtJjdaRGtcoeJeeEoyQlcqQtWok+Rdgkoiij0lx0NhnefAYrX
10C9Mn2P2wJQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000012/seal.json b/reveal/v5-000012/seal.json
new file mode 100644
index 0000000..c78ff49
--- /dev/null
+++ b/reveal/v5-000012/seal.json
@@ -0,0 +1,43 @@
1{
2 "algorithm": "sha256-live-v5",
3 "anchor_ref": "sha256:573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47",
4 "covers_after": "2026-10-08T22:30:20.258717Z",
5 "covers_through": "2026-10-09T04:21:12.160694Z",
6 "digest": "573808acce21d75abd2857a59f497c1e17367ec9fd34ff6b3c6c62bccff57d47",
7 "follows_seq": 42,
8 "n_forecasts": 1113,
9 "n_groups": 15,
10 "n_withheld": 1113,
11 "prev_digest": "aecbc94f76fab78030adf1714ed7145e7b4424b9abcf620d6fe047aaf058c5c9",
12 "prev_seq": 11,
13 "sealed_at": "2026-10-09T04:21:41.242748Z",
14 "seq": 12,
15 "variant": {
16 "beacon": {
17 "chain_hash": "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971",
18 "genesis_time": 1692803367,
19 "period": 3,
20 "relays": [
21 "https://api.drand.sh",
22 "https://api2.drand.sh",
23 "https://api3.drand.sh",
24 "https://drand.cloudflare.com"
25 ],
26 "scheme": "bls-unchained-g1-rfc9380"
27 },
28 "cipher": "chacha20poly1305-zlib6-nonce0",
29 "gate": {
30 "default": "withheld: a kept salt can be released later; an opened text can never be withdrawn",
31 "opened": "none",
32 "why": "no decision by Echo yet"
33 },
34 "line": "numeric<TAB>open:<v4 line> | numeric<TAB>withheld:sha256(salt||v4 line)",
35 "reveal": "utc-day-after-close",
36 "salts": "key ring: one content a seal, one part a line",
37 "tool": {
38 "name": "tle",
39 "sha256": "69157d8c14a1d390d1b7744946288f83d4b10748471d5447f9abb77a5902c541",
40 "version": "tlock v1.2.0 -- github.com/drand/tlock"
41 }
42 }
43}