From a751a01b1196569c098480180e0ded3589ca7224 Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Mon, 2 Nov 2026 02:31:04 +0100 Subject: [PATCH] research: headroom-only landings, band fit, bore exemption (L156; last landing round, kept as patch) Band fit works (all chambers inside host bands, 16/16 seeds both sweeps); chamber support exemption + open-floor control work; found a metres/subvoxel mix in the shell-opening predicate. Still fails: upper landing evaluated grade 22.85 deg over native ground; TN and VS sweeps 0/16; UE 30 m/s near coverage 39.0% vs 45.5%. Owner: stop forcing landings after this round. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1 --- .../Linux156/FinalizeL156SeedSweep.py | 61 ++ .../Linux156/PassageEnvelopeAudit.py | 367 ++++++++ .../WorldAssemblerM3/Linux156/REPORT.md | 40 + .../Linux156/RunL156Captures.py | 206 +++++ .../Linux156/RunL156Determinism.py | 109 +++ .../Linux156/RunL156SeedSweep.py | 202 +++++ .../Linux156/RunL156Timing.py | 174 ++++ .../Linux156/RunL156Unreal.py | 170 ++++ .../PassageEnvelopeAudit.cpython-313.pyc | Bin 0 -> 23761 bytes .../RunL156SeedSweep.cpython-313.pyc | Bin 0 -> 14864 bytes .../baselines/native-owner-fi-seed0.json | 190 ++++ .../Linux156/captures/INDEX.md | 35 + .../after-l156-0-1-0-lower-landing.jpg | Bin 0 -> 17976 bytes .../after-l156-0-1-0-upper-landing.jpg | Bin 0 -> 28060 bytes .../after-l156-1-2-0-lower-landing.jpg | Bin 0 -> 20026 bytes .../after-l156-1-2-0-upper-landing.jpg | Bin 0 -> 18576 bytes .../after-l156-2-3-0-lower-landing.jpg | Bin 0 -> 20419 bytes .../after-l156-2-3-0-upper-landing.jpg | Bin 0 -> 22035 bytes .../before-l151-0-1-0-lower-landing.jpg | Bin 0 -> 17604 bytes .../before-l151-0-1-0-upper-landing.jpg | Bin 0 -> 25461 bytes .../before-l151-1-2-0-lower-landing.jpg | Bin 0 -> 19808 bytes .../before-l151-1-2-0-upper-landing.jpg | Bin 0 -> 18580 bytes .../before-l151-2-3-0-lower-landing.jpg | Bin 0 -> 20302 bytes .../before-l151-2-3-0-upper-landing.jpg | Bin 0 -> 22040 bytes .../Linux156/captures/manifest.json | 278 ++++++ .../Linux156/l156-headroom-landing.patch | 841 ++++++++++++++++++ 26 files changed, 2673 insertions(+) create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/FinalizeL156SeedSweep.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/PassageEnvelopeAudit.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/REPORT.md create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/RunL156Captures.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/RunL156Determinism.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/RunL156SeedSweep.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/RunL156Timing.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/RunL156Unreal.py create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/__pycache__/PassageEnvelopeAudit.cpython-313.pyc create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/__pycache__/RunL156SeedSweep.cpython-313.pyc create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/baselines/native-owner-fi-seed0.json create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/INDEX.md create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-0-1-0-lower-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-0-1-0-upper-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-1-2-0-lower-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-1-2-0-upper-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-lower-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-upper-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-0-1-0-lower-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-0-1-0-upper-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-lower-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-upper-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-lower-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-upper-landing.jpg create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/captures/manifest.json create mode 100644 Standalone/Research/WorldAssemblerM3/Linux156/l156-headroom-landing.patch diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/FinalizeL156SeedSweep.py b/Standalone/Research/WorldAssemblerM3/Linux156/FinalizeL156SeedSweep.py new file mode 100644 index 0000000..a069b7f --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/FinalizeL156SeedSweep.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +"""Recompute the full 16-seed sweep summaries and landing band margins.""" +from __future__ import annotations + +import json +from pathlib import Path + +from PassageEnvelopeAudit import _landing_content_band_audit + + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l156/seeds" + + +def finalize(kind: str) -> dict: + directory = OUT / kind + partial = directory / "runs-partial.json" + results = json.loads(partial.read_text(encoding="utf-8")) if partial.is_file() else [] + for row in results: + layout_path = ROOT / row["layout"] + bands = _landing_content_band_audit( + json.loads(layout_path.read_text(encoding="utf-8"))) if layout_path.is_file() else [] + band_pass = len(bands) == 6 and all(entry["passed"] for entry in bands) + envelope = row.get("envelope_audit") or {} + envelope["landing_content_band"] = bands + envelope["landing_content_band_passed"] = band_pass + envelope["passed"] = bool(envelope.get("passed") and band_pass) + row["envelope_audit"] = envelope + checks = row.setdefault("checks", {}) + checks["envelope"] = bool(envelope["passed"] + and envelope.get("outside_chamber_conflicts") == 0) + checks["envelope_negative_control"] = bool( + envelope.get("negative_controls") == envelope.get("negative_controls_expected") == 1) + checks["landing_content_band"] = band_pass + failed = [name for name, passed in checks.items() if not passed] + row["verdict"] = "PASS" if not failed else "FAIL" + row["reason"] = ", ".join(failed) if failed else "all requested gates pass" + results.sort(key=lambda row: row["seed"]) + completed = len(results) + passed = sum(row["verdict"] == "PASS" for row in results) + missing = sorted(set(range(16)) - {row["seed"] for row in results}) + summary = {"kind": kind, "source_stamp": ( + "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0"), + "completed": completed, "passed": passed, "failed": completed - passed, + "missing_seeds": missing, "status": "PASS" if completed == 16 and passed == 16 else "FAIL", + "results": results} + partial.write_text(json.dumps(results, indent=2) + "\n", encoding="utf-8") + (directory / "summary.json").write_text(json.dumps(summary, indent=2) + "\n", + encoding="utf-8") + print(f"[L156SeedSweepFinal] kind={kind} passed={passed}/{completed} " + f"missing={len(missing)} status={summary['status']}") + return summary + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--kind", choices=("tunnel-network", "vertical-shafts"), required=True) + args = parser.parse_args() + raise SystemExit(0 if finalize(args.kind)["status"] == "PASS" else 1) diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/PassageEnvelopeAudit.py b/Standalone/Research/WorldAssemblerM3/Linux156/PassageEnvelopeAudit.py new file mode 100644 index 0000000..90712da --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/PassageEnvelopeAudit.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +"""Audit cave primitive bounds against passage envelopes, allowing chamber joints only.""" +from __future__ import annotations + +import math +from typing import Any + + +INFLUENCE_REACH_M = 1.053334 +SHELL_THICKNESS_M = 0.75 + + +def _point(control: dict[str, Any], scale: float) -> tuple[float, float, float, float]: + x, y, z = control["position_q"] + return (x * scale, y * scale, z * scale, control["radius_q"] * scale) + + +def _knot_span(a, b) -> float: + return max(1.0e-6, math.sqrt(math.sqrt((b[0] - a[0]) ** 2 + (b[1] - a[1]) ** 2))) + + +def _evaluate(controls, span: int, t: float): + p1, p2 = controls[span], controls[span + 1] + p0 = controls[span - 1] if span else controls[0] + p3 = controls[min(span + 2, len(controls) - 1)] + dt0, dt1, dt2 = _knot_span(p0, p1), _knot_span(p1, p2), _knot_span(p2, p3) + t2, t3 = t * t, t * t * t + result = [] + for axis in (0, 1, 3): + m1 = dt1 * ((p1[axis] - p0[axis]) / dt0 + - (p2[axis] - p0[axis]) / (dt0 + dt1) + + (p2[axis] - p1[axis]) / dt1) + m2 = dt1 * ((p2[axis] - p1[axis]) / dt1 + - (p3[axis] - p1[axis]) / (dt1 + dt2) + + (p3[axis] - p2[axis]) / dt2) + value = ((2 * t3 - 3 * t2 + 1) * p1[axis] + + (-2 * t3 + 3 * t2) * p2[axis] + + (t3 - 2 * t2 + t) * m1 + (t3 - t2) * m2) + result.append(value) + radius = min(max(result[2], min(p1[3], p2[3])), max(p1[3], p2[3])) + return result[0], result[1], p1[2] + (p2[2] - p1[2]) * t, radius + + +def _segments(passage: dict[str, Any], scale: float): + controls = [_point(row, scale) for row in passage["control_points"]] + route_end = min(max(1, int(passage.get("lower_mouth_control_index", len(controls) - 1))), + len(controls) - 1) + along = 0.0 + for span in range(route_end): + a, b = controls[span], controls[span + 1] + chord = math.hypot(b[0] - a[0], b[1] - a[1]) + steps = max(1, math.ceil(chord / 2.0)) + prior = _evaluate(controls, span, 0.0) + for step in range(1, steps + 1): + current = _evaluate(controls, span, step / steps) + length = math.dist(prior[:3], current[:3]) + yield prior, current, along, max(prior[3], current[3]) + INFLUENCE_REACH_M + along += length + prior = current + + +def _distance_squared(a, b, bounds, t: float) -> float: + total = 0.0 + for axis in range(3): + pos = a[axis] + (b[axis] - a[axis]) * t + lo, hi = bounds[axis] + gap = lo - pos if pos < lo else pos - hi if pos > hi else 0.0 + total += gap * gap + return total + + +def _overlap_interval(a, b, bounds, radius: float): + cuts = {0.0, 1.0} + for axis in range(3): + delta = b[axis] - a[axis] + if abs(delta) < 1.0e-15: + continue + for edge in bounds[axis]: + t = (edge - a[axis]) / delta + if 0.0 < t < 1.0: + cuts.add(t) + cuts = sorted(cuts) + best_t, best_d2 = 0.0, math.inf + for lo, hi in zip(cuts, cuts[1:]): + mid = (lo + hi) * 0.5 + quadratic = linear = 0.0 + for axis in range(3): + delta = b[axis] - a[axis] + pos = a[axis] + delta * mid + low, high = bounds[axis] + edge = low if pos < low else high if pos > high else None + if edge is not None: + quadratic += delta * delta + linear += delta * (a[axis] - edge) + candidate = min(hi, max(lo, -linear / quadratic)) if quadratic else lo + d2 = _distance_squared(a, b, bounds, candidate) + if d2 < best_d2: + best_t, best_d2 = candidate, d2 + for t in (0.0, 1.0): + d2 = _distance_squared(a, b, bounds, t) + if d2 < best_d2: + best_t, best_d2 = t, d2 + if best_d2 > radius * radius: + return None + + radius2 = radius * radius + if _distance_squared(a, b, bounds, 0.0) <= radius2: + left = 0.0 + else: + low, high = 0.0, best_t + for _ in range(42): + mid = (low + high) * 0.5 + if _distance_squared(a, b, bounds, mid) <= radius2: + high = mid + else: + low = mid + left = high + if _distance_squared(a, b, bounds, 1.0) <= radius2: + right = 1.0 + else: + low, high = best_t, 1.0 + for _ in range(42): + mid = (low + high) * 0.5 + if _distance_squared(a, b, bounds, mid) <= radius2: + low = mid + else: + high = mid + right = low + return left, right, best_t + + +def _inside_chamber(point, chamber: dict[str, Any], scale: float) -> bool: + cx, cy, cz = (value * scale for value in chamber["floor_center_q"]) + radius = chamber["radius_q"] * scale + clear = chamber["clear_height_q"] * scale + gx, gy = (value / 65536.0 for value in chamber["floor_gradient_q16"]) + floor = cz + gx * (point[0] - cx) + gy * (point[1] - cy) + chamber_distance = max(math.hypot(point[0] - cx, point[1] - cy) - radius, + floor - point[2], point[2] - (floor + clear)) + return chamber_distance <= SHELL_THICKNESS_M + + +def _primitive_bounds(row: dict[str, Any]): + return tuple((row["bounds_min_um"][i] / 1.0e6, + row["bounds_max_um"][i] / 1.0e6) for i in range(3)) + + +def _landing_content_band_audit(layout: dict[str, Any]) -> list[dict[str, Any]]: + """Recheck the validator's complete graded floor, headroom and shell envelope.""" + voxel_um = int(layout["core_voxel_size_um"]) + q_per_metre = 256 * 1_000_000 / voxel_um + strata = {int(row["strate_index"]): row for row in layout.get("strates", [])} + + def q_to_um(q: int) -> int: + numerator = q * voxel_um + return numerator // 256 if numerator >= 0 else -((-numerator) // 256) + + result = [] + shell_q = math.floor(0.75 * q_per_metre + 0.5) + for passage in layout.get("passages", []): + for side, key, strate_key in ( + ("upper", "upper_landing_chamber", "upper_strate_index"), + ("lower", "lower_landing_chamber", "lower_strate_index")): + chamber = passage[key] + host = strata.get(int(passage[strate_key])) + content = host.get("content", {}) if host else {} + gradient = chamber["floor_gradient_q16"] + gradient_magnitude = math.isqrt(gradient[0] ** 2 + gradient[1] ** 2) + plane_reach_q = (int(chamber["radius_q"]) * gradient_magnitude + 65535) // 65536 + floor_q = int(chamber["floor_center_q"][2]) + minimum_um = q_to_um(floor_q - plane_reach_q - shell_q) + maximum_um = q_to_um(floor_q + plane_reach_q + + int(chamber["clear_height_q"]) + shell_q) + band_bottom_um, band_top_um = int(content.get("bottom_um", 0)), int( + content.get("top_um", 0)) + passed = bool(content.get("present", False) + and minimum_um >= band_bottom_um + and maximum_um <= band_top_um) + result.append({ + "passage": passage["stable_id"], "side": side, + "host_strate": int(passage[strate_key]), + "minimum_um": minimum_um, "maximum_um": maximum_um, + "content_bottom_um": band_bottom_um, "content_top_um": band_top_um, + "bottom_margin_m": (minimum_um - band_bottom_um) / 1_000_000.0, + "top_margin_m": (band_top_um - maximum_um) / 1_000_000.0, + "passed": passed, + }) + return result + + +def _bezier(points, t: float): + u = 1.0 - t + return tuple(u**3 * points[0][axis] + 3*u*u*t * points[1][axis] + + 3*u*t*t * points[2][axis] + t**3 * points[3][axis] + for axis in range(3)) + + +def _distance_to_ellipse(radial: float, vertical: float, + radius: float, height: float) -> float: + """Euclidean distance to the edge bore's horizontal/vertical ellipse.""" + radial = abs(radial) + vertical = abs(vertical) + if (radial / radius) ** 2 + (vertical / height) ** 2 <= 1.0: + return 0.0 + + lo, hi = 0.0, math.pi / 2.0 + ratio = (math.sqrt(5.0) - 1.0) / 2.0 + + def squared_distance(angle: float) -> float: + return ((radial - radius * math.cos(angle)) ** 2 + + (vertical - height * math.sin(angle)) ** 2) + + left = hi - ratio * (hi - lo) + right = lo + ratio * (hi - lo) + left_value, right_value = squared_distance(left), squared_distance(right) + for _ in range(48): + if left_value < right_value: + hi, right, right_value = right, left, left_value + left = hi - ratio * (hi - lo) + left_value = squared_distance(left) + else: + lo, left, left_value = left, right, right_value + right = lo + ratio * (hi - lo) + right_value = squared_distance(right) + return math.sqrt(min(left_value, right_value)) + + +def _actual_edge_clearance(passage, edge, scale: float, + chamber: dict[str, Any]) -> float: + """Return minimum true tube clearance outside the landing chamber. + + The route edge is a swept ellipse, with its recorded polyline as the axis. + Comparing the tunnel tube to that ellipse avoids the false clashes caused by + intersecting two enclosing boxes. + """ + controls = [tuple(value / 1.0e6 for value in point) + for point in edge["control_points_um"]] + axis = [tuple(value / 1.0e6 for value in point) + for point in edge.get("polyline_um", [])] + if len(axis) < 2: + axis = [_bezier(controls, index / 64.0) for index in range(65)] + edge_radius = (edge["bore_radius_um"] + + edge["irregularity_amplitude_um"]) / 1.0e6 + edge_height = (edge["bore_height_um"] + + edge["irregularity_amplitude_um"]) / 1.0e6 + passage_segments = passage.get("_audit_segments") or tuple(_segments(passage, scale)) + minimum_clearance = math.inf + for a, b, _, passage_radius in passage_segments: + length = math.dist(a[:3], b[:3]) + steps = max(1, math.ceil(length / 0.05)) + for step in range(steps + 1): + t = step / steps + point = tuple(a[i] + (b[i] - a[i]) * t for i in range(3)) + if _inside_chamber(point, chamber, scale): + continue + tunnel_radius = (a[3] + (b[3] - a[3]) * t + + INFLUENCE_REACH_M) + for start, end in zip(axis, axis[1:]): + delta = tuple(end[i] - start[i] for i in range(3)) + length_squared = sum(value * value for value in delta) + projection = (sum((point[i] - start[i]) * delta[i] + for i in range(3)) / length_squared + if length_squared else 0.0) + projection = min(1.0, max(0.0, projection)) + center = tuple(start[i] + projection * delta[i] for i in range(3)) + radial = math.hypot(point[0] - center[0], point[1] - center[1]) + vertical = abs(point[2] - center[2]) + clearance = (_distance_to_ellipse(radial, vertical, + edge_radius, edge_height) + - tunnel_radius) + minimum_clearance = min(minimum_clearance, clearance) + return minimum_clearance + + +def _test_bounds(bounds, strate_index: int, passages, scale: float, + *, allow_chamber: bool = True): + for passage in passages: + if strate_index not in (passage["upper_strate_index"], passage["lower_strate_index"]): + continue + chamber_key = ("upper_landing_chamber" if strate_index == passage["upper_strate_index"] + else "lower_landing_chamber") + chamber = passage[chamber_key] + segments = passage.get("_audit_segments") + if segments is None: + segments = tuple(_segments(passage, scale)) + for a, b, along, radius in segments: + expanded = [(a[i] - radius, b[i] + radius) if a[i] <= b[i] + else (b[i] - radius, a[i] + radius) for i in range(3)] + if any(expanded[i][1] < bounds[i][0] or expanded[i][0] > bounds[i][1] + for i in range(3)): + continue + overlap = _overlap_interval(a, b, bounds, radius) + if overlap is None: + continue + first, last, closest = overlap + if allow_chamber: + points = [tuple(a[i] + (b[i] - a[i]) * t for i in range(3)) + for t in (first, closest, last)] + if all(_inside_chamber(point, chamber, scale) for point in points): + continue + point = tuple(a[i] + (b[i] - a[i]) * closest for i in range(3)) + return passage["stable_id"], along + closest * math.dist(a[:3], b[:3]), point + return None + + +def audit_layout(layout: dict[str, Any]) -> dict[str, Any]: + scale = layout["core_voxel_size_um"] / (256.0 * 1.0e6) + passages = [dict(row, _audit_segments=tuple(_segments(row, scale))) + for row in layout.get("passages", [])] + primitives = [*layout.get("cavern_rooms", []), *layout.get("cavern_edges", [])] + checked = conflicts = chamber_joints = bounds_candidates = refined_false_positives = 0 + first_conflict = None + for primitive in primitives: + bounds = _primitive_bounds(primitive) + checked += 1 + primitive_conflicted = False + for passage in passages: + found = _test_bounds(bounds, primitive["strate_index"], [passage], scale) + if not found: + continue + bounds_candidates += 1 + passage_id, station, point = found + if "control_points_um" in primitive: + side = ("upper_landing_chamber" + if primitive["strate_index"] == passage["upper_strate_index"] + else "lower_landing_chamber") + clearance = _actual_edge_clearance(passage, primitive, scale, + passage[side]) + if clearance >= 0.0: + refined_false_positives += 1 + continue + primitive_conflicted = True + conflicts += 1 + if first_conflict is None: + first_conflict = {"primitive": primitive["stable_id"], + "passage": passage_id, "station_m": round(station, 3), + "center_m": [round(value, 3) for value in point]} + break + if not primitive_conflicted: + # Count the edge's named landing association as a confirmed joint. + anchor = primitive.get("start_anchor_stable_id", "") + if anchor.endswith(("/upper-landing-chamber", "/lower-landing-chamber")): + chamber_joints += 1 + + negative_controls = 0 + long_passage = max(passages, key=lambda row: len(row["control_points"]), default=None) + if long_passage: + controls = [_point(row, scale) for row in long_passage["control_points"]] + index = min(max(1, len(controls) // 2), len(controls) - 2) + center = controls[index] + bounds = tuple((center[axis] - 0.25, center[axis] + 0.25) for axis in range(3)) + # Select the side whose chamber is farther from this forced tunnel overlap. + strate = long_passage["lower_strate_index"] + if _test_bounds(bounds, strate, [long_passage], scale, allow_chamber=False): + negative_controls = 1 + landing_content_band = _landing_content_band_audit(layout) + landing_content_band_passed = bool(landing_content_band) and all( + row["passed"] for row in landing_content_band) + return {"primitives_checked": checked, "bounds_candidates": bounds_candidates, + "refined_edge_false_positives": refined_false_positives, + "outside_chamber_conflicts": conflicts, + "chamber_joints": chamber_joints, "negative_controls": negative_controls, + "negative_controls_expected": 1, "first_conflict": first_conflict, + "landing_content_band": landing_content_band, + "landing_content_band_passed": landing_content_band_passed, + "passed": conflicts == 0 and negative_controls == 1 + and landing_content_band_passed} diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux156/REPORT.md new file mode 100644 index 0000000..2b2fb80 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/REPORT.md @@ -0,0 +1,40 @@ +# L156 — native-floor carve reaches the grade stop rule + +| Landing | Before (L151) | After (L156) | +|---|---|---| +| passage/0-1/0 · upper | ![Before upper 0-1](captures/before-l151-0-1-0-upper-landing.jpg) | ![After upper 0-1](captures/after-l156-0-1-0-upper-landing.jpg) | +| passage/0-1/0 · lower | ![Before lower 0-1](captures/before-l151-0-1-0-lower-landing.jpg) | ![After lower 0-1](captures/after-l156-0-1-0-lower-landing.jpg) | +| passage/1-2/0 · upper | ![Before upper 1-2](captures/before-l151-1-2-0-upper-landing.jpg) | ![After upper 1-2](captures/after-l156-1-2-0-upper-landing.jpg) | +| passage/1-2/0 · lower | ![Before lower 1-2](captures/before-l151-1-2-0-lower-landing.jpg) | ![After lower 1-2](captures/after-l156-1-2-0-lower-landing.jpg) | +| passage/2-3/0 · upper | ![Before upper 2-3](captures/before-l151-2-3-0-upper-landing.jpg) | ![After upper 2-3](captures/after-l156-2-3-0-upper-landing.jpg) | +| passage/2-3/0 · lower | ![Before lower 2-3](captures/before-l151-2-3-0-lower-landing.jpg) | ![After lower 2-3](captures/after-l156-2-3-0-lower-landing.jpg) | + +## Result + +The headroom-only carve was implemented and captured, but L156 does not pass: fast tier still fails the upper Surface World landing's evaluated floor grade at 22.847° against 15°. The plan profile itself is 10.037°. The passage-interior support exemption and its open-floor negative control pass. The Floating Islands chamber-band failure is fixed: every chamber in both 16-seed sweeps is inside its host band, although other gates leave both sweeps at 0/16. The grade cause stops here after its three failed fits. + +## What changed + +- Bumped `WorldAssemblyEvaluatorVersion` from 239 to 240. The chamber carve now starts at the planned floor raised to the receiving native ground height when that surface is within the chamber's 4.5 m clear-height budget. Surface World samples its deterministic heightfield; a missing or higher, separate surface falls back to the planned floor. The chamber clears upward from that floor and retains its 0.75 m shell. Passage joining remains bounded to 15°. +- Added a passage-interior exemption to chamber support sampling. On the fast fixture it skipped 5,933 bore-overlap support samples; 76,671 passage-interior capsule samples had zero solid hits and the chamber audit reported zero unsupported samples. +- Added an open-floor negative control outside the bore. It found 3 unsupported samples and reported the expected failure (control status PASS). +- Fit each landing's full grade reach, shell, clear height, and Surface World rise inside its host content band. Seed 0's six chambers all pass; its tightest lower and upper band margins are 3.195 m and 3.642 m. The band gate passed all 16 seeds in both sweep types. + +## Measurements + +- **Fast tier:** failed after 64.31 s on the upper chamber. `PassagePlanGradeAudit` passed at 10.037°; the evaluated walk-floor chord at segment 10 was 22.847° over 0.479 m horizontal and 0.202 m vertical. The chamber audit had one grade failure. Passage interior was open (0 solid hits); the outside-bore open-floor negative control detected its unsupported floor. +- **Composed sweeps:** Tunnel Network 0/16 and Vertical Shafts 0/16 passed, with all 16 seeds completed for each at source stamp `4bf096c0…`. The exact landing-band and envelope gates passed across both sweeps. Remaining failures include passage summary/walkability, seams, interior-capsule and chamber-floor gates, and some route-to-chamber envelope conflicts. +- **Determinism:** Clang and GCC at W1/W8/W12 passed 6/6 with identical output hashes. Density `0179a7f6937dab67`, mesh `5f84fb3d3509f12e`, payload `8b857b09f6cb0ea4`, topology `1601efe43ef906b9`, and material `bd37729ce9c3d68d`. A seed-0 candidate baseline is recorded at `baselines/native-owner-fi-seed0.json`; it is not promoted as canonical while fast and composed gates fail. +- **Captures:** six matched eye-height views before (L151) and after (L156), same camera poses and layout identity; image quality passed 12/12. Before stamp `1ca3b84f…`; after stamp `4bf096c0…`. +- **Linux UE:** `VFHostEditor` built successfully, 27/27 actions in 69 s. No Unreal `Source/` files changed. Four start poses per condition settled LOD0–2 at median 2.421 s (`assembler-world`) and 2.457 s (planner). Five interleaved 30 m/s movement runs per condition: near-ready moving mean was 45.51% vs 39.04% (−14.21% planner); far holes were 3.15% vs 3.55% (+12.66%); max and p99 game-thread ticks were +4.13% and +6.64%. Each trace covered 46 moving samples over roughly 53–62 s. +- **L80:** no comparison result. Its quiet gate passed at load 0.74 and CPU idle 99.2%. The baseline warm-up passed in 1.72 s, but the L156 binary rejects the old owner snapshot's canonical identity. A regenerated v240 snapshot is accepted by L156, then the full pipeline exits 2: 176/21,103 compiled passage-centre samples are solid. The L137 binary rejects that v240 snapshot, so no shared serialized snapshot yields a valid cross-version comparison. `--force-generate` does not bypass the initial identity check. + +## Checks and limits + +- Ran: Clang and GCC headless builds; fast tier; both 16-seed sweeps; chamber support and open-floor negative control; content-band/envelope audits; six-way compiler/worker determinism; 12 capture-quality checks; Linux UE build, four start poses, and five 30 m/s runs per condition. +- Not run: L80 `assembler/world` timing at W8/W12 across all four layers. The host met its quiet gate, but the candidate fails its full-pipeline walkability check and the two revisions reject each other's canonical snapshots. The lone baseline warm-up is not treated as a timing comparison. +- The native-floor representation removes below-ground carving in the intended headroom case, but the effective chamber floor still violates the 15° join at a Surface World heightfield transition. No canonical baseline promotion is justified until that gate and the two composed sweeps pass. + +## Remaining risk + +The exact upper-chamber failure is at a native-surface transition, while the planned passage floor remains within its grade bound. The other sweep failures are also unresolved; the band fix and support-audit change do not make those gates pass. The movement result is slower for near-ready coverage than `assembler/world` in this five-run window. diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Captures.py b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Captures.py new file mode 100644 index 0000000..16a62d6 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Captures.py @@ -0,0 +1,206 @@ +#!/usr/bin/env python3 +"""Capture matched eye-height views from both ends of every owner tunnel.""" +from __future__ import annotations + +import json +import math +import os +from pathlib import Path +import re +import subprocess +import sys + + +ROOT = Path(__file__).resolve().parents[4] +DATA = ROOT / "Standalone/data/owner_world.json" +OUT = ROOT / "Saved/Linux/l156/captures" +LAYOUT = OUT / "after-resolved-layout.json" +ARTIFACTS = ROOT / "Standalone/Research/WorldAssemblerM3/Linux156/captures" +LIMIT = ["taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--"] +VERSIONS = { + "before-l151": { + "headless": ROOT / "Standalone/bin/linux/VoxelForgeCoreHeadless-l151-clang", + "renderer": ROOT / "Standalone/bin/linux/VoxelForgeOffscreenCapture-l151-clang", + "stamp": "1ca3b84f6d35f7f355ec0f72dabd3b87a455ea02e5789fea611916962e5db8e5", + }, + "after-l156": { + "headless": ROOT / "Saved/Linux/l156/bin/VoxelForgeCoreHeadless-l156-clang", + "renderer": ROOT / "Saved/Linux/l156/bin/VoxelForgeOffscreenCapture-l156-clang", + "stamp": "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0", + }, +} +STAMP_RE = re.compile(r"^\[VoxelForgeSourceStamp\] sha256=([0-9a-f]{64})$", re.M) + + +def fmt(values) -> str: + return ",".join(f"{value:.6f}" for value in values) + + +def angles(camera, target) -> tuple[float, float]: + dx, dy, dz = (target[index] - camera[index] for index in range(3)) + return math.degrees(math.atan2(dx, dy)), math.degrees( + math.atan2(dz, math.hypot(dx, dy))) + + +def point_q(layout: dict, values) -> tuple[float, float, float]: + scale = layout["core_voxel_size_um"] / (256.0 * 1_000_000.0) + return tuple(value * scale for value in values) + + +def chamber_views(layout: dict) -> list[dict]: + result = [] + for passage in layout["passages"]: + controls = passage["control_points"] + for side, endpoint, neighbor in ( + ("upper", controls[0], controls[1]), + ("lower", controls[-1], controls[-2])): + chamber = passage[f"{side}_landing_chamber"] + center = point_q(layout, chamber["floor_center_q"]) + a = point_q(layout, neighbor["position_q"]) + b = point_q(layout, endpoint["position_q"]) + dx, dy = a[0] - b[0], a[1] - b[1] + length = math.hypot(dx, dy) + if length <= 1.0e-9: + raise ValueError(f"degenerate {side} tunnel tangent: {passage['stable_id']}") + dx, dy = dx / length, dy / length + eye_z = center[2] + 1.45 + distance = 9.0 + target = (center[0] + dx * distance, center[1] + dy * distance, + eye_z + (chamber["floor_gradient_q16"][0] / 65536.0 * dx + + chamber["floor_gradient_q16"][1] / 65536.0 * dy) + * distance) + camera = (center[0], center[1], eye_z) + slug = passage["stable_id"].replace("passage/", "").replace("/", "-") + result.append({"name": f"{slug}-{side}-landing", "passage": passage["stable_id"], + "side": side, "camera": camera, "target": target, + "focus": (center[0], center[1], eye_z, 18.0)}) + return result + + +def stamped_run(name: str, command: list[object], log: Path, expected_stamp: str, + env: dict[str, str]) -> str: + binary = Path(str(command[0])) + probe = subprocess.run([*LIMIT, "timeout", "15s", str(binary), "--print-source-stamp"], + cwd=ROOT, env=env, text=True, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, check=False, timeout=20) + match = STAMP_RE.search(probe.stdout or "") + if probe.returncode or not match or match.group(1) != expected_stamp: + raise RuntimeError(f"{name}: source stamp mismatch for {binary}") + log.parent.mkdir(parents=True, exist_ok=True) + with log.open("w", encoding="utf-8") as stream: + result = subprocess.run([*LIMIT, "timeout", "1740s", *map(str, command)], + cwd=ROOT, env=env, stdout=stream, stderr=subprocess.STDOUT, + timeout=1745, check=False) + output = log.read_text(encoding="utf-8", errors="replace") + emitted = STAMP_RE.search(output) + if result.returncode or not emitted or emitted.group(1) != expected_stamp: + raise RuntimeError(f"{name}: export or render failed; see {log}") + return output + + +def resolve_layout(env: dict[str, str]) -> dict: + config = VERSIONS["after-l156"] + command = [config["headless"], DATA, "--world-assembler-prototype", + "--stream-benchmark", "--stream-pipeline", "--workers=12", + "--clip-radius=6", "--max-clip-level=0", "--max-level=0", + "--force-generate", "--seed=0", "--recipe=surface-world", "--resolved-layout-only", + f"--resolved-layout-output={LAYOUT}"] + stamped_run("after-l156-resolve-layout", list(map(str, command)), + OUT / "after-l156-resolved-layout.log", config["stamp"], env) + layout = json.loads(LAYOUT.read_text(encoding="utf-8")) + if len(layout.get("passages", [])) != 3: + raise RuntimeError("owner layout did not resolve the expected three tunnels") + return layout + + +def main() -> int: + if not DATA.is_file(): + raise SystemExit("missing owner fixture") + OUT.mkdir(parents=True, exist_ok=True) + ARTIFACTS.mkdir(parents=True, exist_ok=True) + env = os.environ.copy() + env["LP_NUM_THREADS"] = "12" + env["XDG_CACHE_HOME"] = str(OUT / "xdg-cache") + layout = resolve_layout(env) + views = chamber_views(layout) + quality_tool = ROOT / "Standalone/Tools/verify/capture_quality.py" + manifest = [] + failures = [] + for version, config in VERSIONS.items(): + for view in views: + camera, target = view["camera"], view["target"] + yaw, pitch = angles(camera, target) + mesh_dir = OUT / "meshes" / version + mesh_dir.mkdir(parents=True, exist_ok=True) + mesh = mesh_dir / f"{view['name']}.vfmesh" + capture_layout = mesh_dir / f"{view['name']}-layout.json" + export = [config["headless"], DATA, "--world-assembler-prototype", + "--stream-benchmark", "--stream-pipeline", "--workers=12", + "--clip-radius=6", "--max-clip-level=0", "--max-level=0", + "--force-generate", "--seed=0", "--recipe=surface-world", + "--render-distance-chunks=0", + f"--camera={fmt((*camera, yaw, pitch))}", + f"--resolved-layout-output={capture_layout}", f"--mesh-export={mesh}"] + stamped_run(f"{version}-{view['name']}-export", list(map(str, export)), + OUT / f"{version}-{view['name']}-export.log", config["stamp"], env) + if not mesh.is_file() or mesh.stat().st_size == 0: + raise RuntimeError(f"{version}-{view['name']}: empty mesh export") + png = OUT / f"{version}-{view['name']}.png" + jpg = ARTIFACTS / f"{version}-{view['name']}.jpg" + render = [config["renderer"], mesh, png, "--size=1280x720", + "--fov-deg=78.0", f"--camera-m={fmt(camera)}", + f"--yaw-deg={yaw:.6f}", f"--pitch-deg={pitch:.6f}", + "--tile-skirts=off", "--shade=readable", "--headlamp=on", + "--height-tint=on", "--height-center-m=-950", "--height-range-m=60", + "--tile-edges=off", f"--focus-region={fmt(view['focus'])}"] + stamped_run(f"{version}-{view['name']}-render", list(map(str, render)), + OUT / f"{version}-{view['name']}-render.log", config["stamp"], env) + subprocess.run([*LIMIT, "timeout", "120s", "ffmpeg", "-nostdin", + "-hide_banner", "-loglevel", "error", "-y", "-i", png, + "-frames:v", "1", "-q:v", "4", jpg], cwd=ROOT, env=env, + check=True, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, + timeout=125) + check = subprocess.run([*LIMIT, "timeout", "120s", sys.executable, + quality_tool, jpg], cwd=ROOT, env=env, text=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + check=False, timeout=125) + quality_ok = check.returncode == 0 and "status=PASS" in check.stdout + if not quality_ok: + failures.append(f"{version}-{view['name']}") + quality_line = (check.stdout.strip().splitlines()[-1] + if check.stdout.strip() else f"quality exit={check.returncode}") + manifest.append({"version": version, "view": view["name"], + "passage": view["passage"], "side": view["side"], + "file": str(jpg.relative_to(ROOT)), "camera_m": camera, + "target_m": target, "yaw_deg": yaw, "pitch_deg": pitch, + "source_stamp": config["stamp"], + "pose_layout_identity": layout.get("stable_identity"), + "quality_status": "PASS" if quality_ok else "FAIL", + "quality": quality_line}) + print(f"[L156Capture] version={version} view={view['name']} " + f"quality={'PASS' if quality_ok else 'FAIL'} " + f"file={jpg.relative_to(ROOT)}", flush=True) + (ARTIFACTS / "manifest.json").write_text( + json.dumps(manifest, indent=2) + "\n", encoding="utf-8") + with (ARTIFACTS / "INDEX.md").open("w", encoding="utf-8") as index: + index.write("# L156 matched owner tunnel landing captures\n\n" + "Seed 0 camera poses resolved from the L156 owner layout and reused for both " + "versions. Each view is at eye height at one of the three tunnel landing " + "chambers. Before uses the L151 head build; after uses L156 source stamp " + f"`{VERSIONS['after-l156']['stamp']}`.\n\n") + for view in views: + index.write(f"## {view['passage']} / {view['side']} landing\n\n" + f"- Before: [image](before-l151-{view['name']}.jpg)\n" + f"- After: [image](after-l156-{view['name']}.jpg)\n\n") + index.write(f"Capture quality failures: {len(failures)}/{len(manifest)}.\n") + print(f"[L156CaptureSummary] chamber_views={len(views)} " + f"images={len(manifest)} quality_failures={len(failures)}", flush=True) + return 0 if not failures else 1 + + +if __name__ == "__main__": + try: + raise SystemExit(main()) + except Exception as error: + print(f"[L156CaptureFailure] {error}", file=sys.stderr, flush=True) + raise SystemExit(1) diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Determinism.py b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Determinism.py new file mode 100644 index 0000000..b87dfd5 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Determinism.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +"""Compare the composed native Floating Islands owner at Clang/GCC W1/W8/W12.""" +from __future__ import annotations + +import json +import re +import subprocess +import time +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l156/determinism" +BASELINE = ROOT / "Standalone/Research/WorldAssemblerM3/Linux156/baselines/native-owner-fi-seed0.json" +DATA = ROOT / "Standalone/data/owner_world.json" +STAMP = "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0" +BINARIES = { + "clang": ROOT / "Saved/Linux/l156/bin/VoxelForgeCoreHeadless-l156-clang", + "gcc": ROOT / "Saved/Linux/l156/bin/VoxelForgeCoreHeadless-l156-gcc", +} +CAMERA = "25.836914,3.199219,-737.000000,0,0" +STAMP_RE = re.compile(r"^\[VoxelForgeSourceStamp\] sha256=([0-9a-f]{64})$", re.M) +HASH_RE = re.compile( + r"^\[Pipeline(?:FullDetailHash|WholeViewHash|MaterialHash|LODHash|ExactQueryHash)\].*$", + re.M) +NATIVE_FI = re.compile( + r"^\[DensityDispatch\] strate=1 generator=FloatingIslands " + r"recipe=FloatingIslands\.ClusterField version=\d+ " + r"bound_path=FloatingIslands-native adapter=FFloatingIslandFieldAdapter$", re.M) +FI_RECIPE_HASH = re.compile( + r"^\[FloatingIslandWorldAssembly\].*recipe_hash=([0-9a-f]+) status=PASS$", re.M) +FI_CLEARANCE = re.compile(r"^\[FloatingIslandPassageClearance\].*status=PASS$", re.M) +FI_ROUTE_AUDIT = re.compile(r"^\[FloatingIslandRouteAudit\].*status=PASS$", re.M) + + +def main() -> int: + if not DATA.is_file() or any(not path.is_file() for path in BINARIES.values()): + raise SystemExit("missing L156 Clang/GCC binary or composed owner fixture") + OUT.mkdir(parents=True, exist_ok=True) + rows: list[dict[str, object]] = [] + reference_hashes: list[str] | None = None + reference_identity: str | None = None + reference_recipe_hash: str | None = None + for compiler, binary in BINARIES.items(): + for workers in (1, 8, 12): + name = f"native-owner-fi-{compiler}-w{workers}" + log, layout = OUT / f"{name}.log", OUT / f"{name}.json" + command = ["taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(binary), str(DATA), "--world-assembler-prototype", + "--stream-benchmark", "--stream-pipeline", f"--workers={workers}", + "--clip-radius=3", "--max-clip-level=8", "--max-level=0", + f"--camera={CAMERA}", "--stream-hash", "--force-generate", "--seed=0", + "--recipe=surface-world", "--native-owner-fi", "--render-distance-chunks=0", + "--density-dispatch-report", f"--resolved-layout-output={layout}"] + started = time.monotonic() + with log.open("w", encoding="utf-8") as output: + proc = subprocess.run(command, cwd=ROOT, stdout=output, + stderr=subprocess.STDOUT, check=False, timeout=1740) + content = log.read_text(encoding="utf-8", errors="replace") + stamp = STAMP_RE.search(content) + hashes = HASH_RE.findall(content) + current_layout = json.loads(layout.read_text(encoding="utf-8")) if layout.is_file() else {} + identity = current_layout.get("stable_identity") + native_ok = bool(NATIVE_FI.search(content)) + recipe_hash = FI_RECIPE_HASH.search(content) + clearance = FI_CLEARANCE.search(content) + route_audit = FI_ROUTE_AUDIT.search(content) + local_pass = (proc.returncode == 0 and stamp is not None + and stamp.group(1) == STAMP and len(hashes) >= 4 and native_ok + and recipe_hash is not None and route_audit is not None and bool(identity)) + if reference_hashes is None and local_pass: + reference_hashes, reference_identity = hashes, identity + reference_recipe_hash = recipe_hash.group(1) if recipe_hash else None + same = (hashes == reference_hashes and identity == reference_identity + and (recipe_hash.group(1) if recipe_hash else None) + == reference_recipe_hash) + passed = bool(local_pass and same) + row = {"compiler": compiler, "workers": workers, "exit": proc.returncode, + "source_stamp": stamp.group(1) if stamp else None, "hash_lines": hashes, + "layout_identity": identity, "native_fi_dispatch": native_ok, + "floating_island_recipe_hash": recipe_hash.group(1) if recipe_hash else None, + "passage_clearance_line": clearance.group(0) if clearance else None, + "route_audit_line": route_audit.group(0) if route_audit else None, + "passed": passed, "elapsed_s": round(time.monotonic() - started, 3), + "log": str(log.relative_to(ROOT)), "layout": str(layout.relative_to(ROOT))} + rows.append(row) + print("[L156DeterminismRun] " + json.dumps(row, sort_keys=True), flush=True) + (OUT / "runs-partial.json").write_text(json.dumps(rows, indent=2) + "\n") + if not passed: + summary = {"status": "FAIL", "source_stamp": STAMP, "runs": rows} + (OUT / "summary.json").write_text(json.dumps(summary, indent=2) + "\n") + raise SystemExit(f"native owner determinism mismatch; see {log}") + + summary = {"status": "PASS", "source_stamp": STAMP, + "world_assembly_evaluator_version": 240, + "layout_identity": reference_identity, + "floating_island_recipe_hash": reference_recipe_hash, + "baseline_scope": "candidate only; fast tier remains failed", + "runs": rows} + OUT.joinpath("summary.json").write_text(json.dumps(summary, indent=2) + "\n") + BASELINE.parent.mkdir(parents=True, exist_ok=True) + BASELINE.write_text(json.dumps(summary, indent=2) + "\n", encoding="utf-8") + print(f"[L156DeterminismSummary] runs={len(rows)} source_stamp={STAMP} status=PASS " + "baseline=candidate-only", flush=True) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/RunL156SeedSweep.py b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156SeedSweep.py new file mode 100644 index 0000000..32ed92e --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156SeedSweep.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python3 +"""Run the L156 passage and envelope gates across the 16 owner seeds.""" +from __future__ import annotations + +import argparse +import json +import re +import subprocess +import time +from pathlib import Path + +from PassageEnvelopeAudit import audit_layout + + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l156/seeds" +BIN = ROOT / "Saved/Linux/l156/bin/VoxelForgeCoreHeadless-l156-clang" +DATA = ROOT / "Standalone/data/owner_world.json" +STAMP = "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0" +STAMP_RE = re.compile(r"^\[VoxelForgeSourceStamp\] sha256=([0-9a-f]+)$", re.M) +DISPATCH = { + "tunnel-network": re.compile( + r"^\[DensityDispatch\] strate=2 generator=TunnelNetwork " + r"recipe=Core\.Caves\.PrimitiveField version=1 " + r"bound_path=Caves-native adapter=FCavesFieldAdapter$", re.M), + "vertical-shafts": re.compile( + r"^\[DensityDispatch\] strate=3 generator=VerticalShafts " + r"recipe=Core\.Caves\.PrimitiveField version=1 " + r"bound_path=Caves-native adapter=FCavesFieldAdapter$", re.M), +} +ROUTES = { + "tunnel-network": re.compile( + r"^\[ResolvedStrateRouteAudit\] strate=2 .*unsupported=0 " + r"grade_failures=0 .*status=PASS$", re.M), + "vertical-shafts": re.compile( + r"^\[ResolvedStrateRouteAudit\] strate=3 .*unsupported=0 " + r"grade_failures=0 .*status=PASS$", re.M), +} +CONTROLS = { + "tunnel-network": re.compile( + r"^\[TunnelNetworkBlockedRouteControl\].*expected=FAIL status=PASS$", re.M), + "vertical-shafts": re.compile( + r"^\[VerticalShaftsBlockedRouteControl\].*expected=FAIL status=PASS$", re.M), +} +REQUIRED = { + "passage_summary": re.compile(r"^\[ResolvedPassageAuditSummary\].*status=PASS$", re.M), + "seams": re.compile(r"^\[PassageTileSeamAudit\].*status=PASS$", re.M), + "shell": re.compile(r"^\[PassageShellAuditSummary\].*status=PASS$", re.M), + "naturalness": re.compile(r"^\[PassageNaturalnessSummary\].*status=PASS$", re.M), + "mouth_profile": re.compile(r"^\[PassageMouthProfileSummary\].*status=PASS$", re.M), + "ripple": re.compile(r"^\[PassageRippleAuditSummary\].*status=PASS$", re.M), + "interior_capsules": re.compile( + r"^\[PassageInteriorCapsuleAuditSummary\].*status=PASS$", re.M), + "layout_controls": re.compile( + r"^\[ResolvedLayoutValidatorControls\] rejected=10/10 status=PASS$", re.M), + "floor_profile_controls": re.compile( + r"^\[FloorProfileBlendNegativeControls\].*detected=true/true status=PASS$", re.M), + "naturalness_control": re.compile( + r"^\[PassageNaturalnessNegativeControl\].*detected=true$", re.M), + "mouth_control": re.compile( + r"^\[PassageMouthProfileNegativeControl\].*detected=true$", re.M), +} + + +def passage_rows(content: str) -> list[str]: + return re.findall(r"^\[ResolvedPassageAudit\].*$", content, re.M) + + +def grade_audit(content: str) -> tuple[bool, list[str]]: + rows = re.findall(r"^\[PassagePlanGradeAudit\].*$", content, re.M) + ids = set() + passed = bool(rows) + for row in rows: + identifier = re.search(r"\bid=([^ ]+)", row) + maximum = re.search(r"\bmax_grade_deg=([0-9.]+)", row) + limit = re.search(r"\blimit_deg=([0-9.]+)", row) + violations = re.search(r"\bviolations=(\d+)", row) + status = "status=PASS" in row + if identifier: + ids.add(identifier.group(1)) + passed &= bool(identifier and maximum and limit and violations and status + and float(maximum.group(1)) <= float(limit.group(1)) + and float(limit.group(1)) == 15.0 + and int(violations.group(1)) == 0) + return passed and len(ids) >= 3, rows + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--kind", choices=tuple(DISPATCH), required=True) + parser.add_argument("--start-seed", type=int, default=0) + parser.add_argument("--end-seed", type=int, default=15) + args = parser.parse_args() + if not 0 <= args.start_seed <= args.end_seed <= 15: + raise SystemExit("seed range must be within 0..15 and start <= end") + if not BIN.is_file() or not DATA.is_file(): + raise SystemExit("missing L156 Clang binary or composed owner fixture") + mode_out = OUT / args.kind + mode_out.mkdir(parents=True, exist_ok=True) + partial = mode_out / "runs-partial.json" + results = (json.loads(partial.read_text(encoding="utf-8")) + if partial.is_file() and args.start_seed > 0 else []) + completed = {row["seed"] for row in results} + for seed in range(args.start_seed, args.end_seed + 1): + if seed in completed: + continue + log = mode_out / f"seed{seed}.log" + layout = mode_out / f"seed{seed}.json" + command = ["taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(BIN), str(DATA), "--world-assembler-prototype", + "--stream-benchmark", "--stream-pipeline", "--workers=8", "--clip-radius=3", + "--max-clip-level=8", "--max-level=0", "--force-generate", f"--seed={seed}", + "--recipe=surface-world", "--density-dispatch-report", + "--audit-resolved-layout-passages", "--audit-passage-tile-seams", + f"--resolved-layout-output={layout}"] + started = time.monotonic() + with log.open("w", encoding="utf-8") as output: + proc = subprocess.run(command, cwd=ROOT, stdout=output, + stderr=subprocess.STDOUT, check=False, timeout=1740) + content = log.read_text(encoding="utf-8", errors="replace") + stamp = STAMP_RE.search(content) + checks = {name: bool(pattern.search(content)) for name, pattern in REQUIRED.items()} + checks["process_exit_zero"] = proc.returncode == 0 + checks["source_stamp"] = stamp is not None and stamp.group(1) == STAMP + checks["dispatch"] = bool(DISPATCH[args.kind].search(content)) + checks["route"] = bool(ROUTES[args.kind].search(content)) + checks["blocked_route_control"] = bool(CONTROLS[args.kind].search(content)) + + passages = passage_rows(content) + checks["three_passages_walkable_and_open"] = ( + len(passages) == 3 and all("walkability=PASS" in row + and "interior_air=PASS" in row + and re.search(r"\bblocked=0\b", row) + and re.search(r"\bunsupported=0\b", row) + and re.search(r"\bgrade_failures=0\b", row) + for row in passages)) + checks["three_interior_negative_controls"] = len(re.findall( + r"^\[ResolvedPassageInteriorNegativeControl\].*detected=true status=PASS$", + content, re.M)) == 3 + checks["three_ripple_gap_controls"] = len(re.findall( + r"^\[PassageRippleSamplingControl\].*status=PASS$", content, re.M)) == 3 + checks["three_blocked_passage_controls"] = len(re.findall( + r"^\[ResolvedPassageBlockedControl\].*detected=true$", content, re.M)) == 3 + chamber_rows = re.findall(r"^\[PassageLandingChamberAudit\].*$", content, re.M) + checks["six_chamber_floors"] = (len(chamber_rows) == 6 and all( + "status=PASS" in row and re.search(r"\bsolid_samples=0\b", row) + and re.search(r"\bgrade_failures=0\b", row) for row in chamber_rows)) + checks["plan_grade"] = grade_audit(content)[0] + chamber_controls = re.search( + r"^\[PassageLandingChamberNegativeControlSummary\] " + r"detected=(\d+)/6 .*status=OBSERVED$", content, re.M) + checks["chamber_negative_control"] = bool( + chamber_controls and int(chamber_controls.group(1)) > 0) + + checks["three_ripple_profiles"] = len(re.findall( + r"^\[PassageRippleAudit\].*status=PASS$", content, re.M)) >= 3 + checks["passage_count"] = len(re.findall( + r"^\[ResolvedPassageAudit\].*walkability=PASS", content, re.M)) == 3 + checks["layout_output"] = layout.is_file() + envelope = audit_layout(json.loads(layout.read_text(encoding="utf-8"))) \ + if layout.is_file() else None + checks["envelope"] = bool(envelope and envelope["passed"] + and envelope["outside_chamber_conflicts"] == 0) + checks["envelope_negative_control"] = bool(envelope + and envelope["negative_controls"] == envelope["negative_controls_expected"] == 1) + checks["landing_content_band"] = bool(envelope + and envelope["landing_content_band_passed"] + and len(envelope["landing_content_band"]) == 6) + passed = all(checks.values()) + failed = [name for name, ok in checks.items() if not ok] + row = {"kind": args.kind, "seed": seed, + "verdict": "PASS" if passed else "FAIL", + "reason": ", ".join(failed) if failed else "all requested gates pass", + "exit": proc.returncode, "checks": checks, + "plan_grade_rows": grade_audit(content)[1], + "envelope_audit": envelope, + "elapsed_s": round(time.monotonic() - started, 3), + "log": str(log.relative_to(ROOT)), "layout": str(layout.relative_to(ROOT))} + results.append(row) + print("[L156SeedSweep] " + json.dumps(row, sort_keys=True), flush=True) + partial.write_text(json.dumps(results, indent=2) + "\n", encoding="utf-8") + + results.sort(key=lambda row: row["seed"]) + passed_count = sum(row["verdict"] == "PASS" for row in results) + completed_count = len(results) + missing_seeds = sorted(set(range(16)) - {row["seed"] for row in results}) + summary = {"kind": args.kind, "source_stamp": STAMP, + "seeds": [row["seed"] for row in results], + "completed": completed_count, "passed": passed_count, + "failed": completed_count - passed_count, "missing_seeds": missing_seeds, + "results": results} + (mode_out / "summary.json").write_text(json.dumps(summary, indent=2) + "\n", + encoding="utf-8") + status = "PASS" if completed_count == 16 and passed_count == 16 else "FAIL" + print(f"[L156SeedSweepSummary] kind={args.kind} passed={passed_count}/{completed_count} " + f"failed={completed_count-passed_count} missing={len(missing_seeds)} status={status}", + flush=True) + return 0 if status == "PASS" else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Timing.py b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Timing.py new file mode 100644 index 0000000..bcaa666 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Timing.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +"""L80 comparison of L156 with the assembler/world baseline.""" +from __future__ import annotations + +import json +import os +import re +import statistics +import subprocess +import time +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[4] +OUT = ROOT / "Saved/Linux/l156/timing" +DATA = ROOT / "Standalone/data/owner_world.json" +BINARIES = { + "assembler-world": ( + ROOT / "Saved/Linux/l137/bin/VoxelForgeCoreHeadless-l137-aa-a", + "4499fb2a8a4ede7d6cbc68d1b794f104658cdaae93ed9cacbc91fe7ff3fc3621"), + "planner-head": ( + ROOT / "Saved/Linux/l156/bin/VoxelForgeCoreHeadless-l156-clang", + "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0"), +} +CAMERAS = { + 0: (8.0, 16.0, -372.2626953125), + 1: (25.8369140625, 3.19921875, -737.0), + 2: (19.166015625, -14.2001953125, -753.3740234375), + 3: (-20.0625, -5.068359375, -900.353515625), +} +PIPELINE = re.compile(r"^\[StreamPipeline\] (.*)$", re.M) +FIELDS = re.compile(r"([a-zA-Z0-9_]+)=([^ ]+)") +NEAR = re.compile( + r"^\[WorldAssemblerNearLODReady\] lods=0-2 tiles=(\d+)/(\d+) cold_ready_s=([0-9.]+)$", + re.M) +STAMP = re.compile(r"^\[VoxelForgeSourceStamp\] sha256=([0-9a-f]+)$", re.M) + + +def run(strate: int, workers: int, version: str, phase: str, replicate: int) -> dict: + OUT.mkdir(parents=True, exist_ok=True) + binary, expected_stamp = BINARIES[version] + camera = ",".join(f"{value:.12f}" for value in CAMERAS[strate]) + ",0,0" + label = f"s{strate}-w{workers}-{version}-{phase}{replicate}" + log = OUT / f"{label}.log" + command = [ + "taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", + "timeout", "1740s", str(binary), str(DATA), "--world-assembler-prototype", + "--stream-benchmark", "--stream-pipeline", f"--workers={workers}", + "--clip-radius=3", "--max-clip-level=8", "--max-level=8", + f"--camera={camera}", "--profile-lod-work", "--stream-scheduler-policy=3", + ] + started = time.monotonic() + with log.open("w", encoding="utf-8") as output: + proc = subprocess.run(command, cwd=ROOT, stdout=output, + stderr=subprocess.STDOUT, check=False, timeout=1740) + content = log.read_text(encoding="utf-8", errors="replace") + pipeline, near, stamp = PIPELINE.search(content), NEAR.search(content), STAMP.search(content) + if (proc.returncode or pipeline is None or near is None or stamp is None + or stamp.group(1) != expected_stamp): + raise SystemExit(f"L80 timing failed or source stamp mismatch: {log}; exit={proc.returncode}") + fields = dict(FIELDS.findall(pipeline.group(1))) + row = { + "strate": strate, "workers": workers, "version": version, + "phase": phase, "replicate": replicate, "source_stamp": stamp.group(1), + "lod02_ready_s": float(near.group(3)), + "whole_view_ready_s": float(fields["whole_view_ready"].removesuffix("s")), + "whole_tiles": int(fields["whole_tiles"].split("/")[0]), + "wall_s": round(time.monotonic() - started, 3), + "log": str(log.relative_to(ROOT)), + } + print("[L156TimingRun] " + json.dumps(row, sort_keys=True), flush=True) + return row + + +def quiet_machine() -> tuple[float, float]: + load_1m = os.getloadavg()[0] + + def totals() -> tuple[int, int]: + fields = Path("/proc/stat").read_text().splitlines()[0].split() + values = [int(value) for value in fields[1:]] + return sum(values), values[3] + values[4] + + before = totals() + time.sleep(2.0) + after = totals() + idle = 100.0 * (after[1] - before[1]) / max(1, after[0] - before[0]) + return load_1m, idle + + +def main() -> int: + if any(not path.is_file() for path in [DATA, *(entry[0] for entry in BINARIES.values())]): + raise SystemExit("missing L156 timing input") + OUT.mkdir(parents=True, exist_ok=True) + load_1m, idle = quiet_machine() + (OUT / "machine-load-before.txt").write_text( + f"1-minute load: {load_1m:.2f}\n2-second CPU idle: {idle:.1f}%\n") + print(f"[L156TimingGate] load_1m={load_1m:.2f} cpu_idle_2s={idle:.1f}%", flush=True) + if load_1m >= 1.5 or idle < 97.0: + raise SystemExit("timing refused: machine is above the L80 quiet-load gate") + + rows = [] + versions = tuple(BINARIES) + for strate in range(4): + for workers in (8, 12): + for version in versions: + run(strate, workers, version, "warmup", 0) + for replicate in range(1, 6): + order = versions if replicate % 2 else tuple(reversed(versions)) + for version in order: + rows.append(run(strate, workers, version, "measured", replicate)) + (OUT / "runs-partial.json").write_text( + json.dumps(rows, indent=2) + "\n", encoding="utf-8") + + measured = [row for row in rows if row["phase"] == "measured"] + summary = [] + for strate in range(4): + for workers in (8, 12): + group = [row for row in measured + if row["strate"] == strate and row["workers"] == workers] + medians = { + version: { + key: statistics.median(row[key] for row in group + if row["version"] == version) + for key in ("lod02_ready_s", "whole_view_ready_s") + } + for version in versions + } + entry = {"strate": strate, "workers": workers, + "replicates_per_version": 5, "medians": medians} + for key in ("lod02_ready_s", "whole_view_ready_s"): + entry[f"planner_head_vs_assembler_world_{key}_delta_pct"] = round( + 100.0 * (medians["planner-head"][key] + / medians["assembler-world"][key] - 1.0), 2) + entry[f"{key}_paired_deltas_pct"] = [ + round(100.0 * ( + next(row[key] for row in group + if row["version"] == "planner-head" + and row["replicate"] == replicate) + / next(row[key] for row in group + if row["version"] == "assembler-world" + and row["replicate"] == replicate) - 1.0), 3) + for replicate in range(1, 6)] + summary.append(entry) + (OUT / "summary.json").write_text(json.dumps({ + "a_a_noise_floor_pct": 1.0, + "timing_protocol": ( + "one warm-up per binary, five interleaved runs per cell, W8/W12, " + "all four owner layers; L137 A/A median noise floor ±1%"), + "runs": rows, + "summary": summary, + }, indent=2) + "\n", encoding="utf-8") + failed_cells = [] + for entry in summary: + for measure in ("lod02_ready_s", "whole_view_ready_s"): + delta = entry[f"planner_head_vs_assembler_world_{measure}_delta_pct"] + if delta > 1.0: + failed_cells.append({"strate": entry["strate"], + "workers": entry["workers"], + "measure": measure, "delta_pct": delta}) + report = json.loads((OUT / "summary.json").read_text(encoding="utf-8")) + report["performance_floor_pct"] = 1.0 + report["performance_floor_rule"] = ( + "pass when no L156 median is more than 1% slower than assembler/world") + report["performance_floor_failures"] = failed_cells + report["status"] = "PASS" if not failed_cells else "FAIL" + (OUT / "summary.json").write_text(json.dumps(report, indent=2) + "\n", + encoding="utf-8") + print(f"[L156TimingSummary] cells={len(summary)} failing_metrics={len(failed_cells)} " + f"status={'PASS' if not failed_cells else 'FAIL'}", flush=True) + return 0 if not failed_cells else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Unreal.py b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Unreal.py new file mode 100644 index 0000000..3befe87 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/RunL156Unreal.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 +"""Measure planner HEAD and code-equivalent assembler/world with the L121/L127 runners.""" +from __future__ import annotations + +import importlib.util +import json +import os +from pathlib import Path +import statistics +import sys + + +ROOT = Path(__file__).resolve().parents[4] +RESEARCH = ROOT / "Standalone/Research/WorldAssemblerM3" +EDITOR = Path("/home/jahni/UnrealEngine/Engine/Binaries/Linux/UnrealEditor-Cmd") +HOSTS = { + "assembler-world": ROOT / "Saved/Linux/l127/ue-baseline-project", + "planner-head": Path("/home/jahni/VFHost"), +} +CAMERAS = { + 0: (8.0, 16.0, -372.2626953125), + 1: (25.8369140625, 3.19921875, -737.0), + 2: (19.166015625, -14.2001953125, -753.3740234375), + 3: (-20.0625, -5.068359375, -900.353515625), +} + + +def load(name: str, path: Path): + spec = importlib.util.spec_from_file_location(name, path) + if spec is None or spec.loader is None: + raise RuntimeError(f"cannot load {path}") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def configure(arrival, movement, label: str): + host = HOSTS[label].resolve() + out = ROOT / "Saved/Linux/l156/ue" / label + plugin_saved = host / "Plugins/VoxelForge/Saved/Linux/l156" + out.mkdir(parents=True, exist_ok=True) + plugin_saved.mkdir(parents=True, exist_ok=True) + os.environ["XDG_CONFIG_HOME"] = str(out / "config") + arrival.HOST = host + arrival.EDITOR = EDITOR + arrival.OUT = out / "start" + arrival.HOST_SAVED = out / "host" + arrival.HOST_PLUGIN_SAVED = plugin_saved + arrival.RUN_TIMEOUT_S = 1740 + movement.HOST = host + movement.EDITOR = EDITOR + movement.OUT = out / "movement" + movement.HOST_SAVED = out / "host" + movement.HOST_OUT = plugin_saved / "movement" + movement.RUN_TIMEOUT_S = 1740 + return host, out + + +def start_matrix(arrival, movement, label: str) -> dict: + host, out = configure(arrival, movement, label) + spawns = { + 0: (8.0, 16.0, -372.2626953125), + 1: (25.8369140625, 3.19921875, -737.0), + 2: (19.166015625, -14.2001953125, -753.3740234375), + 3: (-20.0625, -5.068359375, -900.353515625), + } + starts = [] + for index, position in spawns.items(): + stratum = "FI" if index == 1 else "SW" + arrival.SPAWNS_M[stratum] = position + row = arrival.run(stratum, 1, f"start-s{index}", 8, 1, 0, 1, 1, 0, 1, + False, False, 1) + row["strate_index"] = index + row["spawn_m"] = list(position) + if row.get("lod02_full_settled_t_s") is None: + raise RuntimeError(f"LOD0-2 did not settle for S{index}: {row}") + starts.append(row) + print("[L156UEStart] " + json.dumps(row, sort_keys=True), flush=True) + (out / "start-summary.json").write_text( + json.dumps(starts, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + row = moving_run(movement, label, 1) + (out / "movement-first.json").write_text( + json.dumps(row, indent=2, sort_keys=True) + "\n", encoding="utf-8") + print("[L156UEMovement] " + json.dumps(row, sort_keys=True), flush=True) + return {"host": str(host), "starts": starts, "first_movement": row} + + +def moving_run(movement, label: str, repetition: int) -> dict: + condition = "c743f2a" if label == "assembler-world" else "planner-head" + row = movement.run_unreal(condition, repetition) + events = movement.parse_events(ROOT / row["trace"]) + row["supplemental_far_applies_moving"] = sum( + int(event.get("supplemental_far_applies", 0)) + for event in events + if event.get("type") == "apply_frame" + and float(event.get("speed_cm_s", 0.0)) >= 50.0) + if row.get("effective_tile_slots") != 8: + raise RuntimeError(f"expected eight effective tile slots: {row}") + return row + + +def main() -> int: + out = ROOT / "Saved/Linux/l156/ue" + out.mkdir(parents=True, exist_ok=True) + arrival = load("l150_arrival", RESEARCH / "Linux121/RunL121Arrival.py") + movement = load("l150_movement", RESEARCH / "Linux121/RunL121Movement.py") + summaries = {} + all_runs = {label: [] for label in HOSTS} + for label in HOSTS: + summaries[label] = start_matrix(arrival, movement, label) + all_runs[label].append(summaries[label]["first_movement"]) + + for repetition in range(2, 6): + order = ("planner-head", "assembler-world") if repetition % 2 == 0 \ + else ("assembler-world", "planner-head") + for label in order: + configure(arrival, movement, label) + row = moving_run(movement, label, repetition) + all_runs[label].append(row) + (out / "movement-runs-partial.json").write_text( + json.dumps(all_runs, indent=2, sort_keys=True) + "\n", encoding="utf-8") + print("[L156UEMovementRepeat] " + json.dumps({ + key: row.get(key) for key in ( + "condition", "repetition", "near_ready_moving_mean_pct", + "far_holes_moving_mean_pct", "game_thread_tick_p99_ms", + "game_thread_tick_max_ms", "supplemental_far_applies_moving", + "wall_s", "trace")}, sort_keys=True), flush=True) + + keys = ("near_ready_moving_mean_pct", "far_holes_moving_mean_pct", + "game_thread_tick_p99_ms", "game_thread_tick_max_ms") + medians = { + label: {key: statistics.median(row[key] for row in rows) for key in keys} + for label, rows in all_runs.items() + } + delta = { + key: round(100.0 * (medians["planner-head"][key] + / medians["assembler-world"][key] - 1.0), 2) + for key in keys + } + result = { + "baseline_commit": "c743f2a (code-equivalent to assembler/world eb47d72)", + "protocol": ( + "L121 arrival and L127 movement; starts at four owner strata; five interleaved " + "30 m/s runs per build; 12 s move plus 5 s dwell; eight effective tile slots"), + "starts": summaries, + "movement_runs": all_runs, + "movement_medians": medians, + "planner_head_vs_assembler_world_delta_pct": delta, + } + (out / "summary.json").write_text( + json.dumps(result, indent=2, sort_keys=True) + "\n", encoding="utf-8") + print("[L156UESummary] " + json.dumps({ + "movement_medians": medians, + "planner_head_vs_assembler_world_delta_pct": delta, + "starts_s": { + label: [round(row["lod02_full_settled_t_s"], 3) + for row in summary["starts"]] + for label, summary in summaries.items() + }, + }, sort_keys=True), flush=True) + return 0 + + +if __name__ == "__main__": + try: + raise SystemExit(main()) + except Exception as error: + print(f"[L156UEFailure] {error}", file=sys.stderr, flush=True) + raise SystemExit(1) diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/__pycache__/PassageEnvelopeAudit.cpython-313.pyc b/Standalone/Research/WorldAssemblerM3/Linux156/__pycache__/PassageEnvelopeAudit.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..727d1b531c0cfe48856eaf00138bddbd779cc74a GIT binary patch literal 23761 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 e+pKYNW;Qs}Q`bi-G literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/__pycache__/RunL156SeedSweep.cpython-313.pyc b/Standalone/Research/WorldAssemblerM3/Linux156/__pycache__/RunL156SeedSweep.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff2ecc4c0ea04fbef1ca113ccc38c4e6781cf1f8 GIT binary patch literal 14864 zcmcIKS!^5Gk=;C7;vq_+?u(Ww>m;dzI&C?Yby=2mm@Uc&=^-exCDEoxrJMA@Ogu`m zNaSPz%g)To84NJ;#8_(*1EWm_8%;9U@gRd84G>`1p%ZaCO5kj~Sj^Yju>o%u`?2-9 z*(9a-8YA0+`aRZrRj*#vdsWr1-b0Nh6NBd$tN(fWAB`CHC-g&nv_b`cm?_7wH!u>T zF%l;w!}wtdEis_FbXZDD`BFy9_)<>G`BFhE_)cr74(LBNf0DMrS#*NTo>yH67FlzLpKO48E2_X41J%xvfUT zN|luuse+ce6hy4GN`xAn|5Qx%voW8Fr+GFWsWnUJf~R6FH(gkfdJ*ulObLN?sDL z^d<4io{dMAn^kl%xtpvg#!k!V64FQ-_*yAhMegEjWzKT4vg#{2~`GPO9Tat8vzkUQiH2AEO!EgN@-W}#HO!(Ly=<#%5QhC^S- zpmQXjbf2ZXmLtAE_`JmrBU^YPcy*)cfdL|-PqaYX>>QXO}95wQ|)c7 z)6*U89j)HhR!?K2m-2R6+bD0-l(%WRrE}Wd)Y)X6YH4fj@K952P1B7L^D9nAiW4#z zracr4J2&q{HJqhr z287(*WS9zu16~)n!s_-aYxYm%ZvK9Ac^ z&bp^V%>O%MwUUT7#EZfd5M&X_f|>Fxm_We5Lu3+ow^2;c537gdC24~-MfIQsmM&a# zT{ysm=jVfTi1Kzf8fIv>mvT+Jef}^_F#s^vF|bm@O!s&XNg7{}ZVRA&Il4W-?>6-w z^anj>C@;@-Z!i#|gMQ~Ja~*Ylp7J182YQB%z#2(o?I4iYu8A*C11()qY~#Wf=S4<_ z=jPn>1;oL&F{`0}qThtiPmz>+E+OI_9qUsa$yv(peiS;2UDu| z2#viKq2$O%Wdoz((-}>0b9d6Mhcb0YDSwc!W1+lWxBc z3=W_R%4A>_($r}|nN5wBrpE2s90Upj{$P+!Oy{7V3V25;FtM<0Q#8zVUMeII3DIH7 zf?nGRwWVf|Cd?g_kYcwHGDg}{cDW{s6Y&j+td3XH?`ww1#0LqVzrXdNNL(yNZ(UP=Ehnn zC!r}$IqgH<%+KK?;0Kk6ODYgz5SIpS#xfh6qb#T0vjLxlcPt~8aesKm7hr^+yvMVE zixE8{EIrCiduA=ikYDRz7;0|HPthYSf+Iz46udcdZvn7-q-Cm?a>!+78ZfPM!4y{X#6>UE}oD*Zz+x&BcF#1B){Po8|*FGKgOw>sG6x z^-$1g26R5WI4MJgIN4M%=;suI_2Hy$ua}e0(82ILCkJEg4slYj>zovPS#2g=fY4;f z)&SVca0+C8C@&`k5SQumf(7(V`zV@I!lZn2;W#a_!aHXlcj#?pV(LMdg+*XF20)Mzpwjtv9CYSd=F) zq7~LPPb{x%F*BZBzOtLmu3A+5L6sL*XI&n=G`MtlQ*UJT#+9Qnef1r6O`OoaZd{5y z#-xRvD>HntR>c?VhxuZojW4!J3@ZgU%dVHLel@nMDOS?_KDFNe(eMYu8~86qV{OB1 z$?#(-(6|Tv@@|$~FIheM!}3^3<60kE((zahEsqpfX~nh3W`%{Vu&m*+iso2J%i33= z`Jqyp+w}mGW^{c|@gN)1>F*a}>YPp0?$9 z-tf=D@_xSIcO+dWiFe`w%#PWT<~>OhjC0CZIg;i(xm~2BtWye`3wx4DOgahN0UQaB zEoqiSNXnTc4I%hGM~>M3A{bscj!SK4QZDjG;SRJr_{Wah(6Zd|phLTW1WbC#jt2Ni zO5sn@DKTIcFeP@0aO?*T4Gfg@jocz3%gA!Ff;5o3 z>`L_8QWzi{25}5qrC3Xqse=b_cM4loszt1km2jA0?375bK&E4l2z~NFr=4(sYY-lL zdhZ4inkwNqWDi;0sR*b@IPfJgF%&?q&}K>X6KlXl4O!bM38)>&sPK=iMXaStd-9++ zpmA75xUF5RrAl#~=3%d+dp`f32$H6(TfPjgeSUO@^PTXzaWtdR}kNRIs?EJ4eJ zXr(w#?b;{r02F_}*qne*^A6ev#IgSdv@JVmAN(8AZschr2gE;VYa`n+n1p7FG9{aK zge0)@AYd30dy>t?m_0i;83v1ZAfXn1q$EwpVG+l6M69Js2!5@0by}a%RGU~6KWD@- z1m0kz)-O3y+e?qs{v}81c(D*|t?b`1gJ!XBssycn<%MUEo7&0t+%(%D1j(dG)t>uoE0LUgUDw~Gf@I+L zz?al*&x>-N9I=THsdePRFF8{0ON=B~(>^qkUHPoY0cPI+{9eh31pJo6F3Q?5Db{Sq z#agPYL?b`hZy7t2pU9$g#&8k~=+ktpPt!5P_+bC_cL|A4G7$hluoGUWa%& zr#x0VMTl~EibMQr)su%&$w;~-J9Y$sA$8h-pkopSBA_(-!#w?@Ewt-wsqgBf7(|~c z;sx@c-}8KLJ|ndVz89iI;*{}j6#muP9>R6R_p~L-+(b@f1>ZU>l{zA0}X;?9WIgBi^g5{3=_oHWRn>G zq~bn^gWMvuRGEsfL|(-*4O98$Fv)SVDo|*b+O~aI2xHm{Mf%_gDUlEIXxeU=7NMyU zc0(aV(Y8*B34l-|Q9Nyz*?g%!V(qz9A`vIr_~C5Oq??0o1@@poRc@TTN{~3iOIw# zDWPlPG}i=Y=AmHd!aNnpF_|D;2xsi3DJtNZg;WhNmxRqjnh^4%R7AzoI0H$+?hZ7n z$M2gr!GV$w(pxQv2%NJBKtBa3UFf6{V8YMFh|Xl14nj85l*ma^5haWQlkJY=n@ov> zBon5m-Oz_;H&SFW!9fnnZJNA^7w=8cYK;J1*dGYKdBAW=TK%tVUC9tnsk z1c@CO5RwUq@J>7s*L*nC&Ee-F@^EO{)By{F0D%O(pzZNu$~wftb&j$LO~1q80XXs zpXYVKan#&AM~HLfv9DWh8dOAuIzU34MjRJaL;0I$PL&CEf~-ldAoEPuT?~J=iL4??kS%i77m|!jifR{ZXYdxG|s7nSi2jY zQ;}@v)V8FnbLxNe&MDyxFqP4DPK~}R5e_eR!Mxvk#_C6dtAH72It z`zQmT{1AU(U@2qY?CI#~!a2BUK~ogu_JvL35+vuRT#ycO!L^J)1mzONY~;AmO-yD! zFP*n7mnaUE%*_Q7`ABg+GZ9PbxLU}rlCT}X_{=0ymOC@ZT#>-NkoI%UxaU)}n*W;Z zL`FM}*!HX?S1ynfcUwXzDVmij{*Hir5M#6MxhaZHovD9;Wc%bzc>`L~Hs!!mHsyQcX{e4ERP#kgRx{Xw&#uJupayg{sLX2GAw#AyrSu+uIxnalt zO5*RdW1J?nCc}^m(Im3kg72bhLF8N!{9qvek(3bRgQxvI4BB$UzDWvOD>IA0;IUa421K#U%8I&JV`xGorNC*XIIE5gI zh|aMsF@4GaUOa<=fWdW!y1>8>NF{}t*)Nc_hF=O`2;wph&)l|WrO?VdQglR{wrABC z7R)9wVOn44tHI9Bl zTFvG120bnp+`IF7UC@nhyEzFyQlWGUT4P zOeQ>)h^ip>7lwso8ylP86y!u7P~$RSd3jwS>U@YJ$cdhjahI*1My{J9Z2d>=L$>}t zPVNH+7}|iKnKT6+ePSxl6wJnQzu_5fhe7vN*OfR|Izu%glR99JmFDctigH%NcZ(eR`lz41V9ye#8>` zNJRHU;93?8q6BrL3v8T1Fe97{$x}$M%7utj7I1^?fl>%=F$L&Zgij<)5yPoP%gFCk zo%jpgLxGED4E+iklebNh;2HWX`h_AU;l>DTVGmp{3;`R$eIKR-+LF20zpe-omJEee z^!v~ionbLQ1-A=nSxw%i#`tTE@%;i;)44DZmt}6s3RqdeHR4v)`^1kexBH^#_fTAw zy{Rf?Ri!aiIizh>+RJ+{?Y-Q6sr!cPruw@2ruMpaOIsK%8jWekqQux%R?gDI@`)=a zF1@yJC@xcfXY?DR*Q~3?g;7>!iEDKWgK=$sw5WmAHY^No>GGDQmNOP*0J~;gkzG3r zInSaxR$I3yjb|5K^R8G|_N>aIrDitUyr_uhmI7#Cbtu|?Xu}v+=PjMPA-&Q2L*mx% zTizenMq6!hwIN#By7u+xz%i(64zF*Dpt-% z)s6QxirnT!dLf*B`?d`yNX%t?9l3%gtXlT`{c|tQRerqB*@NZC$vWbtP*> z8PnB3&U%>qeE(%sMGc2C!$BAQjn61(HO_N;oNyP7w5jjn}%_O*Zd+U=&FUi?)a+djIe zSiHy*DNG!A;8$YZ=<8j#+H6IudcRhb5}- zXX#JrIY7a5Fu?ixajI3x@6H7FM z(Azpc%=xJJ=f!dLWL%y5x@~#l%EUvtq^sm1CTT0ZTVZ%0m$dCdgYgIo%+maR<jQ)i8$z&>czp60AXty{2o{!TyjM`P9Jv~aRt|0y+_6n;+9p}sWUS!WqI#>Q ze)UMKrgQx$TeJT$CaFD&e*#nFgSJ2Rjse>!d;`Y&pg`mAW(gyFbQtPa+hY|iYdvg5 z8wmDQmMGmSDSNx~&CdH0T+x~cBHksGaQ-K^Tn zR_$HyiB;{7?fS~?UF@!2n1Z>VAEcHg>HwkMd~52x(?2>LS6kO+KBPYieGq~^mVPwN z`T;yXbQq>tKg^@>daJCuF?I9wJAlx&KKP04(}|BK0HJyqA?!Ya$H&G2VK-XM17OmeKtsjXQ zM(^Z~#j9$O;P%~e(XL6h>DZ>u8PhqV4(A=66V3G%esa9hv-L}p%criK`o1fME`!9Y zO*db?{_2g3cd`$>bMXfqU~O_fv@IL2Uqn0XK)j%2`NEY8tHwXh2FmS=EWFX@Tg`hI@g3toRp}VZTq+Md} z5G7lLCaN{uu-@!?r)$--KEduj$Z8L67=KNS#fhvqY0jpg<(97#;@{i;ulpM*DTzr65EOFXB1 zwQ}`Uwr=l+5)_?v6kiy;E7vS(S$X-Utd5n{-Lk&d^`ow}ncHr*{?LY%tsjGx3QCmM zKfrK#_dQugR9&;Gf3N7>qE*#e$NG`={r55aFs_g5^Os(|G8WA>t{hr>^)?-AA9{Ck z<7~8H^1c*T9mntL^naF1moWlR| z@Fb4q^xzCS!uiD9;LMl*Yk9S^hWJgX)@dewV^+X>D?ig&mBA4%7xHy3SFMcq$@I4Y z2ZhZjPKjio5WoTP(W&%i`k$dsB%hDP9Ozb6gCW`P6r4<$vs4JLkoQO8 zLBR>|{Y}&mLa$=Q$Uo)-A~5ip;2{id9rCNcn0% ztLTTSQWe!UvdTv2Kpb9>$HhCZgB!d-kEuo%h`afP%crlNzAuqveC6(egXktK+?pyF z!0!`SVKFk%JDLgy@CT|4wPb;~pO1kN=aKP@`gnu+y}oz*z`7PR!;%wmx3v^DKgdvK zN){CNa}ua=;>gC-=ibk}U|9+#@VkOnh!Z0l^yi_^kZmor;}4W_emrf0YP6D!+K+A8 zPq6kAv4WFvP1fa;-#r;EJb3%yr+pvy#WX`n(7=Y|bJ=IIm}VrNo44F`wJTblARWt{ zh{HM6$*U)$hVf|91LYlq`04WL@1Bkp9one;-1wOhLaumG$=k(m7RQMLw<|w2eryD` ziVvlj9p12gKJgi{>xCqKx7_gd={HZu30rhxa&zK1J8>KuDo)~e!5M)?i4#4yn?JRF zYz1iP5PnzSAxxFLY7K!Q@-w?y46qApE3OG5D>;-VBOVgz9oM3f@Z_h}-qQZ$h& zWyJssQbJWxz=WoNAgn+Dkq9D1s&u6MbMG$2lDrp__rGuMy;IJ#bI+V}=FHr=OTR8H zLPCZ|&)O-Gc92wdkam%vrFQ6R2!p|Vg8AfA#0l^VtU5tKK`a&vd;tMLK_MY5c7yN+ z0Kf_hi-?GbiGBXLgoGp>|K(CS6b7N#4q9<2G#57yF9(cT0YfM>FBcED5Rw6*xgah$ z2C`9D^aief2$PJpxsT#Sa?W5;5E_Nz=H~l^8x(=-qtIBce~^s1wg0u@=$Y$Rgn!Oy zkmJFh7y16H+=EF6MjM~ox++M^i;gYbhp-s*V;<1-1_-?Y;@SW$wL$z`pg}Ab7Se*I z)(2@a87MkbrvOz&-j}#nbY3Pf>ZFOT*ZkeCB$@i2PEo9lQ&~e#MsD@JsKAuhEJC*A z^Zt8uFV#D3E~xg z>#Jl8?JthbCLGb5->)ZEcFwof@6*x3%0o`;6Q+)QSLj-E=v>0J(fkb;U%#|QE@J!JXCRR zvoj1`s)!I|0#N`GC?1q9nfEe^vV1`l?h1&yNl5Ho)nm8Pj+sUc>)9 z^--yK-;vOJIgz_qFFQj=O2t{*?IRPF=3V?|p2c|eTk14?*K@IaR=eXQvDQjpmvE z`*~}Mv5n8z-EIp#ORt@klXezB&Sb`l6Rc|ZZOI|SZ(cPytyD);A+VHUMI2EE`mVRG@f^)SeSo5I&rAkSoFm`4JE}$3-hq?u;P6D zJ&npYj+mp?qB>%Zv|Z`62T2eFh8%(jNe~SVKj?7pLTMZTqL|)ZawSp8i0=c@LW`dRMXs`jQ*G1jSuH}_09#W4wkF_VaaIWql`9P@~J6X-D3`;Pk_8=a0!pLwa8IICYS5 z#eqHn`M~oxIRTgldpDZu-%NRV0 zjR#)d8MiRIG7wR1X8NPIy{(z4zMoq}gvr_FE!z6~sK(k2p}OnzJb3hIC^7}XL7NjI zOvPa}V}um}$AMV}IBp?`Oc6p^KxWR6tZf5j@1cAMC^H>dw|rya^qwXWoq;=+giQ|^ zOge;NzQ;948;FL4V;`C%aO@%+pN53XS`{=0+a7j<Z#& z9c-mT25Ad&6HSdJ5qEco)h22*kx@J+mvT>-Cp+XIe00pLB_!2U6S?H^<9Cx|SfI2^fbw~%2xP`Zd*t>{h^ zw+Qc-WIduW*?}hCWS33|Y3psG=y_+IO%JlHq={bU=2&ao?+WW%Z$(B?uqLA5_1|%@ z41-ROHH_S-8F*Fy@Nm3R$DvmfdJWw-vr}(uRxBLtlyB;P8d_(w{_geBAyr!sO|R$E zcAin$$Ev<=9rGypN1AVi=AQ29)Yhg#<(~#-jPB;y)Kjq`c4DnzV!ypHvMNv+a&U|5 zO;vZRc-U0k-|y&H_oYSQP{Unys=G%~dUHXD8D9EZy??Nd9Ed%0%~Gb+ccco_sbS>M ze9g$gff_Otsa`na9l+motMquPXR+pX{m|(n)Pr5B9@8?r7f3^6nlhSp`+r`79`(GD z->eyM_H5Oqye|Lg;U%cgX)4Lz+W+avL@8gFU%t03-MO>6|8;9+Yhtn5ScB9vxrP0# z?Ap%g%CkD|dV^zAr~QvT$W}YvZ|UZ&YB&~KUZ2)Ck(HHfhxI8xeaTQi^Ck2NeLN*B zA+EMLBBLHt^;+qax5mz!X=&KciZij50oTrscwJCRb`dMEZTQ7@TQkeFI87xpC9gwX zDuoO|8y=cI&#pN!jvd$Q?2wx97#;R0p709Y_sJ}kI+S?U`}Xubv9Tq{%J-V@4zSSN zD*bJXd{3=+qQ#`lm`Y`ba?Eg{^uyrE607*GB2B5(GDW9h%bgv=_2Hy$zp6IYOjvyJ z+#@X$AK(4-?&!fDm*li$b@kjvPF)^5|7GJ7ouzr|iM~#`^Jv|} zu{)~g+_LjrzH6rTJc$mQxpc0}@y*DUBf(aimEsJi4Xd)Yzbrg7Q_sq-9&nu*vbFWL zJ4wCxYiM@X{G3ExLWz$`a9D6>m|Cyx`dTeOn7`RQ&A?x1kck6UGfPII*;GHpY|Am@ zXJ+=gz}o_(^ZFGA=n<^b$wg}{~s_A~;aD59b$3Rsz-2#m-)vQEJzU39Z7wD(Yf z&c=Z|lP1`(n^C5w+y$3~z|=_*Vb?;5U^&w%((cnwmQcee5W@^v9+%>S-)+gq>$il^*K_r0*<+u?$69Gs+nrhrdj8z^CxaD%G+P$HtILRfAmok?4l(*Q ze)Og=NhS0LOhxxhdykW^+*Swo%+`+Abq<=%tz&x!N)n>V9i%r!3<39w6!^r zNF`ghs_*)(-^+FXty*8rTiH%V)LTKFnv1H``P8ufr~@-kOEnY|9(Ad0jBgn3P134V zb}5UV3AKr2`;Xy9IaBSjeTji#Ny~F4JP!in^%DyQ-prBq$bl}clyjUBZ>~z@_c+vNA_niQ z!46E$Y=)6;Kuc`5EY>nYamRnuiv1*S>{l=UY|?!%M&$~9fk2t z;nt&p_X{$8_GPNXbmA%_!xFypQ3yGc5Hni8x2gEB(<>{bxY4knQT?wUyp7xMrBK@= zjwBw5Y<#KF*DjtZzEwlYyw9g^Ts2l|a4>!{K4<8)x}+w|Y`EC#fDeq4&1= zZ)@($HW)B-I$moufTh2?${w<5w>q`Hp}d3@$E*x zcJFPa%>$dGB40Yynt#{r>uq=U$%FX|lfQ@8N5BPif*2!@Y|V6m)=^=mt5w%#&^4p) z{|cI7u$$vpU+h6$UN!_Ig#an zj$wj5t>x@xC9Y^AZ{*UcOp+|(R6I&}?de-zzdyOpG7 z>-kHDVfjlXL+SY5nZB9%ma?&H$A>H1oMYzHeWmn&^*d#iSYLCqR82Nly8ra(?2#=$ z->n~dP;yK0K^yhpfopE0;~9p%o{#dx#|!aWnlz8d)-_A-H)|he`@9v|3d}Ql=d#skrmg)uD z+5G*sci;3*^|t(LX10V{Yc5)Ks{QVbX&<>Fhs`uG36W)%;wmMla&7d&q$f3E2*bEmI@QlImBY9}{mmC96{4 zeXgbCTv@kSb8=EsoZ+b`-i)fP3%)Hfr)-{{&>Sij?tJC3zNW@a@ukc!V@gF* zN00*zzoxIG-$C&`5yha1=NTA*J`Ai6myT8*H#T>cNebNBTNj_yP_j*{Zg{)0f4o{^PqpKL zHqQdtlDzPd-x30!%tT%sIut&3E6LNtfqEe|x%)uQ@eWdAZ@}k|X3iEae3>veXBS|D zSH2T|S(EvvQ2B$x{W4g{Kj>UI1>%9fN&vUKv_ruOV=^}!fbAv&Q!sYi4#|{_X=Jf9 z6YZKG`*kFWGA2za_8|8yW6YS0)OpW)s}RT)0?%jL{h#fP46{4nV>5KNJ^<5w%crc1vsv9KZhBe{))E)8K@S`k7lzQKZqp_K!yBor;@p zNO3)ZKC~|b0TWvnLN*G?6o+KUAz75yk;3a}tmD?7aCM#LO-WO%#E?DN1QKG8B&TH_ z&Vu)yj-YoJ!0_Idqei}hb9S0YXiTTtm_$JQ&YaN>qF&S~l2U%H;Y73a@SOMVvKlKh z1^1WZx4u1-u(>X!=3_H3!;CXQ#q{sq=l6+ zTt{_qYi$p^_su!C-SHaYZM(b0$3h0{&0HV%sW@vX-Y{^7SD&pNojW~$d8w#AoH^7W zpZBx4bbwp=YI`3ULnWkCCjJo58jmZUX?YozxwyU5q}7)sXT|5NdJ>AC zscR`9W{I+FjP(yKRtD}Kvj2?hPA%K$u~SxZPctjCi)yus0KtNL zFIu#AI#4BNGwf@9wWmI&+xP0M>#L$o>b|{K@YWEZh_pur7?J^lbbv-OND}l=rReYY zAzA25vhiEx-fNiyfOikT)`79M=vt4xli(O}t*sz*Dmv)Zm1}KZT3LFUZS@TeON`2< z>Kl>5zrPb=cS>op*Qd44sl6aGO{MHJlE+t-%2*VZ zT-6^59tf_Tx&G=wKs9Ub$VD58M@dDSe$Xnk%d*3E+r=+I;Q=>hu3v8m^ZniS|4at2 zqD=3Xj=hrUwbYAt0=H66RlIUuhzYJbf9SMC&;aevH1&IB|1CW?!j#nJ{nCV&Xewlz zOpz#3HC`tLSoxd(h>^i;zSe;+`hc-*wam91&z4V>ue8guwN-Z=YrOQRJ7;6QZ^Ojd z$>FE-PkS7mmi(xXNnl3DjA;~Xz4FhY!HmJgjAlL&

2X{uz*UTD$CHxAxwWpACk;k<%FPJ`jNqe;ypHLgHNB zp5vaGISG%Fe(esf;deB@wb$I!ajX3Ei|vx`hK3GG<-<`?JC~q~QF8}J%OazrNDhpMQbC!~djxHiYW>aX?h3opoP>{7YXK>I6wFV|h)xE?jYPH=Wi*v$e<27%HT zj|`v+0+R%MptSuY34$7ugbRWHG|?fmtF8K+{apaiUg2?03}$k$Qw&CxB8pTX^FW&t zlTqbub zBbkTGUnij<+;s&iPNA&Ufig$m-ob)zTO*x!3&0jS^K=>Fi?t+kf4*aT{2IzKsbA zse2ImdUmtW%e*CM-)ug!^RQsJ=gImfyxY z(Jn79|NN?-YO@R$TZG4}3o%w+`!7WnaKQS9Ti_V}5S#YPyOS6KzbQk|<2bHDgqQeu zom5oHm34w)u|i%06G{B^^LRQD!`XC(n9Nl~Fv#&AJ{l7oD}p`RN)`^ByIa0!cmfem z13faKCmC7+|EQh4HYKZ^Jm=uo+Ff?4f3g1ly!yz_-V<#ZzD<4M#S+Sco$H?t_S}Az zWNSw%+~$7AS;Oz}X4k2(;qWg8U0K4y!L7Uc6&2hk{pQN2CuTj1?s#XV)%gX)&eyZ{ z_q!Qg7_crKTrgWqHQ#C4aHl?dTq|bo#KI20$9{XG7827tpA7U26z$%vJ|cfIpjB;~ z8eY04D5T1L&~5mlil&YH5@hWh;vAD`J(w`l1{c*=n_Q%hYwgoYu2)^3=DGysOOK$@{JL^WYgN-?k*DG*m*^7tH0LQ?xpncTtdTW=1_M9o!}z8vto>tp>Yd3=*rRO*z|;Mp_n3t87| z7VM6UduVnPXPs!A4c%PBdZRd{raZLRLg`t|$(}7rJoT(aq2ISMyr+L5_Kjp5K*@;- z5Ioc}-?9Iei&Lz7iJkuIiN!~LVReGnAGS^1d)a(#|Hha^t5^@wwN z(zaI;rOk><(C&jn?QK0BJEI%si?#BO*yV+RzMOBSovX-p(*GpCKJ$^PcYlAQo26ME zT$8%agRKMpjCilOwEE$_cQ0hQ?l5gqyRF)b?>T(%y<{dw24BSG>(q8B z)fPoLC;r+spqX=hwkY6KNz0Cx_bPAo4ESC1k(4R9ty(m2V0N&ruyWqeNIlHB*2-vN z`le&=SzEj2{*I@TZdY8h(mH-_QTd!W5WkXaZf?qV$P<>Zbpyy*=2?`Nmybr57e&F8 zNO7Rb7gBxim>M|WaL%A=#Mr)*9*mK!$PZUeYz3hubxl9lstdbSQ6HP6|1E0NWyF)y8U z1T{KqbigCE!1-!;Q-|bJ`)L&Twhs57q@$xJeeA1M*<2CQkBVsRQD29sfMrd>Uhglb za10We_c%t5z~4wyo+t+M?cT;9^@W}LFe*$ugMp*b_`t>P8QwrZL-Zg9qCVDQgXSDd zJkKeKRDyvRpi0hz^Sd1Q+B*NEIM>95``!pT33$=JnMYYc*K065N^2seeiG!C3n0*4EcrrBrhfgS~CIdLnRoSpT5 z!(Xw<&@=?0w`UpnGifyqkb{ZOF<@SZC(^nbo54f_&o-M1uCJ4$$syDuFz9qp9f#q} zDDc3aKc7S(vR`tA82~%Lv>>p-{}=sb<^Vj;Mh}Ms%O)z|eu#ks--dfF85csWMAmI; zqT`;k%m9O!F{|&GrsH1Zqrm!t8yte>EL*t2`APPQLkI?eB)CA7VxkLyrN{qqw_-VR zc6fCmGK?{>xshFBA!LJ}n*!S)subUuJ5wDA)zCxWpBSqFg^+L!AT$ITA{=-c z6POghA;t#y9EzlnFXF`Iqt9^mUvTK(&^s`g+f2-DFiig~w=6UmD2*W?&k#WR0p|sP zv4(ae5SMQmRl0yYlfeQ3sSkBai!5zg|ClJMKmlK_=%(D@^P)siC`G$>V7J|#3-y)* z3PBk-m^=tsU=e~C7~sQ;Nu2Z{CVv5)R-KOKgOboh27Z8nPe&^-`O}gAd_GM=@19`t zBTwF9I+s}gtHe1bzuk|o5|0wG-;uGrpoHvVmkhgZM%pzmJDOgQ%2@j z0BfXjUEY!yUEam$)hFjF#TrX4CvTcNMse!DN^$A`775|Fi7pS8Jg0-oPFXDv*N@Q! zzZ)zU_Gn#j)inWDPW@y>WQ1hE_<}1qc6%iC3yS-kn=bDdXinHz`;4N9s3Ii5K6Fw&;{`GPq&Y#ke&D( z`1z-RY$r|;tE7ol-Ut51$_P~43Cc!ii*>v8E=#mmkdNLo;T2yEGE8_aE6Db%fw?H^ zbL1AKU`;s^3zO$vcghu~IhB(w>MihU6J6j{Led5Ao_-NY#j3|is;|O-1ZSJfH?oK~ zSXl>>($z>rJ|$R_pmAsu1|A$D_%zFt33aB5KUt(p-%3qce4LDY~+uxgh* zYEjeRI4XN-k0a_PDvNO}I_jJ02&LYKDyFxnwq-pOy_V4c1K#of+WyHF8wj)zXf1D{8CA7t{FXCLx!7X%5ze?F1O z8!O9sN%trc9lOYG?iHvI(E59DY0|Dlt`|f0eY?O183s7=&%h9&bQ&;S;S|6cC}aY#>k#9PN&gg{ z$-o6nJv4(+6a?SRxiEOeF(DWXS6y~%3_~`E)7WaW01OhK-r5|b>>2>Xq``(2AH?n) z&S5Xzk%H{sgOGgSAu}!K4Up{j0Pu?;7h;vc*|hf{92impHi6hR&_lXpr>4bRrofw5 zb3fB0wRRdgK%R+OZu7UdZn9>;-65tP8sr-T zZzaGiZa}LspwWT-7z$QIc-mG4_;=#y$6U&fX?03W{%(Wwd7*sZ$4EMO@G{DcN&H>N z%cpb661ijv7`RRF>toOb0x2sbipu7x?mP~Vqb#i7sBogN6vGc>m>eyAx)u9724M z2ms|(vhV@o!46q9A%lQJ(rjh&zw}|E!iFakUauz+c7U6~Ms3+g;L8b4h``{z!Zi-A z{(-V9U?L9eJu(0d7#Ieq3NB6s_UkkG*y;$-8#KxxJe&Nm&qk6%DbNZcVsDArTM1AA zad1DJ=t}TA1y}Mxgk1@ZrmY43e~7b1bG0KFRnD~v1Ti!X2mihVUn`ECT=hSYu>u0W zOTk0+ZWAD%%?E2*CNgjz`cDezT`(x`Ib^8bgZ`HRYZULAp57mLkom!}2k>_ba~aU& z9&^b;a?KDs1PMe(!U`BL@H=bK5e* zgRB+zA=pah|0tpgPOk)=N2X`6SX~iDHm}06icB1A-u*C&915;xvUwl)oVg6vl?V-y znFvv!2*0CY)d7?Ta^jXfMx5q7lI6;u?o&OgIfw2Zv-JTN6kOc&o)Bc*@%qUg1GC+8S#vFL|KW@49}Mq%|_D_2&J z{sbW8#9v6kdC>sGG{6ZO;HV#<= z-^KMo#c>|V(D`%ca1dxL8Y*jM7GJ&>llR@#FX9NG{4Sr&I(_E7h1dH2u%`WTO0A_= zj89Bq#9}@)DR^g0UQ61$PNryE-x8O=7KF(j&*Wwk!6Y(pXV+MCWSXJJ(7`w7B4%^t z+{_2$(7s`Ietgd|?U-Dba2oBJ80*-Uz1fvP1hV3C(&yy+sMETJ?l+wKx%%Emy)YA4 z^?6tR%n0Q&tERQkRsGF^Z>4H_!%~ZtAvkv+ZNkmtUW5dC(|*#Tmw(?x)b4exy1a~* zxVPBta+{P>X(AbD?R9<56#JLqeG|82tajE-lWfa8GC8yRUaKsMEl%uaW}E8G`N(pj z2QqXfIwUv^?YBE|GaDTOX0~jmAtO>^&bJww1|JNJP}Dg;oNadRTG*YADJhGDHZ3PI zN$0y3ZBa^W)fXnNv9-Clq(O^J60LfKl5$X?jVQ^)!48C$nxob|+winRVFdJEOF9k$ zYnF@++e%lxQKb1yn%P!!St@)_vL|;6KcMUWX}I{{x}PTL@{Wv&Dxv%FU)=`3yNT9O z8P*%N`qOEg@@*e7dJ@oRJDItH{!$FOf*EC3YS9_%%VeFoyKct0ubJe_qwxJK-M{rLUfsHL5~ZmS&K&t-C&r}BF@ng#k^;T6t5369%WH=@Hso9X)XOZ3A| zbDQz3Y^=9Im(bM~o{+%}OU3(M+@74Kb2skhHa%FC2r9_$4JzHm(JtAB`=wBI#MR7b zRl+2<;LWuuo<)Px$(?MUI=Jfe`uB~4QquWzBIhuC$-E)8d9IMLFF$ZMLwu z1xrKdkeO7!RbO=sUa-ke1TFEUH8VMhFTOTj@Cu{m(@w@NEXGR+qFHe*+G&R_0=;^xnd+IrSV!>Nok<$kVCIYir9T^l9#3c;nhgJ9 z!|}hT>8D)yn5ts(rfHMeu#pLjNjfSB&**;31Y3N0c0^7@)VgVLPJ4T1NFhWLUuXf7 zch}w!+Vr)W8#W(+C@d(vB91(Z4V|6D>8gaaDGUkhrN~N}JVi=$Vlgr*Qrrpvh78?{~Apn2>bx||{9Y~~T5quuDzq?^na z;+rQcqWc8zkR`$G#hswaqPE9oTfK5%jF*{SFHzG?7~PYu(O&C)cB5r&PtV8I*-&`7 zVZ&Q{KBcRr$k-upVQN*Y!(2~9pkvWu72o!tdVJx)aJfw0=Xpz!*4Pe10ul|wgBrbG zrL|zLC$&;D-!#`+VU(G(b+5VX&-EkV^x^c-AvfyDTFT>wy|W+9Tl_>$EPF<3t}HM4 zj*MCMYD#a*DHa7<%4LnMC~U?39%1)$gc~?Qk}%?yLPt>2?n~%Qn5MDSVB1@iN0ZL3 zQyNdEO^qX5Ytgh1)ltqZKcF^nMm5Z$ZTGuTUXtK8jY7A<5oMpFNHJZABsq zY@ZHo`xV+GIq&M}2(+ynBo6a?F4$h2^gPI`lc_9Vd~H&)oYLmiTmoBe;BV9&KZj&j zF>=-1(2uJSwDvyReJh0mi{8ym<8s>Y&Qk4P8%`M=8Qgo{*!nivdBwxuoB`{p`SF|Y zGIaKk^`N7AUv1#zwBjFuo0k?kqWA6p7+z!hIiT(507~r6j{$Q%3%llP#<+z>@9%A8 zyZh!6Rx_<>afi8h$;ohbbINwDQ9Va?lq+^gKgDI%+gPh-g~=#)qj~l|m3!MNYhnR^ zF1_IQi%jn8mc8#moLHX%>}sSS6z6kMyN9_duU-=yqU*XLW9BmqK6Ie#zVFO zG{zSv;o*?_-K8!fh0;kPGiBJ3dDEd#w=G|yU^%MRVmEp}MPc_0&yAVcm1eF7)(6v& z_m;aGKK;2iOFPWnCOMj)*Op)Z94<-rdpM^2_i(x0>$6=6^ZMPs5Xh1}m1xbv;HNUr z7(CM=N(<_*R;DwcqGLqsbuSGKsv=k4nFL>1XM)$MGhHtp>c664eGo zRLO3dSnZyEu4Nbl6Mxsfj6+4Hxx+ekW-s~F$oE;JjePSy2vt#LPf`M!p-{9c-3WuR z6q$WhJiyn|n&zNRrzH4*7eg8L$6Myi z1fe%2dZL(gQw9{}hqqo^_83c2Aqo>ThCA>(4h}a^wqm1D`r$s;`?I_L;st$%Y#MLY zyvAb&bULQa8m&Dx5zi}Y9}gbh)^<*yeO23YYY4KKtX9ik&cClkrPePtKa`o2n4*mn zvU`}-;7G4BMB&cuS)>hHVkgbPX;dDF++seHV0vsu`{)1osj7Kv*cGN)G0==|jK1Be zV=qZ)(v&ZFtMJnZbjYO;9UFnzg5F;yqUSdIPb+Jc?C?Wv*U=rv=JB!VKEXV0noj*t zTg_{UKkTUl`>{Q>WcyD8ra`s!oA39Hf-LuYQ8xKO|K^}2w%#tF*y!OVH$-!0I)kzX z-n6{)`Js45*usP{S!qL*b8n_(%XeA5M3*%^o-+YmizWq%H!5R(X(ipqUs`!#EMhdB z_T$}vBpoa>ECj8JlBav!sk@qxN zgzc!0Z^NnDmE38CX35827JTQOs!ZI`W?Su4EIswxd(V#b)i=W7kJr6>-IFeL%Rh9v z@agInr7!^j?$I^7cjlS57PiCWozaH7HcewT3GMb)X*rovIi(6#Po)gyk0GEMO3vBS z8}n1)guJ&BRSpv7@oOG(-gPP)v2$AAz4`yU&ht$Au8B(+y$MRY6qpKJB4Cg^Kv=mpsnb=Cf@?@pr|SXWj_d+=nVE`2QZD`9ss? z2#{CsUwv8SpPZt&-8#C;z6eu{oPONsUy40cOlG${v6uILa_8=!{;sk6?*(h$ozJCu zeigV!0h|Doz$AAnKpga$<1t47NdQ>@CX+%KO=L<|uq=aU!VG>@o}Q&j(} z$Wg{SYiD-t2nb8U?XQEV|D(y7pd-KkvI-ztEPyu*}0pJTj1i$-S`MDA?;Uv)yNf0T4^7va*A{^5YDUoR3eXjI~a0IAa zBcXnwO)4RnMj@yNr+!37y1_p|`sFf(5GaUL!u9{A{aDi3lrOYNF2um;Kl2k;UIcfX z4@rpmd;hDP&+-BRVJ}iSh{_Pqd}6r$RdV9&Ez6h@{SJIYq`C0dHK^x?uJ%XJ2aBsUB3$)3t#s-#`AQ~7 zovhR15^Jh5IXNxwW!bm+#fEJzzRs{0D{O%-HQcw+HiwF-k4wCtltDJ3M)M>>-o|;2 z;bK(N#C+HLjk)?(s#qh9Dh+IP*I16B4SwJkv^lr1ZFIW1U@-r6?oNb=&$rGtTf3L< zOx^3~eWt@UeS`zed+c?-;P;yu>mJ;jDl7jyc&VBYfq(Q?V7yW^UmyO)1v8KXfw* zp~Ewgwzoe*ha0~`2Ofuq_*p{Kfec-{|6iky;DK+hUe;j15^c6W@FQUPSo|ws8FSla zHI8@fn6)_jUZP>s*&}DVC@(f-tvq)zl6cheC1&nxVp0ge!gLzSnIvOx;!|fU;GE_R$amC`)WF z{9{;_-K(asa%JZgt=x+o?LqzCozL2t|Z*3~p3>kFDx^-E_m0)Q^eQ z{hnyb$->@^o|r8Kc4)mrBGXP`_@+DM@m!`{w*T{7Vh5^idm@tROcD;IeLG%-*)xi6 zwq;q_&g^%;f4y24zv2-h&tq0Zo*gd^jhFZajlo11A1|2Z7Z+i zR^f|`I+cpfkV}%pt%XA4l!T`LX{Scve;%2vlVx^HL=OMrqJ~9&6OmbyHf};I ztwW>35B4^73pLxuHh(;SD4so#ULoeO`h-imdkD76@J2blQfJ}MJ z05UQ9-;jqql>m1@tOJC-ASYlQet7zPnPOVT^Wtf zo-gxr>?KlOEj!0%yfz$~T|{_bRV$pE$JV^69@N-1p#EioL`K`igSSO!kAS+A^~g4@ zjz)fTBcApU4CF2rE}|`KWDn!t5Bo;fUJ`3GosFB1&-8R~xXY<eN(3M7XTxa;<+5 zkCm}twLMhYDyzK~)sKJ;wvW~?Qs@UtM6C7puE42@)w&ghDeKrZyTewJ)mY_qQTTUfGHOdobEEAd0s@m&9HkB?3|`e`J2UxlQDQO^6r z*YOt9O>PUVeTUsg0Ji9KByIMzX-%5s@E?QN;=^MQMLn}BlO*iM+`{Gi%@^A$G*way zqOFU#u?^qTmK25L1xJ9o3)X%(#l;$yhgaZ3)M5C82TS){ZtI$aeVvJ%o|v#b)Ji%g z-FnY;h_x(CIcl}v8A=vCh;uAE0{GgGDb4$o)A4sVouvrht>c_MR;vF9h@N&MIJa^# z_cl>)=|t_dI37Fiq5L-LG3$*-hvMfl=K%N5DF85r;ZO!n0ssZqg-2k_ zNSq*{t=wVR2dDo)!BLl&8--Z8Od$w@dBXL7YhZ+M;x-sIfN@#?7&HL@83i#7Xd+&u z^1o^c5_s|3nt+ysV2d7H{&Df60O^gr_T(oHBlj%@I^>>5<&83E9P`N(ecA;*+B{8K`P(QvWtt0N}5n8Ps1=+)L~j-?`I#1UQ4?k)Q-6&i9xt_iuJ7H#TH73hvVkieHB;}z%&s( zazl%@d{1O1IpbQJ5DPYRJe~bnL1&hA@>ey3SC(SF%MUknA2lNV(^gs0!S64qj5wWG za8$847yAVhpI@kAX4kl5gpW01$HeE<U&?jT)F;j zRq>$_rtYc!7EhUjT?+G;j6s*Wj-pIFEiDvk9quTv9?JYEY#WzudH2BbvF z*=qU4M<2#{I9+T9;4ALt&Y4ol8TTi`ZB!L&^Xqz7_O%-|N9SiTaa(G`=e9meEr_YV zr`4I%S`I4d%ui$!(U3mS`m}A-Mi1{d!!eD&-joVSGh3Am_R@QRtF!KRocFAbx0o5f zHgg$b6<^KJzdIVheeSX&;7ke1Jcm8psSHNFGcOR}r-ude-Q{zog%K!ibJjbn*u)UKCZZ2?8 z0Zf1xLH|?$a*(dcYvoUU)|H?^s%(!-v1TQ&wr-O|XdBqR+YrC>%ALBv-p0nXnV@Wg zaBL$SR5e;*Zh{tZpcAgU7O)}_C_EjG5sjzZJauv#lA$|~5vo*kvF}h@z37TVz))KE z!ky~PR!t&h#14Z})U|MxtdNgzQyvdPAt^5}+Z4R+B6D(2_c(2EE<_gr!6rA$tb!beg8W99%i=Cp%ptC?W@l5EzkD||F5 zEsf%tXtQ7vjqB!$3RdN^3V8}}yjp)wTqe3yy=rsB>0(f`xpgBBA%;LgV6Y5GxmTIm zQq5aEXi5@9+c+*59f~!{&2=-4{%~im0gpn>V6kvSrmO3G(4bWyj*wHw2d2c0RUEUe z>q}?t2oe1zZ*NeTa6=U)el9-K0S1G$3bSabfq%@LoSf3=SJ>AkyG9unhGn41;$d~#e={jb$#a0ZiQ>S;lhhe?ALqJ5u#agcIy@;ZKp)?MTNy9LIxa3j%_h#K4=s&0DL{u07s#t8TL*`#8S@xmODzWMmsxO;2ByuX{tPLN zX(@1@u-x3BEy zwUr(LYe{X!g)QwAjwW`@jnk}}5hli5l4nwmfUeL^<2HUv2^6frI&MCqx_@`0uA((6 zHs$3y%4T*TU0b8yOeT|O$aWxVAR}MAQDb{cdbW<8q#?(*h<78`=N+GQZX2#bL_=^Y z|NAIDsnQLelbS zR9e+-c_ex!=V}&kk4Yc# zl@FFLyR%An1*WbkLQ>N9j)3~n+1FLGA772*Jhev3EZudA*b=cDQ}P{>nNMULGel4m z26gjle*Jq~uPmlEz69EfWz5$I*v{*_50CIQSD)c2OMgAk{(W=NOKV=gtOE=vM`Qy- zhi1NeODxCJcTDv+i@|rZT)c*b+4My>+%rzIh1YeCmuTL_?u~IB)C@{}8FHJy){uFy zXFSMVwyDY&i9kM|Q|p|Kjjye~`!ua=$-=imL4E3Xg{LlM^Pkmw3P*VuJca8Z z3fZfMoCcXmv>dc5>?`e0DcPNY=~noMc&af(1oTU`;dgKBYqi`dbx|@#lr8ITgdwJ< zA+R2(Xx7Peii&6>`FZ2c@X8%He4`Pbt$ua}Rg=yHd<=lT0}vc!VgTq6j(q~?7AXG& zM3v~LWK7rXa%=87RQlB_N+fstpOE#&ZrJQdRJ2=yUAG2hKdS7-&g0gs7qwPk6*V0? zg)eP=)*TX6w%!Xh{2qr_{538saB`%`|Jh)qnSpMcsr#o5o2fF(ia|%&5sH+AyB-6K z3nQZyT=-YG<2;nmY-_271b;z zxY>b)Fm?kpNx^;uKB!#YiSjN5jf zHbzT5pE3G;!?)SAIlmhNiBCm|kKcW2HJT2Yo#f-}6u^6O;dA5h@zaitU^dv#F6vu* zM1g;^|1(c^rQMR;%)G&tG&7u$7RyVKsI^Hgl(Y-{V{c|$^6kJcAcxOo09Nh{M6GLj zH>=69xy9yA`-D5Be+BQnD_J|9$#zCS^9p_~8RTl_d?Y4(nTJ<#Xa0!EdOf$(0S?_z zV0KanU-p;{eB6Tjvf;Df?rWXs>Ar0#@3hPFd-%6);bU^kyTgv(%UDGIoR=Is=?|XF zb1_5nM$>eW>8Kf&;KGjz2Yjqji6Q7+n4H40Z!S&8&Hic<}cLf;Bb!=m^p?cQfXd{ju zfeDJ6iK~%y-mx9AkXlfO-ovJ-X~CMIqT3@EZ_CMRdA3Hvv8r@xSLU5}>;ng;&gQQ@ zRs|VCh4E(#4={wB;j0z9?PL_2CjI|r-7b8hu85m4?Y-*pf{21 zO>c=nyDZd=TxtTzK50TOl10+|sV?X_zo+lSs-ZS|!W(;Rr%((F2a2zHd?Mo$xe-jo zvjeydKij%kIqT*t1-x6!(tAr*V7b6rjdz^}n1955_pTgQ?_+Y%U$e!QC%K~R^tE92 zlHtQHlbx!wneh$O z;~?!ggAN)C4)T5F`7(8Vzw++Psu}`XaXG&)ye35rM`_VJS0l@r)0d$!p((?y$1EjQ zUi#k73Rmy7wX|+JG}$`WXyy!sdCm0|e{G(PL~Jb88PwemQ!r*zh#Tln!7C((H{+}% zQ|>S0hGr5wbhw7!x4PQ(NILsAp~kq1{O!47`Pvh5oi4V9t*!4`jaJO6-YJb0=9$*Y z!pntBtCi-rrun(0Xkt9+)M>gZ4C?i8Q(9%l?;JJa^^J@S`v%v_?Ti^py}3;rI&raS z-_~5ylZ6%|)Z~WxS*2^L6QhPRp=HaRCeJrE9O?w;T<}f#j=sZm6`DQ{ma*25eo%@<(?URT6hwfxry=jSLOn!r77eA-0N`Kqi=o zs(aw+R`)%upMH}sY^Um-*Y}BraB|S|w2FhxuQt<{We8a*2!RllBMbyqIQf%ewzWxR z1y-^J;%#R7Tqav8C5*gJCl1j!2fHrFI=bj`U+j6iSTFFBX0F$5Y^K0arku4B;oM|| zL{&$lAgU_#q$oPW?2y8fkNBmoLXh>>gU&y}6B*OirwY^$@)Oqx)~8}tN+^Q<+GLwr z(nC&Fg--qqhhKyN`XFt{VIyYiB9HDEhW8?J71#bRqoHzB{@h6`Eh@J$Td-8;=@ghLh z($d&MA<92f@O)~lPaD-)qQ4pgcX@iRbt_!v6h!oCkLCHvky@)K(q0Juv1Jw4T-{Ka zSFsFUefUA61&@##yTThS9aiq1wf>MZT+*{C2Cayh_3E~{4v)at;F${TnswvI8#Tiz z!I4+6BP?c}-(!Rz|`|8iAsfn|DJ&4D?i)IUj9D za~fhIFnww_Vzk}5TLi35Cvg>DL|N2Vsa}Tg^2QxY?RfL&F`Y{ifH-HXQxN9V%d$DEn!6FkufJ+_Nyo?9*yto$O}2lZhDoD4 z$~cAB^<>Pdj>NdV+35#8@iIB*BJM4;WkuT2Rkk)Hjc z91b8-1(?VwKc#X--?T@5B8paGj#eV0;0WOrr~U&MNwgq(?N`SB7N~F>C+-B0d@7WY4d!bM$2BLLmLzX8*82ME zHv)AAR=abXqE;bCZ?gGvpRi#uBv)@*ujtg>N=K6fjhIzL$&0xHp=9e= z^?L=#t~m5Uhj#V+RhLm#DN9SK#^!R?svca1m92kz1}?5T_SRUqe&h0k;rH<#&FRt& zxw3(hP8&75I+Ah`%*k$EvekjoX;Mi%#A(SY9eN?w9puBcU^9dxNPcKAa_ zu;qw_m_e>dJ6nuUH8cdQ$K@K*^Gwj{>PZk+V11S;ffKiH1B0-nvsU^WxAzfR#b!yL zK%xadxuB9~?wdN9`RS{rDd?v3v8W*PKT{V75rL;)Wdur6#iIclZh!*2OyMVsCu-ei% zX{FXgZ)}divGqRnVem8XUt5^?w#tSn^elsvMA)K1iE)bBO8CC#0T?V>7`7o#S3J%i*>IKAJp!iLA`}_9S!&aQ!h1CN zFcu4QwzKyRyy0F_9om+Tvp!fXfofZgjfS_*c&RnY8D|#uyCwCzHo6S>?59bpC^!h5 zk!qdwl8xVG5v(i7%$wRwa2%I|b+T|xe0tLYhcg-sQM>4>8xEqNda-wrhC{5p1qr#Q z+<7r$QKuMYK%c2iLJPj?Q@Nh3WRs7|0okK+#Qaj40D;O2h&b+e3wB&0dGMTA2sAJs zl+2aR0?<^-dncI4vr8dL5S4%*@4z_l5^#r{60|^I$rMol2apPY`7%lX@+tMJQwUXy zG+=)du;HMBlh|-#$OFU!PCNjxJOO`nogrGd^qd4NHad9`tmnaS1f)s;$0i8ieW}F6 zaS}-V6Ou=&@|K?IPi=yLLE8czfmLC@8-a@dX^MjWI(Zv-Ax%f4Oh?ngd%_ZlrlT98 zGBBfia?P`Ltfef=rZ;@~>TPE}K6iEbYHY{iR%=&hS2#bybGxGybAJt8^L&Y;&)^}E zP79WwI6vl{HmQNYrBwbtgQrTU;tFEo+L%55N0^Yp5DaH=(NmeN5S7(C*KTOl=tNbH z>#tdJvOQ^Sv)IVo>`)~oLB!Yxw-tx*r^D%)C?gn&bX+k7>zz;!e1XC0-6 zL}FoPD9UJ2W|5^9_IdW+_PxJbm_9pcJ!wy<4Oo6((h4j06)CQoZ4Jdk)$9+4U|<3e z<_xpkz>9lxy%1M|zVoLF8b~VlhRTZjM>m^X*sy)2_q=2EToT$q5o2y&mpwCS_Mz#V zi-lG?0{jHO16Z~2P>+%4%M9%{t?E4&mGOYzQUplig2BSe#)Y`#vfJq3n)`8h-oaLO zHv2!gB)Gpe(b~ds#UmeuX!h8RbtGkl%{J5>eT#GkcCGF!Ac|boO(0LO4edjv!=2hT zDbY)suS>A-#>S>GH#JQI^G}VF(;wSn^w-qpBNN4Ye|)-tM{cn7LbpIe;l{*#UB3j} zpH*if<%*5jrQSVX>8kwV+7iXqtk`ggORZ2SjFtg>)ags>8#Og!iN?9-%2xyd7aX$f z1GXWfN;coRFVS(zse6f4uS;fqeZ9<Gm;etuQ0;8}8Q=8*CoyD^(xv$)+jA(T= zkcRG|`cT+hpiaXZr&-^d`H7hHf^403)vGhl;FY?U>n{?Z;Bgb}4r%Onhr_XZ97Juy zd(BZ-9rVl4UrUF1Gc+)RGZ+i#K5r8Tq zeiJO4BTzMICz!G+36O{=fa(tUC3=uR2S9HP(&&WCfN(fb_QXy5o1acN1^svdAK*5; zn8)CNU;uWKoQx@(7tC#)NdwU{1gzKlrM8dA#g(i<>`YF4vzL?x0CQl38IS^qzx^oz zf7jb%rM-Eqw#Tgg@q|ApfjgDE09wnILi&DRhb={Rq4AsuZLY@~=Z-@Q)9yFX-6_sp z3C6BGPwWdbJ*Ou>%-o8)-emqng(j!ZimAmse?TAno}6DuZjlg#lm6rbebgyV65{iB zl|lq+bF;3Mt^~$xJ}Vy@i>j~j&1E)@R@KXy)~<9d%hJKgBfq@>2~E-NTr37k0_>msy)ojx)k4B&NZB8?;eC>79GFg=BCO}xdpW%6XvwE zgLo$0>@WWA^xf>M7TuoJE7y*UD0EP0`=@7R=md0vWI;}DA4?PlQm@9X8)&6#jp=ig zm$kunuEo9bjcZ$_#E8%hR}S`R)TKnLUAo_3!eD&jOzfeI^MSYT0N;3E|Lz*Jawlan zogG&)QtrF_{8)DX*M?|3A+V+Wzy)DYl@%c*G3YJtw6^BtkI-U{9}jV09P*SDG=00Y2&rIf((JU=!MaK7t@6CV#G08h zmnP%hiMRo_XLxm_wlO+5A}*mpueA-^lF+G*TS&f*7h+1_3R+pf7Gfd~qt^}QBjL7_ z5!~(DqR@5A`-L;f2?wy*B*T{AA?5&Y}RWw&Er zU}YIb(Ml&pdCv<0%7XkSl1sveD8~H7-(!52o`BIY=3+~gs>S^@LXcd3QT;x+%i@Js zq8MPj{9>d^q{^+s8~fpMhx7J@r{!gLQeD-IQP{Rb#e44IIp1?-(|t2#yycnSb!7Ff zN%lL-PIVDJ)%lDsE{Av5Cr&1_fCL;>ysE#OBxa#LQDy26ceyZ^i3X)AUbz} zTIJeJ`qsPDI(XndaFK-Lq!PsiKun3ito=(10RjN<)?bd}AhIGlLa_S7cZvsr8T)Pu zaE{mjah8A!1^0<1EY$OO!^;vk-_Bg_cGe#Y8qi~<@a!4cu-&NGP%3%LWm{5hz3_2x zwc-p|QB$X?g^m?|tpw&G3AdyQAZz3yr-;5RQ4Ucyt}C^+#%{`w^c*2nCKBe zV{YeF!8bPF(+Rb_9B&qH7S{*VcWBlvCjl2v$5gj zP}23GfO1zx%%P;RgZYK25j-6qYSEEpm5}2$#d_}irLQ>n~=v7YeotH~pEig6}| z>b26d;j4?0)2GMpU$`GDTAX?Dvk}7euBy+CcwsQDBkit(e6tjIO1KlJrvg^6&jhPb zyM&_DS3)fiEpDCnvsb+jGQFG9JkyHUuvR0YvHi43`bPlVdvacNmiOyezJ>na`eO~9 zYsx*>%OemB-;|YpN{B$@A0Hlj0}$xlAyz{iFP9Uf;128};|u`%NX}9OfG*_@Vd;QC z@AooBf_}pWtYRyE2F939z+f8T^;JnFjX(W%$O)yhokYR>pzq=RLUsYX(=k+L0!v1e z*tS>L(m272ZgMV=jJd|~h&Z4VxEi3X9+0MV0#5V`_}LO6|NY@{nMFu95Kg3=N_-i- z19`DFS^9Ix1yKs_XG-v5%zgeePb~=q#2y!K&!3)d-C7=zmp#|-WLN2G;WU@ATceMZy=H&KlDoeUrrk1L0l{{YDGw?(DfTGLc=qHK8dSN`&ACJWoFRyj2n}3A1D43=5LXLBjR`PUX=BW1OvTXvVjfU-8TtmHeU%iTSPp#-Xy;p{s&z z(O|7U-=@m+jj@lqSt-V~FVicW@9v6tUiG~)b^M$CKQ=_%U>Stjsw_88z7DsU12Z=y z>{W&l41v;;nMDV$tEZR*X+eWAR{Lq_h#Lk2H2wE50-5pYC?qXg?B{^EM0wel+L}Vk z3(tM{_egi$Pmgx1k5>A+u0sk5O#B+L{r<>t7lKX?owW~8-FRc|~Ub%y!N0k}hpL1}w z%6PS89A;B9^VPF&D9Na0X$xwdx3(N8zgR|n>uvGG>sv~0NTwUXdalG1H?=i+@6t1H zMWbjCbTnq*G*Vwulf5P425sIk^f}8*30h<^aQVIk3n#$%;|}>(WpFJigZSqc@&P-} z5{t7uN=JT5eRZ>i_hPgtFqrxrJXB5tzK{h_zETS~&x_6Gq~+B|!Eab=bnyx%@S^G9Q!N(sNWS9Ahj8vs>crnZ zS5D@KK7F2~vV#as>r-I`}t%cVRE;~!B68%7iDME<}8xVe3`6gNgK{iQu^V(YuhQ!PH*BFSVwh}CR zQMuAJwS2d~j$H$D=%>@TEj!DtwB;Xk!ct=F-Ww^*I>R80Nl|A6;f;5vOsqO}>lmq$ z|1#7RJ^UCOG`a@{lPdZbpw5|OO_Lv8{;BKt!)eF zCJZaKI>c6;`>|t-p5p_*QFlb57ts zTDb4+j!bt|k;;$L2wZNZ3G3Xd>=?I9rQvK^L1|(w#a5E6W1E#b8>`Pd&jJ?r+~W~p_R%nRsYxzWO&IV*Ez87=@1(o4$@^4#%60~(ht}%Sdk^tM*v?1las}!O z4-WOkKs_o>25(9m$RPSqr6JiB{BBVwMhlHD{-aSl2 zc$P#ze|oNUTlpkDhSfmBs6zPXE^oFq*Sbk2!l=)%%FdmtjHS9HOVY$nm2O1%{!+`N z&j>$fyOBW5j#g>NEW@M*62&m7gM{nFcp{MYC<{6ULS3Hy%@&F$>7u-%7AK?Nm-j|r za!{Of;Q*z*ULF2kD7RC3K63ZUyTc>kz<;2B9ozs!|I>}lv#$rM+*EJ{lZR+VH4qf1`6vQ!tRr&%=1)SfodGaSN61Ua_b zHMLe~FbwFv)}d*sIEk(}*K!*IGV)L1+7C)70-n(Th*WYAmt1@bxp@Nsvs0r;QV&fE z;x{XRN#D&;m6RKsLmIfSmA_SM(qx#Cn)>veVhgcKrMW7AULW9*{ux5XMuDxIq z>>6;k(s6YcuKem~cOyXtJVJkU%1GiDNl6~+x^$B7YY zsYwGjd8yeIyzob%W;cToq?MO1g3cpah&T0VhT*3)THX+nx1a!t1_l>{OI;c@bq{YY zrA(yEruazZ+kBmi4$O!aUDLhy3faP+rl-n_3AUh2!$=@M0YRyQuSG*BT&-MQ=gPif zph33CP+zanV=*x%GlNRI_Z5z))ri`JI6KWHMbYD6pJ{d+i(r8T1Fqhfz;Zhn_#g$- zRD7DWB_ma~EeAM*|5tkng?RQs3J^i)1eLz$x?(7LoH`Pd9UQ5~g_(`#$Dn)Eu#P8Q ze|owTRl&gCWGNEEIIwYlvf}gFcDVlS;84GK>#W$qEsGja?!K4!^}}T!QWY zEd4$PnRC~i^1h-I9Hs_Me5WUuIKr>;z%h@4Tkk4451rDm_)1LwH2NW_ZhN_HEt39u zv^LRQiSxh}Ep&WMi_-OTmw7zWL~^w0ZeIqTKLTz04=50!M5D?<1qOq9(Kl^)Q$cV| zLJzw7$g38k=Tmzry~*C_P04e8G>;i)g68@1Rb?w-YRIRj%6il##GEB3zkyYr-ynKVRyeqx#1PTN5Rt?XQG!{lD<@6i+LxYlzJBtM z)C0`D-XLUXUx5FT>8VjqR#F9S02C`=DodM?;JQ_A+QpH>_f!df6P(JwG@{Bo#0IxQ z^pu5i5Q3?%y7(-9b-TLXPRgl}xHN++Xfl&ID6nys)nOI-^}x≺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 aZ9dU0Ms{-kTyx}8tv}_CNabzsZ~q??`e5h) literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-1-2-0-upper-landing.jpg b/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-1-2-0-upper-landing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b737b34bd8296591c26b4a6f075a36478a0e9879 GIT binary patch literal 18576 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-lower-landing.jpg b/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-lower-landing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a67a36854dc03e0dfbe7fa2bad1d5e93e20509d7 GIT binary patch literal 20419 zcmd_S30M=?+dh0IAt6lx6HQb=G>xsspeP6;D4O&oXsOmj69fep76oxbKymFfw2DDM zMNm;O4Wcn1ilP-zTmeN{1O)dD0TDM)RIuvzoC#Wg-M{a8ulIVt|Njh5W+pR}Gw0dv z=YG!k{>uAzh%;{H;(%fHcJ?lI_CxH^`|Iex5R1k7jP=>)R5Ld-|E*bASa7*qSeu($ zSa3L8Zr5&I;Q+T=Hy)4IvuBSUy?WUQg#+H7MbU^bHuSL(G`b0c`G>=ZI?f>oL?dV> zxG@+6Ttv{g^ln|H_9lv%U+^Y={qu%PKQJ7g>B3G4E3^NLKlI++fJrTCF1{V2<5g!P zxLplT>0C4#J@zUPbwsm~2Bjd&qd9po zS{9Ic(2>=z}`jZp>N*e}q5TZxh;}M>{s=j}?r3wYGUfq}gQkvw}6D zQ_c*ps-I?BeQbV8V`f0q>)JIFGNN`wmix9GTd_4RAuVc0&l>Auja!ekMcW7(n5!6UJkmLy7RuzGrE5@CULN1!91C?I~sB4sDtRmJy_kE_RY?X;)EVw zh2K9hOjo3cU93TQNP`e!N(f}~$#o0~b3L&ODd8j@k+QWNxlGLo zmhMg7Dl`4|-GhsIu|spK;at}E8@Au*hlr>PZ)6IibFvm4G$gq1)vz4}#=Fr-gw!NS zLo8IfEtp8HA-j3PcswAix5$|`dwQnW#$FzNd55fc+o1(>PwjTHS~|Pi^&z1?HDP;_ z7Zx9xQFCBR)rCt53n&SkfARWw-U9D&lVh7^A77qxdt5)q)_|sksmo8?KJ}=|&!Nn* zF}_=$0e!Q6;K#YrY+ZvT;~n)Z16h`$WZDff(Bn>BRq*SNE%QSd)^cXMrY&Y5K(HsLkDNe=p z&77l;j*C;d_nJFLZ!t%&S-nZ7G~shq-D@25hWMqmBhwA~k?r?uyhYI$o32#OF`M8V zqCRLF{p?`#e*C~AHBcB0h{6#ZLl>lWy@MLf~hk-cAgoh*?xuu+`B-VrE z34+IPmxpYUhj181O;UpFLy#5fGK6S6q^cdc#L9g#*Buc-?()T3T^uUYj--cgbuh$6 zz1_CeN`2JLYO7<3ZCTU8s&Diz8roU3q;R_rZ!z@BYCYlDEKujVdh0d!FKYznl_sET z%=}=wUE;d&rp~&s3|G71bB-s*?T)l6PM-1dVh^91DNFZQgBEy?3u)NCz_)N;(Dsni zGhV#RI;g1|vdl40ojcAiN3SUk-TkSc&2q4;HK1KcOfAL{8S16CaGDb{yiy+>$x*_y zN`4zDZ;9!+$vmQFAlKvGS>7DPCO?xf=covciW9z9$`q@RgphEMOv#L>)Y)vl$V5xWq>=#zp14uzWCJe%aA%)99 zvL?ldHS03U11=2-*&$oHyUW~D`vMeuQo@cWcE@ftHSD-wMyBrQ#olpFnY!F@ zHaQ@+i+&NT%#aGMca=XaBwZ4eE&+RiXW~$Hh9B-fTUP^F@5vf|*#I&{q|wh%XMElr zx!yafwbV z9ZaA52s~R<`__gzT=C@fb0zqO)^*QA6AA~&7P}J?umlBS5DJ8?OwNFjhmLVoTz4fy zhLxw&*1$L7EB~Z%sAFJa;K9N1n(&ws{tnWy=%m&45hxUTa%3@rtq^eET+plvdg`_c z`nD-(rdBpn#g!`vWaTaomP)AGFhFh$)KyPUI&<|>B+=Nq_|QBD&AlTbKY#GoHU~2A zlw2OOzk66mP+?Hq5q>pZz-l_#muv$O~aXj;5bzwlQp zm&*p>(aQ$GITj0h@sG`!g_<>Ic@eQ3#Zh-c3&uQ04o1WAPm(N3S1`NN#39$DT;GPl z?uGKn17eSzbq~34_*$X+Y~R2dMMjOtR{PcohfBAm0(_1Wy~M3DI*AyyQo0PBYr~RM~~<= z_in}s&Dih_-Mf94r?%~0k<(9#hi6Y0c~-g&FD%^f^DTH%_rFkjxa?1xWxBlAUZs@e zNbqldY!R`@W+q2bIZ*1M)3T8R8tSRF_hh+L8(58=TFzPGI=_%%BLw$0P-2eEyeqXX zzEeQ5zEcej`-gewsoeXF9uU=9``|@*z|FXwd)o7s&l=hkn(A_FOT#{)Tg|WA!!CsV z6w-UzbjSMVa|XIE!oSW)4NcfWKX6V*vPm{I{(23Yg|uR!8jrtNj0`mJrfek8iV!>c_viPC?Ed-{)H&`NtHU0I_5^EK;LZJRUMyMqA?eW*yxPJVjdczH52P>#X9ymdazmt znt^Cq`dEauNQ2HHQkWg!DS(JXp3@@w)F58(_)%kaY_n3XoI5n?=%Gc~`PM-%?aw!! z>EACS_@&FmtyW_^f@F%HJ3IbwK0H-K$v%@_KmCWm7(b%OvxO)UTh9TR6^_cx0ZRCj zmZh8Y+^b|}`$}y5!MuKSR~!Wea@2xPGgBG_jo{jnR{>5uEoi@SV&IYO`%Vv))s+_c z@qe}|FWt6eqDX){RWmAdP0GY*gWwauB@N(Ste&aI6ws|(j ziqnpbRmWiy|5r^+-yx0}t`U%*I1BTyslZ~p%bWZVST+$UNfQ4g_g)X>QcaZJ9LJq( zf41w_f;3M=VgZ443O%(hfH2ndPxP7};{Vm;lKao6&7JS^Fz>X>zC}FAobu$eOd0fw zIA+#$lMR=_qp&qREW`NBfbC@r9L)h^DI|yi0SDn|1DJsVER@Of0H(Px(9TQ;)6r`{TCA*P3nbC0fQhXt zwL>anGWCKIQfQ!e7h_qX`Gy)ZMAbS=54wOB_wqM=hz_&&L*6E-N8h)tTauxmr+ z0=fhu2@HXll_`#K!9P7mD*zXK7A-rFIpbW~RrQQ>m2TdBOrv%Nr)sAsFXr_$+R+1 z&M?dD&QGSlST)9vi|czeE^MpAzP`1#>&_>I^v?C21*Z05URj_TM@D@G<-b45=r1;C z6ZKt0R0QZeVIZ16kYnS2QgJk!VWk1{JBLceWT8j^0V_UIOm3J#&$899U1c$%8$wip z&P#CYYm!OJHgQ0hmS7VOML`2kxG0I%@Y5}`Gv1>|%a4!gvud>E{pKh3&%;U$b;aAt zS5L{9vX@&`{msprPaBH+`CXfk6g%b%cdN67;^+V|TP+reNo@NcLs+Lw1#C4$F`5n> zB^&!ktnFCVu!rbh(;N{6LF9BQN zIHm$gx_eof^aO;SM3klzKbgQ@uWL#sU&@uh8R6Lmt&5YSr(Eh!1F_NK)HJcyeu{yf zQo$4(ga-@)J*rScH>j?F;<2=5q!~Cbgm40WunE}&gMDl_Chu-1u&9U;HFX!HEsOyRkwY#;Xux?kfhi^d8V1>wC!Tj1nLP08 zf(8BCEZcu!ojeIX938Y>cokhB7Xs72#ke0=bE3dbSAZ z@OYSGfrzM)p{xrWAV`Jq38uWH5l;ZP)`FSQAVxu^Xa=Tc&^j3CVst@bCZZ1#3lD%R z6ba6Fk`0w)LxnK6#-KA3$LMJ+1Y#iTu_)Byv!umZFdznxDXw6$QQ;Jbb~I8C+O5MX z0(}K{h)VgKK*%1%uPNEUGh=e3z{x&P(NwryZb+Cmu+GN{uzJx!!-%snq6!jD`G-b7 z_kmKuCz{Jhi!E6qHjK0F!WcS^LthyM0Ra;Pp`k}@iLt0qQ-Xl7$_$b81Tg`8EZd~) z)dV@MWp1#-YT*UP5FeMp=g$m0cT~A_(erN`s+9n_88PSzcrJiT8n!^MXKUCZfe;To z^@w5wVnP5X;9<2Q?B>K;*jKAb5h;dm48mv$421wZAP7dU)ri1kG)N;58o)0C&@+H$ z3-#dsN=OH-Sq=+Ey#xdS0wJj*2JH}o0An~YeVZr9K`&@HERk>(kdR-NEZV0cN~L^% ziK+KRG&hE(GLVg4db2@jhCzVLS*X)Mz*5EFR?aJ>Fj_O`bgH_m|5-i#a@=gDsxw{6 zoYdW8O&YI|;c=FVuzxQE)AhlU-_EcG;0-`+J^=5#IN~77bmX5Tg+VrTRmcO*qKLvU z2?fo$3~OvBo3J5(7%+-2t3EWtV(F~b)}XLFL$!yWLup;^+@frshzlD|*{92X3EYM} zvRu`4AqhVS!hl8@13+n<_K=h~z&gwYl-7YcXvGK=$q@vhL1Hb96vv1mNU=d^bP0%# z5(o=E^%cT{6+#_&KN>7}8~Q1FhP&em&A>!aCvGnGM@?WMK| z1s0Mk<(C~+N=x>kK)Kagj_KI-L^kr@C-3zT9M)wVX?REh=ms*RV1!K4Q6LIZO4lP~ zSrEE$7X^k8>Mo#P0+5hatMNaVR;BTe9{a+7%R$jYKoS4gMn-@A@f_Mo)3H+EaTqpV za1`l~AO)gX0NOTj{Bht=O1DT%=Z=%}Yq6?d6;g3jKrk?XYGBBDat3fy z3_^wg<{<^amvdGBv9eSF7YjfDP_YR|$%LSSqeYUEDT5S3N&JM!Z0 zVDAlj48b0U5Hbe{gE^cTU}Aa}&6Yn$XQ7%yo@4EECoQsZ52&o2@>dKF zAD+20HCRuis5pUO{O!FF#VEkg)3XL>P@Dgjp};11?;aS}#iO4{^q8gA2;j@VZ(Rhx z#TvSz6J~uaunqG^24f5X$)p=&NRlL!e->;?I%cdpZ$1}n7%;UGNKsCBx(OH+mJDJJ zZ5`S=5i-((kP8h>tkN-G;G+w=@zOEP91I?S4};ZHE}NOonF(1PaLO=_N;%I+F9Rp} zGl%&zL3vPyT;YF~@IT3nQO6;+mYt1Ma5V#L0>nVLW4;ZXGy}lZheZMw0n{fXi*jSS zXhMyCpot|MfuRRNM!_5)0gC`*$9BR^(ON_p=!kZbsN@jt#71ywIKd_%gahm_f-4wd z0o@UZFYI$&H1Iso=-!yfx$AxUfWd9cp`QYSmt~Lh;VoG$`Zv-0Q&(lN9wcr|A0cu} zDCQE9m~~16eTPUtB#LzP_a|Ko0YiNxHsNb~Po0HQr!ACl@i1Trm8y#En)Ez(WYy?l zcYAj2Rw|k5^n6Lt{5d-IbLUj&&v$QJr46{hrIM@wxk_jNGBD91KqX-2K+QlTcBBlU zk`{+ExrJ)_LNe`ZbO~7rMAbr6sZNvQYce>@7-WF>FT!i=!(ah-2B=xY(g3pqyiW|m z*@pmPdAk;fG8#$ zIdFai_$lm|Bv70X>C8xkwDgqQP6YfaZl-f>SNJXuJUk}NbWcKDN^+*xv!eX-yMmO7 zp2idYcKwM73>46JLC!e#0I)4mk0eksY;J@G`U!mlE^{m}o%cw{L&U#y7nsBN4fRBj z>93opw}71gBnvPQLcUsU0a?lF8u1O z@8pu!tYhy{&BMg1&%K||Vn>e!v}>+oJLArR`%WStVebi!1n+~DaFj}h^;p!@6*-&m z=5d(!B+R>%nf%OA=)r1`)sGS@5+tO9(1NiU5Iby;E262jARK%b4N?Q^10N(VzX`Mg zM1oGM$#bYgZKeUm+XVWrfwaq*e4T`^elo%M9V9t7~D#1vMAPPo~$hdu~a98FOr@s4pSl7n8e(U31c|M(kd-IQtxNoF; z;Y0?G3HBerlaVBYvP=pU&&NQ_01~Y*3>*`rAutSx3)l;i5bTw>kc3zgRF%hc^Vaw| zH$XCcYfG!bFi-ii10WUEGJBu<=h7OUfA9C*^yaL@OP2Zuk+}mfhv){3w`Gjz8ayWq z83{w?fW#-6Qy|ka{}P38lygwpuCeGr3_XOa1dj+Ibq-$htw4RW2+ZaZ;XyJ0U{GOP zfx?tOn_(jY@!_+sSXfNX=> zs+R#D!uThsQ-+0)jjb5Wbe~s4$j02=Hc`AjeBl$iw$aEag)D0p45= zO=G6iLMdv9C|a(jkyTT|8F9!K9|mkYa!N;(Nst#`GTG zW5{l*3uTpB^^V!V_)y#Z2SI%zCGcWUsQwVEgE7dGe?lzl$Xm8CWHU<`zhQ>P32y67 z0pyRNUcv=6LMZC(nC=aAR~v4Z&fI3TVshHf*n>}&ju>j2a-}hP_{~9_0zFO4LXc;~XotD;R0v29y{5q+$VN7O?HM*{Lx{>RB{o8L75wAlPwTZD<~dDT z2!~lg3s96daAV9PLK8p_mWJoY20V_~+f@30)!>KEAXdk%+81jyh z$HEi)#AfE5J=##!I5T<6!Mcc>USslmy_?XhbX}-b(37W2!!FEqtaLjxDEH2}N{{vv zE!BD$Vq8O6JW|1_xiNwTHXI8BP`So=YLDf#cN`i61ya%Azg%b8A`K)vx zKnRY8X25X@@?o$%xWiX6T;7I+3eD~}rx5HKq2B9kdwQu9Pfj0-X3XnbyY|P-xGwHr zRth!v%YSaaF)`Hw%u^x&YB+nLLL-Lpl*{hB!&CdEH)>w1q2-+xr0v2y=Eq`zQMgEe zSU9R8)US{eFvFsET5R5u3C`(zeZJ+l+}f`wyuN%-Vur(kBQ7%;VoCB5yz7iOI5MJ7+QUi;-#P_&_<{|4KG>=f^FaV_EsRVp0i82I= z>aasiTKIG&0mCDZl#pYygK#Wek7pH`Aa`EZbd#=!WF~th?wJ)PdaauFvk%x`3L>@H zdeVtUOr-XbQfObv2t5K02f&M#4Vp&M1Uez?Y1x9$R%|WVOF-gD1YRNf-O3teA1fRF z`qq zl)Ym1s3n7K>Mq>r=(Xj$aS=^+*>*#xylg)jwCjR(+~xTh^n#^NLK?5zr&Hd;#)N?R z2YAd$?4%*X;d<{=ab_Wl4Iro)qC$;cb4n@QMVh-y6*XR8F>LA_bOzU=05Pz}0zKdt zgX@5$C5APY6-Y56kZ&Exo41}4BTVz5B)MK00)H^WfzPKlVRl0xpU)t;QXk|c z;jgEV2?!Gl(OqJ)S7wq~!L@aiLqtTG*F-}@9SJ1!t|rZ8921?|E0_j>Pa_bKS`lPT z5cYsekeEogpawW|?t0UH{(}kua_V=MHvahVnatpf;-a>@UxfA@KQp@Et4z(U;Z0fq zME|;d;Nlphc_C?Wz?d#U&|S->V7l?%q<&$w+Bn0 zTdttf=DT1rm*VJpC~{5#j!FV-n95zQlJ9p$y%u5W9`as^|q_qm^ zt;sGvsxeD_>t%{-_F{H?rl$sKFHo7&8HSaxU56gP6A`Y;Og-exs|=5;46E5Q%nu!4 zZbcznDTbd49)CS^3ksoTpm=P(BDS?gUW-MxBCQ@A5aa_fLxWLSA+es5IR#BQr(@AF z1V4m!*L)T#U>&51&)pzD7m}YTq_*8j{(2Cnl#s|#Cv5~(2vP`+8ncT-lV;t_l*1EQ z7urAf1eP_xszl#b=i8Ert4NEA`>A#BFi803gn)qMP6-I6Nkg-9!mWh)B z6POpr3z0*O6m`W;A5wgvTvePIDB`TKvW_Q`0LV7la%b^DMI4*VC2C}9(G94*rz2p` zG9dT^ubC99lr4e+%d=(igL}4JJ@PKp>`GPLi05I8r$--hXim9O=8|hC?lQL|$jR6K zIy=p>?s~-2WVaT7;W5aVQPapoo=6;Hrh%9S3EeOdE<&?_76lB+lUx^RA6%4z7yaA{ z!K4B{*EhM4GsjD+$mV<02cgJWN_oUu5bK7m3T0%{RynNVbo!)iK3FZ{lT)m>re9VJcMl!~A!RJT7 zh(Qg&mN&S2DOCJ8a?oslwKB)VV-U~kaCxxKR=_SRWX!6Tf9sutv_xMyv9~(}&UM$2 z*Dxf|36P^eizyIucpd;zNW$fU3zqN)Rghb!GrI#k!fiwVOgU063(LG$qJJt5umr8m z)v%q!=hX2V4-09T^QDZSDv74yG8rwPF8KS^2dbpn8#O`howYuO4$c>7ZBW*aMM7L^ zA3|Cj?W}+Rd(|0SAyop@w8N7%BubA9B=k%pvsi&*KDioBL3GQzLsRAjot3R9+c~f5 zcB*xIUTD_?mlN!UAMbgu(xJ*NE04>+(@4V7K~i(P^I%=j{J$p z-JH+TJ}h&BqM#Uay=lR0M-ovC2vVz*%{_yUl!euP@R$Av>D* ziX5pT*N1_>moL8FRjY44@|8?cJ9i$6yxvuvwj0Eb=OAgDjtnDR=f%O1E1(F=X9pYN z9>?hnAbCyN@_=Ca@_-rUkK;aQfwtz#H4$}!(~)5seGOKgadY{2+L_m4lpo+9JvAU$ zX9wzHcO^$YXa>wQ`&`nsW{|wcTr^0JoYtABHXJaiB+ag&DWzJo>MKC&e01m{m@Wq9 zPGbu}j4+XCiiVMCL`+baqDN&74Q4-Hx45pbtEPFi-4%De;YMMNJL8+!U268lco@sR zQ-IjshK&Gbq1|cnkI4$1A%GG4yY>NUed6LVI}3CMX;x_zHB~g`fG%YIMhD=U;UC8`y(({?5t zd9rk}SJ2GRGI&snjgQwxXv|ZC5ppaMrv277Mdss%7Z><&|QiG_!8J(ZP(BtVsjpid$Y^$pA9EEHR9jN16XH zbz0g8hR4gYQ;Or+IV$VxEbT3$)q^_dqNl<<#;Jkw(78JGW3F^@iO8`GW*1t^m`BP^ z%C1{8JdPBd>@jzW$nM6IuVXG}EeC&bj+PDAgy#_RW+-?P<{kFNVJPzv@r#=-+AI42 z<8U1LlZ;R@Ai87suIl6{2o4kkd4x|6I{bqKi;DRpRBgtSUFSWhtLu7ca)Rk0v#y6c zHkB-{ z@}Cjf=pAAbKzELinj289gfL2R(#A>-R10Vv;yS#e0MoUBw1(g(`hWx`s)6^VA>b#V z3(1-TnMV?!Yh$OsLtUFHW8SX5)ie^|-J>kL+0Y3k*x+M(BK zPWG&tsx;Z^y&5$SUF4C}du?J_iNS4U`QXS`LFr@mFBrVi_%Ug4^dSGV+FuegHlIq) z-aW0X@xxZZ$E~u)*o@8j=5^zaUythFFT8MdtK)?S^X@!seA@0|eXcU}_Ak*HJ5SX2 zT+nx1^X*?&htGZnGvwiWa}P?wyI+yMNlPQAehCdHVXmEwS6wsHgoV7ba)> zEXz+F)%?_Fo}%eO;so2_hWO1JYlkAgY9%vWFLIq%%Cmkl6NTo2idZ4XdYGn4s<6}ThwA0Ad9ZVKc6POVJ6h0JyftNL*?(kQuPEy1h^C3VcoZ?ZH zFCKttcVp&{r)p`UO=G}mL4XiwTmchQV|~YLfCl&+ib$kG@#7lQ3uoeKu0XM2iV>F* z@ie`3K*3z8dt@<}DF5yiUpj57P1c~k;#O~fiJYZ=S%ZYOYf7s;V_fn=krGr>K`h3M25Btbi+~drLtvQgZy1I}2607G zDpPtPt8kw6OrA}ztHD->H_5@y`-XEJdqzI?l7&~LhXBGt#O(xP5U;Lo`GJ#}QygbT zUygUR?dvhTsX}7xkvGLtpCu%?X2XLjG1On628nA}f76U;p3om4s`!P3pYSYk)SVZM zl$f;nPeLAp0#_=bW;=q*6;jh(am=Rzf%DoJ@D9Rw$OkG(YKj=(e?DXaAaIzy;TjMV zvwL`co#x!&fj-0_JGyAdA9fQ99AhA9)8=*vT5E3TD z2564A0K@SA!HVW867c z4+O!(vsl$;y~Xt1{X~=(hdGopfL^Nxu<>yYrTq;05o19UNL)68H!I4DE)zw?-}1TB zmdEak6WU$~TapbE$fw30FI1Q&4D@?4=%A)GK9(?JZ?q&j+LvTcjty~+dXQ`cLgV;wZ4Z-tNQfali2*iCh~&!0=)Ss0yceb+PAu@ zUb-4@@%pX!jg6__B7BQgNh{-{v#48)_ADswyhWe%#7FoRa9vBD&!}2_c-?|NJ<<~& zM+CsxJ#UQ~{B8eh4_up*v*YUSy*Ris>&M92K>^mqg-wBP{NUa-_QzICOP+A30uF~q z6c@o^H+gr}V7c<`07l_ofDS`gCm*)i-L$jlbxM z#RKo%xdz;iXl{-Gq4{1fE@`T**^ZAoCnQ##hrv&&hZE{vwEi~Y6Z&7lW0;%wcZWky z8;4~>)&9NI8-3S{FFe}6_fkZy+stDt3Q9VT_ZS}z16%TFe@5rQtbaUc)T{-4Y!4PB z-HWJkTHW$|dFX=|+o-Ml&aLd{`JuNf7kJl9DULo;@Z&vdE4Ejkufv=(LkHEBCRkrj zuxfU_@ZIn`FUR%p83(UGwZY3#9;x3(UtWk`T~ps_yI~!)dgq9Ny)PbE;8SB2)xS^a zqv9^x<~me{-D$h4xpqpp<=*e-(%cXjK`@v+xHRD*PZpGyhtU4a+CLt{d>M|$GBtgd zH`^KPUJg|^YDyC>Reh`?K+LV>e?rBOpH0+&abpr@2k^Iv7m3<#JRDUg13J@o=I1b7 zEy;Z{Oe?UrM@!Day9)kAGV9Ktwycs^ESo3qH8;W#v)`?-vT2vJG5c87s22FFNy!a( zYUS?L627%=q@?$;Y2WLM9BRa&*Y~J9ZVtIUXlT{#YwbSEI?n7dx37Bmvf!(>8>tra zk9pkaSXoees^ivzCC<|V(srs|-a~S=C`t+gPxF+mo;*4X(NKR;^LA z-!?S7$%sB-fB8b_izx}EZ^sP2?Q7GDzf4fH7n~S;vvV)8{%N0-hpj6wpSs;QBl*O) z?`}u^T0UuX-n*_d z_o`zfTpul3wWit4`F8vCtL=@wSMAubEPg`8$_2aMyhmp?|2nw*XiMAOtF`+3Z%u2K zO+WFg%lD^$eUmVHn#~T^_ys50Qnx*Qk1VD?E1++NV}8`JX({hUUl@G#S+CrVXAhgQ zOFR1L?>@Wm{q5ojtw~!!$~(93KYzFJ#HhQ)Rrz}qr5)dtH??kiIP=%J zn_uMZFFhLcjJl=u!<8fR9tQmCJiEEy&eVmC&1b0L+%uZ-Yxs*3hn{CyQvLYWC90sQ z{e;WSO)dLJP5!>vFMh(M8_!-Plr5=$>O0!+J+krL`7;*lh?^^$6Poig5?>^a8l5-V zIq!M>GMn#v?cBY!J)rx{HW#yC3kMy<4jW3(>rgp+lZ7T|%*xe`|^{>8o1M=Zxgq2l>-?rtYtv(6M!Re)veNwb9wnR^?Z(e27xBl>jzen>;hiA`^}AFhpg04Jr^UOZE~ zpyOcedsP0Ye&4eP#S?xGTbR0M^?Ovkv$*~}8fMk-I%JshwL^)Y*KayeXr_C(`0(w7 zV+$hZjqGiE_yMprNADIcRGq1!{!_4rO9@=9vk>)dikj=snqhLe}auU96U#9-iKU4 zguR-JUO;|&&hNG`tHUs7}0CLK5kp_OJU*dEf4AsziNK|OZB4Lg}#36@mW)+ zFT48W*Y{}hh}RjhN5+ile@Mfq>AM5`F z-Tuw_?@|9VoyVuYYkH3g-wl2{czxr$?`u8Yyc^Q-OZ)C=y%v3+I`uso+dl65ooz?n z%zQEUx!v;mAv@~_cU)_K)M6ECxNvpl68(wT)~Ks>^}F*jk5Bh0|K4Wlq@79A3~qf? z<*#aYxM=bf*E-@uUpH$4RoCJ-CvJQvZU`i@9vyEMn9qMxBk8f^ChE}unE8Kp0evuE zFnD>#K~%eVTHAWY%~yJKVsr$g9k`|(nm?e8A8v1I$r}FX;r+K=B3`ZdtaN+J z!o|gt-B$hZtkG~k-tI=8OY@UaBiptP&ue{9RB)!g-1mMH=u$_5N!!ufUoOmj@#tWiu-6{_O^CY1NuBqjvhV z?0;_RJk6$8$I8vcsmIS#2WPf6?vJ0p-PPqqN93KhQ*v&|jwM-s zzM;07ln3Pz`lD$c6~8m6Pj-RMF}cCB>AQK-*rRcGRA6x^kJw=D~jw>Gu) ztzWrn(wRQxufikl9&uf{r1(9`U9|G(s?D#$Bkv6>o^bH>iC11w2kfczB>+LH<&*=|4v)@t3`{8 z$MnAnwo~{p=*j)&`1l3;Z}#bPV(>C*`_Sd0QO=8}J@I}7X4Iql{G->`vwZV@$sBdK zEpNpdJ3kQPr30wQWzT3)ph);fULl&ad#bY;eq1)b2a~eYcH)s_F%M zcOIYVAacIF`S?tGY1XgDoBN^TwV>9Z+W)_4#FCX2MDF=bE$|4p!W(;aOY$3&wd`2k zx$;4FX%8k$UAfaO-a2&mbgyL(+P_=j>Ri?3klQSN%l6#J1>T_K!=HkZw>|=|Q&HwS zIQGsGpE_Urn^nHIe}0ns^aq!49NLN}_kS?#^`z=W6MC4=jn7*4raabd`j=rib~Qg9 zHLfk!#kCazOJ@6_S{K)a*KI~6o^hLRH?Q@&n_Kz7Hg7Mh`dzhqPlw-K;S=sF zCLil#@uWTxzKSEu_vG2pzsY?4hn(y5yUi@;G;De|kjsN}9c`^Pk3doOB z9zINc`1G^0u=3$n|J|P&aI!Jlns)NB&pr z8lRN*2NC=xjQ{y9!6zg0*FF36tWPfZ{pNq(;BPPbqiy3Oa6|3yZ~A}sKK=dG{|5+u BZ~6cL literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-upper-landing.jpg b/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-upper-landing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a29930184abe42671e9d40ab4d9be2badf9a9ce GIT binary patch literal 22035 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 G#{UOcv$ItI literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-0-1-0-lower-landing.jpg b/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-0-1-0-lower-landing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4013c0879bc8f76943dff3e61c51c0eb0754ea0 GIT binary patch literal 17604 zcmeHu30zah*7!|WOGSu)1z8KNrr?GM${tz*7Eyw-gYX0;0wS_20_Lfe7+K0wHf2eJ zK-i0bC@xsp6cA)DAn*X$L3WV+n|qTWDD7))f4~3xe*bT7?ks1{oH=*q%$YMwmVaGd zg8221d)X<;@03^GDZg7DT5f^9gSff5KjZ%FbHwp(;C=5lZrq5$V1UodyKy5wKL)c& zU=sjf1Ox;H1%-vb_(DufTw3~@=y$NF51T8m18vqeN00U`4(|lwN zIu%8MD)&OA;ZMaLlO|Wy-7bW&b}FpyPP<$7C?X(nycU}&-qHW) zUil6+?|_u?mhBx$l+h{cE#=C`lY&Pl+eA->#~Sb%gh!pUwj67`>(*ed6DwNm$JZ#Q zfAZ?+Y^;sWf`QJS!gIbAexHxtD=~B8i=DRl;htN$*}2%;qd8G0&rYb?1gD%7Dy}U& zaQU{sEOmF|t>hn1y3x5I9x3Tgsx*i|Xc~5J8CIzbs)6>Bsh~Y6kQ5pYA>dI-AmqW4 zq(HE)BYg}-W6=yC4-y~=1P%K!?jMF!^K+6RyKi|8ye6>+J(t?5g4Z$|9hM?z91Wo1 z%VZ884Y(*Za;9Q;U$M67?ec;! zZIiD&LJfts?IclpJ6>sWQZlvEP^hy&v?(<0Zsiu=`7!l2(ee!)NiPdT z`)q<9Wrgpq?P(7hDG;sQelk2xX~D(sU0c-o?yK!eqciQ-`rvN7-91tuP#ySlo1~^h z%a{@j+Nf^Y=^TBxLBh(%cWxx-B_VvkSu|K;As~LTARFRA(=Ktp;wi^bDBQ^us4Bb&?>^o~r*w5R zB^p{^7<<@du48e2SILx}IT&YhV~=Ak%QvJJ&b3wXc86P>bK!HjdbfOs2I!p;-tMcr zYkO^i-WG_SCxTI0Ss>8vuQXm_UT6?A*ETqo7w%SQz!h*eCq_oU0z3WtT>@eVAz6kHueFsz0| z5v&}JEjSMN0b&5*7?Oa42NDDk5GGJs3|`en6vNF;gC~L?=SV+N zFPV4bK5iwXE$m3zokDs}gCNl55QL>cBsg5xNqq<<;mZ41{rV@o=JPbuk=b^wT6!7H;k}UN8`C1RXH5<>-u$SG% zDo02(x3bz;xIdUq+wbLR^u3r#j#TkMoJbl)3Q&VzK$AjF;bByaq}O<0B(6zAOhwOV zG>|~j2)}Fb{&b2C)nch_cS$Oh(cO3>AL8LXcWdGsRor@hu01fN*DJ?UqrT@sSy@hq z&I2Hw`6aZ=8CjqeOQ`hbQ)~x#C?xtymCS}?H6RtqU@(rQGD2n(GgS&eAfcg4JUnEo z{3(>xu;8~@r%)MQ6d9BIZ9iaC`b#r@;Lk0`bEezjHc^@NFzEb#^O2C6-+Rn5NWV&f zIzjV+_iu8%unhK!80)6SMxQ)sbm42)-b7==!LTxqvYg<#B06@Uf}W!C6%HQK{G2}u zfia50VZbn6Zx90@tYLtTA)t_u0~z%I20|nFL17?HX97

3W(4_UjBk0=iMuSlh8t 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 Le|?tyaNz#~BY|Kk literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-lower-landing.jpg b/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-lower-landing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aff38d6a4a4e1183e1112c37bba6aa1f62f4abf6 GIT binary patch literal 19808 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 F{{gfp0PO$( literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-upper-landing.jpg b/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-upper-landing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5763300081cfd1688dae1dba46466417e012028d GIT binary patch literal 18580 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-lower-landing.jpg b/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-lower-landing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7765a7fed9134de156c5468f9fd48e6743463c26 GIT binary patch literal 20302 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-upper-landing.jpg b/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-upper-landing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86ecb2b9458922cf081faecff3546979095bcb74 GIT binary patch literal 22040 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 literal 0 HcmV?d00001 diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/captures/manifest.json b/Standalone/Research/WorldAssemblerM3/Linux156/captures/manifest.json new file mode 100644 index 0000000..d8cc0ad --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/captures/manifest.json @@ -0,0 +1,278 @@ +[ + { + "version": "before-l151", + "view": "0-1-0-upper-landing", + "passage": "passage/0-1/0", + "side": "upper", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-0-1-0-upper-landing.jpg", + "camera_m": [ + 37.0, + -5.25, + -372.3810546875 + ], + "target_m": [ + 28.40474992442715, + -7.918646874047773, + -371.83751160914875 + ], + "yaw_deg": -107.24848481126237, + "pitch_deg": 3.4561048595792685, + "source_stamp": "1ca3b84f6d35f7f355ec0f72dabd3b87a455ea02e5789fea611916962e5db8e5", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-0-1-0-upper-landing.jpg pixels=921600 mean_luma=118.644 stddev_luma=15.499 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "before-l151", + "view": "0-1-0-lower-landing", + "passage": "passage/0-1/0", + "side": "lower", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-0-1-0-lower-landing.jpg", + "camera_m": [ + 25.8369140625, + 3.19921875, + -736.6798828125 + ], + "target_m": [ + 17.97380590951016, + -1.1793118453464206, + -734.970169262755 + ], + "yaw_deg": -119.11101808688004, + "pitch_deg": 10.756207017349817, + "source_stamp": "1ca3b84f6d35f7f355ec0f72dabd3b87a455ea02e5789fea611916962e5db8e5", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-0-1-0-lower-landing.jpg pixels=921600 mean_luma=111.426 stddev_luma=12.411 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "before-l151", + "view": "1-2-0-upper-landing", + "passage": "passage/1-2/0", + "side": "upper", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-upper-landing.jpg", + "camera_m": [ + 19.166015625, + -14.2001953125, + -731.8810546875 + ], + "target_m": [ + 10.35825176774404, + -16.050410390488395, + -733.216132282697 + ], + "yaw_deg": -101.86342177874246, + "pitch_deg": -8.437834550031965, + "source_stamp": "1ca3b84f6d35f7f355ec0f72dabd3b87a455ea02e5789fea611916962e5db8e5", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-upper-landing.jpg pixels=921600 mean_luma=117.134 stddev_luma=15.664 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "before-l151", + "view": "1-2-0-lower-landing", + "passage": "passage/1-2/0", + "side": "lower", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-lower-landing.jpg", + "camera_m": [ + 19.166015625, + -14.2001953125, + -753.05390625 + ], + "target_m": [ + 10.48848361510052, + -16.587754362485967, + -751.7193175939389 + ], + "yaw_deg": -105.38384894032598, + "pitch_deg": 8.434788863627224, + "source_stamp": "1ca3b84f6d35f7f355ec0f72dabd3b87a455ea02e5789fea611916962e5db8e5", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-1-2-0-lower-landing.jpg pixels=921600 mean_luma=119.710 stddev_luma=14.975 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "before-l151", + "view": "2-3-0-upper-landing", + "passage": "passage/2-3/0", + "side": "upper", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-upper-landing.jpg", + "camera_m": [ + -20.0625, + -5.068359375, + -812.075390625 + ], + "target_m": [ + -13.604954164712868, + -11.337338700629157, + -813.6662645746064 + ], + "yaw_deg": 134.15112141809087, + "pitch_deg": -10.024269857937275, + "source_stamp": "1ca3b84f6d35f7f355ec0f72dabd3b87a455ea02e5789fea611916962e5db8e5", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-upper-landing.jpg pixels=921600 mean_luma=118.198 stddev_luma=15.882 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "before-l151", + "view": "2-3-0-lower-landing", + "passage": "passage/2-3/0", + "side": "lower", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-lower-landing.jpg", + "camera_m": [ + -20.0625, + -5.068359375, + -900.0333984375 + ], + "target_m": [ + -14.865342978484083, + -12.416118141706198, + -898.4427583280197 + ], + "yaw_deg": 144.72777711381306, + "pitch_deg": 10.022826283920647, + "source_stamp": "1ca3b84f6d35f7f355ec0f72dabd3b87a455ea02e5789fea611916962e5db8e5", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/before-l151-2-3-0-lower-landing.jpg pixels=921600 mean_luma=121.734 stddev_luma=16.193 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "after-l156", + "view": "0-1-0-upper-landing", + "passage": "passage/0-1/0", + "side": "upper", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-0-1-0-upper-landing.jpg", + "camera_m": [ + 37.0, + -5.25, + -372.3810546875 + ], + "target_m": [ + 28.40474992442715, + -7.918646874047773, + -371.83751160914875 + ], + "yaw_deg": -107.24848481126237, + "pitch_deg": 3.4561048595792685, + "source_stamp": "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-0-1-0-upper-landing.jpg pixels=921600 mean_luma=117.423 stddev_luma=13.370 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "after-l156", + "view": "0-1-0-lower-landing", + "passage": "passage/0-1/0", + "side": "lower", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-0-1-0-lower-landing.jpg", + "camera_m": [ + 25.8369140625, + 3.19921875, + -736.6798828125 + ], + "target_m": [ + 17.97380590951016, + -1.1793118453464206, + -734.970169262755 + ], + "yaw_deg": -119.11101808688004, + "pitch_deg": 10.756207017349817, + "source_stamp": "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-0-1-0-lower-landing.jpg pixels=921600 mean_luma=111.621 stddev_luma=12.323 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "after-l156", + "view": "1-2-0-upper-landing", + "passage": "passage/1-2/0", + "side": "upper", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-1-2-0-upper-landing.jpg", + "camera_m": [ + 19.166015625, + -14.2001953125, + -731.8810546875 + ], + "target_m": [ + 10.35825176774404, + -16.050410390488395, + -733.216132282697 + ], + "yaw_deg": -101.86342177874246, + "pitch_deg": -8.437834550031965, + "source_stamp": "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-1-2-0-upper-landing.jpg pixels=921600 mean_luma=117.135 stddev_luma=15.664 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "after-l156", + "view": "1-2-0-lower-landing", + "passage": "passage/1-2/0", + "side": "lower", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-1-2-0-lower-landing.jpg", + "camera_m": [ + 19.166015625, + -14.2001953125, + -753.05390625 + ], + "target_m": [ + 10.48848361510052, + -16.587754362485967, + -751.7193175939389 + ], + "yaw_deg": -105.38384894032598, + "pitch_deg": 8.434788863627224, + "source_stamp": "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-1-2-0-lower-landing.jpg pixels=921600 mean_luma=119.962 stddev_luma=14.895 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "after-l156", + "view": "2-3-0-upper-landing", + "passage": "passage/2-3/0", + "side": "upper", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-upper-landing.jpg", + "camera_m": [ + -20.0625, + -5.068359375, + -812.075390625 + ], + "target_m": [ + -13.604954164712868, + -11.337338700629157, + -813.6662645746064 + ], + "yaw_deg": 134.15112141809087, + "pitch_deg": -10.024269857937275, + "source_stamp": "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-upper-landing.jpg pixels=921600 mean_luma=118.197 stddev_luma=15.883 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + }, + { + "version": "after-l156", + "view": "2-3-0-lower-landing", + "passage": "passage/2-3/0", + "side": "lower", + "file": "Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-lower-landing.jpg", + "camera_m": [ + -20.0625, + -5.068359375, + -900.0333984375 + ], + "target_m": [ + -14.865342978484083, + -12.416118141706198, + -898.4427583280197 + ], + "yaw_deg": 144.72777711381306, + "pitch_deg": 10.022826283920647, + "source_stamp": "4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0", + "pose_layout_identity": "resolved-layout-v3-fnv64:46a5ebaca9fef170", + "quality_status": "PASS", + "quality": "[CaptureQuality] image=/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/captures/after-l156-2-3-0-lower-landing.jpg pixels=921600 mean_luma=121.801 stddev_luma=16.169 coverage_luma_gt12=1.00000 thresholds=(stddev>=2.0,coverage>=0.001) status=PASS" + } +] diff --git a/Standalone/Research/WorldAssemblerM3/Linux156/l156-headroom-landing.patch b/Standalone/Research/WorldAssemblerM3/Linux156/l156-headroom-landing.patch new file mode 100644 index 0000000..28d706a --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux156/l156-headroom-landing.patch @@ -0,0 +1,841 @@ +diff --git a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +index 4799b9e..82bc9e1 100644 +--- a/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h ++++ b/Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h +@@ -512,7 +512,8 @@ namespace VoxelForgeCore + // boundary-blended host rock from widening the authored passage wall. + // v238 plans one resolved passage spline with explicit landing chambers. + // v239 plans their floor planes as the passage's continuous floor profile. +- inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 239; ++ // v240 treats SurfaceWorld landings as headroom above max(planned floor,native ground). ++ inline constexpr std::uint32_t WorldAssemblyEvaluatorVersion = 240; + + enum class FieldChannel : std::uint32_t + { +@@ -1212,8 +1213,9 @@ namespace VoxelForgeCore + + struct ResolvedLayoutPassageLandingChamberV1 + { +- // The chamber floor plane passes through this point. Gradient is dz/dx, +- // dz/dy in Q16 so the chamber continues the passage's authored h(s) grade. ++ // The planned chamber floor passes through this point. SurfaceWorld adds ++ // native ground where it lies within the clear-height envelope. Gradient is ++ // dz/dx,dy in Q16 and continues the passage's authored h(s) grade. + std::array floorCenterSubvoxels{}; + std::array floorGradientQ16{}; + std::int64_t radiusSubvoxels = 0; +@@ -2009,6 +2011,9 @@ namespace VoxelForgeCore + ShapeBuildStats buildStats() const; + + float densityAt(Vec3d voxelPosition) const; ++ // Deterministic native SurfaceWorld or receiving-route ground in Core voxels. ++ bool nativeSurfaceGroundHeightAt(Vec3d voxelPosition, ++ double& groundHeightVoxels) const; + // Companion material query for the bound strate evaluator; coordinates use Core voxels. + MaterialSampleV1 materialAt(Vec3d voxelPosition) const; + // Measure-only carve estimate. This does not apply an edit or grant inventory. +diff --git a/Standalone/Core/src/ResolvedLayoutInternal.h b/Standalone/Core/src/ResolvedLayoutInternal.h +index 7ea6c8c..c80b95d 100644 +--- a/Standalone/Core/src/ResolvedLayoutInternal.h ++++ b/Standalone/Core/src/ResolvedLayoutInternal.h +@@ -3993,6 +3993,72 @@ bool PlanResolvedLayoutPassagesV1(ResolvedLayoutSnapshotV3& layout,std::int32_t + reach/static_cast(qPerMetre)); + } + } ++ // Reserve each landing envelope inside its host band before building h(s). ++ // SurfaceWorld can raise its floor by at most the 4.5 m headroom allowance, ++ // so include that bounded rise as well as the grade reach and floor shell. ++ constexpr std::int64_t MaximumLandingGradeQ16=17560; ++ const std::int64_t landingRadius=mouthRadius+3*qPerMetre; ++ const std::int64_t landingClearHeight=static_cast( ++ std::llround(4.5*qPerMetre)); ++ const std::int64_t landingShell=static_cast( ++ std::llround(0.75*qPerMetre)); ++ const std::int64_t landingPlaneReach=(landingRadius ++ *MaximumLandingGradeQ16+65535)/65536; ++ const std::array upperMouthBeforeBandFit=upperMouth; ++ const std::array lowerMouthBeforeBandFit=lowerMouth; ++ const auto fitMouth=[&](std::array& mouth, ++ const ResolvedLayoutStratumV2& host,std::int64_t playerHeightQ, ++ const char* side) ++ { ++ if(!host.content.presentInCurrentField)return true; ++ const std::int64_t minimumFloor=contentZQ(host.content.bottomMicrometres) ++ +landingPlaneReach+landingShell; ++ const std::int64_t nativeFloorRise=host.generatorKind=="SurfaceWorld" ++ ?landingClearHeight:0; ++ const std::int64_t maximumFloor=contentZQ(host.content.topMicrometres) ++ -landingPlaneReach-landingShell-landingClearHeight-nativeFloorRise; ++ if(maximumFloor(qPerMetre)); ++ } ++ return true; ++ }; ++ if(!fitMouth(upperMouth,upper,upperPlayerCenterAboveFloorQ,"upper") ++ ||!fitMouth(lowerMouth,lower,playerCenterAboveFloorQ,"lower"))return false; ++ const auto bindFittedMouthAnchor=[&]( ++ const ResolvedLayoutStratumV2& host, ++ const std::array& before, ++ const std::array& after,const char* side) ++ { ++ if(before==after)return; ++ auto mutableHost=std::find_if(layout.strates.begin(),layout.strates.end(), ++ [&](const auto& stratum) ++ {return stratum.strateIndex==host.strateIndex;}); ++ if(mutableHost!=layout.strates.end()) ++ for(auto& anchor:mutableHost->anchors) ++ if((anchor.kind=="passage_arrival" ++ ||anchor.kind=="passage_departure") ++ &&anchor.values.size()>=3 ++ &&anchor.values[0]==after[0] ++ &&anchor.values[1]==after[1]) ++ { ++ anchor.values[2]=after[2]; ++ std::printf("[PassageLandingChamberArrivalBinding] id=%s side=%s anchor=%s status=PASS\n", ++ passage.stableId.c_str(),side,anchor.stableId.c_str()); ++ break; ++ } ++ }; ++ bindFittedMouthAnchor(upper,upperMouthBeforeBandFit,upperMouth,"upper"); ++ bindFittedMouthAnchor(lower,lowerMouthBeforeBandFit,lowerMouth,"lower"); + if(!radialWithin(upperMouth,placementRadius)||!radialWithin(lowerMouth,placementRadius)) + {error=passage.stableId+" route mouth is outside the resolved PassageConfig.DistanceMax radius";return false;} + passage.upperMouthSubvoxels=upperMouth;passage.lowerMouthSubvoxels=lowerMouth; +@@ -5048,6 +5114,91 @@ bool PlanResolvedLayoutPassagesV1(ResolvedLayoutSnapshotV3& layout,std::int32_t + surfaceHorizontalSquared)}; + } + } ++ if(host.generatorKind=="FloatingIslands"&&side[0]=='u') ++ { ++ // The island route is authored as player-center heights. Keep ++ // the chamber center bound to passage h(s), while selecting the ++ // closest grade plane that leaves the audited lower capsule arc ++ // above every receiving route point under the chamber footprint. ++ const auto route=routePoints(host); ++ const std::int64_t routeRadius=chamber.radiusSubvoxels ++ +static_cast(std::llround(0.34*qPerMetre)); ++ const std::int64_t routeRadiusSquared=routeRadius*routeRadius; ++ const std::int64_t footClearanceQ=static_cast( ++ std::llround((0.84+0.025)*qPerMetre)); ++ struct FRouteFloorConstraint ++ { ++ std::int64_t dx=0,dy=0,maximumRiseQ16=0; ++ }; ++ std::vector constraints; ++ constraints.reserve(route.size()); ++ for(const auto& point:route) ++ { ++ const auto dx=static_cast(std::llround( ++ point[0]-chamber.floorCenterSubvoxels[0])); ++ const auto dy=static_cast(std::llround( ++ point[1]-chamber.floorCenterSubvoxels[1])); ++ if(dx*dx+dy*dy>routeRadiusSquared)continue; ++ const auto routeFloorMaximum=static_cast( ++ std::llround(point[2]))-footClearanceQ; ++ constraints.push_back({dx,dy, ++ (routeFloorMaximum-chamber.floorCenterSubvoxels[2])*65536}); ++ } ++ const auto originalGradient=chamber.floorGradientQ16; ++ for(std::size_t pass=0;pass<256&&!constraints.empty();++pass) ++ { ++ bool adjusted=false; ++ for(const auto& constraint:constraints) ++ { ++ const std::int64_t distanceSquared=constraint.dx*constraint.dx ++ +constraint.dy*constraint.dy; ++ if(distanceSquared<=0)continue; ++ const std::int64_t rise= ++ static_cast(chamber.floorGradientQ16[0]) ++ *constraint.dx ++ +static_cast(chamber.floorGradientQ16[1]) ++ *constraint.dy; ++ const std::int64_t excess=rise-constraint.maximumRiseQ16; ++ if(excess<=0)continue; ++ const auto correction=[&](std::int64_t delta) ++ { ++ if(delta==0)return std::int64_t{0}; ++ const std::uint64_t product=static_cast(excess) ++ *static_cast(std::abs(delta)); ++ return static_cast((product ++ +static_cast(distanceSquared)-1) ++ /static_cast(distanceSquared)); ++ }; ++ const auto correctionX=correction(constraint.dx); ++ const auto correctionY=correction(constraint.dy); ++ chamber.floorGradientQ16[0]-=static_cast( ++ constraint.dx<0?-correctionX:correctionX); ++ chamber.floorGradientQ16[1]-=static_cast( ++ constraint.dy<0?-correctionY:correctionY); ++ adjusted|=correctionX!=0||correctionY!=0; ++ } ++ if(!adjusted)break; ++ } ++ for(const auto& constraint:constraints) ++ { ++ const std::int64_t rise= ++ static_cast(chamber.floorGradientQ16[0]) ++ *constraint.dx ++ +static_cast(chamber.floorGradientQ16[1]) ++ *constraint.dy; ++ if(rise>constraint.maximumRiseQ16) ++ {error=passage.stableId ++ +" upper landing floor cannot clear its receiving FloatingIslands route"; ++ return false;} ++ } ++ if(chamber.floorGradientQ16!=originalGradient) ++ std::printf("[PassageLandingChamberRouteFit] id=%s side=upper host=FloatingIslands route_points=%zu fitted_constraints=%zu source_gradient_q16=(%lld,%lld) fitted_gradient_q16=(%lld,%lld) foot_clearance_m=0.865 max_grade_deg=15.000 status=PASS\n", ++ passage.stableId.c_str(),route.size(),constraints.size(), ++ static_cast(originalGradient[0]), ++ static_cast(originalGradient[1]), ++ static_cast(chamber.floorGradientQ16[0]), ++ static_cast(chamber.floorGradientQ16[1])); ++ } + const std::uint64_t gradientSquared=static_cast( + chamber.floorGradientQ16[0]*chamber.floorGradientQ16[0] + +chamber.floorGradientQ16[1]*chamber.floorGradientQ16[1]); +diff --git a/Standalone/Core/src/ShapeWorldInternal.h b/Standalone/Core/src/ShapeWorldInternal.h +index 6b1a6af..c20b0ce 100644 +--- a/Standalone/Core/src/ShapeWorldInternal.h ++++ b/Standalone/Core/src/ShapeWorldInternal.h +@@ -1280,11 +1280,32 @@ public: + double unionDistance=std::numeric_limits::infinity(); + double unionShellDistance=std::numeric_limits::infinity(); + double unionFloorShellDistance=std::numeric_limits::infinity(); ++ double unionLandingChamberDistance=std::numeric_limits::infinity(); + double unionLandingChamberFloorShellDistance= + std::numeric_limits::infinity(); + double plannedTunnelPassageShellDistance=std::numeric_limits::infinity(); + const std::uint32_t reliefSeed=static_cast(Owner?Owner->Seed:0); + const auto* queryStratum=FindBoundStratumForManagerZ(Z); ++ const auto effectiveLandingFloor=[&]( ++ const VoxelForgeCore::ResolvedLayoutPassageLandingChamberV1& chamber, ++ double plannedFloorZ,double sampleXSubvoxels,double sampleYSubvoxels) ++ { ++ if(!std::isfinite(sampleXSubvoxels)||!std::isfinite(sampleYSubvoxels)) ++ return plannedFloorZ; ++ double nativeGroundCoreVoxels=0.0; ++ if(!GetNativeSurfaceGroundHeightAt( ++ static_cast(sampleXSubvoxels/Q), ++ static_cast(sampleYSubvoxels/Q), ++ static_cast(plannedFloorZ/Q),nativeGroundCoreVoxels)) ++ return plannedFloorZ; ++ const double clearHeight=static_cast( ++ chamber.clearHeightSubvoxels); ++ const double nativeFloor=nativeGroundCoreVoxels*Q; ++ // A native surface above the chamber's clear-height budget denotes a ++ // different layer surface, not a landing floor to clear from this room. ++ return nativeFloor>plannedFloorZ&&nativeFloor<=plannedFloorZ+clearHeight ++ ?nativeFloor:plannedFloorZ; ++ }; + const bool plannedTunnelStratum=queryStratum&&queryStratum->Resolved + &&(queryStratum->Resolved->generatorKind=="TunnelNetwork" + ||queryStratum->Resolved->generatorKind=="VerticalShafts") +@@ -1339,10 +1360,12 @@ public: + landingChamber->floorCenterSubvoxels[0]); + const double centerY=static_cast( + landingChamber->floorCenterSubvoxels[1]); +- const double floorCenterZ=static_cast( ++ const double plannedFloorCenterZ=static_cast( + landingChamber->floorCenterSubvoxels[2]) + +(landingChamber->floorGradientQ16[0]*(qx-centerX) + +landingChamber->floorGradientQ16[1]*(qy-centerY))/65536.0; ++ const double floorCenterZ=effectiveLandingFloor(*landingChamber, ++ plannedFloorCenterZ,qx,qy); + const double radialDistance=DeterministicSqrt( + (qx-centerX)*(qx-centerX)+(qy-centerY)*(qy-centerY)) + -landingChamber->radiusSubvoxels; +@@ -1357,6 +1380,8 @@ public: + std::max(-floorDistance,floorDistance-shellThickness), + radialDistance); + unionDistance=std::min(unionDistance,chamberDistance); ++ unionLandingChamberDistance=std::min(unionLandingChamberDistance, ++ chamberDistance); + unionShellDistance=std::min(unionShellDistance,chamberShellDistance); + unionFloorShellDistance=std::min(unionFloorShellDistance, + chamberFloorShellDistance); +@@ -1746,15 +1771,18 @@ public: + departureTailDistance) + ||nearRouteSegment(*lastTwo,*last,PortalWalkLeadMetres,true,0.0); + }; +- const auto connectedSurfaceLandingShellContains=[&]() ++ const auto connectedNativeLandingShellContains=[&]() + { + if(!queryStratum||!queryStratum->Resolved +- ||queryStratum->Resolved->generatorKind!="SurfaceWorld")return false; ++ ||(queryStratum->Resolved->generatorKind!="SurfaceWorld" ++ &&queryStratum->Resolved->generatorKind!="FloatingIslands")) ++ return false; + const double queryX=qx/qPerMetre,queryY=qy/qPerMetre,queryZ=qz/qPerMetre; + constexpr double ChamberShellThicknessMetres=0.75; + constexpr double RouteClearanceMetres=1.25; + constexpr double RouteHeightClearanceMetres=1.5; +- constexpr double PortalWalkLeadMetres=9.0; ++ const double portalWalkLeadMetres= ++ queryStratum->Resolved->generatorKind=="FloatingIslands"?12.0:9.0; + for(const auto& passage:ResolvedLayout->passages) + { + if(passage.upperStrateIndex!=queryStratum->StrateIndex)continue; +@@ -1762,9 +1790,13 @@ public: + if(chamber.radiusSubvoxels<=0||chamber.clearHeightSubvoxels<=0)continue; + const double cx=static_cast(chamber.floorCenterSubvoxels[0])/qPerMetre; + const double cy=static_cast(chamber.floorCenterSubvoxels[1])/qPerMetre; +- const double floorZ=static_cast(chamber.floorCenterSubvoxels[2])/qPerMetre ++ const double plannedFloorZ=static_cast( ++ chamber.floorCenterSubvoxels[2])/qPerMetre + +chamber.floorGradientQ16[0]/65536.0*(queryX-cx) + +chamber.floorGradientQ16[1]/65536.0*(queryY-cy); ++ const double floorZ=effectiveLandingFloor(chamber, ++ plannedFloorZ*qPerMetre,queryX*qPerMetre, ++ queryY*qPerMetre)/qPerMetre; + const double radialDistance=std::hypot(queryX-cx,queryY-cy) + -static_cast(chamber.radiusSubvoxels)/qPerMetre; + const double floorDistance=floorZ-queryZ; +@@ -1784,7 +1816,11 @@ public: + const double mouthZ=static_cast(passage.upperMouthSubvoxels[2]) + /qPerMetre; + std::size_t endpoint=route.size(); +- double endpointDistanceSquared=1.0; ++ const double endpointRadius= ++ queryStratum->Resolved->generatorKind=="FloatingIslands"?3.0:1.0; ++ const double endpointHeight= ++ queryStratum->Resolved->generatorKind=="FloatingIslands"?2.0:1.5; ++ double endpointDistanceSquared=endpointRadius*endpointRadius; + for(std::size_t index=0;indexvalues[0]/qPerMetre; +@@ -1793,7 +1829,7 @@ public: + const double dx=x-cx,dy=y-cy; + const double distanceSquared=dx*dx+dy*dy; + if(distanceSquaredPortalWalkLeadMetres)continue; ++ if(alongFromEndpoint>portalWalkLeadMetres)continue; + const double routeX=ax+t*dx,routeY=ay+t*dy; + const double routeZ=az+t*(b.values[2]-a.values[2])/qPerMetre; +- if(std::hypot(queryX-routeX,queryY-routeY)<=RouteClearanceMetres +- &&std::abs(queryZ-routeZ)<=RouteHeightClearanceMetres)return true; ++ const double lateral=std::hypot(queryX-routeX,queryY-routeY); ++ const double vertical=std::abs(queryZ-routeZ); ++ if(lateral<=RouteClearanceMetres ++ &&vertical<=RouteHeightClearanceMetres)return true; + } + } + return false; +@@ -1887,13 +1925,19 @@ public: + } + if(nativeFloorSupport!=std::numeric_limits::lowest() + &&nativeFloorSupport<0.0f) ++ { ++ // Host floor support keeps solid ground under a landing chamber, but it ++ // cannot refill the chamber air above the selected planned/native floor. ++ if(unionLandingChamberDistance<=0.0) ++ return passageAirDistance; + return std::min(nativeFloorSupport,unionDistance<=0.0 + ?passageAirDistance:density); ++ } + if(nativeTunnelFieldDensity!=std::numeric_limits::lowest()) + return std::max(density,passageAirDistance); + if(unionDistance>0.0&&unionShellDistance<0.0&&density>=0.0f) + { +- if(connectedSurfaceLandingShellContains()) ++ if(connectedNativeLandingShellContains()) + return std::max(density,passageAirDistance); + return static_cast(unionShellDistance/Q); + } +@@ -2044,11 +2088,12 @@ public: + static_cast(chamber.floorGradientQ16[0])/65536.0, + static_cast(chamber.floorGradientQ16[1])/65536.0); + const double extent=reachCoreVoxels+0.01; ++ const double clearHeight=static_cast( ++ chamber.clearHeightSubvoxels)/Q; + const double low[3]={cx-radius-extent,cy-radius-extent, + cz-floorExtent-extent}; + const double high[3]={cx+radius+extent,cy+radius+extent, +- cz+floorExtent+static_cast( +- chamber.clearHeightSubvoxels)/Q+extent}; ++ cz+floorExtent+2.0*clearHeight+extent}; + return overlaps(low,high); + }; + if(chamberOverlaps(passage.upperLandingChamber) +@@ -5488,7 +5533,7 @@ private: + cx-radius-extent,cy-radius-extent,cz-floorExtent-extent}; + const std::array maximum{ + cx+radius+extent,cy+radius+extent, +- cz+floorExtent+height+extent}; ++ cz+floorExtent+2.0*height+extent}; + FPassageProofBound proof; + for(std::size_t axis=0;axis<3;++axis) + { +@@ -5859,6 +5904,71 @@ public: + return std::isfinite(OutGroundZ)&&std::isfinite(OutCeilingZ); + } + ++ bool GetNativeSurfaceGroundHeightAt(float X,float Y,float Z, ++ double& OutGroundZ) const ++ { ++ if(!ResolvedLayout||!std::isfinite(X)||!std::isfinite(Y)||!std::isfinite(Z)) ++ return false; ++ const auto* bound=FindBoundStratumForManagerZ(Z); ++ if(!bound)return false; ++ constexpr double Scale=static_cast( ++ VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel); ++ const double maxVoxel=static_cast(std::numeric_limits::max())/Scale; ++ if(std::abs(static_cast(X))>maxVoxel ++ ||std::abs(static_cast(Y))>maxVoxel)return false; ++ const auto toFixed=[](float value) ++ {return static_cast(std::llround(static_cast(value) ++ *VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel));}; ++ const auto* field=std::get_if(&bound->Evaluator); ++ if(field&&field->Evaluator.isValid()) ++ { ++ const auto column=field->Evaluator.point(toFixed(X),toFixed(Y),0); ++ OutGroundZ=static_cast(column.groundHeightSubvoxels)/Scale; ++ return std::isfinite(OutGroundZ); ++ } ++ const auto* islands=std::get_if(&bound->Evaluator); ++ if(!islands||!bound->IslandPlan)return false; ++ const auto& route=bound->IslandPlan->manifest.plan.route; ++ if(route.size()<2)return false; ++ const auto& recipe=bound->IslandPlan->manifest.recipe; ++ const std::int64_t routeLift=recipe.routeConstraints.capsuleHeightSubvoxels/2 ++ +recipe.routeConstraints.minimumClearanceSubvoxels ++ +(recipe.geometryVersion>=2 ++ ?VoxelForgeCore::WorldAssemblySubvoxelsPerVoxel/8:0); ++ const std::int64_t supportRadius=recipe.routeConstraints ++ .supportProbeRadiusSubvoxels; ++ if(routeLift<0||supportRadius<0)return false; ++ const std::int64_t queryX=toFixed(X),queryY=toFixed(Y); ++ std::uint64_t nearestDistanceSquared=std::numeric_limits::max(); ++ std::int64_t nearestRouteZ=0; ++ bool found=false; ++ for(std::size_t index=1;index( ++ offsetX*offsetX+offsetY*offsetY); ++ if(distanceSquared>static_cast(supportRadius)*supportRadius ++ ||distanceSquared>=nearestDistanceSquared)continue; ++ const std::int64_t dz=b[2]-a[2]; ++ nearestRouteZ=a[2]+dz*projection/lengthSquared; ++ nearestDistanceSquared=distanceSquared; ++ found=true; ++ } ++ if(!found)return false; ++ OutGroundZ=static_cast(nearestRouteZ-routeLift)/Scale; ++ return std::isfinite(OutGroundZ); ++ } ++ + EVoxelTileClass ClassifyBox(const FIntVector& Origin,int32 Step,int32 Cells) const + { return ClassifyBoxDetailed(Origin,Step,Cells).Verdict; } + +diff --git a/Standalone/Core/src/VoxelForgeCore.cpp b/Standalone/Core/src/VoxelForgeCore.cpp +index b139ec4..e40250c 100644 +--- a/Standalone/Core/src/VoxelForgeCore.cpp ++++ b/Standalone/Core/src/VoxelForgeCore.cpp +@@ -1811,6 +1811,13 @@ namespace VoxelForgeCore + + float World::densityAt(Vec3d position) const + { return impl_&&impl_->shapeReady.load(std::memory_order_acquire)&&impl_->shape?impl_->shape->DensityAt(static_cast(position.x),static_cast(position.y),static_cast(position.z)):0.0f; } ++ bool World::nativeSurfaceGroundHeightAt(Vec3d position,double& groundHeightVoxels) const ++ { ++ return impl_&&impl_->shapeReady.load(std::memory_order_acquire)&&impl_->shape ++ &&impl_->shape->GetNativeSurfaceGroundHeightAt(static_cast(position.x), ++ static_cast(position.y),static_cast(position.z), ++ groundHeightVoxels); ++ } + MaterialSampleV1 World::materialAt(Vec3d position) const + { + if(!impl_||!impl_->shapeReady.load(std::memory_order_acquire)||!impl_->shape) +diff --git a/Standalone/Source/StreamBenchmarkPipeline.h b/Standalone/Source/StreamBenchmarkPipeline.h +index 2fcf4b5..3ed4dd1 100644 +--- a/Standalone/Source/StreamBenchmarkPipeline.h ++++ b/Standalone/Source/StreamBenchmarkPipeline.h +@@ -3051,7 +3051,8 @@ namespace StandaloneStreamBenchmark + double supportMaximumMetres,std::uint32_t minimumSupportProbes, + double supportProbeRadiusMetres, + const std::function& supportExemption={}, +- const std::function& passageInteriorPredicate={}) ++ const std::function& passageInteriorPredicate={}, ++ const std::function& densityOverride={}) + { + FWalkAudit audit; + if(path.size()<2)return audit; +@@ -3068,15 +3069,18 @@ namespace StandaloneStreamBenchmark + &&passageInteriorPredicate(xMetres,yMetres,zMetres); + if(inPassageInterior)++audit.passageInteriorCapsuleSamples; + const VoxelForgeCore::Vec3d position{xMetres/coreMetres,yMetres/coreMetres,zMetres/coreMetres}; +- const float density=Field.densityAt(position); ++ const float density=densityOverride ++ ?densityOverride(position):Field.densityAt(position); + if(density<0.0f) + { + if(inPassageInterior)++audit.passageInteriorSolidSamples; + if(audit.firstBlockedCount::max(), + std::size_t ignoredSegment=std::numeric_limits::max(), +- std::size_t selectedPassage=std::numeric_limits::max()) ++ std::size_t selectedPassage=std::numeric_limits::max(), ++ bool includeLandingChambers=true) + { + constexpr double CornerBlendMetres=0.50; + constexpr double WallReliefMetres=0.21; +@@ -3748,8 +3761,9 @@ namespace StandaloneStreamBenchmark + +qToMetres(chamber.clearHeightSubvoxels)); + return std::max({radialDistance,floorDistance,ceilingDistance})<=0.0; + }; +- if(inLandingChamber(passage.upperLandingChamber) +- ||inLandingChamber(passage.lowerLandingChamber))return true; ++ if(includeLandingChambers ++ &&(inLandingChamber(passage.upperLandingChamber) ++ ||inLandingChamber(passage.lowerLandingChamber)))return true; + const auto& route=allPassageSmoothRoutes[passageIndex]; + if(route.size()<2)continue; + double bestRoundDistance=std::numeric_limits::infinity(); +@@ -4722,7 +4736,13 @@ namespace StandaloneStreamBenchmark + const double mouthZ=qToMetres(upper?passage.upperMouthSubvoxels[2] + :passage.lowerMouthSubvoxels[2]); + std::size_t endpoint=route.size(); +- double endpointDistanceSquared=1.0; ++ const double endpointRadius=stratum->generatorKind=="FloatingIslands" ++ ?3.0:1.0; ++ const double endpointHeight=stratum->generatorKind=="FloatingIslands" ++ ?2.0:1.5; ++ const double portalWalkLead=stratum->generatorKind=="FloatingIslands" ++ ?12.0:9.0; ++ double endpointDistanceSquared=endpointRadius*endpointRadius; + for(std::size_t index=0;indexvalues[0])-cx; +@@ -4730,7 +4750,7 @@ namespace StandaloneStreamBenchmark + const double z=qToMetres(route[index]->values[2]); + const double distanceSquared=dx*dx+dy*dy; + if(distanceSquared9.0)continue; ++ if(fromEndpoint>portalWalkLead)continue; + const double routeX=ax+t*dx,routeY=ay+t*dy; + const double routeZ=az+t*qToMetres(b.values[2]-a.values[2]); + const double lateralDistance=std::hypot(xMetres-routeX, +@@ -5167,6 +5187,21 @@ namespace StandaloneStreamBenchmark + const double radius=qToMetres(chamber.radiusSubvoxels); + const double gx=chamber.floorGradientQ16[0]/65536.0; + const double gy=chamber.floorGradientQ16[1]/65536.0; ++ const auto floorAt=[&](double x,double y) ++ { ++ const double planned=baseFloorZ+gx*(x-centerX)+gy*(y-centerY); ++ double nativeGroundVoxels=0.0; ++ if(Field.nativeSurfaceGroundHeightAt({x/coreMetres,y/coreMetres, ++ planned/coreMetres},nativeGroundVoxels)) ++ { ++ const double nativeGround=nativeGroundVoxels*coreMetres; ++ const double clearHeight=qToMetres( ++ chamber.clearHeightSubvoxels); ++ if(nativeGround>planned&&nativeGround<=planned+clearHeight) ++ return nativeGround; ++ } ++ return planned; ++ }; + for(const double radial:chamberFloorRadii) + { + if(radial>=radius-1.0)continue; +@@ -5177,16 +5212,18 @@ namespace StandaloneStreamBenchmark + *static_cast(angleIndex)/ChamberAngularSamples; + const double sampleX=centerX+radial*std::cos(angle); + const double sampleY=centerY+radial*std::sin(angle); +- const double floorZ=baseFloorZ+gx*(sampleX-centerX) +- +gy*(sampleY-centerY); ++ const double floorZ=floorAt(sampleX,sampleY); + for(const double depth:PassageShellAuditDepthsMetres) + { + const double sampleZ=floorZ-depth; + const VoxelForgeCore::Vec3d position{sampleX/coreMetres, + sampleY/coreMetres,sampleZ/coreMetres}; + if(Native.densityAt(position)<0.0f)continue; +- if(landingChamberConnectionContains(passage,upper, +- sampleX,sampleY,sampleZ)) ++ if(passageInteriorWinsAt(sampleX,sampleY,sampleZ, ++ std::numeric_limits::max(), ++ std::numeric_limits::max(),passageIndex) ++ ||landingChamberConnectionContains(passage,upper, ++ sampleX,sampleY,sampleZ)) + {++audit.chamberConnectionSkips;continue;} + ++audit.chamberFloorSamples; + const float density=Field.densityAt(position); +@@ -5211,8 +5248,7 @@ namespace StandaloneStreamBenchmark + { + const double sampleX=centerX+(radius+depth)*nx; + const double sampleY=centerY+(radius+depth)*ny; +- const double floorZ=baseFloorZ+gx*(sampleX-centerX) +- +gy*(sampleY-centerY); ++ const double floorZ=floorAt(sampleX,sampleY); + const double sampleZ=floorZ+height; + const VoxelForgeCore::Vec3d position{sampleX/coreMetres, + sampleY/coreMetres,sampleZ/coreMetres}; +@@ -5275,6 +5311,25 @@ namespace StandaloneStreamBenchmark + {return passageInteriorWinsAt(x,y,z, + std::numeric_limits::max(), + std::numeric_limits::max(),passageIndex);}; ++ const auto floorAt=[&](double x,double y) ++ { ++ const double planned=centerZ+gx*(x-centerX)+gy*(y-centerY); ++ double nativeGroundVoxels=0.0; ++ if(field.nativeSurfaceGroundHeightAt({x/coreMetres,y/coreMetres, ++ planned/coreMetres},nativeGroundVoxels)) ++ { ++ const double nativeGround=nativeGroundVoxels*coreMetres; ++ const double clearHeight=qToMetres(chamber.clearHeightSubvoxels); ++ if(nativeGround>planned&&nativeGround<=planned+clearHeight) ++ return nativeGround; ++ } ++ return planned; ++ }; ++ const std::function supportExemption= ++ [&](double x,double y,double z) ++ {return passageInteriorWinsAt(x,y,z, ++ std::numeric_limits::max(), ++ std::numeric_limits::max(),passageIndex,false);}; + for(const auto& direction:directions) + { + std::vector> chamberPath; +@@ -5286,12 +5341,12 @@ namespace StandaloneStreamBenchmark + const double distance=radius*step/intervals; + const double x=centerX+direction[0]*distance; + const double y=centerY+direction[1]*distance; +- const double floorZ=centerZ+gx*(x-centerX)+gy*(y-centerY); ++ const double floorZ=floorAt(x,y); + chamberPath.push_back({x/coreMetres,y/coreMetres, + (floorZ+1.13)/coreMetres}); + } + const FWalkAudit part=auditPlayerPath(field,chamberPath, +- 0.125,0.125,1.125,3,0.45,{},interiorPredicate); ++ 0.125,0.125,1.125,3,0.45,supportExemption,interiorPredicate); + total.segments+=part.segments;total.centers+=part.centers; + total.capsuleSamples+=part.capsuleSamples; + total.blocked+=part.blocked; +@@ -5305,10 +5360,116 @@ namespace StandaloneStreamBenchmark + } + return total; + }; ++ const auto auditOpenChamberFloorNegativeControl=[&]( ++ const VoxelForgeCore::World& field, ++ const VoxelForgeCore::ResolvedLayoutPassageV1& passage, ++ std::size_t passageIndex,bool upper) ++ { ++ const auto& chamber=upper?passage.upperLandingChamber ++ :passage.lowerLandingChamber; ++ const double centerX=qToMetres(chamber.floorCenterSubvoxels[0]); ++ const double centerY=qToMetres(chamber.floorCenterSubvoxels[1]); ++ const double centerZ=qToMetres(chamber.floorCenterSubvoxels[2]); ++ const double gx=chamber.floorGradientQ16[0]/65536.0; ++ const double gy=chamber.floorGradientQ16[1]/65536.0; ++ const double chamberAuditRadius=std::min(5.75, ++ qToMetres(chamber.radiusSubvoxels)-1.5); ++ const double mouthRadius=qToMetres(passage.mouthRadiusSubvoxels); ++ const double radius=std::min(chamberAuditRadius-0.1,mouthRadius+1.25); ++ if(radius<=0.0) ++ { ++ std::printf("[PassageLandingChamberOpenFloorNegativeControl] id=%s side=%s radius_m=%.3f mouth_radius_m=%.3f unsupported=0 support_overlap_skips=0 expected=FAIL status=FAIL reason=no_outer_floor_sample\n", ++ passage.stableId.c_str(),upper?"upper":"lower",radius,mouthRadius); ++ return false; ++ } ++ const auto floorAt=[&](double x,double y) ++ { ++ const double planned=centerZ+gx*(x-centerX)+gy*(y-centerY); ++ double nativeGroundVoxels=0.0; ++ if(field.nativeSurfaceGroundHeightAt({x/coreMetres,y/coreMetres, ++ planned/coreMetres},nativeGroundVoxels)) ++ { ++ const double nativeGround=nativeGroundVoxels*coreMetres; ++ const double clearHeight=qToMetres(chamber.clearHeightSubvoxels); ++ if(nativeGround>planned&&nativeGround<=planned+clearHeight) ++ return nativeGround; ++ } ++ return planned; ++ }; ++ const std::function interiorPredicate= ++ [&](double x,double y,double z) ++ {return passageInteriorWinsAt(x,y,z, ++ std::numeric_limits::max(), ++ std::numeric_limits::max(),passageIndex);}; ++ const std::function supportExemption= ++ [&](double x,double y,double z) ++ {return passageInteriorWinsAt(x,y,z, ++ std::numeric_limits::max(), ++ std::numeric_limits::max(),passageIndex,false);}; ++ constexpr std::array,5> supportOffsets{{ ++ {{0.0,0.0}},{{0.45,0.0}},{{-0.45,0.0}}, ++ {{0.0,0.45}},{{0.0,-0.45}}}}; ++ std::vector> path; ++ double selectedAngle=0.0; ++ bool foundOutsideBore=false; ++ for(std::size_t directionIndex=0;directionIndex<32&&!foundOutsideBore; ++ ++directionIndex) ++ { ++ selectedAngle=2.0*3.14159265358979323846 ++ *static_cast(directionIndex)/32.0; ++ const double nx=std::cos(selectedAngle),ny=std::sin(selectedAngle); ++ const double tangentX=-ny,tangentY=nx; ++ const double x0=centerX+radius*nx-0.25*tangentX; ++ const double y0=centerY+radius*ny-0.25*tangentY; ++ const double x1=centerX+radius*nx+0.25*tangentX; ++ const double y1=centerY+radius*ny+0.25*tangentY; ++ const double floor0=floorAt(x0,y0),floor1=floorAt(x1,y1); ++ const std::array,2> candidate{{ ++ {{x0,y0,floor0+1.13}},{{x1,y1,floor1+1.13}}}}; ++ bool samplesOutsideBore=true; ++ for(const auto& point:candidate) ++ { ++ const double supportZ=point[2]-0.88-0.125; ++ for(const auto& offset:supportOffsets) ++ if(supportExemption(point[0]+offset[0], ++ point[1]+offset[1],supportZ)) ++ {samplesOutsideBore=false;break;} ++ if(!samplesOutsideBore)break; ++ } ++ if(samplesOutsideBore) ++ { ++ path={{candidate[0][0]/coreMetres,candidate[0][1]/coreMetres, ++ candidate[0][2]/coreMetres}, ++ {candidate[1][0]/coreMetres,candidate[1][1]/coreMetres, ++ candidate[1][2]/coreMetres}}; ++ foundOutsideBore=true; ++ } ++ } ++ if(!foundOutsideBore) ++ { ++ std::printf("[PassageLandingChamberOpenFloorNegativeControl] id=%s side=%s radius_m=%.3f mouth_radius_m=%.3f unsupported=0 support_overlap_skips=0 expected=FAIL status=FAIL reason=no_bore_clear_spoke\n", ++ passage.stableId.c_str(),upper?"upper":"lower",radius,mouthRadius); ++ return false; ++ } ++ const std::function openDensity= ++ [](VoxelForgeCore::Vec3d){return 1.0f;}; ++ const FWalkAudit control=auditPlayerPath(field,path,0.125,0.125, ++ 1.125,3,0.45,supportExemption,interiorPredicate,openDensity); ++ const bool passed=!control.passed&&control.unsupported>0 ++ &&control.supportOverlapSkips==0; ++ std::printf("[PassageLandingChamberOpenFloorNegativeControl] id=%s side=%s radius_m=%.3f mouth_radius_m=%.3f angle_deg=%.1f unsupported=%llu support_overlap_skips=%llu result=%s expected=FAIL status=%s\n", ++ passage.stableId.c_str(),upper?"upper":"lower",radius,mouthRadius, ++ selectedAngle*180.0/3.14159265358979323846, ++ static_cast(control.unsupported), ++ static_cast(control.supportOverlapSkips), ++ control.passed?"PASS":"FAIL",passed?"PASS":"FAIL"); ++ return passed; ++ }; + std::uint64_t passageCount=0,passagePasses=0,blockedControls=0,naturalPasses=0; + std::uint64_t passageInteriorCapsuleSamples=0,passageInteriorSolidSamples=0; + std::uint64_t passageInteriorControls=0; + std::uint64_t landingChamberCount=0,landingChamberNegativeControls=0; ++ std::uint64_t openChamberFloorNegativeControls=0; + std::uint64_t mouthProfilePasses=0,ripplePasses=0,rippleControlsDetected=0; + std::uint64_t floorRippleControlsDetected=0,floorStepRippleControlsDetected=0; + std::uint64_t shellAudits=0,shellFloorSamples=0,shellFloorViolations=0; +@@ -5346,6 +5507,9 @@ namespace StandaloneStreamBenchmark + passage,passageIndex,true); + const FWalkAudit lowerChamberAudit=auditLandingChamber(Shape, + passage,passageIndex,false); ++ const bool openChamberFloorControl=auditOpenChamberFloorNegativeControl( ++ Shape,passage,passageIndex,true); ++ openChamberFloorNegativeControls+=openChamberFloorControl; + const bool landingChambersWalkable=upperChamberAudit.passed + &&lowerChamberAudit.passed; + const bool passageInteriorAirPassed= +@@ -5889,6 +6053,10 @@ namespace StandaloneStreamBenchmark + static_cast(landingChamberCount), + static_cast(landingChamberCount + -landingChamberNegativeControls)); ++ std::printf("[PassageLandingChamberOpenFloorNegativeControlSummary] expected_fail_detected=%llu/%llu status=%s\n", ++ static_cast(openChamberFloorNegativeControls), ++ static_cast(passageCount), ++ openChamberFloorNegativeControls==passageCount?"PASS":"FAIL"); + const bool shellAuditPassed=shellAudits==passageCount + &&shellFloorViolations==0&&shellWallViolations==0 + &&shellChamberFloorViolations==0&&shellChamberWallViolations==0 +@@ -5939,6 +6107,7 @@ namespace StandaloneStreamBenchmark + &&mouthProfilePasses==passageCount&&l23TerraceControlDetected + &&ripplePasses==passageCount + &&shellAuditPassed ++ &&openChamberFloorNegativeControls==passageCount + &&routePasses>0&&routePasses==routeWalkPasses&&routePasses==routeBindings + &&routeBindingFailures==0 + &&tunnelNetworkRoutes==tunnelNetworkBlockedControls