diff --git a/.gitattributes b/.gitattributes index 9137892c8..7957aed07 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12,17 +12,24 @@ # For append-only JSONL, `union` is that behaviour and is built in. .trinity/experience/*.jsonl merge=union -# NOW.md: canonical location is docs/NOW.md. The root file is a symlink, so -# git merges the link target, not the text — and `theirs` is not a built-in -# driver either (same missing .git/config entry as append-log had). Point the -# symlink's rule at the same built-in the real file uses; if the symlink is -# ever replaced by a real file, this keeps working. +# NOW.md: canonical location is docs/NOW.md. The root NOW.md is NOT a symlink +# — `git ls-tree master NOW.md` reports mode 100644, a regular file (a symlink +# would be 120000). It is its own divergent document, last stamped 2026-08-09 +# while docs/NOW.md is stamped by every pull request. An earlier version of +# this comment described a symlink and merge-of-the-link-target; no such +# symlink has existed here. Whether the root file should become a real +# symlink, be deleted, or keep its own content is still open — see #2253. +# +# This pattern has no slash, so git matches it by basename at ANY depth: it +# already covers docs/NOW.md (and sub/dir/NOW.md), verifiable with +# `git check-attr merge -- docs/NOW.md`. The rule below is therefore +# redundant, and is kept only because it is the one people look for. NOW.md merge=union -# The rule above names the SYMLINK, not the file that actually conflicts, and -# `theirs` is not a built-in driver — it needs a per-clone .git/config entry -# that a fresh checkout does not have. So docs/NOW.md conflicted on every -# branch (seven times in one campaign), each resolved identically by hand: -# keep both entries. `union` is built in, so it works in every clone with no -# setup, and it is exactly that resolution. +# docs/NOW.md is the file that actually conflicts: it conflicted on every +# branch (seven times in one campaign), each time resolved identically by hand +# — keep both entries. `theirs` used to be named here, but it is not a +# built-in driver: it needs a merge.theirs.driver entry in .git/config that no +# fresh clone has, so it silently did nothing. `union` is built in, needs no +# setup, and concatenates both sides — exactly that hand resolution. docs/NOW.md merge=union diff --git a/cli/tri/src/hooks.rs b/cli/tri/src/hooks.rs index 460575697..97226c5ac 100644 --- a/cli/tri/src/hooks.rs +++ b/cli/tri/src/hooks.rs @@ -95,7 +95,13 @@ pub fn now_gate(path: Option<&Path>, today_override: Option<&str>) -> Result<()> None => Utc::now().format("%Y-%m-%d").to_string(), }; - let re = Regex::new(r"(?m)^\*\*Last updated:\*\*\s*(\d{4}-\d{2}-\d{2})") + // Match the format the producer actually writes. `nownote.rs` emits a + // PLAIN `Last updated: ` line, and all 136 stamps in `docs/NOW.md` + // use that form -- zero use the bold one this pattern required before, so + // the gate could never take the `Some` branch on the real document. The + // `**` markers stay optional because archived snapshots (and the entry + // still sitting in root `NOW.md`) predate the switch to plain. + let re = Regex::new(r"(?m)^(?:\*\*)?Last updated:(?:\*\*)?\s*(\d{4}-\d{2}-\d{2})") .expect("static regex always compiles"); match re.captures(&body) { Some(caps) => { @@ -111,7 +117,7 @@ pub fn now_gate(path: Option<&Path>, today_override: Option<&str>) -> Result<()> Ok(()) } None => bail!( - "NOW gate violation: no `**Last updated:** YYYY-MM-DD` line found in {}", + "NOW gate violation: no `Last updated: YYYY-MM-DD` line found in {}", resolved.display() ), } @@ -188,4 +194,55 @@ mod tests { std::fs::remove_file(&tmp).ok(); assert!(r.is_err()); } + + /// The two tests above write their own fixture in the bold form, so they + /// only ever proved the regex is self-consistent. This one pins the shape + /// `nownote.rs` actually writes (see its `add()`): a PLAIN `Last updated:` + /// line. It fails against the pre-fix bold-only pattern. + #[test] + fn now_gate_accepts_the_plain_form_nownote_writes() { + let date = "2026-05-12"; + let body = "# NOW -- some entry (2026-05-12)\n\ + \n\ + Last updated: 2026-05-12\n\ + \n\ + ## some entry (Closes #1)\n\ + \n\ + - x\n\n"; + let tmp = std::env::temp_dir().join(format!("now_gate_plain_{}.md", std::process::id())); + std::fs::write(&tmp, body).unwrap(); + let r = now_gate(Some(&tmp), Some(date)); + std::fs::remove_file(&tmp).ok(); + assert!(r.is_ok(), "{:?}", r); + } + + /// Liveness: run the gate against the real `docs/NOW.md` rather than a + /// fixture. The expected date is re-derived with the *live* gate's own + /// rule (`bootstrap/src/suite.rs` takes the first line containing + /// "Last updated:"), so this asserts the two implementations agree on the + /// actual document. It does not assert freshness, so it cannot go red + /// merely because the file is a day old. + #[test] + fn now_gate_agrees_with_the_live_gate_on_the_real_document() { + let root = match repo_root() { + Ok(r) => r, + Err(_) => return, // not in a git checkout; nothing to check + }; + let path = root.join("docs/NOW.md"); + let body = match std::fs::read_to_string(&path) { + Ok(b) => b, + Err(_) => return, // file absent (sparse checkout); nothing to check + }; + let stamped = body + .lines() + .find(|l| l.contains("Last updated:")) + .and_then(|l| l.split("Last updated:").nth(1)) + .map(|s| s.trim().trim_start_matches("**").trim().to_string()) + .expect("docs/NOW.md must carry a `Last updated:` line"); + let date = stamped + .get(..10) + .expect("`Last updated:` value must start with YYYY-MM-DD"); + let r = now_gate(Some(&path), Some(date)); + assert!(r.is_ok(), "gate rejected the real docs/NOW.md: {:?}", r); + } } diff --git a/docs/NOW.md b/docs/NOW.md index f8dead0f9..f7d6184d7 100644 --- a/docs/NOW.md +++ b/docs/NOW.md @@ -1,3 +1,89 @@ +# NOW -- a commit gate that could never pass, a symlink that never existed, and 835 lines of base64 (2026-08-20) + +Last updated: 2026-08-20 + +## hooks: match the NOW stamp format that is actually written (Closes #2299) + +Three small defects found while analysing the `docs/NOW.md` bottleneck, all +verified against `origin/master` at `7e8de87b1` before being touched. + +### 1. `tri hooks now-gate` required a format nothing produces + +`cli/tri/src/hooks.rs` matched the **bold** stamp: + +``` +r"(?m)^\*\*Last updated:\*\*\s*(\d{4}-\d{2}-\d{2})" +``` + +The producer disagrees. `cli/tri/src/nownote.rs` writes the plain form, and on +`master` the count is decisive: + +``` +$ git show origin/master:docs/NOW.md | grep -c '^\*\*Last updated:\*\*' +0 +$ git show origin/master:docs/NOW.md | grep -c '^Last updated:' +136 +``` + +Zero bold against 136 plain, so the gate always fell to its `None` branch and +bailed with "no line found". It could not pass on the one document it exists +to check. The pattern now accepts either form; `**` is optional because +archived snapshots and root `NOW.md` still carry the old bold style. + +### Why the suite was quiet about it + +Both existing `now_gate` tests write their own fixture in the bold form and +then assert the regex reads it back. The fixture matched because the same +commit authored both sides. Neither test ever saw `nownote.rs`'s output or the +real document, so a producer/consumer split was invisible. Two tests added: one +pins the plain shape `nownote.rs` emits, and one runs the gate against the real +`docs/NOW.md`, deriving the expected date with the *live* gate's own rule so +the two implementations are asserted to agree. It checks agreement, not +freshness, so it cannot go red merely because the file is a day old. + +### This one is dead code, and that is worth stating + +Nothing invokes `tri hooks now-gate` or `tri hooks pre-commit`. The gate that +actually runs is a different implementation -- `.githooks/pre-commit` calls +`scripts/tri check-now` -> `t27c check-now` in `bootstrap/src/suite.rs`, which +matches on `contains("Last updated:")` and therefore accepts the plain form. +No commit is being blocked today. It matters because `MIGRATION_AUDIT.md` +advertises `tri hooks` as the Rust port that replaces the shell gates: the +moment anything wires it up, it rejects every commit. + +### 2. `.gitattributes` described a symlink that does not exist + +The comment read "The root file is a symlink, so git merges the link target, +not the text". `git ls-tree master NOW.md` reports mode `100644` -- a regular +file; a symlink would be `120000`. Root `NOW.md` is its own divergent document +stamped 2026-08-09 while `docs/NOW.md` is stamped today. + +A second claim was backwards too: "the rule above names the SYMLINK, not the +file that actually conflicts". The pattern `NOW.md` has no slash, so git +matches it by basename at any depth -- it already covers `docs/NOW.md`, +confirmed with `git check-attr merge -- docs/NOW.md`. Comments corrected; the +`merge=union` rules themselves are unchanged and `check-attr` returns `union` +for the same three paths before and after. + +Whether root `NOW.md` should become a real symlink, be deleted, or keep its own +content is a decision left open deliberately -- #2253 stays open for it. + +### 3. `docs/NOW.md.master` was 835 lines of committed base64 + +Landed in `d063152ad`, a `.master` conflict side-file that got base64'd and +committed. Verified junk before removal: it decodes to 35,328 bytes of an +obsolete NOW snapshot stamped 2026-04-08, and +`git grep "NOW\.md\.master" origin/master` returns zero hits tree-wide. Being +base64, it was unreadable in review, ungreppable and undiffable. Removed. + +### A number in my own brief did not survive checking + +The task described "137 entries". Measured on `master` it is 136 `Last +updated:` stamps across 74 `^# NOW --` headers. Corrected everywhere rather +than repeated; the load-bearing figure for the defect is the zero, not the 136. +The existing content of this file is untouched -- this entry is a pure prepend, +so `git diff --numstat` reports 0 deleted lines for `docs/NOW.md`. + # NOW -- the workspace was throwing away a release profile, and the brief about it was measured on the wrong branch (2026-08-20) Last updated: 2026-08-20 diff --git a/docs/NOW.md.master b/docs/NOW.md.master deleted file mode 100644 index 791d64bd1..000000000 --- a/docs/NOW.md.master +++ /dev/null @@ -1,835 +0,0 @@ -WyFbUEhJIExvb3AgQ0ldKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90 -MjcvYWN0aW9ucy93b3JrZmxvd3MvcGhpLWxvb3AtY2kueW1sL2JhZGdlLnN2 -Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFn -L3QyNy9hY3Rpb25zL3dvcmtmbG93cy9waGktbG9vcC1jaS55bWwpClshW05P -VyBzeW5jIGdhdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90Mjcv -YWN0aW9ucy93b3JrZmxvd3Mvbm93LXN5bmMtZ2F0ZS55bWwvYmFkZ2Uuc3Zn -P2JyYW5jaD1tYXN0ZXIpXShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcv -dDI3L2FjdGlvbnMvd29ya2Zsb3dzL25vdy1zeW5jLWdhdGUueW1sKQpbIVtO -T1cgZG9jdW1lbnRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvTk9X -JTIwZG9jdW1lbnQtQUNUSVZFLWJyaWdodGdyZWVuKV0oaHR0cHM6Ly9naXRo -dWIuY29tL2dIYXNoVGFnL3QyNy9ibG9iL21hc3Rlci9OT1cubWQpClshW1F1 -ZWVuIGhlYWx0aF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9RdWVl -biUyMGhlYWx0aC1HUkVFTiUyMCUyRiUyMDEuMC1icmlnaHRncmVlbildKGh0 -dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90MjcvYmxvYi9tYXN0ZXIvLnRy -aW5pdHkvc3RhdGUvcXVlZW4taGVhbHRoLmpzb24pCgojIE5PVyDigJQgUm9s -bGluZyBpbnRlZ3JhdGlvbiBzbmFwc2hvdAoKKipMYXN0IHVwZGF0ZWQ6Kiog -MjAyNi0wNC0wOCDigJQgUmluZy0wNzIgR2l0SHViIFNTT1QgKyBQMiBicmFp -bi9waHlzaWNzIMK3IFBSICMzMjIsICMzMjMgwrcgUkZDMzMzOSAyMDI2LTA0 -LTA4VDAwOjAwOjAwWgoKKipEb2N1bWVudCBjbGFzczoqKiBPcGVyYXRpb25h -bCBmb2N1cyBkb2N1bWVudAoqKlJldmlzaW9uOioqICoqUDIgU3ByaW50IDEg -KyBSaW5nLTA3MioqIOKAlCA2IGJyYWluL3BoeXNpY3Mgc3BlY3MgKyA1IEdp -dEh1YiBTU09UIHNwZWNzOgotIGBzcGVjcy9icmFpbi9icmFpbi50MjdgIOKA -lCBTwrNBSSBOZXVyb2FuYXRvbXkgdjUuMSAoMjMgYnJhaW4gcmVnaW9ucykK -LSBgc3BlY3MvYnJhaW4vbmV1cmFsX2dhbW1hLnQyN2Ag4oCUIENvbnNjaW91 -c25lc3MgJiBHb2xkZW4gUmF0aW8KLSBgc3BlY3MvYnJhaW4vZ3d0X21vZGVs -LnQyN2Ag4oCUIEdsb2JhbCBXb3Jrc3BhY2UgVGhlb3J5Ci0gYHNwZWNzL3Bo -eXNpY3MvaHNsbV9iZW5jaG1hcmsudDI3YCDigJQgSFNMTSBQbGF0Zm9ybSBC -ZW5jaG1hcmsgU3VpdGUKLSBgc3BlY3MvcGh5c2ljcy9xdWFudHVtLnQyN2Ag -4oCUIFRlcm5hcnkgUXVhbnR1bSBWTQotIGBzcGVjcy9waHlzaWNzL2U4X2xx -Z19icmlkZ2UudDI3YCDigJQgRTgtUXVhbnR1bSBHcmF2aXR5IEJyaWRnZQoK -KipSaW5nLTA3MioqIOKAlCBHaXRIdWIgU1NPVCAoWmVybyBQeXRob24sIC50 -MjcgTmF0aXZlKToKLSBgc3BlY3MvZ2l0aHViL2F1dGgudDI3YCDigJQgR2l0 -SHViIGF1dGggc3BlYyArIFRERAotIGBzcGVjcy9naXRodWIvaXNzdWVzLnQy -N2Ag4oCUIElzc3VlcyBBUEkgc3BlYyArIFRERAotIGBzcGVjcy9naXRodWIv -cHJzLnQyN2Ag4oCUIFBScyBBUEkgc3BlYyArIFRERAotIGBzcGVjcy9naXRo -dWIvY29tbWVudHMudDI3YCDigJQgQ29tbWVudHMgQVBJIHNwZWMgKyBUREQK -LSBgc3BlY3MvdHJpL3N5bmMudDI3YCDigJQgU3luYyBvcmNoZXN0cmF0b3Ig -KyBUREQKLSBgYm9vdHN0cmFwL3NyYy9icmlkZ2UucnNgIOKAlCBFeHRlbmRl -ZCB3aXRoIEdpdEh1YkNvbW1hbmRzLCBnaCBDTEkgaW50ZWdyYXRpb24KCioq -UDIgU3ByaW50IDIqKiDigJQgQmVuY2htYXJrcyAmIGNvbnRyYWN0cyAoZnJv -bSB0cmluaXR5LXcxIHJld3JpdGUpOgotIGBzcGVjcy9iZW5jaG1hcmtzL3Rl -cm5hcnlfdnNfYmluYXJ5LnQyN2Ag4oCUIEZvcm1hdCBjb21wYXJpc29uIGJl -bmNobWFyawotIGBzcGVjcy9iZW5jaG1hcmtzL2JlbmNoX21haW4udDI3YCDi -gJQgTk4gaW5mZXJlbmNlIGJlbmNobWFyayAoMTAw4oaSNjTihpIxMCkKLSBg -c3BlY3MvYmVuY2htYXJrcy9iZW5jaF9ubi50MjdgIOKAlCBGb3JtYXQgY29t -cGFyaXNvbiBkZXRhaWxlZCBzcGVjCi0gYHNwZWNzL2FwaS9zZGtfY29udHJh -Y3QudDI3YCDigJQgVHJpbml0eSBTREsgaGlnaC1sZXZlbCBBUEkKLSBgc3Bl -Y3MvYXBpL2NfYXBpX2NvbnRyYWN0LnQyN2Ag4oCUIEMgQVBJIEZGSSBicmlk -Z2UgY29udHJhY3QKLSBgc3BlY3MvY29uZm9ybWFuY2UvZTJlX3NjZW5hcmlv -cy50MjdgIOKAlCBFMkUgZnVsbCBwaXBlbGluZSB2ZXJpZmljYXRpb24KClRv -dGFsOiAxOCBzcGVjcy4gQ29tbWl0cyBgYmI3MTkzOWAgKFAyKSwgYGJmZGQ0 -NjJgIChSaW5nLTA3MikuIFBScyAjMzIyLCAjMzIzLCAjMzI2IChPUEVOKS4K -CioqU3RhdHVzOioqIEFDVElWRSDigJQgcmVwbGFjZSBib2R5IG9uIGV2ZXJ5 -IHJpbmcgYm91bmRhcnkgIAoqKlF1ZWVuIGhlYWx0aDoqKiBHUkVFTiAvIDEu -MCAoYWxsIDE3IGRvbWFpbnM7IHNlYWxlZCAyMDI2LTA0LTA1VDEyOjAwWikg -4oCUICp2ZXJpZnkqIGAudHJpbml0eS9zdGF0ZS9xdWVlbi1oZWFsdGguanNv -bmAgIAoqKkNhbm9uaWNhbCBVUkw6KiogYGh0dHBzOi8vZ2l0aHViLmNvbS9n -SGFzaFRhZy90MjcvYmxvYi9tYXN0ZXIvTk9XLm1kYAoKPiAqIkEgc3BlY2lm -aWNhdGlvbiB3aXRob3V0IHRlc3RzIGlzIGEgbGllIHRvbGQgaW4gdGhlIGZ1 -dHVyZSB0ZW5zZS4iKiAgCj4g4oCUIGBTT1VMLm1kYAoKKipTeW5jIGdhdGVz -OioqIGAuZ2l0aG9va3MvcHJlLWNvbW1pdGAgYW5kICoqcGhpLWxvb3AgQ0kq -KiB1c2UgKipgLi9zY3JpcHRzL3RyaSBjaGVjay1ub3dgKiouIFRoZSBnYXRl -IGNvbXBhcmVzICoqY2FsZW5kYXIgZGF0ZSBgWVlZWS1NTS1ERGAqKiBvbiB0 -aGUgKipMYXN0IHVwZGF0ZWQqKiBsaW5lIHRvICoqeW91ciBtYWNoaW5l4oCZ -cyBsb2NhbCBkYXRlKiogd2hlbiB5b3UgcnVuIGB0cmlgIOKAlCBzbyB3cml0 -ZSAqKnlvdXIgd2FsbC1jbG9jayB0aW1lKiogaW4gdGhlIGhlYWRlciwgbm90 -IFVUQywgdW5sZXNzIHlvdSBhcmUgaW4gVVRDLgoKLS0tCgojIyDCpyAxICBQ -dXJwb3NlIGFuZCBzY29wZQoKVGhpcyBkb2N1bWVudCBpcyB0aGUgKipzaW5n -bGUgcm9sbGluZyBzbmFwc2hvdCoqIG9mIHdoYXQgaXMgYmVpbmcgd29ya2Vk -IG9uICpyaWdodCBub3cqLiAgCkl0IGlzICoqbm90KiogYSByb2FkbWFwICji -hpIgYFtkb2NzL1JPQURNQVAubWRdKGRvY3MvUk9BRE1BUC5tZClgLCBpc3N1 -ZSBbIzEyNl0oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1 -ZXMvMTI2KSksICAKKipub3QqKiBhIHJpbmcgbG9nICjihpIgYC50cmluaXR5 -L2V4cGVyaWVuY2UvY2xhcmFfdHJhY2sxLmpzb25sYCksICAKYW5kICoqbm90 -KiogYSBkZXNpZ24gc3BlY2lmaWNhdGlvbiAo4oaSIGBzcGVjcy9gKS4KCioq -Q29vcmRpbmF0aW9uOioqIEZvcm1lciByb290ICoqYFRBU0subWRgKiogaXMg -cmV0aXJlZCDigJQgdGhpcyBmaWxlIGlzIHRoZSAqKnNpbmdsZSoqIHJvbGxp -bmcgc25hcHNob3QgKiphbmQqKiBjb29yZGluYXRpb24gZW50cnlwb2ludC4g -KipQcm90b2NvbDoqKiBbYGRvY3MvY29vcmRpbmF0aW9uL1RBU0tfUFJPVE9D -T0wubWRgXShkb2NzL2Nvb3JkaW5hdGlvbi9UQVNLX1BST1RPQ09MLm1kKS4g -KipBbmNob3I6KiogWyMxNDFdKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRh -Zy90MjcvaXNzdWVzLzE0MSkgKGxvY2tzLCBoYW5kb2ZmcywgUFIgbGlua3Mp -LgoKKipSZXBsYWNlIHRoaXMgZmlsZeKAmXMgYm9keSBhdCBldmVyeSByaW5n -IGJvdW5kYXJ5LioqICAKU3RhbGUgY29udGVudCBoZXJlIGlzIGEgcXVhbGl0 -eSBkZWZlY3Qg4oCUIHRyZWF0IGl0IGFzIGEgZmFpbGluZyB0ZXN0LgoKKipT -Y2llbmNlIOKGlCBvcHM6KiogVHJlYXQgKipOT1cqKiBhcyB0aGUgbGl2ZSAq -KnN0cnVjdHVyZWQgYWJzdHJhY3QgKyBtZXRob2RzIGxvZyoqIChjb250ZXh0 -LCBzdGF0ZSwgZ2FwLCBuZXh0IGFjdGlvbnMpOyBvbiBlYWNoIHJpbmcgYm91 -bmRhcnksIGZyZWV6ZS9leHBvcnQgZm9yIGxvbmdlciBJTVJhRC1zdHlsZSBy -ZXBvcnRzIHdpdGhvdXQgZHVwbGljYXRpbmcgU1NPVCDigJQgc2VlIGBbUkVT -RUFSQ0hfV1JJVElOR19UMjcubWRdKGRvY3MvUkVTRUFSQ0hfV1JJVElOR19U -MjcubWQpYCBhbmQgYFtTQ0lFTkNFLU9QUy1EVUFMLVRSQUNLLVNZTlRIRVNJ -Uy5tZF0oZG9jcy9TQ0lFTkNFLU9QUy1EVUFMLVRSQUNLLVNZTlRIRVNJUy5t -ZClgLgoKIyMjIMKnIDEuMSAgQWdlbnQgaGFuZG9mZiDigJQgdGFsayB0byB0 -aGUgbmV4dCBhZ2VudCAvIFF1ZWVuIHZpYSBOT1cKCioqQ2Fub25pY2FsIFVS -TCAoU1NPVCBmb3IgaHVtYW5zICsgYWdlbnRzKToqKiAgCmBodHRwczovL2dp -dGh1Yi5jb20vZ0hhc2hUYWcvdDI3L2Jsb2IvbWFzdGVyL05PVy5tZGAKCldo -ZW4geW91ICoqY29tcGxldGUgYSBub24tdHJpdmlhbCB0YXNrKiogKGNvZGUs -IHNwZWNzLCBDSSwgc2VhbHMsIGFyY2hpdGVjdHVyZSBkb2NzKSwgKip1cGRh -dGUgYE5PVy5tZGAgYmVmb3JlIHlvdSBzdG9wKio6CgoxLiBSZWZyZXNoICoq -YExhc3QgdXBkYXRlZDpgKiogKGNhbGVuZGFyICoqYFlZWVktTU0tRERgKiog -bXVzdCBtYXRjaCAqKnRvZGF5KiogZm9yIGAuL3NjcmlwdHMvdHJpIGNoZWNr -LW5vd2A7IGtlZXAgKipsb2NhbCB3YWxsIHRpbWUqKiArICoqUkZDMzMzOSB3 -aXRoIG9mZnNldCoqIGFzIGluIHRoZSBoZWFkZXIgdGVtcGxhdGUpLgoyLiBG -aXggKirCpyAzKiogc3RhdGUsICoqY3JpdGljYWwgZ2FwKiosICoqbGlua3Mq -Kiwgb3IgKiptaWxlc3RvbmUgbm90ZXMqKiBzbyB0aGUgKipuZXh0IGFnZW50 -KiogcmVhZHMgKipjdXJyZW50IHRydXRoKiosIG5vdCB5ZXN0ZXJkYXnigJlz -IHN0b3J5LgozLiAqKkNvbW1pdCBgTk9XLm1kYCBpbiB0aGUgc2FtZSBQUioq -IGFzIHRoZSB3b3JrIChvciBhbWVuZCksIHBlciBSaW5nIDAzMyAvIFsjMTQx -XShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L2lzc3Vlcy8xNDEp -LgoKCioqU2tpcHBpbmcgdGhpcyBpcyBhIGZhaWxlZCBoYW5kb2ZmKiog4oCU -IHRoZSBmbGVldCBjb29yZGluYXRlcyBoZXJlLCBub3Qgb25seSBpbiBpc3N1 -ZXMuCgojIyMgwqcgMS4yICBDYW5vbmljYWwgaXRlcmF0aW9uIHNjaGVtYQoK -KldoZW4gcmVjb3JkaW5nIHdvcmsgaXRlcmF0aW9ucyAoUEhJIExPT1AgY3lj -bGVzKSwgdXNlIHRoaXMgc2NoZW1hOioKCmBgYG1hcmtkb3duCiMjIEl0ZXJh -dGlvbiA8Tj4KLSAqKkdvYWwqKjogPHNpbmdsZSBjYXBhYmlsaXR5LCBvbmUg -c2VudGVuY2U+Ci0gKipTcGVjIGRlbHRhKio6IDx3aGljaCAudDI3IHNwZWMg -Y2hhbmdlZD4KLSAqKkdlbmVyYXRlZCBhcnRpZmFjdHMqKjogPHppZy92ZXJp -bG9nL2Mgb3V0cHV0cz4KLSAqKlRlc3RzKio6IDx0ZXN0L2ludmFyaWFudC9i -ZW5jaCBleGVjdXRlZD4KLSAqKlNlYWwqKjogPGhhc2ggb3IgUEVORElORz4K -LSAqKlZlcmRpY3QqKjogQ0xFQU4gfCBUT1hJQwotICoqTmV4dCBjb25zdHJh -aW50Kio6IDxzaW5nbGUgbmV4dCBib3R0bGVuZWNrPgpgYGAKCipUaGlzIGFs -aWducyB3aXRoIFBISSBMT09QICjCpzQpIGFuZCBJU1NVRS1HQVRFIGxhd3Mg -KEwx4oCTTDcpLioKCioqQ29uZmxpY3QgUHJldmVudGlvbiAoUmluZyA0Nysp -OioqCi0gKipSb290IGBOT1cubWRgIGlzIGEgc3ltbGluayoqIHRvIGBkb2Nz -L05PVy5tZGAg4oCUIHByZXZlbnRzIGRpdmVyZ2VuY2UKLSAqKmAudHJpbml0 -eS9leHBlcmllbmNlLyouanNvbmxgIGFyZSBub3QgdHJhY2tlZCoqIOKAlCBs -b2NhbC1vbmx5IGFwcGVuZCBsb2dzCi0gKipgLmdpdGF0dHJpYnV0ZXNgIG1l -cmdlIGRyaXZlcnMqKiDigJQgYXV0by1yZXNvbHZlIGFwcGVuZC1vbmx5IGNv -bmZsaWN0cwotIEVkaXQgb25seSBgZG9jcy9OT1cubWRgOyByb290IGBOT1cu -bWRgIGZvbGxvd3MgYXV0b21hdGljYWxseQoKCioqUmVjZW50IG1ldGhvZG9s -b2d5IGRvY3MgKGtlcm5lbCArIGV4cGVyaWVuY2UgKyBmb3JtYWwgKyBzY2ll -bmNlL29wcyk6KiogIApgW0tFUk5FTF9BWElPTVNfQU5EX0FHRU5UX0VYUEVS -SUVOQ0VfUFJPVE9DT0wubWRdKGRvY3MvS0VSTkVMX0FYSU9NU19BTkRfQUdF -TlRfRVhQRVJJRU5DRV9QUk9UT0NPTC5tZClgIMK3IGBbS0VSTkVMLVBMQU4t -TVVMVEktTU9ERUwtU1lOVEhFU0lTLm1kXShkb2NzL0tFUk5FTC1QTEFOLU1V -TFRJLU1PREVMLVNZTlRIRVNJUy5tZClgIMK3IGBbU0NJRU5DRS1PUFMtRFVB -TC1UUkFDSy1TWU5USEVTSVMubWRdKGRvY3MvU0NJRU5DRS1PUFMtRFVBTC1U -UkFDSy1TWU5USEVTSVMubWQpYCDCtyBgW1JFU0VBUkNIX1dSSVRJTkdfVDI3 -Lm1kXShkb2NzL1JFU0VBUkNIX1dSSVRJTkdfVDI3Lm1kKWAgwrcgYFtUUklO -SVRZLUVYUEVSSUVOQ0UtRVhDSEFOR0UtQVJDSElURUNUVVJFLm1kXShkb2Nz -L1RSSU5JVFktRVhQRVJJRU5DRS1FWENIQU5HRS1BUkNISVRFQ1RVUkUubWQp -YCDCtyBgW1QyN19LRVJORUxfRk9STUFMX0NPUS5tZF0oZG9jcy9UMjdfS0VS -TkVMX0ZPUk1BTF9DT1EubWQpYCDCtyBgW0NPTVBJTEVSX1ZFUklGSUNBVElP -Tl9TVEFOREFSRFMubWRdKGRvY3MvQ09NUElMRVJfVkVSSUZJQ0FUSU9OX1NU -QU5EQVJEUy5tZClgIChkZWVwIG1hcCArIHJpbmcgcGxhbjsgaW5kZXggYFtD -T01QSUxFUl9WRVJJRklDQVRJT05fTEFORFNDQVBFX0FORF9UMjdfUExBTi5t -ZF0oZG9jcy9DT01QSUxFUl9WRVJJRklDQVRJT05fTEFORFNDQVBFX0FORF9U -MjdfUExBTi5tZClgOyBSVSBpbXBhY3QgYFtDT01QSUxFUl9WRVJJRklDQVRJ -T05fSU1QQUNUX1JVLm1kXShkb2NzL0NPTVBJTEVSX1ZFUklGSUNBVElPTl9J -TVBBQ1RfUlUubWQpYDsgVE9SL1RWUCBgW3F1YWxpZmljYXRpb24vXShkb2Nz -L3F1YWxpZmljYXRpb24vKWA7IHRlbXBsYXRlIGBbdGVtcGxhdGVzL1RPT0xf -UVVBTElGSUNBVElPTl9TS0VUQ0hfRE8zMzAubWRdKGRvY3MvdGVtcGxhdGVz -L1RPT0xfUVVBTElGSUNBVElPTl9TS0VUQ0hfRE8zMzAubWQpYCkgwrcgcmVw -byBgW2NvcS9dKGNvcS8pYCAoUm9jcS9Db3Egc2NhZmZvbGQ7IHdvcmtmbG93 -IGAuZ2l0aHViL3dvcmtmbG93cy9jb3Eta2VybmVsLnltbGApCgotLS0KCiMj -IMKnIDIgIEludmFyaWFudCBsYXcgKG5ldmVyIGNoYW5nZXMpCgoKfCBMYXcg -ICAgICAgICAgICAgICAgICB8IFN0YXRlbWVudCAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVuZm9yY2VtZW50ICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgKipJU1NVRS1H -QVRFKiogICAgICAgfCBObyBjb2RlIG1lcmdlZCB3aXRob3V0IGBDbG9zZXMg -I05gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgfCBgLmdpdGh1Yi93b3JrZmxvd3Mv -aXNzdWUtZ2F0ZS55bWxgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIHwKfCAqKk5PLUhBTkQtRURJVC1HRU4qKiB8IEZpbGVzIHVuZGVy -IGBnZW4vYCBhcmUgZ2VuZXJhdGVkOyBlZGl0IHRoZSBgLnQyN2Agc3BlYyBp -bnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 -IGAuL2Jvb3RzdHJhcC90YXJnZXQvcmVsZWFzZS90MjdjIC0tcmVwby1yb290 -IC4gdmFsaWRhdGUtZ2VuLWhlYWRlcnNgIChvciBgLi9zY3JpcHRzL3RyaSB2 -YWxpZGF0ZS1nZW4taGVhZGVyc2ApICAgfAp8ICoqU09VTC1BU0NJSSoqICAg -ICAgIHwgQWxsIGAudDI3YCAvIGAuemlnYCAvIGAudmAgLyBgLmNgIHNvdXJj -ZSDigJQgQVNDSUktb25seSBpZGVudGlmaWVycyAmIGNvbW1lbnRzICAgICAg -ICAgICAgICAgICAgICAgICAgfCBgU09VTC5tZGAsIEFEUi0wMDQgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -IHwKfCAqKlRERC1NQU5EQVRFKiogICAgICB8IEV2ZXJ5IGAudDI3YCBzcGVj -IG11c3QgY29udGFpbiBgdGVzdGAgLyBgaW52YXJpYW50YCAvIGBiZW5jaGAg -4oCUICoqRU5GT1JDRUQqKiAoUmluZyAwMzcg4pyFKSAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICB8IGBTT1VMLm1kIEFydGljbGUgSUlg -LCBgYm9vdHN0cmFwL3NyYy9jb21waWxlci5yczp2YWxpZGF0ZV9zb3VsX2Nv -bXBsaWFuY2UoKWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgIHwKfCAqKlBISS1JREVOVElUWSoqICAgICB8ICoqSzIgY29y -ZToqKiBcKFx2YXJwaGleMiA9IFx2YXJwaGkgKyAxXCkgb24gXChcbWF0aGJi -e1J9XCk7ICoqY29uc2VxdWVuY2UqKiBcKFx2YXJwaGleMitcdmFycGhpXnst -Mn09M1wpOyAqKklFRUUgYGY2NGAqKiBjaGVja3MgdXNlICoqdG9sZXJhbmNl -KiogKG5vdCBleGFjdCBlcXVhbGl0eSkgfCBgW05VTUVSSUMtQ09SRS1QQUxF -VFRFLVJFR0lTVFJZLm1kXShkb2NzL25vbmEtMDItb3JnYW5pc20vTlVNRVJJ -Qy1DT1JFLVBBTEVUVEUtUkVHSVNUUlkubWQpYCwgYHNwZWNzL21hdGgvY29u -c3RhbnRzLnQyN2AgfAp8ICoqVFJJTklUWS1TQUNSRUQqKiAgIHwgYGNvbmZv -cm1hbmNlL0ZPUk1BVC1TUEVDLTAwMS5qc29uYCArIGBzcGVjcy9udW1lcmlj -L2dmMTYudDI3YCBhcmUgdGhlIG51bWVyaWMgY2VpbGluZyAgICAgICAgICAg -ICAgIHwgU1NPVDogbmV2ZXIgZm9ya2VkICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgKipOTy1ORVct -U0hFTEwqKiAgICAgfCBObyBuZXcgYCouc2hgIG9uIHRoZSBjcml0aWNhbCBw -YXRoIGZvciB2YWxpZGF0aW9uIC8gZ2VuIC8gZGF0YSAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgIHwgKipTT1VMLm1kKiogQXJ0aWNsZSBW -SUlJOyBgdDI3Y2AgKyBQeXRob247IGB0cmlgICsgYHNldHVwLWdpdC1ob29r -cy5zaGAgb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICB8CgoKLS0tCgojIyDCpyAzICBTeXN0ZW0gc3RhdGUgKG5hcnJh -dGl2ZSBzZWFsIMK3IDIwMjYtMDQtMDY7IHZlcmlmeSBgLnRyaW5pdHkvYCAr -IENJKQoKIyMjIDMuMSAgU2VhbGVkIGFydGlmYWN0cwoKCnwgQXJ0aWZhY3Qg -ICAgICAgICAgICAgfCBDb3VudCAvIHZlcnNpb24gICAgICAgICAgICAgICAg -ICAgICAgICB8IExhc3QgcmluZyAgfCBWZXJkaWN0ICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0t -LS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwK -fCBgLnQyN2Agc3BlY3MgICAgICAgICB8IDQ4IGZpbGVzICoocmluZyBuYXJy -YXRpdmUpKiAgICAgICAgICAgIHwgUmluZyAwNzIgICB8IDQ4LzQ4IHBhcnNl -IFBBU1MgICAgICAgICAgICAgICAgICAgICB8CnwgYGdlbi96aWcvYCAgICAg -ICAgICAgfCA1MiBmaWxlcyAqKHJpbmcgbmFycmF0aXZlKSogICAgICAgICAg -ICB8IFJpbmcgNDMgICAgfCBnZW5lcmF0ZWQsIGNvbXBpbGUtY2hlY2tlZCAg -ICAgICAgICAgfAp8IGBjb25mb3JtYW5jZS9gIEpTT04gIHwgNjIgZmlsZXMg -KihyaW5nIG5hcnJhdGl2ZSkqICAgICAgICAgICAgfCBSaW5nIDQ0ICAgIHwg -c2NoZW1hIHYxICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBgc3Rh -Z2UwL0ZST1pFTl9IQVNIYCB8IFNIQS0yNTYgb2YgYGJvb3RzdHJhcC9zcmMv -Y29tcGlsZXIucnNgIHwgZ2VuZXNpcyAgICB8IGltbXV0YWJsZSAqKGlmIHBy -ZXNlbnQgaW4gY2hlY2tvdXQpKiB8CnwgRXhwZXJpZW5jZSBsb2cgICAgICAg -fCA0NSBlbnRyaWVzICoocmluZyBuYXJyYXRpdmUpKiAgICAgICAgICB8IFJp -bmcgNDUgICAgfCBhbGwgYHZlcmRpY3Q6IGNsZWFuYCAgICAgICAgICAgICAg -ICAgfAp8IFF1ZWVuIGhlYWx0aCAgICAgICAgIHwgMS4wIC8gR1JFRU4gICAg -ICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDI2LTA0LTA1IHwgMTcvMTcg -ZG9tYWlucyAgICAgICAgICAgICAgICAgICAgICAgIHwKCgoqKipSZS1zY2Fu -IGJlZm9yZSBldmVyeSBjb21taXQgKGRvIG5vdCB0cmVhdCBzdGFsZSBjb3Vu -dHMgYXMgU1NPVCk6KioqCgpgYGBiYXNoCmZpbmQgc3BlY3MgLW5hbWUgIiou -dDI3IiB8IHdjIC1sCmZpbmQgZ2VuL3ppZyAtbmFtZSAiKi56aWciIHwgd2Mg -LWwKZmluZCBjb25mb3JtYW5jZSAtbmFtZSAiKi5qc29uIiB8IHdjIC1sCmBg -YAoKVGhlICoqdGFibGUgY291bnRzKiogYWJvdmUgYXJlICpyaW5nIG5hcnJh -dGl2ZSogc25hcHNob3RzOyByZWZyZXNoIHRoZW0gd2hlbiB5b3Ugc2VhbCBh -IHJpbmcuCgojIyMgMy4yICBFMkUgY29tcGlsZXIgbG9vcCAoIzE1MCBjbG9z -ZWQpCgpgYGAKYm9vdHN0cmFwL3NyYy9jb21waWxlci5ycyAg4pSA4pSA4pSA -IHBhcnNlIC8gZ2VuIOKUgOKUgOKGkiAgQVNUIC8gZW1pdAogICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSC -CiAgICAgICAgICAgICAgICAgICAgICAgICBDSSBFMkUgREVNT05TVFJBVEVE -OiAgICAgICAg4pSCCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkLnQy -NyDihpIgdDI3YyBnZW4g4oaSIHppZyB0ZXN0IOKGkiBHUkVFTgogICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -4pSCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICBnZW4vemlnLyouemlnICAoZnJvbSB0MjdjLCBub3QgaGFuZC13cml0 -dGVuKQpgYGAKCioqVGhlIFJ1c3QgYm9vdHN0cmFwKiogKGB0MjdjIHBhcnNl -YCwgYHQyN2MgZ2VuYCwgYHQyN2MgY29tcGlsZWAsIGB0MjdjIHN1aXRlYCkg -KipleGlzdHMqKi4KKipUaGUgY2xvc2VkIGxvb3AqKiBgc2VlZC50Mjcg4oaS -IHQyN2MgZ2VuIOKGkiBvdXRwdXQuemlnIOKGkiB6aWcgdGVzdCDihpIgR1JF -RU5gIGhhcyBiZWVuICoqZGVtb25zdHJhdGVkIGVuZC10by1lbmQqKiBpbiBg -cGhpLWxvb3AtY2kueW1sYCB3aXRoICoqWmlnIDAuMTMuMCoqIGFuZCAqKnNl -ZWQudDI3KiogZ29sZGVuIHNwZWMuCioqRTJFIHN0YXR1czoqKiAqKkRFTU9O -U1RSQVRFRCoqIOKAlCBQUiBgZmVhdC9yaW5nLTA1MS1qb25lcy1wb2x5bm9t -aWFsLWNsZWFuYCAocnVuIDI0MDQ1ODIyMDcyKSB3aXRoICoqYENsb3NlcyAj -MTUwYCoqIHBlciAqKklTU1VFLUdBVEUqKi4KCioqVFYgcmVmZXJlbmNlIChb -YHF1YWxpZmljYXRpb24vVFZQLm1kYF0oZG9jcy9xdWFsaWZpY2F0aW9uL1RW -UC5tZCkpOioqICoqVFYtMDEqKiAoYHRyaSB0ZXN0YCAvIHN1aXRlIG9uIGdv -bGRlbiBzbmFwc2hvdCkg4oCUICoqUEFTUyoqICg2MyBzcGVjcykgwrcgKipU -Vi0wMioqIChyZWdlbiArIGJsZXNzZWQgaGFzaCBvZiBgZ2VuL2ApIOKAlCAq -KlBBU1MqKiAoNjMgc2VhbHMgY3VycmVudCkKCioqSzIgZmFzdCBwYXRoIChi -aW5hcnk2NCk6KiogRm9yIHRoZSBJRUVFIGxpdGVyYWwgb2YgXChcdmFycGhp -XCksICoqYGZsKM+GwrfPhilgKiogYW5kICoqYGZsKM+GKzEuMClgKiogYXJl -ICoqYml0LWlkZW50aWNhbCoqIChgMHg0MDA0RjFCQkNEQ0JGQTU0YCkuIFNv -ICoqYHBoaV9pZGVudGl0eV9jb250cmFjdGAqKiBpbiBgY29xL0tlcm5lbC9Q -aGlGbG9hdC52YCBpcyAqKmBSYWJzKDApIDwgcGhpX3RvbGVyYW5jZWAqKiAo -dHJpdmlhbCByZXNpZHVhbCkuIE1hbnRpc3NhIC8gZXhwb25lbnQgZm9yIEZs -b2NxOiAqKmA3Mjg2OTc3MjY4ODA2ODI0YCoqLCBleHAgKipgLTUyYCoqIOKA -lCBjcm9zcy1jaGVjayB3aXRoICoqYHQyN2MgdmFsaWRhdGUtcGhpYCoqIChv -ciAqKmAuL3NjcmlwdHMvdHJpIHZhbGlkYXRlLXBoaWAqKikuIFNwZWM6IFtg -UEhJX0lERU5USVRZX0ZMT0NRX0JSSURHRV9TUEVDLm1kYF0oZG9jcy9ub25h -LTAzLW1hbmlmZXN0L1BISV9JREVOVElUWV9GTE9DUV9CUklER0VfU1BFQy5t -ZCkgwrcgdGFzayBhbmNob3I6IFtgUEhBU0VfQl9GTE9DUV9BR0VOVF9UQVNL -Lm1kYF0oZG9jcy9ub25hLTAzLW1hbmlmZXN0L1BIQVNFX0JfRkxPQ1FfQUdF -TlRfVEFTSy5tZCkuCgoqKk9wdGlvbmFsIGZvcm1hbCB0cmFjazoqKiBgW2Nv -cS9dKGNvcS8pYCArIGBbVDI3X0tFUk5FTF9GT1JNQUxfQ09RLm1kXShkb2Nz -L1QyN19LRVJORUxfRk9STUFMX0NPUS5tZClgIOKAlCBSb2NxL0NvcSBzY2Fm -Zm9sZCBmb3IgKipLMeKAk0s0KiogKG5vdCBLNS9LNik7IENJIGAuZ2l0aHVi -L3dvcmtmbG93cy9jb3Eta2VybmVsLnltbGAgd2hlbiAqKmBjb3EvKipgKiog -Y2hhbmdlcy4gIAoqKksyIC8gUEhJLUlERU5USVRZIChzdW1tYXJ5KToqKiBg -S2VybmVsL1BoaS52YCDigJQgYENvcS5SZWFsc2AgKCoqYHBoaV9zcXVhcmVk -X2lkZW50aXR5YCoqLCAqKmBwaGlfdG9sZXJhbmNlYCoqKS4gYEtlcm5lbC9Q -aGlGbG9hdC52YCDigJQgRmxvY3EgKipgYmluYXJ5NjRgKiosICoqYHBoaV9p -ZGVudGl0eV9jb250cmFjdGAqKi4gQmFsYW5jZWQgdGVybmFyeSAvIHJhZGl4 -IGVjb25vbXkgY29udGV4dDogWyMxMzhdKGh0dHBzOi8vZ2l0aHViLmNvbS9n -SGFzaFRhZy90MjcvaXNzdWVzLzEzOCksIFsjMTQyXShodHRwczovL2dpdGh1 -Yi5jb20vZ0hhc2hUYWcvdDI3L2lzc3Vlcy8xNDIpLiAgCioqQ2VydGlmaWNh -dGlvbiAvIGV2aWRlbmNlIHZvY2FidWxhcnk6KiogYFtDT01QSUxFUl9WRVJJ -RklDQVRJT05fU1RBTkRBUkRTLm1kXShkb2NzL0NPTVBJTEVSX1ZFUklGSUNB -VElPTl9TVEFOREFSRFMubWQpYCDigJQgKipETy0xNzhDIC8gRE8tMzMwIC8g -RE8tMzMzKiosIElTTyAyNjI2MiAoVENMKSwgSUVDIDYxNTA4IChUMeKAk1Qz -KSwgRU4gNTA3MTYsIEVDU1MtUS1TVC04MEMsIElFQyA2MjMwNCwgSUVFRSAx -MDEyLCBOSVNUIFNTREYsIENvbXBDZXJ0L0Nha2VNTC9BbGl2ZTIvRmxvY3Es -IFRWQ1AgKipUVi0wMeKAk1RWLTA3KiosIHBoYXNlZCBwbGFuLiBRdWljayBp -bmRleDogYFtDT01QSUxFUl9WRVJJRklDQVRJT05fTEFORFNDQVBFX0FORF9U -MjdfUExBTi5tZF0oZG9jcy9DT01QSUxFUl9WRVJJRklDQVRJT05fTEFORFND -QVBFX0FORF9UMjdfUExBTi5tZClgLiBEcmFmdCAqKlRPUi9UVlA6KiogYFtx -dWFsaWZpY2F0aW9uL1RPUi5tZF0oZG9jcy9xdWFsaWZpY2F0aW9uL1RPUi5t -ZClgLCBgW3F1YWxpZmljYXRpb24vVFZQLm1kXShkb2NzL3F1YWxpZmljYXRp -b24vVFZQLm1kKWAuCgojIyMgMy4zICBDb21waWxlciB2ZXJpZmljYXRpb24g -4oCUIGltcGFjdCBkaWdlc3QgKHRydXN0IGluIGB0MjdjYCkKCioqUXVlc3Rp -b24gdGhlIHN0YW5kYXJkcyBwYWNrIGFuc3dlcnM6KiogaG93IHdlICoqanVz -dGlmeSB0cnVzdCoqIGluICoqYHQyN2NgKiogYXMgYSBjb2RlIGdlbmVyYXRv -ciAoYW5kIGluICoqYGNvcWNgKiogYXMgcHJvb2YtY2hlY2tpbmcgdG9vbGlu -ZykgdXNpbmcgdGhlIHNhbWUgdm9jYWJ1bGFyeSByZWd1bGF0b3JzIHVzZSAo -dG9vbCBxdWFsaWZpY2F0aW9uLCBWJlYsIGZvcm1hbCBtZXRob2RzKS4KCioq -V2h5IGl0IG1hdHRlcnMgZm9yIFQyNyoqCgotICoqRE8tMzMwIC8gSVNPIDI2 -MjYyIC8gSUVDIDYxNTA4KiogYWxsIGZvcmNlIHRoZSBzYW1lIGRpc2NpcGxp -bmU6IGlmIGEgdG9vbCAqKndyaXRlcyoqIHByb2R1Y3QgY29kZSBvciAqKnJl -cGxhY2VzKiogdmVyaWZpY2F0aW9uLCBpdHMgZmFpbHVyZXMgbXVzdCBiZSAq -KmNvbnRyb2xsZWQqKiB3aXRoIGV2aWRlbmNlIChUT1IvVFZQL1RWQ1AvVFZS -L1RBUyBpbiBhdmlhdGlvbi1zaGFwZWQgcHJvZ3JhbXMpLiAgCi0gKipETy0x -NzhDKiogYWxpZ25zIHdpdGggcmVwbyBsYXc6ICoqYFRERC1NQU5EQVRFYCoq -IOKJiCByZXF1aXJlbWVudHMtYmFzZWQgdGVzdGluZyBtaW5kc2V0OyAqKmBJ -U1NVRS1HQVRFYCoqIOKJiCB0cmFjZWFiaWxpdHkgb2YgY2hhbmdlIHRvIHRy -YWNrZWQgd29yay4gIAotICoqRE8tMzMzKiogaXMgdGhlIHNsb3QgZm9yICoq -YGNvcS9gKiogKHRoZW9yZW0gcHJvdmluZyk7ICoqSzIqKiBpcyBwcm92ZWQg -b24gKipgUmVhbHNgKiogaW4gYFBoaS52YDsgKipgUGhpRmxvYXQudmAqKiBn -aXZlcyB0aGUgKipgZjY0YCoqIEZsb2NxIG1vZGVsICsgKipgcGhpX2lkZW50 -aXR5X2NvbnRyYWN0YCoqIChjb21wdXRhdGlvbmFsIGJyaWRnZTsgZGVlcGVy -IGVycm9yIGxlbW1hcyDihpIgbGF0ZXIgcmluZykuICAKLSAqKklFRUUgMTAx -Mi1zdHlsZSBWJlYgcGxhbm5pbmcqKiBpbXBsaWVzIGdlbmVyYXRvciBhc3N1 -cmFuY2Ugc2hvdWxkIGJlICoqY29tbWVuc3VyYXRlKiogd2l0aCB0aGUgaW50 -ZWdyaXR5IG9mIHRoZSBzb2Z0d2FyZSB0aGUgZ2VuZXJhdG9yIGFmZmVjdHMg -4oCUICoqYE5PLUhBTkQtRURJVC1HRU5gKiogZW5mb3JjZXMgU1NPVCBvbiAq -KmAudDI3YCoqLCBub3QgaGFuZCBwYXRjaGVzIGluICoqYGdlbi9gKiouICAK -LSAqKk5JU1QgU1NERioqIGFsaWducyB3aXRoICoqcGlubmVkIHRvb2xjaGFp -bnMqKiwgKipgRlJPWkVOX0hBU0hgKiosIGFuZCBhcHBlbmQtb25seSAqKmV4 -cGVyaWVuY2UqKiBsb2dzLgoKKipDSSBmb2xsb3ctdXA6KiogKipgcGhpLWxv -b3AtY2kueW1sYCoqIG11c3Qgc3RheSAqKnZhbGlkIEFjdGlvbnMgWUFNTCoq -IChldmVyeSBzdGVwIG5lZWRzICoqYHJ1bjpgKiogb3IgKipgdXNlczpgKiop -LiBBbiBlbXB0eSBzdGVwIHdpdGggb25seSAqKmBuYW1lOmAqKiBwcmV2ZW50 -cyB0aGUgd29ya2Zsb3cgZnJvbSBsb2FkaW5nIChmaXhlZCBhZnRlciBtZXJn -ZSBvZiAqKiMxNTIqKikuICoqRTJFKiogcmVtYWlucyAqKmBzZWVkLnQyNyDi -hpIgdDI3YyBnZW4g4oaSIHppZyB0ZXN0YCoqIG9uICoqYHB1c2hgL2BwdWxs -X3JlcXVlc3RgKiogdG8gKipgbWFzdGVyYCoqIOKAlCB0cmFjayByZWdyZXNz -aW9ucyB2aWEgdGhlICoqUEhJIExvb3AgQ0kqKiBiYWRnZS4KCioqUnVzc2lh -biBmdWxsIG5hcnJhdGl2ZSAoaW1wYWN0IHBlciBzZWN0aW9uKToqKiBgW0NP -TVBJTEVSX1ZFUklGSUNBVElPTl9JTVBBQ1RfUlUubWRdKGRvY3MvQ09NUElM -RVJfVkVSSUZJQ0FUSU9OX0lNUEFDVF9SVS5tZClgIOKAlCBhbGxvd2xpc3Rl -ZCBDeXJpbGxpYyBjb21wYW5pb247ICoqRW5nbGlzaCBTU09UKiogcmVtYWlu -cyBgW0NPTVBJTEVSX1ZFUklGSUNBVElPTl9TVEFOREFSRFMubWRdKGRvY3Mv -Q09NUElMRVJfVkVSSUZJQ0FUSU9OX1NUQU5EQVJEUy5tZClgLgoKLS0tCgoj -IyDCpyA0ICBBY3RpdmUgR2l0SHViIG1pbGVzdG9uZQoKKipbRVBPQ0gtMDEt -SEFSREVOXShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L21pbGVz -dG9uZS8xKSoqIOKAlCBSaW5ncyAwMzLigJMwNDkKCgp8IElzc3VlICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmlu -ZyB8IERvbWFpbiAgICAgICB8IFRpdGxlICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLSB8IC0tLS0t -LS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0gfAp8IFsjMTI3XShodHRwczovL2dpdGh1Yi5jb20vZ0hh -c2hUYWcvdDI3L2lzc3Vlcy8xMjcpIHwgMDMyICB8IFRvb2xpbmcgICAgICB8 -IGBOT1cubWRgIChyb290KSArIGl0ZXJhdGlvbiBzY2hlbWEgICAgICAgICAg -ICAgICAgICAgfAp8IFsjMTI4XShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hU -YWcvdDI3L2lzc3Vlcy8xMjgpIHwgMDMzICB8IENJICAgICAgICAgICB8IElz -c3VlLWdhdGUgZW5mb3JjZW1lbnQg4oCUIGV2ZXJ5IFBSIGBDbG9zZXMgI05g -ICB8CnwgWyMxMjldKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90Mjcv -aXNzdWVzLzEyOSkgfCAwMzQgIHwgTnVtZXJpY3MgICAgIHwgR29sZGVuRmxv -YXQgYmVuY2htYXJrIHNwZWMgKE5NU0UgdnMgYmZsb2F0MTYpICB8CnwgWyMx -MzBdKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90MjcvaXNzdWVzLzEz -MCkgfCAwMzUgIHwgQXJjaGl0ZWN0dXJlIHwgYFRFQ0hOT0xPR1ktVFJFRS5t -ZGAg4oCUIHJpbmcgREFHIHRvIDk5OSAgICAgICAgIHwKfCBbIzEzMV0oaHR0 -cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTMxKSB8IDAz -NiAgfCBDSSAgICAgICAgICAgfCBTZWFsIGNvdmVyYWdlIOKAlCBibG9jayBQ -UnMgd2l0aCBtaXNzaW5nIFNIQS0yNTYgfAp8IFsjMTMyXShodHRwczovL2dp -dGh1Yi5jb20vZ0hhc2hUYWcvdDI3L2lzc3Vlcy8xMzIpIHwgMDM3ICB8IExh -bmd1YWdlICAgICB8IFNPVUwubWQgcGFyc2VyIGVuZm9yY2VtZW50IChPUEVO -IFBSICMxOTAsIENJIGJsb2NraW5nIG9uIGNvbXBpbGVyIG1ldGEtc3BlY3Mp -IHwKfCBbIzEzM10oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9p -c3N1ZXMvMTMzKSB8IDAzOCAgfCBDb25mb3JtYW5jZSAgfCBDb25mb3JtYW5j -ZSB2ZWN0b3Igc2NoZW1hIHYyICAgICAgICAgICAgICAgICAgIHwKfCBbIzEz -NF0oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTM0 -KSB8IDAzOSAgfCBTY2llbmNlICAgICAgfCBDTEFSQSAvIERBUlBBIFRBMeKA -k1RBMiBzdWJtaXNzaW9uIGNoZWNrbGlzdCAgICAgfAp8IFsjMTM1XShodHRw -czovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L2lzc3Vlcy8xMzUpIHwgMDQw -ICB8IEFnZW50cyAgICAgICB8IGBBR0VOVFNfQUxQSEFCRVQubWRgIOKAlCAy -NyBhZ2VudCBkZWZpbml0aW9ucyAoQ0xPU0VEIFBSICMxOTEpIHwKfCBbIzEz -OF0oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTM4 -KSB8IDA0MyAgfCBNYXRoICAgICAgICAgfCBCYWxhbmNlZCB0ZXJuYXJ5IGFk -ZGl0aW9uIGZvcm1hbCBzcGVjICAgICAgICAgIHwKfCBbIzEzOV0oaHR0cHM6 -Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTM5KSB8IDA0NCAg -fCBQcm90b2NvbCAgICAgfCBQSEkgTE9PUCBjb250cmFjdCB2MiArIFRPWElD -IHJvbGxiYWNrICAgICAgICAgIHwKfCBbIzE0MF0oaHR0cHM6Ly9naXRodWIu -Y29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTQwKSB8IDA0NSAgfCBJU0EgICAg -ICAgICAgfCAyNyBDb3B0aWMgcmVnaXN0ZXIgaW52YXJpYW50cyAoQ0xPU0VE -IFBSICMxODkpIHwKfCBbIzE0Ml0oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNo -VGFnL3QyNy9pc3N1ZXMvMTQyKSB8IDA0NiAgfCBNYXRoICAgICAgICAgfCBS -YWRpeCBlY29ub215IOKAlCBiYXNlLTMgb3B0aW1hbGl0eSBwcm9vZiAgICAg -ICAgfAp8IFsjMTQzXShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3 -L2lzc3Vlcy8xNDMpIHwgMDQ3ICB8IE1hdGggICAgICAgICB8IEszIGxvZ2lj -IHRydXRoIHRhYmxlIOKAlCAyNy1lbnRyeSBpc29tb3JwaGlzbSAgICB8Cnwg -WyMxNDRdKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90MjcvaXNzdWVz -LzE0NCkgfCAwNDggIHwgVlNBICAgICAgICAgIHwgVHJpdC1zcGFjZSBiaW5k -L3VuYmluZCBmb3JtYWwgc3BlYyAoQ0xPU0VEIFBSICMxODgpIHwKfCBbIzE0 -NV0oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTQ1 -KSB8IDA0OSAgfCBQaHlzaWNzICAgICAgfCBTYWNyZWQgcGh5c2ljcyBoYXJk -LXRvbGVyYW5jZSBjb25mb3JtYW5jZSAgICAgIHwKfCBbIzE1MF0oaHR0cHM6 -Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTUwKSAqKGNsb3Nl -ZCkqIHwg4oCUICAgIHwgQ0kgICAgICAgICAgIHwgRTJFIENJOiBgc2VlZC50 -MjdgIOKGkiBgdDI3YyBnZW5gIOKGkiBgemlnIHRlc3RgIOKGkiBHUkVFTiB8 -CgoKKkNvbmZpcm0gaXNzdWUgdGl0bGVzIHdpdGggYGdoIGlzc3VlIHZpZXdg -IGlmIGxpbmtzIGRyaWZ0LioKCioqQWxzbzoqKiBgW1JJTkdfQkFDS0xPR18w -NDdfMDYzLm1kXShkb2NzL1JJTkdfQkFDS0xPR18wNDdfMDYzLm1kKWAgwrcg -YFtjb29yZGluYXRpb24vUk9MTElORy1JTlRFR1JBVElPTi1QTEFOLVNFRUQt -VE8tUVVFRU4ubWRdKGRvY3MvY29vcmRpbmF0aW9uL1JPTExJTkctSU5URUdS -QVRJT04tUExBTi1TRUVELVRPLVFVRUVOLm1kKWAgwrcgYFtLRVJORUwtUExB -Ti1NVUxUSS1NT0RFTC1TWU5USEVTSVMubWRdKGRvY3MvS0VSTkVMLVBMQU4t -TVVMVEktTU9ERUwtU1lOVEhFU0lTLm1kKWAgwrcgYFtTQ0lFTkNFLU9QUy1E -VUFMLVRSQUNLLVNZTlRIRVNJUy5tZF0oZG9jcy9TQ0lFTkNFLU9QUy1EVUFM -LVRSQUNLLVNZTlRIRVNJUy5tZClgIMK3IGBbUkVTRUFSQ0hfV1JJVElOR19U -MjcubWRdKGRvY3MvUkVTRUFSQ0hfV1JJVElOR19UMjcubWQpYCDCtyBhbmNo -b3IgWyMxNDFdKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90MjcvaXNz -dWVzLzE0MSkKCi0tLQoKIyMgwqcgNSAgU2VxdWVudGlhbCBpbnRlZ3JhdGlv -biBwbGFuOiBTZWVkIOKGkiBUZXN0cyDihpIgUXVlZW4KCioqUnVsZToqKiBD -b21wbGV0ZSBlYWNoIHBoYXNlIGJlZm9yZSBleHBhbmRpbmcgdGhlIG5leHQu -CioqRXZlcnkgUFIgbXVzdCBjb250YWluKiogYENsb3NlcyAjTmAgKFJpbmcg -MDMzIC8gWyMxMjhdKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90Mjcv -aXNzdWVzLzEyOCkpLgoqKk5vIGNvZGUgd2l0aG91dCBhbiBpc3N1ZS4qKgoK -YGBgClNFRUQgKGJvb3RzdHJhcC9SdXN0KQogIOKUgiAgUGhhc2UgMSDigJQg -TGF3ICYgU1NPVCDinIUKICDilrwKU1RFTSAoY29uZm9ybWFuY2UgdmVjdG9y -cykKICDilIIgIFBoYXNlIDIg4oCUIFRlc3QgZXhlY3V0aW9uIOKchQogIOKW -vApCUkFOQ0hFUyAoUmluZyAwNTArIHNjaWVuY2UgdGVzdHMpCiAg4pSCICBQ -aGFzZSAzIOKAlCBNYXRoL3BoeXNpY3MgYXVkaXQg4pyFCiAg4pa8CkNST1dO -IChRdWVlbiBicmFpbiAmIGF1dG9tYXRpb24pCiAgICAgUGhhc2UgNCDigJQg -T3JjaGVzdHJhdGlvbiDwn5+hCmBgYAoKIyMjIFBoYXNlIDEg4oCUIFNlZWQ6 -IExhdyArIFNTT1QgKyBnYXRlcyAqKOKchSBDT01QTEVURSkqCgoKfCBTdGVw -IHwgSXNzdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgfCBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWNjZXB0YW5jZSBjcml0ZXJp -b24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -IHwKfCAtLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tIHwKfCAxLjEgIHwgWyMxMjhdKGh0dHBzOi8vZ2l0aHViLmNv -bS9nSGFzaFRhZy90MjcvaXNzdWVzLzEyOCkgfCBFbmFibGUgaXNzdWUtZ2F0 -ZSBDSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg -QWxsIFBScyBibG9ja2VkIHdpdGhvdXQgYENsb3NlcyAjTmA7IHplcm8gYnlw -YXNzICAgICAgICAgICAgICAgIHwKfCAxLjIgIHwgWyMxMzJdKGh0dHBzOi8v -Z2l0aHViLmNvbS9nSGFzaFRhZy90MjcvaXNzdWVzLzEzMikgfCBQYXJzZXIg -ZW5mb3JjZXMgU09VTC5tZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIHwgU3BlYyB3aXRob3V0IGB0ZXN0YC9gaW52YXJpYW50YC9gYmVu -Y2hgIOKGkiBlcnJvciAod2hlbiBlbmZvcmNlZCkgfAp8IDEuMyAgfCBbIzEy -N10oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTI3 -KSB8IENhbm9uaWNhbGlzZSAqKmBOT1cubWRgKiogKHJvb3QpICsgaXRlcmF0 -aW9uIHNjaGVtYSAgICAgICAgICAgICAgICAgIHwgYHRyaSBjaGVjay1ub3dg -IHBhc3NlcyBvbiBjbGVhbiByZXBvICAgICAgICAgICAgICAgICAgICAgICAg -ICAgIHwKfCAxLjQgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICB8IFZlcmlmeSBgRk9STUFULVNQRUMt -MDAxLmpzb25gICsgYGdmMTYudDI3YCBhcyBudW1lcmljIFNTT1QgfCBOdW1l -cmljIFBScyBsaW5rIHRvIHRoZXNlICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgfAp8IDEuNSAgfCBbIzE1MF0oaHR0cHM6Ly9naXRo -dWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTUwKSAqKGNsb3NlZCkqIHwg -RG9jdW1lbnQgLyBDSSAqKnNlZWQg4oaSIGdlbiDihpIgemlnIHRlc3QqKiAg -ICAgICAgICAgICAgICAgICAgfCAqKuKchSoqIE1pbmltYWwgZ29sZGVuIHBh -dGggaW4gKipgcGhpLWxvb3AtY2kueW1sYCoqOyBsYW5kZWQgKipQUiBbIzE1 -Ml0oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9wdWxsLzE1Mikq -KiAgICAgIHwKCgojIyMgUGhhc2UgMiDigJQgU3RlbTogQ29uZm9ybWFuY2Ug -KyBiZW5jaG1hcmtzICsgc2VhbHMgKihET05FKSoKCgp8IFN0ZXAgfCBJc3N1 -ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgfCBB -Y2NlcHRhbmNlIGNyaXRlcmlvbiAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICB8CnwgLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwK -fCAyLjAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICB8IFNDSEVNQV9WMiArIHZhbGlkYXRvciAgICAg -ICAgfCAqKuKchSBET05FKiogfCBgY29uZm9ybWFuY2UvU0NIRU1BX1YyLmpz -b25gICsgYHQyN2MgdmFsaWRhdGUtY29uZm9ybWFuY2UtdjJgIChOTy1TSEVM -TCBsYXcpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDIuMSAgfCBb -IzEzM10oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMv -MTMzKSB8IE1pZ3JhdGUgdmVjdG9ycyB0byB2MiAgICAgICAgfCAqKuKchSBE -T05FKiogKDU4LzU4KSB8IGB0MjdjIG1pZ3JhdGUtdjJgIOKAlCBhbGwgdmVj -dG9ycyBtaWdyYXRlZCB0byB2MiBmb3JtYXQgKHNjaGVtYV92ZXJzaW9uLCB2 -ZXJkaWN0LCBzZWFsLCB0aW1lc3RhbXBzKSAgICB8CnwgMi4yICB8IFsjMTI5 -XShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L2lzc3Vlcy8xMjkp -IHwgR29sZGVuRmxvYXQgTk1TRSBiZW5jaG1hcmsgICB8ICoq4pyFIERPTkUq -KiB8IGB0MjdjIGdlbi1ubXNlLWJlbmNobWFya2Agd3JpdGVzICoqYG5tc2Vf -c3ludGhldGljX3JvdW5kdHJpcGAqKiAoSUVFRSBmMTYgdnMgYmZsb2F0MTYg -cHJveHk7IGRvY3VtZW50ZWQgaW4gSlNPTikgfAp8IDIuMyAgfCBbIzEzMV0o -aHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTMxKSB8 -IFNlYWwgY292ZXJhZ2UgQ0kgICAgICAgICAgICAgfCAqKuKchSBET05FKiog -fCBgLmdpdGh1Yi93b3JrZmxvd3Mvc2VhbC1jb3ZlcmFnZS55bWxgIChQUi1z -Y29wZWQgZ2F0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgIHwKfCAyLjQgIHwg4oCUICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdGMTYg -dmVjdG9ycyBncm93ICAgICAgICAgICAgfCAqKuKchSBET05FKiogfCAqKmB0 -MjdjIGV4cGFuZC1nZjE2YCoqIOKGkiAqKjUwKiogcm93cyBpbiBgZ2YxNl92 -ZWN0b3JzLmpzb25gICjiiaUzMyB0YXJnZXQpOyB2MiBzZWFsIHJlY29tcHV0 -ZWQgICAgICAgICAgICAgICAgICAgICB8CnwgMi41ICB8IFsjMTYzXShodHRw -czovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L2lzc3Vlcy8xNjMpIHwgTDUg -SURFTlRJVFkgc2VhbCByZWZyZXNoICAgICB8ICoq4pyFIERPTkUqKiB8IGBG -T1JNQVQtU1BFQy0wMDEuanNvbmAgdjEuMSAqKmBwaGlfaWRlbnRpdHlgKiog -KyAqKmB0MjdjIHZhbGlkYXRlLXBoaS1pZGVudGl0eWAqKiAoz4YgZGlzdGFu -Y2UgMC4wNDg2MzI2NDE1NDM1NjMwIGZyb20gYGdmMTZfdmVjdG9yc2ApIHwK -fCAyLjYgIHwgWyMxNjddKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90 -MjcvaXNzdWVzLzE2NykgfCBOdW1lcmljIGRlYnQgc3ByaW50ICAgICAgICAg -IHwgKirinIUgRE9ORSoqIHwgYFtOVU1FUklDLUdGMTYtREVCVC1JTlZFTlRP -UlkubWRdKGRvY3Mvbm9uYS0wMi1vcmdhbmlzbS9OVU1FUklDLUdGMTYtREVC -VC1JTlZFTlRPUlkubWQpYCDihpQgYFtSRVNFQVJDSF9DTEFJTVMubWRdKGRv -Y3Mvbm9uYS0wMy1tYW5pZmVzdC9SRVNFQVJDSF9DTEFJTVMubWQpYCArICoq -TDQgVEVTVEFCSUxJVFkqKiDigJQgbWF0aCDihpIgbm4vdnNhIOKGkiBhciAq -KFBSIFsjMTczXShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L3B1 -bGwvMTczKSkqIHwKCgoqKlBoYXNlIDIgaGFuZG9mZjoqKiBTdGVwcyAqKjIu -MOKAkzIuNioqIGFyZSAqKuKchSoqICggKioyLjMqKiAqKlBSIFsjMTY2XSho -dHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L3B1bGwvMTY2KSoqOyAq -KjIuNSoqICoqYDMxZTBkNDdgKiogLyBbIzE2M10oaHR0cHM6Ly9naXRodWIu -Y29tL2dIYXNoVGFnL3QyNy9pc3N1ZXMvMTYzKTsgKioyLjYqKiAqKlBSIFsj -MTczXShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L3B1bGwvMTcz -KSoqIC8gWyMxNjddKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90Mjcv -aXNzdWVzLzE2NykgKS4gKipQaGFzZSAyIGNvbXBsZXRlKiog4oCUIFBoYXNl -IDMgY29tcGxldGVkLgoKKipQaGFzZSAzIGhhbmRvZmY6KiogUmluZ3MgKiow -NTDigJMwNTMqKiBhcmUgKirinIUqKiAoUmFkaXggZWNvbm9teSAjMTQyLCBK -b25lcyBwb2x5bm9taWFsICMxNzUsIEszIHRydXRoIHRhYmxlICMxNDMsIFBy -b3BlcnR5LXRlc3QgdGVtcGxhdGUgIzIyMCkuICoqUGhhc2UgMyBjb21wbGV0 -ZSoqIOKAlCBQaGFzZSA0IHVuYmxvY2tlZC4KCioqTnVtZXJpYyBwYWxldHRl -OioqIGBbTlVNRVJJQy1TVEFOREFSRC0wMDEubWRdKGRvY3Mvbm9uYS0wMi1v -cmdhbmlzbS9OVU1FUklDLVNUQU5EQVJELTAwMS5tZClgIMK3IGBbTlVNRVJJ -Qy1HRjE2LUNBTk9OSUNBTC1QSUNUVVJFLm1kXShkb2NzL25vbmEtMDItb3Jn -YW5pc20vTlVNRVJJQy1HRjE2LUNBTk9OSUNBTC1QSUNUVVJFLm1kKWAgwrcg -YFtOVU1FUklDLVdIWS1OT1QtR0YxNi1FVkVSWVdIRVJFLm1kXShkb2NzL25v -bmEtMDItb3JnYW5pc20vTlVNRVJJQy1XSFktTk9ULUdGMTYtRVZFUllXSEVS -RS5tZClgIMK3IGBbTlVNRVJJQy1DT1JFLVBBTEVUVEUtUkVHSVNUUlkubWRd -KGRvY3Mvbm9uYS0wMi1vcmdhbmlzbS9OVU1FUklDLUNPUkUtUEFMRVRURS1S -RUdJU1RSWS5tZClgCgojIyMgUGhhc2UgMyDigJQgQnJhbmNoZXM6IFJpbmcg -MDUwKyBzY2llbmNlIHRlc3RzICoo4pyFIENPTVBMRVRFKSoKCgp8IFJpbmcg -fCBJc3N1ZSB8IERvbWFpbiAgICAgICAgICB8IEtleSBkZWxpdmVyYWJsZSAg -ICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzIHwKfCAtLS0tIHwgLS0tLS0g -fCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLSB8IC0tLS0tLS0tIHwKfCAwNDIgIHwgWyMxMzddKGh0dHBz -Oi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90MjcvaXNzdWVzLzEzNykgfCBOdW1l -cmljcyAgICAgICAgfCBHRjggc3BlYyBoYXJkZW5pbmc6IDMyIGNvbmZvcm1h -bmNlIHZlY3RvcnMgfCDinIUgQ0xPU0VEIHwKfCAwNDMgIHwgWyMxMzhdKGh0 -dHBzOi8vZ2l0aHViLmNvbS9nSGFzaFRhZy90MjcvaXNzdWVzLzEzOCkgfCBJ -U0EvQXJpdGhtZXRpYyAgfCBCYWxhbmNlZCB0ZXJuYXJ5IGFkZGl0aW9uOiBj -YXJyeSBwcm9wYWdhdGlvbiBpbnZhcmlhbnRzIHwg4pyFIENMT1NFRCB8Cnwg -MDUwICB8IFsjMTQyXShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3 -L2lzc3Vlcy8xNDIpIHwgTWF0aC9waHlzaWNzICAgIHwgUmFkaXggZWNvbm9t -eTogRSgzKS9FKGUpID49IDk5LjUlLCA1LjQlIG92ZXIgYmFzZS0yIHwg4pyF -IENMT1NFRCB8CnwgMDUxICB8IFsjMTc1XShodHRwczovL2dpdGh1Yi5jb20v -Z0hhc2hUYWcvdDI3L2lzc3Vlcy8xNzUpIHwgVlNBL01hdGggICAgICAgIHwg -Sm9uZXMgcG9seW5vbWlhbCBmcm9tIGlucHV0IHN0cnVjdHVyZSB8IOKchSBD -TE9TRUQgfAp8IDA0NyAgfCBbIzE0M10oaHR0cHM6Ly9naXRodWIuY29tL2dI -YXNoVGFnL3QyNy9pc3N1ZXMvMTQzKSB8IExvZ2ljIChLMykgICAgICB8IEsz -IHRydXRoIHRhYmxlICgyNy1lbnRyeSBpc29tb3JwaGlzbSkgfCDinIUgQ0xP -U0VEIHwKfCAwNTMgIHwgWyMyMjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFz -aFRhZy90MjcvaXNzdWVzLzIyMCkgfCBDb25mb3JtYW5jZSAoRikgfCBQcm9w -ZXJ0eS10ZXN0IHRlbXBsYXRlIGNvbnZlcnRlZCB0byAudDI3IHN5bnRheCB8 -IOKchSBDTE9TRUQgfAoKCioqQ2hhcnRlcjoqKiBgW1QyNy1NQVRILVBIWVNJ -Q1MtVEVTVC1GUkFNRVdPUkstU1BFQy5tZF0oZG9jcy9ub25hLTAzLW1hbmlm -ZXN0L1QyNy1NQVRILVBIWVNJQ1MtVEVTVC1GUkFNRVdPUkstU1BFQy5tZClg -ICAKKipDbGFpbXM6KiogYFtSRVNFQVJDSF9DTEFJTVMubWRdKGRvY3Mvbm9u -YS0wMy1tYW5pZmVzdC9SRVNFQVJDSF9DTEFJTVMubWQpYCDCtyBgW0NMQUlN -X1RJRVJTLm1kXShkb2NzL25vbmEtMDMtbWFuaWZlc3QvQ0xBSU1fVElFUlMu -bWQpYAoKIyMjIFBoYXNlIDQg4oCUIENyb3duOiBNZXRyaWNzIOKGkiBicmFp -biBzZWFscyDihpIgUXVlZW4gKihpbiBwcm9ncmVzcykqCgoKfCBTdGVwIHwg -UmluZyB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzIHwg -QWNjZXB0YW5jZSBjcml0ZXJpb24gICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgIHwKfCAtLS0tIHwgLS0tLSB8IC0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwK -fCA0LjEgIHwgMDU2ICB8IFZFUkRJQ1RfU0NIRU1BICAgICAgICAgICAgfCDi -nIUgRE9ORSB8IFNpbmdsZSBzY2hlbWEgZm9yIFF1ZWVuIHRvb2xpbmcgKHZl -cmRpY3QgZXBpc29kZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IDQuMiAgfCAwNTcg -IHwgRVhQRVJJRU5DRV9TQ0hFTUEgICAgICAgICAgfCDinIUgRE9ORSB8IFNj -aGVtYSBmb3IgZXhwZXJpZW5jZSBlcGlzb2RlcyAoYWdncmVnYXRpb24gc291 -cmNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgIHwKfCA0LjMgIHwgMDU4ICB8IFNjaGVtYSB2YWxpZGF0 -aW9uIENJICAgICAgICB8IOKchSBET05FIHwgVmFsaWRhdGUgc2NoZW1hcyBh -Z2FpbnN0IERyYWZ0LTA3IG1ldGEtc2NoZW1hICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgfAp8IDQuNCAgfCAwNTkgIHwgQlJBSU5fU0VBTF9TQ0hFTUEgICAgICAg -ICAgIHwg4pyFIERPTkUgfCBTY2hlbWEgZm9yIGJyYWluIHNlYWxzIChzdW1t -YXJ5L2RvbWFpbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCA0LjUg -IHwgMDU5ICB8IEJyYWluIHNlYWwgcmVmcmVzaCBwaXBlbGluZSB8IOKchSBE -T05FIHwgYC50cmluaXR5L3NlYWxzL2JyYWluXyouanNvbmAgZnJvbSBleHBl -cmllbmNlIGFnZ3JlZ2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgIHwKfCA0LjYgIHwgMDYwICB8IFByb3Bl -cnR5LXRlc3QgdGVtcGxhdGUgICAgIHwg4pyFIERPTkUgfCBQcm9wZXIgLnQy -NyBzeW50YXggd2l0aCBwcm9wZXJ0eSB0ZXN0aW5nIHBhdHRlcm5zICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICB8CnwgNC43ICB8IDA1MyAgfCBNRVRBIGRhc2hib2FyZCAg -ICAgICAgICAgICB8IOKchSBET05FIHwgWyMxMjZdKGh0dHBzOi8vZ2l0aHVi -LmNvbS9nSGFzaFRhZy90MjcvaXNzdWVzLzEyNikgwrcgYFtNRVRBX0RBU0hC -T0FSRC5tZF0oZG9jcy9NRVRBX0RBU0hCT0FSRC5tZCkgICAgICAgICAgICAg -ICAgICAgICAgICAgfAp8IDQuOCAgfCAwNjEgIHwgTG90dXMgcGhhc2UgYXV0 -b21hdGlvbiAgICAgfCDinIUgRE9ORSB8IGBzcGVjcy9xdWVlbi9icmFpbl9z -dW1tYXJpZXMudDI3YCArIHNjaGVtYSArIENJIGludGVncmF0aW9uICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwK -fCA0LjkgIHwgMDYyKyB8IFF1ZWVuLWJyYWluIHNwZWMgICAgICAgICAgICB8 -IPCfk4sgVE9ETyB8IGBzcGVjcy9xdWVlbi9sb3R1cy50MjdgIGZvciBvcmNo -ZXN0cmF0aW9uIChleGlzdHMsIG1heSBuZWVkIGVuaGFuY2VtZW50cykgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgoKKipCcmFpbiBh -cnRpZmFjdHM6KiogYC50cmluaXR5L3NlYWxzL2JyYWluLSouanNvbmAgwrcg -YC50cmluaXR5L3N0YXRlL3F1ZWVuLWhlYWx0aC5qc29uYCDCtyBgLnRyaW5p -dHkvZXhwZXJpZW5jZS9jbGFyYV90cmFjazEuanNvbmxgCgotLS0KCiMjIMKn -IDYgIE1hdHJ5b3Noa2EgbGF5ZXIgbWFwCgoKfCBMYXllciAgfCBOYW1lICAg -ICAgICAgICAgICAgfCBLZXkgZmlsZXMgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJ -bnRlZ3JhdGlvbiBwaGFzZSB8CnwgLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0t -LS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0t -LS0tLS0tLS0gfAp8ICoqTDAqKiB8ICoqU2VlZCoqICAgICAgICAgICB8IGBi -b290c3RyYXAvc3JjL2NvbXBpbGVyLnJzYDsgYHN0YWdlMC9GUk9aRU5fSEFT -SGAgKmlmIHNoaXBwZWQqICAgICAgICAgICB8IGdlbmVzaXMgICAgICAgICAg -IHwKfCAqKkwxKiogfCAqKkJvb3RzdHJhcCoqICAgICAgfCBgYm9vdHN0cmFw -L3NyYy9tYWluLnJzYCwgYGJvb3RzdHJhcC9tYWluLnppZ2AgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgfCBQaGFzZSAxICAgICAgICAgICB8CnwgKipM -MioqIHwgKipCYXNlIHR5cGVzKiogICAgIHwgYHNwZWNzL2Jhc2UvdHlwZXMu -dDI3YCwgYHNwZWNzL2Jhc2Uvb3BzLnQyN2AgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgIHwgUGhhc2UgMSAgICAgICAgICAgfAp8ICoqTDMqKiB8ICoq -TnVtZXJpY3MqKiAgICAgICB8IGBzcGVjcy9udW1lcmljL2dmKi50MjdgLCBg -c3BlY3MvbnVtZXJpYy90ZjMudDI3YCAgICAgICAgICAgICAgICAgICAgICAg -ICB8IFBoYXNlIDIgICAgICAgICAgIHwKfCAqKkw0KiogfCAqKk1hdGggLyBw -aHlzaWNzKiogfCBgc3BlY3MvbWF0aC9jb25zdGFudHMudDI3YCwgYHNwZWNz -L21hdGgvc2FjcmVkX3BoeXNpY3MudDI3YCAgICAgICAgICAgICAgfCBQaGFz -ZSAzICAgICAgICAgICB8CnwgKipMNSoqIHwgKipDb21waWxlcioqICAgICAg -IHwgYHNwZWNzL2NvbXBpbGVyL2AsIGBnZW4vemlnL2NvbXBpbGVyL2AgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhhc2UgMeKAkzIg -ICAgICAgICB8CnwgKipMNioqIHwgKipIYXJkd2FyZSoqICAgICAgIHwgYHNw -ZWNzL2ZwZ2EvYCwgYHNwZWNzL2lzYS9yZWdpc3RlcnMudDI3YCAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhhc2UgMyAgICAgICAgICAg -fAp8ICoqTDcqKiB8ICoqUXVlZW4gYnJhaW4qKiAgICB8IGBzcGVjcy9xdWVl -bi9sb3R1cy50MjdgLCBgc3BlY3Mvbm4vaHNsbS50MjdgLCBgc3BlY3MvdnNh -L2AsIGBzcGVjcy9hci9gKiB8IFBoYXNlIDQgICAgICAgICAgIHwKCgotLS0K -CiMjIMKnIDcgIFN5bmMgZ2F0ZXMgYW5kIHRvb2xpbmcKCgp8IEdhdGUgICAg -ICAgICAgICAgICAgfCBUcmlnZ2VyICAgICAgfCBDaGVja3MgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAqKHZlcmlmeSBp -biBBY3Rpb25zKSogICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tIHwg -LS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLSB8CnwgYHByZS1jb21taXRgICAgICAgICB8IGxvY2FsIGNvbW1pdCB8 -IGB0cmkgY2hlY2stbm93YDsgYE5PVy5tZGAgZGF0ZSAgICAgICAgICAgIHwg -YWN0aXZlIGlmIGhvb2tzIGluc3RhbGxlZCAgICAgICAgICAgfAp8IGBpc3N1 -ZS1nYXRlLnltbGAgICAgfCBQUiAgICAgICAgICAgfCBgQ2xvc2VzICNOYCAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlZSBiYWRnZSAvIEFj -dGlvbnMgICAgICAgICAgICAgICAgIHwKfCBgcGhpLWxvb3AtY2kueW1sYCAg -IHwgcHVzaCAvIFBSICAgIHwgRTJFICsgYHRyaWAgc3VpdGUgKyBjb25mb3Jt -YW5jZSAoc2VlIHdvcmtmbG93KSB8ICoqRTJFIGluIENJKiog4oCUIFsjMTUw -XShodHRwczovL2dpdGh1Yi5jb20vZ0hhc2hUYWcvdDI3L2lzc3Vlcy8xNTAp -ICoqY2xvc2VkKiogfAp8IGBub3ctc3luYy1nYXRlLnltbGAgfCBwdXNoICAg -ICAgICAgfCBgTk9XLm1kYCBmcmVzaG5lc3Mgd2luZG93ICAgICAgICAgICAg -ICAgICB8IHNlZSBiYWRnZSAvIEFjdGlvbnMgICAgICAgICAgICAgICAgIHwK -fCAqKkNvbmZvcm1hbmNlKiogICAgIHwgQ0kgLyBsb2NhbCAgIHwgYHQyN2Mg -LS1yZXBvLXJvb3QgLiB2YWxpZGF0ZS1jb25mb3JtYW5jZWAgfCBydW4gbG9j -YWxseSBvciBpbiBDSSAgICAgICAgICAgICAgICB8CnwgKipHZW4gaGVhZGVy -cyoqICAgICB8IENJIC8gbG9jYWwgICB8IGB0MjdjIC0tcmVwby1yb290IC4g -dmFsaWRhdGUtZ2VuLWhlYWRlcnNgIHwgcnVuIGxvY2FsbHkgb3IgaW4gQ0kg -ICAgICAgICAgICAgICAgfAoKCioqQWdlbnQgc3luYzoqKiBgLnRyaW5pdHkv -c3RhdGUvZ2l0aHViLXN5bmMuanNvbmAgIAoqKkhvb2tzOioqIGBiYXNoIHNj -cmlwdHMvc2V0dXAtZ2l0LWhvb2tzLnNoYCAgCioqTWFudWFsOioqIGAuL3Nj -cmlwdHMvdHJpIGNoZWNrLW5vd2AKCi0tLQoKIyMgwqcgOCAgRG9jdW1lbnQg -bWFwCgoKfCBUb3BpYyAgICAgICAgICAgICAgICAgICAgICB8IERvY3VtZW50 -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t -LS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IENvbnN0aXR1dGlvbiB2MS4yICAg -ICAgICAgIHwgYFtUMjctQ09OU1RJVFVUSU9OLm1kXShkb2NzL1QyNy1DT05T -VElUVVRJT04ubWQpYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgfAp8IFJpbmcgbG9nICAgICAgICAgICAgICAgICAgIHwg -YC50cmluaXR5L2V4cGVyaWVuY2UvY2xhcmFfdHJhY2sxLmpzb25sYCAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwK -fCBRdWVlbiBoZWFsdGggICAgICAgICAgICAgICB8IGAudHJpbml0eS9zdGF0 -ZS9xdWVlbi1oZWFsdGguanNvbmAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgUm9sbGluZyBpbnRl -Z3JhdGlvbiBkZXRhaWwgfCBgW1JPTExJTkctSU5URUdSQVRJT04tUExBTi1T -RUVELVRPLVFVRUVOLm1kXShkb2NzL2Nvb3JkaW5hdGlvbi9ST0xMSU5HLUlO -VEVHUkFUSU9OLVBMQU4tU0VFRC1UTy1RVUVFTi5tZClgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICB8CnwgTnVtZXJpYyBTU09UICAgICAgICAg -ICAgICAgfCBgY29uZm9ybWFuY2UvRk9STUFULVNQRUMtMDAxLmpzb25gICsg -YFtOVU1FUklDLVNUQU5EQVJELTAwMS5tZF0oZG9jcy9ub25hLTAyLW9yZ2Fu -aXNtL05VTUVSSUMtU1RBTkRBUkQtMDAxLm1kKWAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICB8CnwgQ2xhaW1zIHJlZ2lzdHJ5ICAgICAgICAgICAgfCBg -W1JFU0VBUkNIX0NMQUlNUy5tZF0oZG9jcy9ub25hLTAzLW1hbmlmZXN0L1JF -U0VBUkNIX0NMQUlNUy5tZClgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICB8CnwgTWF0aC9waHlzaWNzIHRlc3QgY2hhcnRlciAgfCBgW1QyNy1NQVRI -LVBIWVNJQ1MtVEVTVC1GUkFNRVdPUkstU1BFQy5tZF0oZG9jcy9ub25hLTAz -LW1hbmlmZXN0L1QyNy1NQVRILVBIWVNJQ1MtVEVTVC1GUkFNRVdPUkstU1BF -Qy5tZClgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgQXhp -b20vdGhlb3JlbSBmb3JtYXQgICAgICAgfCBgW1QyNy1VTklGSUVELUFYSU9N -LVRIRU9SRU0tRk9STUFULVNZU1RFTS5tZF0oZG9jcy9ub25hLTAzLW1hbmlm -ZXN0L1QyNy1VTklGSUVELUFYSU9NLVRIRU9SRU0tRk9STUFULVNZU1RFTS5t -ZClgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgUHVibGljYXRpb25z -IHBpcGVsaW5lICAgICAgfCBgW1BVQkxJQ0FUSU9OX1BJUEVMSU5FLm1kXShk -b2NzL1BVQkxJQ0FUSU9OX1BJUEVMSU5FLm1kKWAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICB8CnwgQ29tcGlsZXIgdmVyaWZpY2F0aW9u -IChFTikgfCBgW0NPTVBJTEVSX1ZFUklGSUNBVElPTl9TVEFOREFSRFMubWRd -KGRvY3MvQ09NUElMRVJfVkVSSUZJQ0FUSU9OX1NUQU5EQVJEUy5tZClgIMK3 -IGBbQ09NUElMRVJfVkVSSUZJQ0FUSU9OX0xBTkRTQ0FQRV9BTkRfVDI3X1BM -QU4ubWRdKGRvY3MvQ09NUElMRVJfVkVSSUZJQ0FUSU9OX0xBTkRTQ0FQRV9B -TkRfVDI3X1BMQU4ubWQpYCB8CnwgQ29tcGlsZXIgdmVyaWZpY2F0aW9uIChS -VSkgfCBgW0NPTVBJTEVSX1ZFUklGSUNBVElPTl9JTVBBQ1RfUlUubWRdKGRv -Y3MvQ09NUElMRVJfVkVSSUZJQ0FUSU9OX0lNUEFDVF9SVS5tZClgIChhbGxv -d2xpc3RlZDsgc2VlIEFEUi0wMDQpICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICB8CnwgUEhJLUlERU5USVRZIEZsb2NxIGJyaWRnZSAgfCBgW1BI -SV9JREVOVElUWV9GTE9DUV9CUklER0VfU1BFQy5tZF0oZG9jcy9ub25hLTAz -LW1hbmlmZXN0L1BISV9JREVOVElUWV9GTE9DUV9CUklER0VfU1BFQy5tZClg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -IHwKfCBQaGFzZSBCIEZsb2NxIHRhc2sgYW5jaG9yICB8IGBbUEhBU0VfQl9G -TE9DUV9BR0VOVF9UQVNLLm1kXShkb2NzL25vbmEtMDMtbWFuaWZlc3QvUEhB -U0VfQl9GTE9DUV9BR0VOVF9UQVNLLm1kKWAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnwgz4Yg -LyBmNjQgdmFsaWRhdGlvbiAgICAgICAgIHwgYHQyN2MgdmFsaWRhdGUtcGhp -YCAvIGAuL3NjcmlwdHMvdHJpIHZhbGlkYXRlLXBoaWAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFJvYWRtYXAgdW1icmVs -bGEgICAgICAgICAgIHwgWyMxMjZdKGh0dHBzOi8vZ2l0aHViLmNvbS9nSGFz -aFRhZy90MjcvaXNzdWVzLzEyNikgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgIHwKCgotLS0KCiMjIMKnIDkgIE5leHQgYWN0aW9ucyAo -NDggaCkKCioqUHJpb3JpdHk6KiogS2VlcCAqKnBoaS1sb29wIENJKiogZ3Jl -ZW4gb24gKipgbWFzdGVyYCoqIChFMkUgKyBzZWFscyArIGB0cmkgY2hlY2st -bm93YCkuICoqUGhhc2UgMyBpcyDinIUgQ09NUExFVEUqKiDigJQgc2hpZnQg -Zm9jdXMgdG8gKipQaGFzZSA0IOKAlCBDcm93biBBdXRvbWF0aW9uKiouCgoq -KkN1cnJlbnQgUGhhc2UgNCBXb3JrOioqCi0g8J+foSBNRVRBIGRhc2hib2Fy -ZCAoIzEyNikg4oCUIG5lZWRzIHVwZGF0ZXMgZm9yIGNvbXBsZXRlZCBQaGFz -ZSAzCi0g8J+TiyBRdWVlbi1icmFpbiBzcGVjIChgc3BlY3MvcXVlZW4vbG90 -dXMudDI3YCkg4oCUIG9yY2hlc3RyYXRpb24gbGF5ZXIKLSDwn5OLIExvdHVz -IHBoYXNlIGF1dG9tYXRpb24g4oCUIGAudHJpbml0eS9xdWVlbi1icmFpbi9z -dW1tYXJpZXMvYCBwaXBlbGluZQotIOKchSBUcmluaXR5IHggUGVsbGlzIGh5 -YnJpZCBwYXRoIChbIzI3N10oaHR0cHM6Ly9naXRodWIuY29tL2dIYXNoVGFn -L3QyNy9pc3N1ZXMvMjc3KSk6IGAuL3NjcmlwdHMvdHJpIG1hdGggY29tcGFy -ZWAgd3JpdGVzIGAudHJpbml0eS9leHBlcmllbmNlL21hdGhfY29tcGFyZS5q -c29ubGAgKGdpdGlnbm9yZWQpOyBTU09UIHNwZWMgYHBlbGxpcy1mb3JtdWxh -cy50MjdgOyBwYXBlciBzY2FmZm9sZCB1bmRlciBgcmVzZWFyY2gvdHJpbml0 -eS1wZWxsaXMtcGFwZXIvYC4KCioqQWxzbyBsYW5kZWQgKFBSIC8gaXNzdWUp -OioqIFRyaW5pdHkgeCBQZWxsaXMgKFsjMjc3XShodHRwczovL2dpdGh1Yi5j -b20vZ0hhc2hUYWcvdDI3L2lzc3Vlcy8yNzcpKSDigJQgYC4vc2NyaXB0cy90 -cmkgbWF0aCBjb21wYXJlYCBhcHBlbmRzIGAudHJpbml0eS9leHBlcmllbmNl -L21hdGhfY29tcGFyZS5qc29ubGAgKGdpdGlnbm9yZWQpOyBTU09UIGBzcGVj -cy9waHlzaWNzL3BlbGxpcy1mb3JtdWxhcy50MjdgOyBzY2FmZm9sZCBgcmVz -ZWFyY2gvdHJpbml0eS1wZWxsaXMtcGFwZXIvYC4KCmBgYGJhc2gKIyAwLiBO -T1cgZ2F0ZSDigJQgcnVuIEZJUlNUIGJlZm9yZSBhbnkgY29tbWl0IChvdGhl -cndpc2UgcHVzaCAvIGhvb2tzIG1heSBmYWlsKQouL3NjcmlwdHMvdHJpIGNo -ZWNrLW5vdwoKIyAxLiBFMkUgQ0kg4oCUICMxNTAgY2xvc2VkIChQUiAjMTUy -KTsgdmVyaWZ5IEFjdGlvbnMgYWZ0ZXIgd29ya2Zsb3cgZWRpdHMKIyBnaCBy -dW4gbGlzdCAtLXdvcmtmbG93PXBoaS1sb29wLWNpLnltbCAtLWxpbWl0IDMK -CiMgMi4gTWlsZXN0b25lIGh5Z2llbmUgKG5lZWRzIGdoIGF1dGgpCiMgZ2gg -aXNzdWUgZWRpdCAxMjcgMTI4IDEyOSAxMzAgMTMxIDEzMiAxMzMgLS1taWxl -c3RvbmUgIkVQT0NILTAxLUhBUkRFTiIKCiMgMy4gQm9vdHN0cmFwICsgc3Vp -dGUKY2QgYm9vdHN0cmFwICYmIGNhcmdvIGJ1aWxkIC0tcmVsZWFzZQouL3Rh -cmdldC9yZWxlYXNlL3QyN2MgLS1yZXBvLXJvb3QgLi4gdmFsaWRhdGUtY29u -Zm9ybWFuY2UKLi90YXJnZXQvcmVsZWFzZS90MjdjIC0tcmVwby1yb290IC4u -IHZhbGlkYXRlLWdlbi1oZWFkZXJzCi4vdGFyZ2V0L3JlbGVhc2UvdDI3YyAt -LXJlcG8tcm9vdCAuLiBzdWl0ZQoKIyAzYi4gVHJpbml0eSB4IFBlbGxpcyAo -aXNzdWUgIzI3Nykg4oCUIFJ1c3Qtb25seTsgYXBwZW5kcyBsb2NhbCBleHBl -cmllbmNlIEpTT05MCi4vc2NyaXB0cy90cmkgbWF0aCBjb21wYXJlIC0tcGVs -bGlzIC0tcGVsbGlzLWV4dGVuZGVkIC0taHlicmlkIC0tc2Vuc2l0aXZpdHkK -CiMgNC4gT3B0aW9uYWw6IGNvbXBpbGVyIGhhc2ggKGlmIHN0YWdlMC9GUk9a -RU5fSEFTSCBleGlzdHMgaW4geW91ciB0cmVlKQojIHNoYXN1bSAtYSAyNTYg -Ym9vdHN0cmFwL3NyYy9jb21waWxlci5ycwoKIyA1LiBFeHBlcmllbmNlIGxv -ZyDigJQgUmluZyA0NiBzZWFsIGRpc2NpcGxpbmUgKCMxMzEgLyBQUiAjMTY2 -KTogYXBwZW5kIG9uZSBKU09OTCBsaW5lIHRvIGAudHJpbml0eS9leHBlcmll -bmNlL2NsYXJhX3RyYWNrMS5qc29ubGAgd2hlbiBzZWFsaW5nCgojIDYuIGdo -IGlzc3VlIGNvbW1lbnQgMTI2IC0tYm9keSAi4oCmIgpgYGAKCi0tLQoKKkxp -dmluZyBkb2N1bWVudGF0aW9uIGNvcnB1cyDCtyBgW1QyNy1DT05TVElUVVRJ -T04ubWRdKGRvY3MvVDI3LUNPTlNUSVRVVElPTi5tZClgIHYxLjIsIEFydGlj -bGUgRE9DUy1UUkVFIMK3ICoqTGFzdCB1cGRhdGVkKiogbXVzdCBpbmNsdWRl -ICoqY2FsZW5kYXIgZGF0ZSoqIGBZWVlZLU1NLUREYCAoZm9yIGB0cmkgY2hl -Y2stbm93YCkuIFByZWZlciAqKmh1bWFuLXJlYWRhYmxlIGxvY2FsIHdhbGwg -dGltZSoqIHBsdXMgb3B0aW9uYWwgKipSRkMzMzM5IHdpdGggb2Zmc2V0Kiog -KGUuZy4gYDIwMjYtMDQtMDZUMTg6NDU6MDArMDc6MDBgKSBzbyB0b29scyBj -YW4gZWNobyBpdCDigJQgZG8gbm90IHJlcXVpcmUgVVRDIGBaYCB1bmxlc3Mg -eW91IHdvcmsgaW4gVVRDLio= - -# NOW — Rolling integration snapshot - -**Last updated:** 2026-04-08 — FPGA pipeline restoration, seal collision fix · PR #344, #336 - -**Document class:** Operational focus document - ---- - -## §3 State - -### Trinity×Pellis (ring-074) - -**Status:** COMPLETE — All source files restored from git history, IMRaD paper created, PR #337 opened - -**Files added:** -- `specs/physics/pellis-formulas.t27` — L5 anchor, Pell block P₁…P₅, TDD tests -- `specs/math/pellis_precision_verify.t27` — 100-digit φ, 50-digit seal -- `scripts/print_pellis_seal_decimal.py` — Decimal seal generator (50 digits) -- `scripts/verify_precision.py` — mpmath high-precision replay -- `research/trinity-pellis-paper/` — FORMULA_TABLE (32 rows), TRINITY_VS_SM, hybrid-conjecture H2 -- `docs/scientific-collaboration/pellis/pellis-imrad-paper.md` — unified IMRaD for Olsen/Pellis - -**Key results:** -- Pellis α⁻¹ = 137.035999164766… matches CODATA 2022 < 0.01 ppb -- Conjecture H2 pre-registered: sin θ₁₃ = φ⁻⁴ ≈ 8.39° vs Daya Bay 8.54° ± 0.15° (~1σ) -- Section 1.1 reserved for Scott Olsen (deadline 2026-04-13) - -**Issues opened:** -- #338 — feat(cli): tri math compare --weinberg -- #339 — feat(cli): hybrid v2 golden tests N=5..152 - -**Verdict:** READY FOR MERGE — Waiting for CI approval - ---- - -*This is a partial update for PR #337. Integrate into full NOW.md after merge.*