From 472d16936d8129e9a79f69951a6faedc0bf2855b Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 00:11:31 +0200 Subject: [PATCH 01/24] Add tiling QC metric for detecting tile-boundary segmentation artifacts Cells segmented in tiles get cut at tile borders, producing fragments with artificially straight edges. This adds: - `sq.experimental.tl.calculate_tiling_qc`: per-cell scoring via collinearity-based straight-edge detection (max_straight_edge_ratio, cardinal_alignment_score, cut_score). Scores stored in .obs of a QC AnnData table linked to the labels element via spatialdata_attrs. Algorithm parameters recorded in .uns["tiling_qc"]. - `sq.experimental.pl.tiling_qc`: diagnostic plot via spatialdata-plot (renders labels coloured by score; tile grid emerges from the data). - Cell-aware tiling infrastructure (_tiling.py) for scalable labels-only tile extraction without materialising full arrays. - Test fixture with 400x400 dask-backed ellipsoid cells cut by a 3x3 tile grid, with ground-truth cut/intact classification. - 35 tests (unit, integration, visual regression). Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/__init__.py | 4 +- src/squidpy/experimental/im/_tiling.py | 429 ++++++++++++++++ src/squidpy/experimental/pl/__init__.py | 3 +- src/squidpy/experimental/pl/_tiling_qc.py | 75 +++ src/squidpy/experimental/tl/__init__.py | 5 + src/squidpy/experimental/tl/_tiling_qc.py | 475 ++++++++++++++++++ .../TilingQCVisual_tiling_qc_cut_score.png | Bin 0 -> 7213 bytes ...QCVisual_tiling_qc_straight_edge_ratio.png | Bin 0 -> 7213 bytes tests/experimental/conftest.py | 213 ++++++++ tests/experimental/test_tiling_qc.py | 350 +++++++++++++ 10 files changed, 1551 insertions(+), 3 deletions(-) create mode 100644 src/squidpy/experimental/im/_tiling.py create mode 100644 src/squidpy/experimental/pl/_tiling_qc.py create mode 100644 src/squidpy/experimental/tl/__init__.py create mode 100644 src/squidpy/experimental/tl/_tiling_qc.py create mode 100644 tests/_images/TilingQCVisual_tiling_qc_cut_score.png create mode 100644 tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png create mode 100644 tests/experimental/conftest.py create mode 100644 tests/experimental/test_tiling_qc.py diff --git a/src/squidpy/experimental/__init__.py b/src/squidpy/experimental/__init__.py index 435cd0098..5f4c695ab 100644 --- a/src/squidpy/experimental/__init__.py +++ b/src/squidpy/experimental/__init__.py @@ -6,6 +6,6 @@ from __future__ import annotations -from . import im, pl +from . import im, pl, tl -__all__ = ["im", "pl"] +__all__ = ["im", "pl", "tl"] diff --git a/src/squidpy/experimental/im/_tiling.py b/src/squidpy/experimental/im/_tiling.py new file mode 100644 index 000000000..259bc2319 --- /dev/null +++ b/src/squidpy/experimental/im/_tiling.py @@ -0,0 +1,429 @@ +"""Cell-aware tiling for large images. + +Splits a label image into overlapping tiles such that every cell is fully +contained in exactly one tile. Cells are assigned to tiles by centroid: +the tile whose non-overlapping base region contains the centroid owns the +cell. Non-owned cells are zeroed out in each tile's mask so that +downstream processing never double-counts. + +All functions accept pre-computed centroid dicts and image shapes — they +never materialize the full image or label array. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Literal + +import numpy as np +import xarray as xr +from skimage.measure import regionprops + + +@dataclass(frozen=True) +class CellInfo: + """Centroid and bounding box for a single label.""" + + label: int + centroid_y: float + centroid_x: float + bbox_h: int # height of bounding box + bbox_w: int # width of bounding box + + +@dataclass(frozen=True) +class TileSpec: + """Specification for a single tile. + + Attributes + ---------- + base + The non-overlapping region ``(y0, x0, y1, x1)`` used for centroid + ownership. Tiles partition the image into a grid of base regions. + crop + The extended region ``(y0, x0, y1, x1)`` that includes the overlap + margin. This is the actual slice extracted from the image/labels. + owned_ids + Label IDs whose centroid falls inside ``base``. Only these labels + are kept in the tile's mask; all others are zeroed out. + """ + + base: tuple[int, int, int, int] + crop: tuple[int, int, int, int] + owned_ids: frozenset[int] = field(default_factory=frozenset) + + +# --------------------------------------------------------------------------- +# Centroid computation +# --------------------------------------------------------------------------- + + +def compute_cell_info(labels: np.ndarray) -> dict[int, CellInfo]: + """Compute centroid and bounding-box size for every label from a numpy array. + + Parameters + ---------- + labels + 2-D integer label image where 0 is background. + + Returns + ------- + Mapping from label ID to :class:`CellInfo`. + """ + props = regionprops(labels) + info: dict[int, CellInfo] = {} + for p in props: + min_row, min_col, max_row, max_col = p.bbox + info[p.label] = CellInfo( + label=p.label, + centroid_y=p.centroid[0], + centroid_x=p.centroid[1], + bbox_h=max_row - min_row, + bbox_w=max_col - min_col, + ) + return info + + +def compute_cell_info_multiscale( + labels_node: xr.DataTree, + target_scale: str = "scale0", +) -> dict[int, CellInfo]: + """Compute centroids using the coarsest scale of a multiscale label pyramid. + + Reads only the smallest resolution, then scales coordinates to *target_scale*. + """ + available = list(labels_node.keys()) + if not available: + return {} + + # Pick coarsest scale (highest numeric suffix) + def _scale_idx(k: str) -> int: + num = "".join(c for c in k if c.isdigit()) + return int(num) if num else 0 + + coarsest = max(available, key=_scale_idx) + coarse_da = labels_node[coarsest].ds["image"] + coarse_labels = np.asarray(coarse_da.values).squeeze() + + if coarse_labels.ndim != 2: + raise ValueError(f"Expected 2-D labels at scale {coarsest}, got shape {coarse_labels.shape}") + + # Compute scale factors to target resolution + target_da = labels_node[target_scale].ds["image"] + target_h, target_w = target_da.sizes.get("y", target_da.shape[-2]), target_da.sizes.get("x", target_da.shape[-1]) + coarse_h, coarse_w = coarse_labels.shape + scale_y = target_h / coarse_h + scale_x = target_w / coarse_w + + props = regionprops(coarse_labels) + return { + p.label: CellInfo( + label=p.label, + centroid_y=p.centroid[0] * scale_y, + centroid_x=p.centroid[1] * scale_x, + bbox_h=int(np.ceil((p.bbox[2] - p.bbox[0]) * scale_y)), + bbox_w=int(np.ceil((p.bbox[3] - p.bbox[1]) * scale_x)), + ) + for p in props + } + + +def compute_cell_info_tiled( + labels_da: xr.DataArray, + chunk_size: int = 4096, +) -> dict[int, CellInfo]: + """Compute centroids by reading label tiles — never materializes the full array. + + For cells spanning multiple chunks, centroids are computed as + area-weighted means of per-chunk centroids. + + Parameters + ---------- + labels_da + 2-D (y, x) dask-backed xarray DataArray. + chunk_size + Size of chunks to read at a time. + """ + H = int(labels_da.sizes.get("y", labels_da.shape[-2])) + W = int(labels_da.sizes.get("x", labels_da.shape[-1])) + + # Per-label accumulators: [sum_y*area, sum_x*area, total_area, min_y, max_y, min_x, max_x] + stats: dict[int, list[float]] = {} + + for y0 in range(0, H, chunk_size): + y1 = min(y0 + chunk_size, H) + for x0 in range(0, W, chunk_size): + x1 = min(x0 + chunk_size, W) + chunk = labels_da.isel(y=slice(y0, y1), x=slice(x0, x1)).values + if chunk.ndim > 2: + chunk = chunk.squeeze() + + for p in regionprops(chunk): + lid = p.label + cy_global = p.centroid[0] + y0 + cx_global = p.centroid[1] + x0 + area = p.area + min_row = p.bbox[0] + y0 + max_row = p.bbox[2] + y0 + min_col = p.bbox[1] + x0 + max_col = p.bbox[3] + x0 + + if lid not in stats: + stats[lid] = [cy_global * area, cx_global * area, area, min_row, max_row, min_col, max_col] + else: + s = stats[lid] + s[0] += cy_global * area + s[1] += cx_global * area + s[2] += area + s[3] = min(s[3], min_row) + s[4] = max(s[4], max_row) + s[5] = min(s[5], min_col) + s[6] = max(s[6], max_col) + + result: dict[int, CellInfo] = {} + for lid, s in stats.items(): + if lid == 0: + continue + result[lid] = CellInfo( + label=lid, + centroid_y=s[0] / s[2], + centroid_x=s[1] / s[2], + bbox_h=int(s[4] - s[3]), + bbox_w=int(s[6] - s[5]), + ) + return result + + +# --------------------------------------------------------------------------- +# Tile spec building +# --------------------------------------------------------------------------- + + +def _auto_margin(cell_info: dict[int, CellInfo]) -> int: + """Compute the minimum margin that covers the largest cell's half-extent.""" + if not cell_info: + return 0 + max_half = max(max(c.bbox_h, c.bbox_w) for c in cell_info.values()) + # Centroid can be at most half a bbox away from the cell's edge. + # Add 1 pixel for safety (rounding / off-by-one). + return int(np.ceil(max_half / 2)) + 1 + + +def build_tile_specs( + image_shape: tuple[int, int], + cell_info: dict[int, CellInfo], + tile_size: int = 2048, + overlap_margin: int | Literal["auto"] = "auto", +) -> list[TileSpec]: + """Build tile specifications from pre-computed centroids. + + No pixel data is needed — only the image dimensions and centroid dict. + + Parameters + ---------- + image_shape + ``(H, W)`` of the full-resolution image/labels. + cell_info + Pre-computed centroids from :func:`compute_cell_info`, + :func:`compute_cell_info_multiscale`, or :func:`compute_cell_info_tiled`. + tile_size + Side length of the non-overlapping base grid cells. + overlap_margin + Pixel margin added around each base region. ``"auto"`` computes the + minimum margin from the largest cell's bounding box. + + Returns + ------- + List of :class:`TileSpec`, one per grid cell that owns at least one + label. Empty tiles (no cells) are omitted. + """ + H, W = image_shape + if tile_size <= 0: + raise ValueError(f"tile_size must be positive, got {tile_size}") + + if isinstance(overlap_margin, str) and overlap_margin == "auto": + margin = _auto_margin(cell_info) + else: + margin = int(overlap_margin) + if margin < 0: + raise ValueError(f"overlap_margin must be non-negative, got {margin}") + + # Assign each cell to a base-grid cell by its centroid + cell_to_tile: dict[int, tuple[int, int]] = {} + for lid, ci in cell_info.items(): + tile_row = min(int(ci.centroid_y) // tile_size, (H - 1) // tile_size) + tile_col = min(int(ci.centroid_x) // tile_size, (W - 1) // tile_size) + cell_to_tile[lid] = (tile_row, tile_col) + + # Group cells by tile + tile_to_cells: dict[tuple[int, int], set[int]] = {} + for lid, key in cell_to_tile.items(): + tile_to_cells.setdefault(key, set()).add(lid) + + # Build specs (skip empty tiles) + n_rows = (H + tile_size - 1) // tile_size + n_cols = (W + tile_size - 1) // tile_size + + specs: list[TileSpec] = [] + for row in range(n_rows): + for col in range(n_cols): + owned = tile_to_cells.get((row, col), set()) + if not owned: + continue + + by0 = row * tile_size + bx0 = col * tile_size + by1 = min(by0 + tile_size, H) + bx1 = min(bx0 + tile_size, W) + + cy0 = max(by0 - margin, 0) + cx0 = max(bx0 - margin, 0) + cy1 = min(by1 + margin, H) + cx1 = min(bx1 + margin, W) + + specs.append( + TileSpec( + base=(by0, bx0, by1, bx1), + crop=(cy0, cx0, cy1, cx1), + owned_ids=frozenset(owned), + ) + ) + + return specs + + +# --------------------------------------------------------------------------- +# Tile extraction +# --------------------------------------------------------------------------- + + +def extract_tile( + image: np.ndarray, + labels: np.ndarray, + spec: TileSpec, +) -> tuple[np.ndarray, np.ndarray]: + """Extract a tile from numpy arrays, zeroing out non-owned cells. + + Parameters + ---------- + image + ``(C, H, W)`` numpy array. + labels + ``(H, W)`` numpy label array. + spec + Tile specification. + + Returns + ------- + tile_image, tile_labels + """ + cy0, cx0, cy1, cx1 = spec.crop + tile_image = image[:, cy0:cy1, cx0:cx1] + tile_labels = labels[cy0:cy1, cx0:cx1].copy() + _zero_non_owned(tile_labels, spec.owned_ids) + return tile_image, tile_labels + + +def extract_tile_lazy( + image_da: xr.DataArray, + labels_da: xr.DataArray, + spec: TileSpec, +) -> tuple[np.ndarray, np.ndarray]: + """Extract a tile from dask-backed xarray arrays. + + Materializes only the tile's crop region (~2k×2k), not the full image. + + Parameters + ---------- + image_da + ``(c, y, x)`` dask-backed DataArray. + labels_da + ``(y, x)`` dask-backed DataArray. + spec + Tile specification. + + Returns + ------- + tile_image + ``(C, crop_h, crop_w)`` numpy array. + tile_labels + ``(crop_h, crop_w)`` numpy array with non-owned cells zeroed. + """ + cy0, cx0, cy1, cx1 = spec.crop + tile_image = image_da.isel(y=slice(cy0, cy1), x=slice(cx0, cx1)).values + tile_labels = labels_da.isel(y=slice(cy0, cy1), x=slice(cx0, cx1)).values.copy() + if tile_labels.ndim > 2: + tile_labels = tile_labels.squeeze() + _zero_non_owned(tile_labels, spec.owned_ids) + return tile_image, tile_labels + + +def extract_labels_tile_lazy( + labels_da: xr.DataArray, + spec: TileSpec, +) -> np.ndarray: + """Extract a labels-only tile from a dask-backed DataArray. + + Like :func:`extract_tile_lazy` but skips the image entirely. + Materializes only the crop region. + + Parameters + ---------- + labels_da + ``(y, x)`` dask-backed DataArray. + spec + Tile specification. + + Returns + ------- + ``(crop_h, crop_w)`` numpy array with non-owned cells zeroed. + """ + cy0, cx0, cy1, cx1 = spec.crop + tile_labels = labels_da.isel(y=slice(cy0, cy1), x=slice(cx0, cx1)).values.copy() + if tile_labels.ndim > 2: + tile_labels = tile_labels.squeeze() + _zero_non_owned(tile_labels, spec.owned_ids) + return tile_labels + + +def _zero_non_owned(tile_labels: np.ndarray, owned_ids: frozenset[int]) -> None: + """Zero out labels not in *owned_ids* (in-place).""" + for lid in np.unique(tile_labels): + if lid != 0 and lid not in owned_ids: + tile_labels[tile_labels == lid] = 0 + + +# --------------------------------------------------------------------------- +# Coverage verification +# --------------------------------------------------------------------------- + + +def verify_coverage( + all_label_ids: set[int], + specs: list[TileSpec], +) -> None: + """Assert that tile specs provide full, non-overlapping cell coverage. + + Parameters + ---------- + all_label_ids + Set of all nonzero label IDs expected in the image. + specs + Tile specifications to verify. + + Raises + ------ + AssertionError + If any cell is missing or assigned to more than one tile. + """ + owned_union: set[int] = set() + for spec in specs: + overlap = owned_union & spec.owned_ids + assert not overlap, f"Cells {overlap} assigned to multiple tiles" + owned_union |= spec.owned_ids + + missing = all_label_ids - owned_union + assert not missing, f"Cells {missing} not assigned to any tile" + + extra = owned_union - all_label_ids + assert not extra, f"Tile specs reference non-existent labels {extra}" diff --git a/src/squidpy/experimental/pl/__init__.py b/src/squidpy/experimental/pl/__init__.py index cdb8a56d1..1a95f7c71 100644 --- a/src/squidpy/experimental/pl/__init__.py +++ b/src/squidpy/experimental/pl/__init__.py @@ -1,5 +1,6 @@ from __future__ import annotations from ._qc_image import qc_image +from ._tiling_qc import tiling_qc -__all__ = ["qc_image"] +__all__ = ["qc_image", "tiling_qc"] diff --git a/src/squidpy/experimental/pl/_tiling_qc.py b/src/squidpy/experimental/pl/_tiling_qc.py new file mode 100644 index 000000000..c17f33448 --- /dev/null +++ b/src/squidpy/experimental/pl/_tiling_qc.py @@ -0,0 +1,75 @@ +"""Diagnostic plot for tiling segmentation QC.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from spatialdata import SpatialData + +__all__ = ["tiling_qc"] + + +def tiling_qc( + sdata: SpatialData, + labels_key: str, + qc_key: str | None = None, + score_col: str = "cut_score", + cmap: str = "Reds", + figsize: tuple[float, float] | None = None, + **kwargs: Any, +) -> None: + """Plot labels coloured by their tiling-artifact score. + + Uses :mod:`spatialdata_plot` to render the label element coloured + by the chosen QC score from the linked table. If tile-boundary + artifacts are present the tile grid emerges as lines of + high-scoring cells. + + Parameters + ---------- + sdata + SpatialData object (must contain the QC table). + labels_key + Key in ``sdata.labels`` with the segmentation mask. + qc_key + Key in ``sdata.tables`` with the QC AnnData. Defaults to + ``"{labels_key}_qc"``. + score_col + Which ``.obs`` column to colour by. One of + ``"cut_score"``, ``"max_straight_edge_ratio"``, + ``"cardinal_alignment_score"``. + cmap + Matplotlib colormap name. + figsize + Figure size passed to :meth:`spatialdata.SpatialData.pl.show`. + **kwargs + Forwarded to :meth:`spatialdata.SpatialData.pl.render_labels`. + """ + import spatialdata_plot # noqa: F401 — registers accessor + + table_key = qc_key if qc_key is not None else f"{labels_key}_qc" + if table_key not in sdata.tables: + raise ValueError( + f"QC table '{table_key}' not found in sdata.tables. " + f"Run calculate_tiling_qc(sdata, labels_key='{labels_key}') first." + ) + + adata = sdata.tables[table_key] + if score_col not in adata.obs.columns: + raise ValueError( + f"Score column '{score_col}' not found in .obs. " + f"Available: {[c for c in adata.obs.columns if c not in ('region', 'label_id')]}" + ) + + show_kwargs: dict[str, Any] = {} + if figsize is not None: + show_kwargs["figsize"] = figsize + + sdata.pl.render_labels( + element=labels_key, + color=score_col, + table_name=table_key, + cmap=cmap, + **kwargs, + ).pl.show(**show_kwargs) diff --git a/src/squidpy/experimental/tl/__init__.py b/src/squidpy/experimental/tl/__init__.py new file mode 100644 index 000000000..e4e529771 --- /dev/null +++ b/src/squidpy/experimental/tl/__init__.py @@ -0,0 +1,5 @@ +from __future__ import annotations + +from ._tiling_qc import calculate_tiling_qc + +__all__ = ["calculate_tiling_qc"] diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py new file mode 100644 index 000000000..92af45200 --- /dev/null +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -0,0 +1,475 @@ +"""QC metrics for detecting tile-boundary segmentation artifacts. + +Cells cut by tile borders during segmentation have characteristic +straight edges that natural cell boundaries never produce. This module +computes per-cell metrics that quantify this artifact: + +- **max_straight_edge_ratio**: length of the longest straight contour + segment normalised by the cell's equivalent diameter. +- **cardinal_alignment_score**: how closely that segment aligns with + 0° or 90° (axis-aligned tile borders). +- **cut_score**: product of the two, combining evidence from shape and + orientation. + +All heavy computation is done per-tile via the tiling infrastructure +in :mod:`squidpy.experimental.im._tiling`, so this scales to +100k×100k images without materialising the full array. +""" + +from __future__ import annotations + +from typing import Literal + +import anndata as ad +import numpy as np +import pandas as pd +import xarray as xr +from joblib import Parallel, delayed +from skimage.measure import find_contours, regionprops +from spatialdata import SpatialData +from spatialdata._logging import logger as logg +from spatialdata.models import TableModel + +from squidpy.experimental.im._tiling import ( + build_tile_specs, + compute_cell_info, + compute_cell_info_multiscale, + compute_cell_info_tiled, + extract_labels_tile_lazy, +) + +__all__ = ["calculate_tiling_qc"] + +# Minimum cell area in pixels — smaller cells produce noisy contours +_MIN_CELL_AREA = 20 + +# Default perpendicular distance tolerance for collinearity (pixels). +# Points within this distance of the start→end line are considered +# part of the same straight segment. 0.75 px works well for +# sub-pixel contours from marching squares. +_DEFAULT_DISTANCE_TOL = 0.75 + + +# --------------------------------------------------------------------------- +# Core geometry +# --------------------------------------------------------------------------- + + +def _longest_collinear_segment( + contour: np.ndarray, + distance_tol: float = _DEFAULT_DISTANCE_TOL, +) -> tuple[float, float]: + """Find the longest collinear run of contour points. + + Uses a two-pointer approach: for each start index, extend the end + index as long as all intermediate points are within + ``distance_tol`` of the line from start to end. Early exit when + remaining points cannot beat the current best. + + Parameters + ---------- + contour + ``(N, 2)`` array of ``(row, col)`` contour coordinates. + distance_tol + Maximum perpendicular distance (pixels) from the start→end + line for a point to be considered part of the straight segment. + + Returns + ------- + run_length + Euclidean length of the longest straight segment (pixels). + run_angle + Angle (radians, ``[-π, π]``) of that segment. + """ + n = len(contour) + if n < 3: + return 0.0, 0.0 + + best_len = 0.0 + best_angle = 0.0 + + # Precompute cumulative arc length for early-exit bound + diffs_all = np.diff(contour, axis=0) + seg_lengths = np.sqrt((diffs_all**2).sum(axis=1)) + cum_arc = np.zeros(n, dtype=np.float64) + cum_arc[1:] = np.cumsum(seg_lengths) + total_arc = cum_arc[-1] + + for start in range(n - 2): + # Upper bound: arc length from start to end of contour + remaining_arc = total_arc - cum_arc[start] + if remaining_arc <= best_len: + break # no start from here or later can beat best + + for end in range(start + 2, n): + p0 = contour[start] + p1 = contour[end] + d = p1 - p0 + seg_len = np.sqrt(d[0] ** 2 + d[1] ** 2) + if seg_len < 1e-12: + continue + + # Perpendicular distances of all intermediate points + intermediates = contour[start + 1 : end] + rel = intermediates - p0 + cross = np.abs(d[0] * rel[:, 1] - d[1] * rel[:, 0]) + max_perp = cross.max() / seg_len + + if max_perp > distance_tol: + break + + if seg_len > best_len: + best_len = seg_len + best_angle = float(np.arctan2(d[0], d[1])) + + return best_len, best_angle + + +def _cardinal_alignment(angle: float) -> float: + """Score how close an angle is to a cardinal direction (0° or 90°). + + Returns a value in ``[0, 1]`` where 1 means perfectly axis-aligned + and 0 means maximally diagonal (45°). + """ + # Normalise angle to [0, π) — direction, not orientation + a = abs(angle) % np.pi + + # Distance to nearest cardinal: 0, π/2, π + dist = min(a, abs(a - np.pi / 2), abs(a - np.pi)) + + # Map [0, π/4] → [1, 0] + return float(1.0 - dist / (np.pi / 4)) + + +def _straight_edge_metrics( + contour: np.ndarray, + cell_area: float, + distance_tol: float = _DEFAULT_DISTANCE_TOL, +) -> tuple[float, float, float]: + """Compute straight-edge metrics for a single cell contour. + + Parameters + ---------- + contour + ``(N, 2)`` contour coordinates from :func:`skimage.measure.find_contours`. + cell_area + Area of the cell in pixels (for normalisation). + distance_tol + Perpendicular distance tolerance for collinearity (pixels). + + Returns + ------- + straight_edge_ratio + Longest collinear segment / equivalent diameter. + cardinal_score + Cardinal alignment of the longest straight segment. + cut_score + Product of the two. + """ + eq_diam = np.sqrt(4 * cell_area / np.pi) + if eq_diam == 0: + return 0.0, 0.0, 0.0 + + run_length, run_angle = _longest_collinear_segment(contour, distance_tol) + straight_ratio = run_length / eq_diam + cardinal = _cardinal_alignment(run_angle) + cut_score = straight_ratio * cardinal + + return float(straight_ratio), float(cardinal), float(cut_score) + + +# --------------------------------------------------------------------------- +# Per-tile scoring +# --------------------------------------------------------------------------- + + +def _score_tile( + tile_labels: np.ndarray, + distance_tol: float = _DEFAULT_DISTANCE_TOL, + min_area: int = _MIN_CELL_AREA, + downsample: int = 1, +) -> pd.DataFrame: + """Compute tiling QC metrics for all cells in a numpy label tile. + + Parameters + ---------- + tile_labels + ``(H, W)`` label array (background = 0, owned cells only). + distance_tol + Perpendicular distance tolerance for collinearity (pixels). + min_area + Cells smaller than this (in pixels at analysis resolution) + are skipped and get NaN values. + downsample + Factor by which to downsample each cell's bounding-box crop + before contour extraction. ``1`` = full resolution, ``2`` = + half, etc. Straight edges are scale-invariant so moderate + downsampling (2–4x) is safe and much faster for large cells. + + Returns + ------- + DataFrame with columns ``max_straight_edge_ratio``, + ``cardinal_alignment_score``, ``cut_score``, indexed by cell label. + """ + regions = regionprops(tile_labels) + if not regions: + return pd.DataFrame( + columns=["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"], + dtype=float, + ) + + rows: dict[int, dict[str, float]] = {} + + for region in regions: + lid = region.label + area = region.area + + if area < min_area * (downsample**2): + rows[lid] = { + "max_straight_edge_ratio": np.nan, + "cardinal_alignment_score": np.nan, + "cut_score": np.nan, + } + continue + + # Extract bbox crop for efficient contour finding. + # Pad with 1px of zeros so find_contours can trace cells + # that touch the crop edge (e.g., cells filling their bbox). + min_row, min_col, max_row, max_col = region.bbox + crop = (tile_labels[min_row:max_row, min_col:max_col] == lid).astype(np.float32) + crop = np.pad(crop, 1, mode="constant", constant_values=0) + + # Optionally downsample for speed + if downsample > 1: + crop = crop[::downsample, ::downsample] + + contours = find_contours(crop, 0.5) + if not contours: + rows[lid] = { + "max_straight_edge_ratio": np.nan, + "cardinal_alignment_score": np.nan, + "cut_score": np.nan, + } + continue + + # Use the longest contour (exterior boundary) + contour = max(contours, key=len) + + # Scale area to analysis resolution for consistent normalisation + analysis_area = area / (downsample**2) if downsample > 1 else area + + ser, cas, cs = _straight_edge_metrics(contour, analysis_area, distance_tol) + + rows[lid] = { + "max_straight_edge_ratio": ser, + "cardinal_alignment_score": cas, + "cut_score": cs, + } + + return pd.DataFrame.from_dict(rows, orient="index") + + +# --------------------------------------------------------------------------- +# Centroid computation (shared logic with _feature.py) +# --------------------------------------------------------------------------- + + +def _compute_centroids_for_labels( + sdata: SpatialData, + labels_key: str, + labels_da: xr.DataArray, + scale: str | None, +) -> dict: + """Compute cell centroids using the most efficient strategy available.""" + if isinstance(sdata.labels[labels_key], xr.DataTree): + logg.info("Computing centroids from coarse scale.") + return compute_cell_info_multiscale( + sdata.labels[labels_key], target_scale=scale or "scale0" + ) + + n_pixels = labels_da.sizes.get("y", 1) * labels_da.sizes.get("x", 1) + if n_pixels <= 4096 * 4096: + lbl_np = labels_da.values + if lbl_np.ndim > 2: + lbl_np = lbl_np.squeeze() + return compute_cell_info(lbl_np) + + logg.info("Computing centroids in tiled mode (large single-scale labels).") + return compute_cell_info_tiled(labels_da) + + +# --------------------------------------------------------------------------- +# Public API +# --------------------------------------------------------------------------- + + +_METHOD_KEY = "tiling_qc" + + +def calculate_tiling_qc( + sdata: SpatialData, + labels_key: str, + scale: str | None = None, + tile_size: int = 2048, + overlap_margin: int | Literal["auto"] = "auto", + distance_tol: float = _DEFAULT_DISTANCE_TOL, + min_area: int = _MIN_CELL_AREA, + downsample: int = 1, + n_jobs: int = 1, + adata_key_added: str | None = None, + inplace: bool = True, +) -> ad.AnnData | None: + """Score cells for tile-boundary segmentation artifacts. + + Computes per-cell metrics that detect artificially straight edges + caused by tiled segmentation. Large images are processed via the + same tiling infrastructure as + :func:`~squidpy.experimental.im.calculate_image_features`. + + Results are stored in a QC table (default + ``sdata.tables["{labels_key}_qc"]``). Scores live in ``.obs``; + the ``.X`` matrix is empty. Algorithm parameters are recorded in + ``.uns["tiling_qc"]``. + + Parameters + ---------- + sdata + SpatialData object. + labels_key + Key in ``sdata.labels`` with segmentation masks. + scale + Scale level for multi-scale labels. + tile_size + Side length of the tiling grid (pixels). + overlap_margin + Overlap around each tile. ``"auto"`` computes the minimum from + the largest cell's bounding box. + distance_tol + Maximum perpendicular distance (pixels) from the fitted line + for a contour point to be considered part of a straight + segment. Default 0.75 px. + min_area + Cells smaller than this (pixels) are skipped (NaN scores). + downsample + Factor by which to downsample each cell's bounding-box crop + before contour extraction. Straightness is scale-invariant, + so ``2``–``4`` is safe and much faster on large cells. + n_jobs + Number of parallel jobs for tile processing. + adata_key_added + Key under which to store the result in ``sdata.tables``. + Defaults to ``"{labels_key}_qc"``. + inplace + If ``True``, store result in ``sdata.tables``. Otherwise + return the AnnData directly. + + Returns + ------- + :class:`~anndata.AnnData` when ``inplace=False``, otherwise ``None``. + The AnnData ``.obs`` contains three scores per cell: + + - ``max_straight_edge_ratio``: longest collinear boundary segment / + equivalent diameter. + - ``cardinal_alignment_score``: axis-alignment of that segment + (1 = cardinal, 0 = diagonal). + - ``cut_score``: product of the two. + """ + # --- Validate --- + if labels_key not in sdata.labels: + raise ValueError( + f"Labels key '{labels_key}' not found, valid keys: {list(sdata.labels.keys())}" + ) + + # --- Resolve labels DataArray (stays lazy) --- + labels_node = sdata.labels[labels_key] + if isinstance(labels_node, xr.DataTree): + if scale is None: + raise ValueError("When using multi-scale labels, please specify the scale.") + labels_da = labels_node[scale].ds["image"] + else: + labels_da = labels_node + + # --- Compute centroids --- + cell_info = _compute_centroids_for_labels(sdata, labels_key, labels_da, scale) + if not cell_info: + raise ValueError("No cells found in labels (all zeros).") + + H = int(labels_da.sizes.get("y", labels_da.shape[-2])) + W = int(labels_da.sizes.get("x", labels_da.shape[-1])) + + # --- Build tile specs --- + specs = build_tile_specs( + (H, W), cell_info, tile_size=tile_size, overlap_margin=overlap_margin + ) + logg.info( + f"Tiling QC: {len(specs)} tiles ({tile_size}x{tile_size}, " + f"margin={overlap_margin}, downsample={downsample}x)." + ) + + # --- Process tiles (labels only — no image needed) --- + def _process_one(spec, idx): + tile_lbl = extract_labels_tile_lazy(labels_da, spec) + logg.debug(f"Tiling QC tile {idx + 1}/{len(specs)}: {len(spec.owned_ids)} cells.") + return _score_tile(tile_lbl, distance_tol=distance_tol, min_area=min_area, downsample=downsample) + + results = Parallel(n_jobs=n_jobs, prefer="threads")( + delayed(_process_one)(spec, i) for i, spec in enumerate(specs) + ) + tile_dfs = [df for df in results if not df.empty] + + if not tile_dfs: + raise ValueError("No cells scored — labels may be empty or all below min_area.") + + combined = pd.concat(tile_dfs, axis=0).sort_index() + + # Sanity: each cell should appear in exactly one tile + if combined.index.duplicated().any(): + dups = combined.index[combined.index.duplicated()].unique().tolist() + raise RuntimeError( + f"Duplicate cell IDs across tiles — tile ownership may be broken. " + f"Duplicates: {dups}" + ) + + # --- Build AnnData (scores in .obs, empty .X) --- + n_cells = len(combined) + adata = ad.AnnData( + X=np.empty((n_cells, 0), dtype=np.float32), + ) + adata.obs_names = [f"cell_{i}" for i in combined.index] + + # Spatialdata linking + adata.obs["region"] = pd.Categorical([labels_key] * n_cells) + adata.obs["label_id"] = combined.index.values + adata.uns["spatialdata_attrs"] = { + "region": labels_key, + "region_key": "region", + "instance_key": "label_id", + } + + # QC scores in obs + for col in combined.columns: + adata.obs[col] = combined[col].values + + # Centroids (already computed without materialising the full array) + adata.obs["centroid_y"] = np.array( + [cell_info[lid].centroid_y for lid in combined.index] + ) + adata.obs["centroid_x"] = np.array( + [cell_info[lid].centroid_x for lid in combined.index] + ) + + # Algorithm parameters in uns + adata.uns[_METHOD_KEY] = { + "scale": scale, + "tile_size": tile_size, + "overlap_margin": overlap_margin, + "distance_tol": distance_tol, + "min_area": min_area, + "downsample": downsample, + } + + if inplace: + table_key = adata_key_added if adata_key_added is not None else f"{labels_key}_qc" + sdata.tables[table_key] = TableModel.parse(adata) + return None + return adata diff --git a/tests/_images/TilingQCVisual_tiling_qc_cut_score.png b/tests/_images/TilingQCVisual_tiling_qc_cut_score.png new file mode 100644 index 0000000000000000000000000000000000000000..5097a44fffbbd03ffad27fbcf6816d9e0654f1d6 GIT binary patch literal 7213 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 literal 0 HcmV?d00001 diff --git a/tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png b/tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png new file mode 100644 index 0000000000000000000000000000000000000000..5097a44fffbbd03ffad27fbcf6816d9e0654f1d6 GIT binary patch literal 7213 zcmV+|9Ma>7P)005u}1^@s6i_d2*0000wbVXQnQ*UN; zcVTj608L?ZaBOdMY-wU3c4cyNX>V>bE-^4JI4mG&baZfYIxjD6VRUe8Z***FVlHoT zXD`89buV3H5*5wDSX*VEG_~x5$)B_JZ zpiVg91hsPIN;PiWIJITV7S-O~u8utNNHu8CAT?pa1ohEJAF0{1XRF=2cdKWgeO5jB zhAAeL^w{BIlX3a|bG%|(40!F}+B}>$@Wy{pkrAyU;0|)f6#~*)O&6_t*J@wR6 z+N%Be=b!3=3og*_Iq$sl)O+u}r$&w(sjj~IYBhN9VD;gLAEtd8nLAEke^see z(vOyw7JaOuYpc5R&O6oKy?fR0;louC^*R*A5F7z_+;NAx z<(6C2amO83CEc`X)3gO-SjO`8>(@`MS+hnx^w2|k$el7}idw#WxmvYqmHOk4KQuXy zIp&zOPbD*GDFV^%cy#fgmkUJWOyHB4!s;#X}O`JHf&Yv&P)e(t+ z_uO-jcBXNz$BY@H-hKDo#%Y5o>sCGf`RAXjUw-*T`!`1% zaYX#BERak5{rBJMth3HiC!KVX=j;3T?~g{n0Rsl8ZQHh~{{8#w*`6JMB{VT?*f5nA zI3aM@VTToMQ0cZo;-4<*u~?R7g$3Q6=;>JUGxc@_nhUL2A|J%twQE;(nGfM7 zQg@>1%|JpqFV3YI&Znse*wN8(2>Aei|Ni^$s%OuhxxZkX3ppY@vy_Qwqg0CD1LFHx zljoTcghwNOr>O`iM6(4B;NZc7T2+AtF|XjfPz#A`v2Wi#eZ%$Z*Do?Tf~+Wg_1ka1 z>AVzKn@5mv^wCG_)PO9)w^iSN|Gk`XD|KGQ7U)7^W4=p#36Lcy$6Mo>r zF+}Il3es+fAmlRz1HF6qb|#<@j~f;8VnMN_@_EPy$t79JRL1PtvqzIKi^nl-e_nkWBlvAooj3}U!?2a?R9S!lr z2pB}-q+quJ0y6YM8XLQI?b0L+J1@S2?`1e8uLQEuCr2H1ls?Am92Xgu{agG`|0PX8 z+EcR{=HiPlR@Ys3owj-me=olHqCO7E&;*(UtOs;n5c%Txel7qPSwyr+TT(yK`TqU; zoh4I3Kob}SjzLHvpWp9eNOENXH*DCTF2DS8?L$CDNC$rY`RD%#3{5>?R1KO~Si5sg za2L5)3W2o2_Prn=uQh4{;ME4mFR7e1N~MxhTR0Ca9{pgB7Faco;UjzXpLvYm3F_lU zz(o-2OTg1kJ56WtV*zK*oT=V^`)&P<*^kTm0Xm;fgoJ)@8GgNB`(9WId?=13*h2&g+R=h&7mCfiIoi_VVED5CNeQM#{&3SiF$_1AYwz%B>W=2AEFQ* zsR!LFlMO~7`Cr=3Y#5Sz`I@}1mT*r}$V98;4!42jtF`lFXb%FzpI7WLZg3u6=g=#{ z3J>q&JMgP`nBT{1xJq8+JNDRPGfTeASU^ChQr<#>sQk|bs;Be#4u&|d5QzAMNd#yi z2*bT;1^L~+ef!2TBNr=+C1gTk2B5P{zDyC2j$$aL(?DDohB_?7+aQ|@7{++7OkSj2 z^;}5tW3fh%Lo8M)Msi3yr67`6%&a3b1Qf&_qvN7*;k`)cHH)+b5diYkYfbnp--DHE zWGu2JXF`YU-y&8p)qF%DA*(w0lMnz4!7+Q1!gv1q>#zU$Zf4DXGwNn1NSCvKUVspU zO&|jP9K^wTVNqQDMBc-&7qpl!!><<_xmwee(V7<-lWBn<2@itTtUWV4x&(7U9{i%N zgxp^ZER*Q$>ID|jZ&vI|@B&RnK#36s1(p56EVa&>?cX98Udw7sfpGlic1LP8e*Ab{ zaC^?2IeMsL_@f9nWoB2bSfMZY+_`hLPA~~zm6$}Zj*A~?`f0ot=aQOCSj6WOtC+^n zT`rfas~gQac{zlD2p6Az`e_~1gor3F9((LDwRrJjwR-hxT@n8E*I(B|9^|CWfMa7A2# z)Ouj5U9u=htrcZU$V$J;%1s`Gxvqj#-`fc?ZQs8A5Dg&16CHxauBi0hc$7WF1rV{B z>dO0uVFnHysGV;#f%rqn@wxLTQpp{*V8Mb|1gVWcGqjap97p@@<-j=GP!O=e z5TbeEV8$mBwiHeh`{P^^EC|>@h;rM{%Js@{zAljUcC-Bi!J`&d$^-$q5Jd6K;*)lI zVHP3nWi^P-H>WeSF&=z6QqD57? zR;|b?@dT~~eXwwl6`7hB@NM6hSKA$HkOFia4-bv^WKbmZpp;KF8o2o^ADKz|oTEQai?*5RuaTqDlEQP;}1 zM+XcTpytn?uWLoa@=>EksV!T!sGD!TSPPO!KFQpqc9^@aB{v9qh{W2q#;KTE!MK|rfAmY?NIGAFmQGP5MeZ3-5SKmK_A zTF??EL!{R%7xNg#bc95UHOM7BZ0; zrNpyjSxFSXSUIdDzbgqpJZHsG_kv&BXgB_kj~?7 zCqBk7jPD4rWHMW}FO=-1;Wex?DM>2S;ulaZ8Jo^XXh?$KwAODZQfAU8LCO&`fF z0aM_ZYO=ozRIW)CEz6)eAnZ0`UgeR6PS)$GMRaaf5 zw`6s#j_O*Vl1O}zb1YTwMZoG8jD;v(8Z=iOoVWnIUnVd-b7RyS8}n;}#Q4nD_w3oD zt##b-xI7i8tP-%TtxZ28NF6a^MAgECRY!FNpAU;qnIQx&3f2%(@_>lk$=t;*RYHRx zj=H@f04bx8A&SrH731rytng$ZAeZr8;U9aHo3>sbT4TjdGazUaYL_8|+Fxg5jpC zA(l<7vzJBVyXjX`+TSN6JyTX_WJ!`6A2)#;#f!{&M3sPcHB=k*R!60ynXQ_EW2yX} z=B&(>c(yO+1yM?KPWDFIlAZ~XIDbjVD*61jgsEgQD3BW6Ocb*+lg&*S2BPIPM^+%h zPQSPz1eIK2JLVWg(0TCSK|L|_dkrEs!|qLqUwygjqgtLUAt=lvVA!m62dB=8Y$^yY zS$cUuJ{iyexM~h%!i;$(Ln4!YO=*Xb<@uldW1N2?rdkrai;XGrBwhftR%tonY97mdO;B5Q`_IYt&|k zJ$m%Wd|}HdXpY;c4oHC52E$;~p4ft%f2v({RB)xfc zsWQ0{WppzVFHjH2nlG7VY}q!^}q35onFX-SBMB{x~UV94MhDqC z=bBI?>6uAbzJnos!Dx}?{E^&QKp{?$YM6`fw|k`t*|Qiw5X;77MyfD)Wx|P2fQu>{ z*x2n7O<2fKo+Eh8L485D!AR2ubbl^O8XB2nZkp7S8NkE)o`@o();#a}v*kd{V|&3a87~ zq*CTBZmZH+sS+kc=EiU>8Inijl7K)ih#4@BD*)_QmB8ypfE;n{yU|%G8EjfnNY71% zn_&J%lyl8;23^B%D>{`9lm{0yE7eGYzaFqZx8G_h7Ebi_*I%#oe>5Bm!|@khcp;J?RaPpzHb$ZIq%K}om#zE?DcOi) z4>p&4V2Eih?n@$6nEZ{;WVwV#m4KWGf>g})g%@6^rCC(Pnm&EH+Prylpdi&t4~X9+ zC39_XH}gIcY~sxDk5dQ7L_xu94?k!DF) zCXTk319l`Acv)jvcb2km-1KHW>8unYcOu~W_3PD{XP&7(`|L9<$sap*>>&cwAVI3F z2jp&b-96kTU>p@$5CcSMLuaLMd(dbgH$&J?nIJ2hW=GNk(&#Bursx>jwbx#&zW@Gv zHFM@n?W<8QdcuSWzJk=SN&`XQz4dN-oCa#GTIz+CN?0c-xGv$JAY^r-;Y7eoF1bWM zy1F3M1tQ5Z*PQFw&b6hbCDa#=GV9F~vKt_35X@DES_mT*N==^)GV-0&h^ZAld-kku zwrHaWL`Q%uYq`z_d2dpi!$2C@xS0zsL%(Y{ND4=KO&FL^)#J;SD)}b_qD>GAtH-)Z zP#tT{IZDtxD}-){1>_{{-M+mbS^tfMlsh9NWQIA!=fdicfbV(}1g*i=QV-BB=f+Sh zH?LIas)u~`$_h6MzmpZK+7JSY8pW^1vA{*KQV+Z;+S`yVtXyVnVRie=^woMskHcb0 z1(n&geT@F_THZ?o4f}OEF=(?qUTdUdElXQrD+MA>bwSw0%F{$)-@bjmK4()*LL{?{ zu#V(X*xI^Af!~s3r7%Dm*Wp*BSzfLM$9X->N+yX?rJwys#?4uee;EfF{>%1Gk4fwa z6110x3E2+JwLMZj!G`PslEql&;UQKz?J^!s8-@v+5J>PhhOokyE?2u>S*D+}ftuV2nE4muZ7Lg4BB2Cv&0|qwW-g!0BKZX74J*5W zvRWhML$VN%_7tR!A3t8*b=O_GMj&?yJErp*CEM_Qo_OMk#FQ3vqP_G5@M}08mVo5a z!7^#_)6HciXj@BKrim;N&Pk980l6snOXr_|zV?SGQpt|#l=HP2YfY`aI15r|&z`N4hD#^fi8|6*wd`1wb>g`|;*^bW z8*Eocd`zMdwPxOxvfi0tc_or3ApvB3MrOwhr%Yhdj`Z7*YOeUMe^&}?Ms1_tY*yl* zjoM4tYgtcrcCU4^lj%61ti9SIO}h$}EJ2B%$_1c9m{bu$@mjx41LC`xTY$AxeApS8*R?Nzj!H_EMvZW%Y^%2nh*xM;(qcPe4wZ4z*{)bhPLRgSNQGXURg{W{EZ0 zg*D5S<5+qo4KD38#j8>_&UGI-87UY(dB_TpOPw1@_4Fel6UL~u2s2GUz{zlD)5+oh z(-Cx>d7^%y7?*6aBtZMTs=C_JDA%^uB3>1Ns%bf;NC3nMODPa>gRGU?fY4FP0%zI> zv}dUdr98Zf0eN*E7A5W6Sl5|r5|HIaFSypX5$Tzq%qwaYhRj>QC{~hTh>kRel&s8b z!z^338aBg;6H$COAz@g$gVXP-CV|YDdAO9(O&XGs=C@SWH-QRPGLo2WkcnQ@K9k{? zo1KXjH@=)>mn2|bthB6e3%YgdrU{V5o^(=TSbRZ#QzkF9kl!qEY#xh(f`ADRb6hM5 z8};bXqZ&w0YN8}$i!(G;kL4~1m@tF@S(zNAjY9~?I6ivxX!Y>J533a`R#dmbLJzoV z)hd0A_spF;R}CFHG`&_AXc`=1JK3@o;ejj_J@UvS>h#l3SF2aA))ldyd+s^4bm>yH zc=6)&T3nzxE#UIy%hiYxBeYYBeh>`fGLWx#ucB5SXtL@U_=oQ~mq**Sf%uKmJ&qbIv(c{onB6!?nZA@Jk@mYlA;X zn|6}RrcImlbDHi!(T4wnSZq*W8je*7_{JM==;!(K=j-aI5OUV6S=y>mE1Fr_)TvW- z3~9lF1)hRb`|q?+v>`if2m-?9mU0ri>J=#9gKVr*73i{vB@RfsW_x?PUi@!sYf}>^ zPE<*N?IXzG!*884XHMc_qm3Iks)Y*|>Ln=>*JWp=B-`+9%=^34ikd@sixw>^fAGNv<#FT2l@A;^P~N$7 zXZgk(Z)`{#R(}ewBAs^GvSrol;Ih9%=_#M00000NkvXXu0mjfT56yb literal 0 HcmV?d00001 diff --git a/tests/experimental/conftest.py b/tests/experimental/conftest.py new file mode 100644 index 000000000..4e33b9c3b --- /dev/null +++ b/tests/experimental/conftest.py @@ -0,0 +1,213 @@ +"""Shared fixtures for experimental tests. + +Provides synthetic SpatialData objects for testing segmentation QC metrics. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field + +import dask.array as da +import numpy as np +import pytest +import xarray as xr +from scipy import ndimage +from skimage.draw import ellipse +from spatialdata import SpatialData +from spatialdata.models import Image2DModel, Labels2DModel + +# --------------------------------------------------------------------------- +# Tile-boundary QC fixture +# --------------------------------------------------------------------------- + +_IMAGE_SIZE = 400 +_TILE_BORDERS = (133, 267) # 3×3 grid on 400 px → borders at 133, 267 +_BORDER_GAP = 2 # pixels zeroed at each tile border +_CELL_GAP = 2 # minimum gap between any two cells +_N_CELLS_TARGET = 40 +_SEMI_AXIS_RANGE = (8, 20) # semi-axis lengths in pixels + + +@dataclass +class TileBoundaryGroundTruth: + """Ground-truth metadata for the tile-boundary fixture.""" + + cut_cell_ids: frozenset[int] = field(default_factory=frozenset) + intact_cell_ids: frozenset[int] = field(default_factory=frozenset) + original_n_cells: int = 0 + tile_borders_y: tuple[int, ...] = _TILE_BORDERS + tile_borders_x: tuple[int, ...] = _TILE_BORDERS + + +def _place_ellipsoids( + shape: tuple[int, int], + n_target: int, + semi_range: tuple[int, int], + cell_gap: int, + rng: np.random.Generator, +) -> np.ndarray: + """Place non-overlapping ellipsoids via rejection sampling. + + Returns an ``(H, W)`` int32 label array with IDs 1..N. + """ + H, W = shape + labels = np.zeros(shape, dtype=np.int32) + cell_id = 0 + max_attempts = n_target * 20 # allow generous retries + + for _ in range(max_attempts): + if cell_id >= n_target: + break + + # Random ellipse parameters + cy = rng.integers(semi_range[1] + cell_gap, H - semi_range[1] - cell_gap) + cx = rng.integers(semi_range[1] + cell_gap, W - semi_range[1] - cell_gap) + r_radius = rng.integers(semi_range[0], semi_range[1] + 1) + c_radius = rng.integers(semi_range[0], semi_range[1] + 1) + angle = rng.uniform(0, np.pi) + + # Rasterise candidate ellipse + rr, cc = ellipse(cy, cx, r_radius, c_radius, shape=shape, rotation=angle) + if len(rr) == 0: + continue + + # Check for overlap (including gap buffer) + # Dilate existing labels by cell_gap and check candidate pixels + if cell_gap > 0: + occupied = ndimage.binary_dilation( + labels > 0, + iterations=cell_gap, + ) + else: + occupied = labels > 0 + + if occupied[rr, cc].any(): + continue + + cell_id += 1 + labels[rr, cc] = cell_id + + return labels + + +def _apply_tile_cuts( + labels: np.ndarray, + borders_y: tuple[int, ...], + borders_x: tuple[int, ...], + gap: int, +) -> np.ndarray: + """Zero out pixels along tile borders to simulate segmentation seams. + + For each border coordinate, a stripe of width ``gap`` centred on the + border is erased. + """ + out = labels.copy() + half = gap // 2 + + for by in borders_y: + out[by - half : by - half + gap, :] = 0 + for bx in borders_x: + out[:, bx - half : bx - half + gap] = 0 + + return out + + +def _relabel_and_track( + original: np.ndarray, + cut: np.ndarray, +) -> tuple[np.ndarray, frozenset[int], frozenset[int]]: + """Relabel connected components after cutting and classify fragments. + + Returns + ------- + relabelled + New label array with unique IDs for each fragment. + cut_ids + Fragment IDs that came from an original cell that was split. + intact_ids + Fragment IDs from cells that remained whole. + """ + # Relabel connected components (each fragment gets a new ID) + relabelled, n_fragments = ndimage.label(cut > 0) + + # Map each fragment back to its original cell ID + # For each new fragment, find which original cell(s) it overlaps with + cut_ids: set[int] = set() + intact_ids: set[int] = set() + + # Build reverse mapping: original_id → set of fragment_ids + orig_to_fragments: dict[int, set[int]] = {} + for frag_id in range(1, n_fragments + 1): + frag_mask = relabelled == frag_id + orig_ids_in_frag = set(np.unique(original[frag_mask])) - {0} + + for oid in orig_ids_in_frag: + orig_to_fragments.setdefault(oid, set()).add(frag_id) + + # Classify: if an original cell maps to >1 fragment, all its fragments are "cut" + for _orig_id, frag_set in orig_to_fragments.items(): + if len(frag_set) > 1: + cut_ids.update(frag_set) + else: + intact_ids.update(frag_set) + + return relabelled, frozenset(cut_ids), frozenset(intact_ids) + + +def make_tile_boundary_sdata() -> tuple[SpatialData, TileBoundaryGroundTruth]: + """Build a 400x400 SpatialData with ellipsoid cells cut by a 3x3 tile grid. + + Returns a tuple of ``(sdata, ground_truth)`` where ``ground_truth`` + contains the sets of cut and intact cell IDs for test assertions. + + The labels are dask-backed to exercise lazy codepaths. + """ + rng = np.random.default_rng(42) + + # 1. Place ellipsoids + original_labels = _place_ellipsoids( + shape=(_IMAGE_SIZE, _IMAGE_SIZE), + n_target=_N_CELLS_TARGET, + semi_range=_SEMI_AXIS_RANGE, + cell_gap=_CELL_GAP, + rng=rng, + ) + n_original = len(np.unique(original_labels)) - 1 # exclude background + + # 2. Apply tile cuts (zero out 2px stripes at borders) + cut_labels = _apply_tile_cuts( + original_labels, + borders_y=_TILE_BORDERS, + borders_x=_TILE_BORDERS, + gap=_BORDER_GAP, + ) + + # 3. Relabel fragments and track ground truth + relabelled, cut_ids, intact_ids = _relabel_and_track(original_labels, cut_labels) + + # 4. Wrap as dask array (chunks matching ~tile size for realistic access) + dask_labels = da.from_array(relabelled, chunks=(200, 200)) + labels_xr = xr.DataArray(dask_labels, dims=["y", "x"]) + + # 5. Dummy image for API compatibility + image_data = rng.integers(0, 255, (3, _IMAGE_SIZE, _IMAGE_SIZE), dtype=np.uint8) + image_xr = xr.DataArray(image_data, dims=["c", "y", "x"], coords={"c": ["R", "G", "B"]}) + + sdata = SpatialData( + images={"image": Image2DModel.parse(image_xr)}, + labels={"labels": Labels2DModel.parse(labels_xr)}, + ) + + ground_truth = TileBoundaryGroundTruth( + cut_cell_ids=cut_ids, + intact_cell_ids=intact_ids, + original_n_cells=n_original, + ) + + return sdata, ground_truth + + +@pytest.fixture() +def sdata_tile_boundary() -> tuple[SpatialData, TileBoundaryGroundTruth]: + """Fixture wrapper around :func:`make_tile_boundary_sdata`.""" + return make_tile_boundary_sdata() diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py new file mode 100644 index 000000000..700f590a9 --- /dev/null +++ b/tests/experimental/test_tiling_qc.py @@ -0,0 +1,350 @@ +"""Tests for tiling segmentation QC metrics.""" + +from __future__ import annotations + +import numpy as np +import pytest + +from squidpy.experimental.pl._tiling_qc import tiling_qc +from squidpy.experimental.tl._tiling_qc import ( + _cardinal_alignment, + _longest_collinear_segment, + _score_tile, + _straight_edge_metrics, + calculate_tiling_qc, +) +from tests.conftest import PlotTester, PlotTesterMeta + +# --------------------------------------------------------------------------- +# Unit tests for geometry helpers +# --------------------------------------------------------------------------- + + +class TestLongestCollinearSegment: + """Tests for _longest_collinear_segment.""" + + def test_perfectly_straight_horizontal(self): + """A horizontal line should be detected as fully straight.""" + contour = np.array([[0.0, i] for i in range(20)]) + length, angle = _longest_collinear_segment(contour) + assert length == pytest.approx(19.0, abs=0.1) + # angle of horizontal line (row=0, col increasing) -> arctan2(0, 1) = 0 + assert abs(angle) < 0.1 + + def test_perfectly_straight_vertical(self): + """A vertical line should be detected as fully straight.""" + contour = np.array([[i, 0.0] for i in range(15)]) + length, angle = _longest_collinear_segment(contour) + assert length == pytest.approx(14.0, abs=0.1) + assert abs(angle - np.pi / 2) < 0.1 + + def test_staircase_is_straight(self): + """A pixel staircase (alternating cardinal/diagonal steps) is collinear.""" + contour = np.array([ + [0.0, 0.5], + [0.5, 1.0], + [0.5, 2.0], + [1.0, 2.5], + [1.0, 3.5], + [1.5, 4.0], + ]) + length, _ = _longest_collinear_segment(contour, distance_tol=0.75) + assert length > 3.0 + + def test_circle_has_short_segments(self): + """A circle should have no long straight segments.""" + t = np.linspace(0, 2 * np.pi, 60, endpoint=False) + contour = np.column_stack([10 * np.sin(t), 10 * np.cos(t)]) + length, _ = _longest_collinear_segment(contour) + assert length < 10.0 + + def test_too_few_points(self): + """Contours with fewer than 3 points return zero.""" + length, angle = _longest_collinear_segment(np.array([[0, 0], [1, 1]])) + assert length == 0.0 + + def test_empty_contour(self): + length, angle = _longest_collinear_segment(np.array([]).reshape(0, 2)) + assert length == 0.0 + + +class TestCardinalAlignment: + """Tests for _cardinal_alignment.""" + + def test_horizontal(self): + assert _cardinal_alignment(0.0) == pytest.approx(1.0) + + def test_vertical(self): + assert _cardinal_alignment(np.pi / 2) == pytest.approx(1.0) + + def test_diagonal(self): + assert _cardinal_alignment(np.pi / 4) == pytest.approx(0.0) + + def test_negative_angle(self): + assert _cardinal_alignment(-np.pi / 2) == pytest.approx(1.0) + + def test_near_pi(self): + assert _cardinal_alignment(np.pi - 0.01) == pytest.approx(1.0, abs=0.05) + + +class TestStraightEdgeMetrics: + """Tests for _straight_edge_metrics.""" + + def test_output_range(self): + contour = np.array([[0.0, i] for i in range(10)]) + ser, cas, cs = _straight_edge_metrics(contour, cell_area=50.0) + assert ser >= 0 + assert 0 <= cas <= 1.0 + assert cs >= 0 + + def test_zero_area(self): + contour = np.array([[0.0, i] for i in range(10)]) + ser, cas, cs = _straight_edge_metrics(contour, cell_area=0.0) + assert ser == 0.0 + assert cas == 0.0 + assert cs == 0.0 + + +# --------------------------------------------------------------------------- +# Per-tile scoring +# --------------------------------------------------------------------------- + + +class TestScoreTile: + """Tests for _score_tile.""" + + def test_empty_labels(self): + labels = np.zeros((50, 50), dtype=np.int32) + df = _score_tile(labels) + assert df.empty + assert list(df.columns) == [ + "max_straight_edge_ratio", + "cardinal_alignment_score", + "cut_score", + ] + + def test_single_cell(self): + from skimage.draw import disk + labels = np.zeros((50, 50), dtype=np.int32) + rr, cc = disk((25, 25), 15, shape=(50, 50)) + labels[rr, cc] = 1 + df = _score_tile(labels) + assert len(df) == 1 + assert df.index[0] == 1 + assert not df.isna().any().any() + + def test_cell_below_min_area_gets_nan(self): + labels = np.zeros((50, 50), dtype=np.int32) + labels[10, 10] = 1 + df = _score_tile(labels, min_area=5) + assert len(df) == 1 + assert df.iloc[0].isna().all() + + def test_rectangle_has_high_straight_ratio(self): + labels = np.zeros((50, 50), dtype=np.int32) + labels[5:45, 5:15] = 1 + df = _score_tile(labels) + assert df.loc[1, "max_straight_edge_ratio"] > 1.0 + + def test_downsample(self): + from skimage.draw import disk + labels = np.zeros((100, 100), dtype=np.int32) + rr, cc = disk((50, 50), 30, shape=(100, 100)) + labels[rr, cc] = 1 + df1 = _score_tile(labels, downsample=1) + df2 = _score_tile(labels, downsample=2) + assert len(df2) == 1 + assert abs(df1.loc[1, "max_straight_edge_ratio"] - df2.loc[1, "max_straight_edge_ratio"]) < 0.3 + + +# --------------------------------------------------------------------------- +# End-to-end tests with fixture +# --------------------------------------------------------------------------- + + +class TestCalculateTilingQC: + """Tests for calculate_tiling_qc using the tile-boundary fixture.""" + + def test_returns_anndata_with_scores_in_obs(self, sdata_tile_boundary): + sdata, gt = sdata_tile_boundary + adata = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + ) + assert adata.n_obs == len(gt.cut_cell_ids) + len(gt.intact_cell_ids) + assert adata.n_vars == 0 + for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: + assert col in adata.obs.columns + + def test_inplace_stores_in_default_table_key(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + result = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=True, + ) + assert result is None + assert "labels_qc" in sdata.tables + + def test_spatialdata_attrs(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + adata = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + ) + assert adata.uns["spatialdata_attrs"]["region"] == "labels" + assert "label_id" in adata.obs.columns + + def test_centroids_stored_in_obs(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + adata = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + ) + assert "centroid_y" in adata.obs.columns + assert "centroid_x" in adata.obs.columns + # Centroids should be within image bounds (400x400) + assert (adata.obs["centroid_y"] >= 0).all() + assert (adata.obs["centroid_x"] >= 0).all() + assert (adata.obs["centroid_y"] < 400).all() + assert (adata.obs["centroid_x"] < 400).all() + + def test_params_stored_in_uns(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + adata = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, + distance_tol=1.0, min_area=10, downsample=2, inplace=False, + ) + params = adata.uns["tiling_qc"] + assert params["tile_size"] == 200 + assert params["distance_tol"] == 1.0 + assert params["min_area"] == 10 + assert params["downsample"] == 2 + assert params["scale"] is None + + def test_cut_cells_score_higher_than_intact(self, sdata_tile_boundary): + sdata, gt = sdata_tile_boundary + adata = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + ) + obs = adata.obs + cut = obs[obs["label_id"].isin(gt.cut_cell_ids)]["max_straight_edge_ratio"].dropna() + intact = obs[obs["label_id"].isin(gt.intact_cell_ids)]["max_straight_edge_ratio"].dropna() + assert cut.mean() > intact.mean() + + def test_score_ranges(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + adata = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + ) + for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: + valid = adata.obs[col].dropna() + assert (valid >= 0).all(), f"{col} has negative values" + + def test_cardinal_score_bounded(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + adata = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + ) + cardinal = adata.obs["cardinal_alignment_score"].dropna() + assert (cardinal >= 0).all() + assert (cardinal <= 1.0).all() + + def test_tiled_vs_single_tile(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + adata_tiled = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + ) + adata_single = calculate_tiling_qc( + sdata, labels_key="labels", tile_size=2000, inplace=False, + ) + df1 = adata_tiled.obs.set_index("label_id").sort_index() + df2 = adata_single.obs.set_index("label_id").sort_index() + + assert set(df1.index) == set(df2.index) + for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: + np.testing.assert_allclose( + df1[col].values, df2[col].values, atol=1e-10, equal_nan=True, + ) + + def test_invalid_labels_key(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + with pytest.raises(ValueError, match="not found"): + calculate_tiling_qc(sdata, labels_key="nonexistent", inplace=False) + + def test_custom_adata_key(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, + adata_key_added="my_qc", inplace=True, + ) + assert "my_qc" in sdata.tables + + +# --------------------------------------------------------------------------- +# Diagnostic plot +# --------------------------------------------------------------------------- + + +class TestPlotTilingQC: + """Tests for tiling_qc plot (delegates to spatialdata-plot).""" + + def test_plot_renders(self, sdata_tile_boundary): + import matplotlib + matplotlib.use("Agg") + + sdata, _ = sdata_tile_boundary + calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=True, + ) + tiling_qc(sdata, labels_key="labels") + import matplotlib.pyplot as plt + plt.close("all") + + def test_plot_custom_score_col(self, sdata_tile_boundary): + import matplotlib + matplotlib.use("Agg") + + sdata, _ = sdata_tile_boundary + calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=True, + ) + tiling_qc( + sdata, labels_key="labels", score_col="max_straight_edge_ratio", + ) + import matplotlib.pyplot as plt + plt.close("all") + + def test_plot_missing_qc_table(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + with pytest.raises(ValueError, match="not found"): + tiling_qc(sdata, labels_key="labels", qc_key="nonexistent") + + def test_plot_invalid_score_col(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=True, + ) + with pytest.raises(ValueError, match="not found"): + tiling_qc(sdata, labels_key="labels", score_col="invalid") + + +# --------------------------------------------------------------------------- +# Visual regression tests (PlotTester) +# --------------------------------------------------------------------------- + + +@pytest.fixture() +def sdata_with_qc(sdata_tile_boundary): + """SpatialData with tiling QC already computed.""" + sdata, _ = sdata_tile_boundary + calculate_tiling_qc(sdata, labels_key="labels", tile_size=200, inplace=True) + return sdata + + +class TestTilingQCVisual(PlotTester, metaclass=PlotTesterMeta): + def test_plot_tiling_qc_cut_score(self, sdata_with_qc): + """Visual: labels coloured by cut_score.""" + tiling_qc(sdata_with_qc, labels_key="labels", score_col="cut_score") + + def test_plot_tiling_qc_straight_edge_ratio(self, sdata_with_qc): + """Visual: labels coloured by max_straight_edge_ratio.""" + tiling_qc( + sdata_with_qc, labels_key="labels", + score_col="max_straight_edge_ratio", + ) From 8020a1ed7b02d90c236cdd3207abac80f902a7f1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 22:11:58 +0000 Subject: [PATCH 02/24] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/squidpy/experimental/tl/_tiling_qc.py | 32 ++----- tests/experimental/test_tiling_qc.py | 112 ++++++++++++++++------ 2 files changed, 93 insertions(+), 51 deletions(-) diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py index 92af45200..e1e482646 100644 --- a/src/squidpy/experimental/tl/_tiling_qc.py +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -283,9 +283,7 @@ def _compute_centroids_for_labels( """Compute cell centroids using the most efficient strategy available.""" if isinstance(sdata.labels[labels_key], xr.DataTree): logg.info("Computing centroids from coarse scale.") - return compute_cell_info_multiscale( - sdata.labels[labels_key], target_scale=scale or "scale0" - ) + return compute_cell_info_multiscale(sdata.labels[labels_key], target_scale=scale or "scale0") n_pixels = labels_da.sizes.get("y", 1) * labels_da.sizes.get("x", 1) if n_pixels <= 4096 * 4096: @@ -376,9 +374,7 @@ def calculate_tiling_qc( """ # --- Validate --- if labels_key not in sdata.labels: - raise ValueError( - f"Labels key '{labels_key}' not found, valid keys: {list(sdata.labels.keys())}" - ) + raise ValueError(f"Labels key '{labels_key}' not found, valid keys: {list(sdata.labels.keys())}") # --- Resolve labels DataArray (stays lazy) --- labels_node = sdata.labels[labels_key] @@ -398,12 +394,9 @@ def calculate_tiling_qc( W = int(labels_da.sizes.get("x", labels_da.shape[-1])) # --- Build tile specs --- - specs = build_tile_specs( - (H, W), cell_info, tile_size=tile_size, overlap_margin=overlap_margin - ) + specs = build_tile_specs((H, W), cell_info, tile_size=tile_size, overlap_margin=overlap_margin) logg.info( - f"Tiling QC: {len(specs)} tiles ({tile_size}x{tile_size}, " - f"margin={overlap_margin}, downsample={downsample}x)." + f"Tiling QC: {len(specs)} tiles ({tile_size}x{tile_size}, margin={overlap_margin}, downsample={downsample}x)." ) # --- Process tiles (labels only — no image needed) --- @@ -412,9 +405,7 @@ def _process_one(spec, idx): logg.debug(f"Tiling QC tile {idx + 1}/{len(specs)}: {len(spec.owned_ids)} cells.") return _score_tile(tile_lbl, distance_tol=distance_tol, min_area=min_area, downsample=downsample) - results = Parallel(n_jobs=n_jobs, prefer="threads")( - delayed(_process_one)(spec, i) for i, spec in enumerate(specs) - ) + results = Parallel(n_jobs=n_jobs, prefer="threads")(delayed(_process_one)(spec, i) for i, spec in enumerate(specs)) tile_dfs = [df for df in results if not df.empty] if not tile_dfs: @@ -425,10 +416,7 @@ def _process_one(spec, idx): # Sanity: each cell should appear in exactly one tile if combined.index.duplicated().any(): dups = combined.index[combined.index.duplicated()].unique().tolist() - raise RuntimeError( - f"Duplicate cell IDs across tiles — tile ownership may be broken. " - f"Duplicates: {dups}" - ) + raise RuntimeError(f"Duplicate cell IDs across tiles — tile ownership may be broken. Duplicates: {dups}") # --- Build AnnData (scores in .obs, empty .X) --- n_cells = len(combined) @@ -451,12 +439,8 @@ def _process_one(spec, idx): adata.obs[col] = combined[col].values # Centroids (already computed without materialising the full array) - adata.obs["centroid_y"] = np.array( - [cell_info[lid].centroid_y for lid in combined.index] - ) - adata.obs["centroid_x"] = np.array( - [cell_info[lid].centroid_x for lid in combined.index] - ) + adata.obs["centroid_y"] = np.array([cell_info[lid].centroid_y for lid in combined.index]) + adata.obs["centroid_x"] = np.array([cell_info[lid].centroid_x for lid in combined.index]) # Algorithm parameters in uns adata.uns[_METHOD_KEY] = { diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index 700f590a9..a6abdb02a 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -40,14 +40,16 @@ def test_perfectly_straight_vertical(self): def test_staircase_is_straight(self): """A pixel staircase (alternating cardinal/diagonal steps) is collinear.""" - contour = np.array([ - [0.0, 0.5], - [0.5, 1.0], - [0.5, 2.0], - [1.0, 2.5], - [1.0, 3.5], - [1.5, 4.0], - ]) + contour = np.array( + [ + [0.0, 0.5], + [0.5, 1.0], + [0.5, 2.0], + [1.0, 2.5], + [1.0, 3.5], + [1.5, 4.0], + ] + ) length, _ = _longest_collinear_segment(contour, distance_tol=0.75) assert length > 3.0 @@ -125,6 +127,7 @@ def test_empty_labels(self): def test_single_cell(self): from skimage.draw import disk + labels = np.zeros((50, 50), dtype=np.int32) rr, cc = disk((25, 25), 15, shape=(50, 50)) labels[rr, cc] = 1 @@ -148,6 +151,7 @@ def test_rectangle_has_high_straight_ratio(self): def test_downsample(self): from skimage.draw import disk + labels = np.zeros((100, 100), dtype=np.int32) rr, cc = disk((50, 50), 30, shape=(100, 100)) labels[rr, cc] = 1 @@ -168,7 +172,10 @@ class TestCalculateTilingQC: def test_returns_anndata_with_scores_in_obs(self, sdata_tile_boundary): sdata, gt = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) assert adata.n_obs == len(gt.cut_cell_ids) + len(gt.intact_cell_ids) assert adata.n_vars == 0 @@ -178,7 +185,10 @@ def test_returns_anndata_with_scores_in_obs(self, sdata_tile_boundary): def test_inplace_stores_in_default_table_key(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary result = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=True, + sdata, + labels_key="labels", + tile_size=200, + inplace=True, ) assert result is None assert "labels_qc" in sdata.tables @@ -186,7 +196,10 @@ def test_inplace_stores_in_default_table_key(self, sdata_tile_boundary): def test_spatialdata_attrs(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) assert adata.uns["spatialdata_attrs"]["region"] == "labels" assert "label_id" in adata.obs.columns @@ -194,7 +207,10 @@ def test_spatialdata_attrs(self, sdata_tile_boundary): def test_centroids_stored_in_obs(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) assert "centroid_y" in adata.obs.columns assert "centroid_x" in adata.obs.columns @@ -207,8 +223,13 @@ def test_centroids_stored_in_obs(self, sdata_tile_boundary): def test_params_stored_in_uns(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, - distance_tol=1.0, min_area=10, downsample=2, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + distance_tol=1.0, + min_area=10, + downsample=2, + inplace=False, ) params = adata.uns["tiling_qc"] assert params["tile_size"] == 200 @@ -220,7 +241,10 @@ def test_params_stored_in_uns(self, sdata_tile_boundary): def test_cut_cells_score_higher_than_intact(self, sdata_tile_boundary): sdata, gt = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) obs = adata.obs cut = obs[obs["label_id"].isin(gt.cut_cell_ids)]["max_straight_edge_ratio"].dropna() @@ -230,7 +254,10 @@ def test_cut_cells_score_higher_than_intact(self, sdata_tile_boundary): def test_score_ranges(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: valid = adata.obs[col].dropna() @@ -239,7 +266,10 @@ def test_score_ranges(self, sdata_tile_boundary): def test_cardinal_score_bounded(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) cardinal = adata.obs["cardinal_alignment_score"].dropna() assert (cardinal >= 0).all() @@ -248,10 +278,16 @@ def test_cardinal_score_bounded(self, sdata_tile_boundary): def test_tiled_vs_single_tile(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary adata_tiled = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) adata_single = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=2000, inplace=False, + sdata, + labels_key="labels", + tile_size=2000, + inplace=False, ) df1 = adata_tiled.obs.set_index("label_id").sort_index() df2 = adata_single.obs.set_index("label_id").sort_index() @@ -259,7 +295,10 @@ def test_tiled_vs_single_tile(self, sdata_tile_boundary): assert set(df1.index) == set(df2.index) for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: np.testing.assert_allclose( - df1[col].values, df2[col].values, atol=1e-10, equal_nan=True, + df1[col].values, + df2[col].values, + atol=1e-10, + equal_nan=True, ) def test_invalid_labels_key(self, sdata_tile_boundary): @@ -270,8 +309,11 @@ def test_invalid_labels_key(self, sdata_tile_boundary): def test_custom_adata_key(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, - adata_key_added="my_qc", inplace=True, + sdata, + labels_key="labels", + tile_size=200, + adata_key_added="my_qc", + inplace=True, ) assert "my_qc" in sdata.tables @@ -286,28 +328,40 @@ class TestPlotTilingQC: def test_plot_renders(self, sdata_tile_boundary): import matplotlib + matplotlib.use("Agg") sdata, _ = sdata_tile_boundary calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=True, + sdata, + labels_key="labels", + tile_size=200, + inplace=True, ) tiling_qc(sdata, labels_key="labels") import matplotlib.pyplot as plt + plt.close("all") def test_plot_custom_score_col(self, sdata_tile_boundary): import matplotlib + matplotlib.use("Agg") sdata, _ = sdata_tile_boundary calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=True, + sdata, + labels_key="labels", + tile_size=200, + inplace=True, ) tiling_qc( - sdata, labels_key="labels", score_col="max_straight_edge_ratio", + sdata, + labels_key="labels", + score_col="max_straight_edge_ratio", ) import matplotlib.pyplot as plt + plt.close("all") def test_plot_missing_qc_table(self, sdata_tile_boundary): @@ -318,7 +372,10 @@ def test_plot_missing_qc_table(self, sdata_tile_boundary): def test_plot_invalid_score_col(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=True, + sdata, + labels_key="labels", + tile_size=200, + inplace=True, ) with pytest.raises(ValueError, match="not found"): tiling_qc(sdata, labels_key="labels", score_col="invalid") @@ -345,6 +402,7 @@ def test_plot_tiling_qc_cut_score(self, sdata_with_qc): def test_plot_tiling_qc_straight_edge_ratio(self, sdata_with_qc): """Visual: labels coloured by max_straight_edge_ratio.""" tiling_qc( - sdata_with_qc, labels_key="labels", + sdata_with_qc, + labels_key="labels", score_col="max_straight_edge_ratio", ) From de15686565a6e98899aa09c56ece638d0bbf7090 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 00:19:25 +0200 Subject: [PATCH 03/24] Increase fixture density, pin spatialdata-plot>=0.3.3 - Bump fixture from 40 cells on 400x400 to 120 cells on 600x600 for more visible tile-grid pattern in diagnostic plots - Pin spatialdata-plot>=0.3.3 for correct continuous color rendering - Regenerate visual reference images - Use _IMAGE_SIZE constant in centroid bounds test Co-Authored-By: Claude Opus 4.6 (1M context) --- pyproject.toml | 2 +- .../TilingQCVisual_tiling_qc_cut_score.png | Bin 7213 -> 9660 bytes ...QCVisual_tiling_qc_straight_edge_ratio.png | Bin 7213 -> 9421 bytes tests/experimental/conftest.py | 8 ++++---- tests/experimental/test_tiling_qc.py | 7 ++++--- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 06e9dfc5a..8f2bf00fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,7 +67,7 @@ dependencies = [ # due to https://github.com/scikit-image/scikit-image/issues/6850 breaks rescale ufunc "scikit-learn>=0.24", "spatialdata>=0.7.1", - "spatialdata-plot", + "spatialdata-plot>=0.3.3", "statsmodels>=0.12", # https://github.com/scverse/squidpy/issues/526 "tifffile!=2022.4.22", diff --git a/tests/_images/TilingQCVisual_tiling_qc_cut_score.png b/tests/_images/TilingQCVisual_tiling_qc_cut_score.png index 5097a44fffbbd03ffad27fbcf6816d9e0654f1d6..d7b9c35ee27f1428113661ae43a871591d1fc643 100644 GIT binary patch delta 9616 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 diff --git a/tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png b/tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png index 5097a44fffbbd03ffad27fbcf6816d9e0654f1d6..cbbba2b5bfcf62d16364ba9c3b97ed0a547e34cc 100644 GIT binary patch delta 9375 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 Z{vVdtENP$rXpjH^002ovPDHLkV1i>KLd5_8 delta 7149 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 diff --git a/tests/experimental/conftest.py b/tests/experimental/conftest.py index 4e33b9c3b..3e93b9bac 100644 --- a/tests/experimental/conftest.py +++ b/tests/experimental/conftest.py @@ -20,12 +20,12 @@ # Tile-boundary QC fixture # --------------------------------------------------------------------------- -_IMAGE_SIZE = 400 -_TILE_BORDERS = (133, 267) # 3×3 grid on 400 px → borders at 133, 267 +_IMAGE_SIZE = 600 +_TILE_BORDERS = (200, 400) # 3×3 grid on 600 px → borders at 200, 400 _BORDER_GAP = 2 # pixels zeroed at each tile border _CELL_GAP = 2 # minimum gap between any two cells -_N_CELLS_TARGET = 40 -_SEMI_AXIS_RANGE = (8, 20) # semi-axis lengths in pixels +_N_CELLS_TARGET = 120 +_SEMI_AXIS_RANGE = (6, 16) # semi-axis lengths in pixels @dataclass diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index a6abdb02a..8e6321726 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -214,11 +214,12 @@ def test_centroids_stored_in_obs(self, sdata_tile_boundary): ) assert "centroid_y" in adata.obs.columns assert "centroid_x" in adata.obs.columns - # Centroids should be within image bounds (400x400) + # Centroids should be within image bounds + from tests.experimental.conftest import _IMAGE_SIZE assert (adata.obs["centroid_y"] >= 0).all() assert (adata.obs["centroid_x"] >= 0).all() - assert (adata.obs["centroid_y"] < 400).all() - assert (adata.obs["centroid_x"] < 400).all() + assert (adata.obs["centroid_y"] < _IMAGE_SIZE).all() + assert (adata.obs["centroid_x"] < _IMAGE_SIZE).all() def test_params_stored_in_uns(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary From c1636a12f0a74fe2955a5595dedfe2fc168a59be Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 22:19:47 +0000 Subject: [PATCH 04/24] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/experimental/test_tiling_qc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index 8e6321726..13f142c3e 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -216,6 +216,7 @@ def test_centroids_stored_in_obs(self, sdata_tile_boundary): assert "centroid_x" in adata.obs.columns # Centroids should be within image bounds from tests.experimental.conftest import _IMAGE_SIZE + assert (adata.obs["centroid_y"] >= 0).all() assert (adata.obs["centroid_x"] >= 0).all() assert (adata.obs["centroid_y"] < _IMAGE_SIZE).all() From d86fafbed57d00979044f94c4f969777713f5a23 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 00:43:00 +0200 Subject: [PATCH 05/24] Numba-accelerate collinearity scan, fix progress bar, vectorise helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JIT-compile the two-pointer collinearity scan with @njit for ~10-50x speedup on the per-cell hot path - Cap contour points at 500 via arc-length resampling to bound O(n²) - Handle contour closure: scan 3 rotations so straight segments crossing the start/end junction are not split - Vectorise _resample_contour with np.searchsorted (no Python loops) - Replace _zero_non_owned loop with single np.isin pass - Add tqdm progress bar that tracks cells (not tiles), updates on completion for correct parallel reporting - Extract _SCORE_COLUMNS / _NAN_SCORES constants to deduplicate - Precompute segment lengths once across rotations Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/im/_tiling.py | 6 +- src/squidpy/experimental/tl/_tiling_qc.py | 220 ++++++++++++++++------ 2 files changed, 163 insertions(+), 63 deletions(-) diff --git a/src/squidpy/experimental/im/_tiling.py b/src/squidpy/experimental/im/_tiling.py index 259bc2319..25e0d3430 100644 --- a/src/squidpy/experimental/im/_tiling.py +++ b/src/squidpy/experimental/im/_tiling.py @@ -388,9 +388,9 @@ def extract_labels_tile_lazy( def _zero_non_owned(tile_labels: np.ndarray, owned_ids: frozenset[int]) -> None: """Zero out labels not in *owned_ids* (in-place).""" - for lid in np.unique(tile_labels): - if lid != 0 and lid not in owned_ids: - tile_labels[tile_labels == lid] = 0 + owned_arr = np.array(list(owned_ids), dtype=tile_labels.dtype) + mask = ~np.isin(tile_labels, owned_arr) & (tile_labels != 0) + tile_labels[mask] = 0 # --------------------------------------------------------------------------- diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py index e1e482646..3e439b706 100644 --- a/src/squidpy/experimental/tl/_tiling_qc.py +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -18,6 +18,7 @@ from __future__ import annotations +import math from typing import Literal import anndata as ad @@ -25,6 +26,7 @@ import pandas as pd import xarray as xr from joblib import Parallel, delayed +from numba import njit from skimage.measure import find_contours, regionprops from spatialdata import SpatialData from spatialdata._logging import logger as logg @@ -49,22 +51,115 @@ # sub-pixel contours from marching squares. _DEFAULT_DISTANCE_TOL = 0.75 +# Maximum contour points to analyse. Longer contours are resampled +# to this length via equidistant arc-length interpolation to bound +# the O(n²) two-pointer scan. +_MAX_CONTOUR_POINTS = 500 + +_SCORE_COLUMNS = ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"] +_NAN_SCORES = {col: np.nan for col in _SCORE_COLUMNS} + # --------------------------------------------------------------------------- # Core geometry # --------------------------------------------------------------------------- +@njit(cache=True) +def _collinear_scan( + contour: np.ndarray, + cum_arc: np.ndarray, + total_arc: float, + distance_tol: float, +) -> tuple[float, float]: + """Numba-accelerated two-pointer collinearity scan. + + For each start index, extends the end index as long as all + intermediate points stay within ``distance_tol`` of the + start→end line. Returns ``(best_length, best_angle)``. + """ + n = contour.shape[0] + best_len = 0.0 + best_angle = 0.0 + + for start in range(n - 2): + remaining_arc = total_arc - cum_arc[start] + if remaining_arc <= best_len: + break + + for end in range(start + 2, n): + d0 = contour[end, 0] - contour[start, 0] + d1 = contour[end, 1] - contour[start, 1] + seg_len = math.sqrt(d0 * d0 + d1 * d1) + if seg_len < 1e-12: + continue + + # Max perpendicular distance of intermediate points + max_perp = 0.0 + for k in range(start + 1, end): + r0 = contour[k, 0] - contour[start, 0] + r1 = contour[k, 1] - contour[start, 1] + perp = abs(d0 * r1 - d1 * r0) / seg_len + if perp > max_perp: + max_perp = perp + if perp > distance_tol: + break + + if max_perp > distance_tol: + break + + if seg_len > best_len: + best_len = seg_len + best_angle = math.atan2(d0, d1) + + return best_len, best_angle + + +def _resample_contour(contour: np.ndarray, max_points: int) -> np.ndarray: + """Resample a contour to at most *max_points* via arc-length interpolation. + + Fully vectorised using :func:`numpy.searchsorted` — no Python + loops. Preserves geometry far better than naive stride-based + subsampling because points are placed equidistantly along the + contour arc. + """ + n = len(contour) + if n <= max_points: + return contour + + diffs = np.diff(contour, axis=0) + seg_lengths = np.sqrt((diffs**2).sum(axis=1)) + cum_arc = np.empty(n, dtype=np.float64) + cum_arc[0] = 0.0 + cum_arc[1:] = np.cumsum(seg_lengths) + total = cum_arc[-1] + + if total < 1e-12: + return contour[:max_points] + + targets = np.linspace(0.0, total, max_points) + + # For each target, find the segment it falls into + idx = np.searchsorted(cum_arc, targets, side="right") - 1 + idx = np.clip(idx, 0, n - 2) + + seg = cum_arc[idx + 1] - cum_arc[idx] + safe_seg = np.where(seg < 1e-12, 1.0, seg) + frac = np.where(seg < 1e-12, 0.0, (targets - cum_arc[idx]) / safe_seg) + + return contour[idx] + frac[:, np.newaxis] * (contour[idx + 1] - contour[idx]) + + def _longest_collinear_segment( contour: np.ndarray, distance_tol: float = _DEFAULT_DISTANCE_TOL, ) -> tuple[float, float]: """Find the longest collinear run of contour points. - Uses a two-pointer approach: for each start index, extend the end - index as long as all intermediate points are within - ``distance_tol`` of the line from start to end. Early exit when - remaining points cannot beat the current best. + Uses a numba-compiled two-pointer scan with three contour + rotations to handle the closure point. Long contours are + resampled to at most :data:`_MAX_CONTOUR_POINTS` via arc-length + interpolation to bound worst-case runtime. Parameters ---------- @@ -85,42 +180,47 @@ def _longest_collinear_segment( if n < 3: return 0.0, 0.0 - best_len = 0.0 - best_angle = 0.0 - - # Precompute cumulative arc length for early-exit bound - diffs_all = np.diff(contour, axis=0) - seg_lengths = np.sqrt((diffs_all**2).sum(axis=1)) - cum_arc = np.zeros(n, dtype=np.float64) - cum_arc[1:] = np.cumsum(seg_lengths) - total_arc = cum_arc[-1] - - for start in range(n - 2): - # Upper bound: arc length from start to end of contour - remaining_arc = total_arc - cum_arc[start] - if remaining_arc <= best_len: - break # no start from here or later can beat best + pts = np.asarray(contour, dtype=np.float64) + pts = _resample_contour(pts, _MAX_CONTOUR_POINTS) + n = len(pts) - for end in range(start + 2, n): - p0 = contour[start] - p1 = contour[end] - d = p1 - p0 - seg_len = np.sqrt(d[0] ** 2 + d[1] ** 2) - if seg_len < 1e-12: - continue + # find_contours returns closed contours (first ≈ last point) + closed = np.sqrt(((pts[0] - pts[-1]) ** 2).sum()) < 1.0 - # Perpendicular distances of all intermediate points - intermediates = contour[start + 1 : end] - rel = intermediates - p0 - cross = np.abs(d[0] * rel[:, 1] - d[1] * rel[:, 0]) - max_perp = cross.max() / seg_len + # For closed contours, drop the duplicate last point and precompute + # segment lengths once — rotations reuse the same distances. + if closed and n > 6: + core = pts[:-1] + core_diffs = np.diff(core, axis=0) + core_seg_lens = np.sqrt((core_diffs**2).sum(axis=1)) + rotations = [0, len(core) // 3, 2 * len(core) // 3] + else: + core = pts + core_diffs = np.diff(core, axis=0) + core_seg_lens = np.sqrt((core_diffs**2).sum(axis=1)) + rotations = [0] - if max_perp > distance_tol: - break + best_len = 0.0 + best_angle = 0.0 - if seg_len > best_len: - best_len = seg_len - best_angle = float(np.arctan2(d[0], d[1])) + # Scan at multiple rotations so straight segments crossing the + # closure point are not split. + for shift in rotations: + if shift == 0: + rotated = core + sl = core_seg_lens + else: + rotated = np.roll(core, -shift, axis=0) + sl = np.roll(core_seg_lens, -shift) + + cum_arc = np.empty(len(rotated), dtype=np.float64) + cum_arc[0] = 0.0 + cum_arc[1:] = np.cumsum(sl) + + length, angle = _collinear_scan(rotated, cum_arc, cum_arc[-1], distance_tol) + if length > best_len: + best_len = length + best_angle = angle return best_len, best_angle @@ -213,10 +313,7 @@ def _score_tile( """ regions = regionprops(tile_labels) if not regions: - return pd.DataFrame( - columns=["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"], - dtype=float, - ) + return pd.DataFrame(columns=_SCORE_COLUMNS, dtype=float) rows: dict[int, dict[str, float]] = {} @@ -225,39 +322,25 @@ def _score_tile( area = region.area if area < min_area * (downsample**2): - rows[lid] = { - "max_straight_edge_ratio": np.nan, - "cardinal_alignment_score": np.nan, - "cut_score": np.nan, - } + rows[lid] = dict(_NAN_SCORES) continue - # Extract bbox crop for efficient contour finding. # Pad with 1px of zeros so find_contours can trace cells # that touch the crop edge (e.g., cells filling their bbox). min_row, min_col, max_row, max_col = region.bbox crop = (tile_labels[min_row:max_row, min_col:max_col] == lid).astype(np.float32) crop = np.pad(crop, 1, mode="constant", constant_values=0) - # Optionally downsample for speed if downsample > 1: crop = crop[::downsample, ::downsample] contours = find_contours(crop, 0.5) if not contours: - rows[lid] = { - "max_straight_edge_ratio": np.nan, - "cardinal_alignment_score": np.nan, - "cut_score": np.nan, - } + rows[lid] = dict(_NAN_SCORES) continue - # Use the longest contour (exterior boundary) contour = max(contours, key=len) - - # Scale area to analysis resolution for consistent normalisation analysis_area = area / (downsample**2) if downsample > 1 else area - ser, cas, cs = _straight_edge_metrics(contour, analysis_area, distance_tol) rows[lid] = { @@ -400,12 +483,29 @@ def calculate_tiling_qc( ) # --- Process tiles (labels only — no image needed) --- - def _process_one(spec, idx): + n_cells_total = sum(len(s.owned_ids) for s in specs) + + try: + import ipywidgets # noqa: F401 + + from tqdm.auto import tqdm + except ImportError: + from tqdm.std import tqdm + + pbar = tqdm(total=n_cells_total, desc="Scoring cells", unit="cells") + + def _process_one(spec): tile_lbl = extract_labels_tile_lazy(labels_da, spec) - logg.debug(f"Tiling QC tile {idx + 1}/{len(specs)}: {len(spec.owned_ids)} cells.") - return _score_tile(tile_lbl, distance_tol=distance_tol, min_area=min_area, downsample=downsample) + df = _score_tile(tile_lbl, distance_tol=distance_tol, min_area=min_area, downsample=downsample) + pbar.update(len(spec.owned_ids)) + return df + + if n_jobs == 1: + results = [_process_one(spec) for spec in specs] + else: + results = Parallel(n_jobs=n_jobs, prefer="threads")(delayed(_process_one)(spec) for spec in specs) - results = Parallel(n_jobs=n_jobs, prefer="threads")(delayed(_process_one)(spec, i) for i, spec in enumerate(specs)) + pbar.close() tile_dfs = [df for df in results if not df.empty] if not tile_dfs: From 801546b50fd38c5b61de28693f03ae7660a7a8f8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 22:43:44 +0000 Subject: [PATCH 06/24] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/squidpy/experimental/tl/_tiling_qc.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py index 3e439b706..42011bf95 100644 --- a/src/squidpy/experimental/tl/_tiling_qc.py +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -487,7 +487,6 @@ def calculate_tiling_qc( try: import ipywidgets # noqa: F401 - from tqdm.auto import tqdm except ImportError: from tqdm.std import tqdm From 6bb7f2a5a536c65a7e59742166233196d4c93ace Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 00:46:40 +0200 Subject: [PATCH 07/24] Trim tests to core behavioural + visual, add cardinal alignment visual Drop 29 tests that over-tested private internals. Keep 4 behavioural tests (output structure, metric discrimination, tiling invariant, error handling) and 3 visual regression tests (one per score column). Co-Authored-By: Claude Opus 4.6 (1M context) --- ...gQCVisual_tiling_qc_cardinal_alignment.png | Bin 0 -> 11207 bytes tests/experimental/test_tiling_qc.py | 347 +----------------- 2 files changed, 17 insertions(+), 330 deletions(-) create mode 100644 tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png diff --git a/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png b/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png new file mode 100644 index 0000000000000000000000000000000000000000..eb660a350418a80e1fe5e49142d20d3dc9abdba2 GIT binary patch literal 11207 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 arctan2(0, 1) = 0 - assert abs(angle) < 0.1 - - def test_perfectly_straight_vertical(self): - """A vertical line should be detected as fully straight.""" - contour = np.array([[i, 0.0] for i in range(15)]) - length, angle = _longest_collinear_segment(contour) - assert length == pytest.approx(14.0, abs=0.1) - assert abs(angle - np.pi / 2) < 0.1 - - def test_staircase_is_straight(self): - """A pixel staircase (alternating cardinal/diagonal steps) is collinear.""" - contour = np.array( - [ - [0.0, 0.5], - [0.5, 1.0], - [0.5, 2.0], - [1.0, 2.5], - [1.0, 3.5], - [1.5, 4.0], - ] - ) - length, _ = _longest_collinear_segment(contour, distance_tol=0.75) - assert length > 3.0 - - def test_circle_has_short_segments(self): - """A circle should have no long straight segments.""" - t = np.linspace(0, 2 * np.pi, 60, endpoint=False) - contour = np.column_stack([10 * np.sin(t), 10 * np.cos(t)]) - length, _ = _longest_collinear_segment(contour) - assert length < 10.0 - - def test_too_few_points(self): - """Contours with fewer than 3 points return zero.""" - length, angle = _longest_collinear_segment(np.array([[0, 0], [1, 1]])) - assert length == 0.0 - - def test_empty_contour(self): - length, angle = _longest_collinear_segment(np.array([]).reshape(0, 2)) - assert length == 0.0 - - -class TestCardinalAlignment: - """Tests for _cardinal_alignment.""" - - def test_horizontal(self): - assert _cardinal_alignment(0.0) == pytest.approx(1.0) - - def test_vertical(self): - assert _cardinal_alignment(np.pi / 2) == pytest.approx(1.0) - - def test_diagonal(self): - assert _cardinal_alignment(np.pi / 4) == pytest.approx(0.0) - - def test_negative_angle(self): - assert _cardinal_alignment(-np.pi / 2) == pytest.approx(1.0) - - def test_near_pi(self): - assert _cardinal_alignment(np.pi - 0.01) == pytest.approx(1.0, abs=0.05) - - -class TestStraightEdgeMetrics: - """Tests for _straight_edge_metrics.""" - - def test_output_range(self): - contour = np.array([[0.0, i] for i in range(10)]) - ser, cas, cs = _straight_edge_metrics(contour, cell_area=50.0) - assert ser >= 0 - assert 0 <= cas <= 1.0 - assert cs >= 0 - - def test_zero_area(self): - contour = np.array([[0.0, i] for i in range(10)]) - ser, cas, cs = _straight_edge_metrics(contour, cell_area=0.0) - assert ser == 0.0 - assert cas == 0.0 - assert cs == 0.0 - - -# --------------------------------------------------------------------------- -# Per-tile scoring -# --------------------------------------------------------------------------- - - -class TestScoreTile: - """Tests for _score_tile.""" - - def test_empty_labels(self): - labels = np.zeros((50, 50), dtype=np.int32) - df = _score_tile(labels) - assert df.empty - assert list(df.columns) == [ - "max_straight_edge_ratio", - "cardinal_alignment_score", - "cut_score", - ] - - def test_single_cell(self): - from skimage.draw import disk - - labels = np.zeros((50, 50), dtype=np.int32) - rr, cc = disk((25, 25), 15, shape=(50, 50)) - labels[rr, cc] = 1 - df = _score_tile(labels) - assert len(df) == 1 - assert df.index[0] == 1 - assert not df.isna().any().any() - - def test_cell_below_min_area_gets_nan(self): - labels = np.zeros((50, 50), dtype=np.int32) - labels[10, 10] = 1 - df = _score_tile(labels, min_area=5) - assert len(df) == 1 - assert df.iloc[0].isna().all() - - def test_rectangle_has_high_straight_ratio(self): - labels = np.zeros((50, 50), dtype=np.int32) - labels[5:45, 5:15] = 1 - df = _score_tile(labels) - assert df.loc[1, "max_straight_edge_ratio"] > 1.0 - - def test_downsample(self): - from skimage.draw import disk - - labels = np.zeros((100, 100), dtype=np.int32) - rr, cc = disk((50, 50), 30, shape=(100, 100)) - labels[rr, cc] = 1 - df1 = _score_tile(labels, downsample=1) - df2 = _score_tile(labels, downsample=2) - assert len(df2) == 1 - assert abs(df1.loc[1, "max_straight_edge_ratio"] - df2.loc[1, "max_straight_edge_ratio"]) < 0.3 - # --------------------------------------------------------------------------- -# End-to-end tests with fixture +# Core behavioural tests # --------------------------------------------------------------------------- class TestCalculateTilingQC: """Tests for calculate_tiling_qc using the tile-boundary fixture.""" - def test_returns_anndata_with_scores_in_obs(self, sdata_tile_boundary): + def test_returns_anndata_with_scores(self, sdata_tile_boundary): sdata, gt = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=False, + sdata, labels_key="labels", tile_size=200, inplace=False, ) assert adata.n_obs == len(gt.cut_cell_ids) + len(gt.intact_cell_ids) assert adata.n_vars == 0 for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: assert col in adata.obs.columns - def test_inplace_stores_in_default_table_key(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - result = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=True, - ) - assert result is None - assert "labels_qc" in sdata.tables - - def test_spatialdata_attrs(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - adata = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=False, - ) - assert adata.uns["spatialdata_attrs"]["region"] == "labels" - assert "label_id" in adata.obs.columns - - def test_centroids_stored_in_obs(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - adata = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=False, - ) - assert "centroid_y" in adata.obs.columns - assert "centroid_x" in adata.obs.columns - # Centroids should be within image bounds - from tests.experimental.conftest import _IMAGE_SIZE - - assert (adata.obs["centroid_y"] >= 0).all() - assert (adata.obs["centroid_x"] >= 0).all() - assert (adata.obs["centroid_y"] < _IMAGE_SIZE).all() - assert (adata.obs["centroid_x"] < _IMAGE_SIZE).all() - - def test_params_stored_in_uns(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - adata = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - distance_tol=1.0, - min_area=10, - downsample=2, - inplace=False, - ) - params = adata.uns["tiling_qc"] - assert params["tile_size"] == 200 - assert params["distance_tol"] == 1.0 - assert params["min_area"] == 10 - assert params["downsample"] == 2 - assert params["scale"] is None - def test_cut_cells_score_higher_than_intact(self, sdata_tile_boundary): sdata, gt = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=False, + sdata, labels_key="labels", tile_size=200, inplace=False, ) obs = adata.obs cut = obs[obs["label_id"].isin(gt.cut_cell_ids)]["max_straight_edge_ratio"].dropna() intact = obs[obs["label_id"].isin(gt.intact_cell_ids)]["max_straight_edge_ratio"].dropna() assert cut.mean() > intact.mean() - def test_score_ranges(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - adata = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=False, - ) - for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: - valid = adata.obs[col].dropna() - assert (valid >= 0).all(), f"{col} has negative values" - - def test_cardinal_score_bounded(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - adata = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=False, - ) - cardinal = adata.obs["cardinal_alignment_score"].dropna() - assert (cardinal >= 0).all() - assert (cardinal <= 1.0).all() - def test_tiled_vs_single_tile(self, sdata_tile_boundary): + """Tiling must not change results — scores should be identical.""" sdata, _ = sdata_tile_boundary adata_tiled = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=False, + sdata, labels_key="labels", tile_size=200, inplace=False, ) adata_single = calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=2000, - inplace=False, + sdata, labels_key="labels", tile_size=2000, inplace=False, ) df1 = adata_tiled.obs.set_index("label_id").sort_index() df2 = adata_single.obs.set_index("label_id").sort_index() @@ -297,10 +53,7 @@ def test_tiled_vs_single_tile(self, sdata_tile_boundary): assert set(df1.index) == set(df2.index) for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: np.testing.assert_allclose( - df1[col].values, - df2[col].values, - atol=1e-10, - equal_nan=True, + df1[col].values, df2[col].values, atol=1e-10, equal_nan=True, ) def test_invalid_labels_key(self, sdata_tile_boundary): @@ -308,80 +61,6 @@ def test_invalid_labels_key(self, sdata_tile_boundary): with pytest.raises(ValueError, match="not found"): calculate_tiling_qc(sdata, labels_key="nonexistent", inplace=False) - def test_custom_adata_key(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - adata_key_added="my_qc", - inplace=True, - ) - assert "my_qc" in sdata.tables - - -# --------------------------------------------------------------------------- -# Diagnostic plot -# --------------------------------------------------------------------------- - - -class TestPlotTilingQC: - """Tests for tiling_qc plot (delegates to spatialdata-plot).""" - - def test_plot_renders(self, sdata_tile_boundary): - import matplotlib - - matplotlib.use("Agg") - - sdata, _ = sdata_tile_boundary - calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=True, - ) - tiling_qc(sdata, labels_key="labels") - import matplotlib.pyplot as plt - - plt.close("all") - - def test_plot_custom_score_col(self, sdata_tile_boundary): - import matplotlib - - matplotlib.use("Agg") - - sdata, _ = sdata_tile_boundary - calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=True, - ) - tiling_qc( - sdata, - labels_key="labels", - score_col="max_straight_edge_ratio", - ) - import matplotlib.pyplot as plt - - plt.close("all") - - def test_plot_missing_qc_table(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - with pytest.raises(ValueError, match="not found"): - tiling_qc(sdata, labels_key="labels", qc_key="nonexistent") - - def test_plot_invalid_score_col(self, sdata_tile_boundary): - sdata, _ = sdata_tile_boundary - calculate_tiling_qc( - sdata, - labels_key="labels", - tile_size=200, - inplace=True, - ) - with pytest.raises(ValueError, match="not found"): - tiling_qc(sdata, labels_key="labels", score_col="invalid") - # --------------------------------------------------------------------------- # Visual regression tests (PlotTester) @@ -401,6 +80,14 @@ def test_plot_tiling_qc_cut_score(self, sdata_with_qc): """Visual: labels coloured by cut_score.""" tiling_qc(sdata_with_qc, labels_key="labels", score_col="cut_score") + def test_plot_tiling_qc_cardinal_alignment(self, sdata_with_qc): + """Visual: labels coloured by cardinal_alignment_score.""" + tiling_qc( + sdata_with_qc, + labels_key="labels", + score_col="cardinal_alignment_score", + ) + def test_plot_tiling_qc_straight_edge_ratio(self, sdata_with_qc): """Visual: labels coloured by max_straight_edge_ratio.""" tiling_qc( From 7613f609cd7f8703a3ba8e780e91677153c0b1cb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 22:47:22 +0000 Subject: [PATCH 08/24] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/experimental/test_tiling_qc.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index 2f10553f3..6a40f04ff 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -9,7 +9,6 @@ from squidpy.experimental.tl._tiling_qc import calculate_tiling_qc from tests.conftest import PlotTester, PlotTesterMeta - # --------------------------------------------------------------------------- # Core behavioural tests # --------------------------------------------------------------------------- @@ -21,7 +20,10 @@ class TestCalculateTilingQC: def test_returns_anndata_with_scores(self, sdata_tile_boundary): sdata, gt = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) assert adata.n_obs == len(gt.cut_cell_ids) + len(gt.intact_cell_ids) assert adata.n_vars == 0 @@ -31,7 +33,10 @@ def test_returns_anndata_with_scores(self, sdata_tile_boundary): def test_cut_cells_score_higher_than_intact(self, sdata_tile_boundary): sdata, gt = sdata_tile_boundary adata = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) obs = adata.obs cut = obs[obs["label_id"].isin(gt.cut_cell_ids)]["max_straight_edge_ratio"].dropna() @@ -42,10 +47,16 @@ def test_tiled_vs_single_tile(self, sdata_tile_boundary): """Tiling must not change results — scores should be identical.""" sdata, _ = sdata_tile_boundary adata_tiled = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, ) adata_single = calculate_tiling_qc( - sdata, labels_key="labels", tile_size=2000, inplace=False, + sdata, + labels_key="labels", + tile_size=2000, + inplace=False, ) df1 = adata_tiled.obs.set_index("label_id").sort_index() df2 = adata_single.obs.set_index("label_id").sort_index() @@ -53,7 +64,10 @@ def test_tiled_vs_single_tile(self, sdata_tile_boundary): assert set(df1.index) == set(df2.index) for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: np.testing.assert_allclose( - df1[col].values, df2[col].values, atol=1e-10, equal_nan=True, + df1[col].values, + df2[col].values, + atol=1e-10, + equal_nan=True, ) def test_invalid_labels_key(self, sdata_tile_boundary): From 4511c7c3ae9cc579751e0fffc02b3efeac177806 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 01:49:38 +0200 Subject: [PATCH 09/24] Replace joblib with dask.delayed, add affinity-aware cpu_count - Replace joblib parallelisation with dask.delayed + dask.compute for native integration with dask-backed zarr data. Tiles are scheduled as delayed tasks; the dask scheduler handles chunk caching and worker management. - Add n_jobs parameter (default -1 = all CPUs) using a threaded scheduler, and an optional dask.distributed.Client parameter for cluster execution. Warn via logger when both are specified. - Add affinity-aware cpu_count() to squidpy/_utils.py that respects cgroup limits (SLURM, Docker, taskset) via os.sched_getaffinity, replacing multiprocessing.cpu_count throughout the codebase. - Fix NameError in pl.tiling_qc (**kwargs referenced after removal), keep spatialdata_plot import lazy, remove unused typing imports. - Replace assert with raise ValueError in verify_coverage. - Add nogil=True to numba collinearity scan for thread parallelism. - Use public API (sq.experimental.tl/pl) in tests. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/_utils.py | 16 +++++- src/squidpy/experimental/im/_tiling.py | 15 +++-- src/squidpy/experimental/pl/_tiling_qc.py | 17 ++---- src/squidpy/experimental/tl/_tiling_qc.py | 68 ++++++++++++++--------- tests/experimental/test_tiling_qc.py | 23 ++++---- 5 files changed, 81 insertions(+), 58 deletions(-) diff --git a/src/squidpy/_utils.py b/src/squidpy/_utils.py index 3c5c86392..4fbe84a79 100644 --- a/src/squidpy/_utils.py +++ b/src/squidpy/_utils.py @@ -8,7 +8,8 @@ from collections.abc import Callable, Generator, Hashable, Iterable, Sequence from contextlib import contextmanager from enum import Enum -from multiprocessing import Manager, cpu_count +import os +from multiprocessing import Manager from queue import Queue from threading import Thread from typing import TYPE_CHECKING, Any, Literal @@ -45,6 +46,19 @@ def wrapper(*args: Any, **kw: Any) -> Any: NDArrayA = NDArray[Any] +def cpu_count() -> int: + """Number of CPUs available to this process. + + Uses :func:`os.sched_getaffinity` to respect cgroup limits set by + SLURM, Docker, or ``taskset``. Falls back to :func:`os.cpu_count` + on platforms where affinity queries are unavailable (e.g. macOS). + """ + try: + return len(os.sched_getaffinity(0)) + except (AttributeError, OSError): + return os.cpu_count() or 1 + + class SigQueue(Queue["Signal"] if TYPE_CHECKING else Queue): # type: ignore[misc] """Signalling queue.""" diff --git a/src/squidpy/experimental/im/_tiling.py b/src/squidpy/experimental/im/_tiling.py index 25e0d3430..eca05dd57 100644 --- a/src/squidpy/experimental/im/_tiling.py +++ b/src/squidpy/experimental/im/_tiling.py @@ -203,10 +203,10 @@ def _auto_margin(cell_info: dict[int, CellInfo]) -> int: """Compute the minimum margin that covers the largest cell's half-extent.""" if not cell_info: return 0 - max_half = max(max(c.bbox_h, c.bbox_w) for c in cell_info.values()) + max_extent = max(max(c.bbox_h, c.bbox_w) for c in cell_info.values()) # Centroid can be at most half a bbox away from the cell's edge. # Add 1 pixel for safety (rounding / off-by-one). - return int(np.ceil(max_half / 2)) + 1 + return int(np.ceil(max_extent / 2)) + 1 def build_tile_specs( @@ -413,17 +413,20 @@ def verify_coverage( Raises ------ - AssertionError + ValueError If any cell is missing or assigned to more than one tile. """ owned_union: set[int] = set() for spec in specs: overlap = owned_union & spec.owned_ids - assert not overlap, f"Cells {overlap} assigned to multiple tiles" + if overlap: + raise ValueError(f"Cells {overlap} assigned to multiple tiles") owned_union |= spec.owned_ids missing = all_label_ids - owned_union - assert not missing, f"Cells {missing} not assigned to any tile" + if missing: + raise ValueError(f"Cells {missing} not assigned to any tile") extra = owned_union - all_label_ids - assert not extra, f"Tile specs reference non-existent labels {extra}" + if extra: + raise ValueError(f"Tile specs reference non-existent labels {extra}") diff --git a/src/squidpy/experimental/pl/_tiling_qc.py b/src/squidpy/experimental/pl/_tiling_qc.py index c17f33448..ee24cb13c 100644 --- a/src/squidpy/experimental/pl/_tiling_qc.py +++ b/src/squidpy/experimental/pl/_tiling_qc.py @@ -2,22 +2,18 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - from spatialdata import SpatialData +import spatialdata as sd __all__ = ["tiling_qc"] def tiling_qc( - sdata: SpatialData, + sdata: sd.SpatialData, labels_key: str, qc_key: str | None = None, score_col: str = "cut_score", cmap: str = "Reds", figsize: tuple[float, float] | None = None, - **kwargs: Any, ) -> None: """Plot labels coloured by their tiling-artifact score. @@ -43,11 +39,7 @@ def tiling_qc( Matplotlib colormap name. figsize Figure size passed to :meth:`spatialdata.SpatialData.pl.show`. - **kwargs - Forwarded to :meth:`spatialdata.SpatialData.pl.render_labels`. """ - import spatialdata_plot # noqa: F401 — registers accessor - table_key = qc_key if qc_key is not None else f"{labels_key}_qc" if table_key not in sdata.tables: raise ValueError( @@ -62,7 +54,9 @@ def tiling_qc( f"Available: {[c for c in adata.obs.columns if c not in ('region', 'label_id')]}" ) - show_kwargs: dict[str, Any] = {} + import spatialdata_plot # noqa: F401 — registers accessor + + show_kwargs: dict[str, object] = {} if figsize is not None: show_kwargs["figsize"] = figsize @@ -71,5 +65,4 @@ def tiling_qc( color=score_col, table_name=table_key, cmap=cmap, - **kwargs, ).pl.show(**show_kwargs) diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py index 42011bf95..918a8b886 100644 --- a/src/squidpy/experimental/tl/_tiling_qc.py +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -13,25 +13,30 @@ All heavy computation is done per-tile via the tiling infrastructure in :mod:`squidpy.experimental.im._tiling`, so this scales to -100k×100k images without materialising the full array. +100k x 100k images without materialising the full array. """ from __future__ import annotations import math -from typing import Literal +from typing import TYPE_CHECKING, Literal import anndata as ad +import dask import numpy as np import pandas as pd +import spatialdata as sd import xarray as xr -from joblib import Parallel, delayed +from dask.diagnostics import ProgressBar from numba import njit from skimage.measure import find_contours, regionprops -from spatialdata import SpatialData from spatialdata._logging import logger as logg from spatialdata.models import TableModel +if TYPE_CHECKING: + from dask.distributed import Client + +from squidpy._utils import cpu_count from squidpy.experimental.im._tiling import ( build_tile_specs, compute_cell_info, @@ -65,7 +70,7 @@ # --------------------------------------------------------------------------- -@njit(cache=True) +@njit(cache=True, nogil=True) def _collinear_scan( contour: np.ndarray, cum_arc: np.ndarray, @@ -358,7 +363,7 @@ def _score_tile( def _compute_centroids_for_labels( - sdata: SpatialData, + sdata: sd.SpatialData, labels_key: str, labels_da: xr.DataArray, scale: str | None, @@ -388,7 +393,7 @@ def _compute_centroids_for_labels( def calculate_tiling_qc( - sdata: SpatialData, + sdata: sd.SpatialData, labels_key: str, scale: str | None = None, tile_size: int = 2048, @@ -396,7 +401,8 @@ def calculate_tiling_qc( distance_tol: float = _DEFAULT_DISTANCE_TOL, min_area: int = _MIN_CELL_AREA, downsample: int = 1, - n_jobs: int = 1, + n_jobs: int = -1, + client: Client | None = None, adata_key_added: str | None = None, inplace: bool = True, ) -> ad.AnnData | None: @@ -434,9 +440,16 @@ def calculate_tiling_qc( downsample Factor by which to downsample each cell's bounding-box crop before contour extraction. Straightness is scale-invariant, - so ``2``–``4`` is safe and much faster on large cells. + so ``2``--``4`` is safe and much faster on large cells. n_jobs - Number of parallel jobs for tile processing. + Number of threads for tile processing. ``-1`` (default) uses + all available CPUs. Ignored when ``client`` is provided. + client + A :class:`dask.distributed.Client` for distributed execution. + When provided, tile processing is submitted to this client, + ``n_jobs`` is ignored, and progress is reported via the dask + dashboard. Workers must have access to the underlying data + store (e.g. shared filesystem or cloud storage for zarr). adata_key_added Key under which to store the result in ``sdata.tables``. Defaults to ``"{labels_key}_qc"``. @@ -454,6 +467,13 @@ def calculate_tiling_qc( - ``cardinal_alignment_score``: axis-alignment of that segment (1 = cardinal, 0 = diagonal). - ``cut_score``: product of the two. + + Notes + ----- + Tile processing is parallelised via :func:`dask.compute`. By + default a threaded scheduler with ``n_jobs`` workers is used. + Pass a :class:`~dask.distributed.Client` to use a distributed + cluster instead. """ # --- Validate --- if labels_key not in sdata.labels: @@ -483,28 +503,22 @@ def calculate_tiling_qc( ) # --- Process tiles (labels only — no image needed) --- - n_cells_total = sum(len(s.owned_ids) for s in specs) - - try: - import ipywidgets # noqa: F401 - from tqdm.auto import tqdm - except ImportError: - from tqdm.std import tqdm - - pbar = tqdm(total=n_cells_total, desc="Scoring cells", unit="cells") - + @dask.delayed def _process_one(spec): tile_lbl = extract_labels_tile_lazy(labels_da, spec) - df = _score_tile(tile_lbl, distance_tol=distance_tol, min_area=min_area, downsample=downsample) - pbar.update(len(spec.owned_ids)) - return df + return _score_tile(tile_lbl, distance_tol=distance_tol, min_area=min_area, downsample=downsample) + + tasks = [_process_one(spec) for spec in specs] - if n_jobs == 1: - results = [_process_one(spec) for spec in specs] + if client is not None: + if n_jobs != -1: + logg.warning("`n_jobs` is ignored when a `client` is provided. Parallelism is controlled by the client.") + results = dask.compute(*tasks, scheduler=client) else: - results = Parallel(n_jobs=n_jobs, prefer="threads")(delayed(_process_one)(spec) for spec in specs) + num_workers = cpu_count() if n_jobs == -1 else n_jobs + with ProgressBar(): + results = dask.compute(*tasks, scheduler="threads", num_workers=num_workers) - pbar.close() tile_dfs = [df for df in results if not df.empty] if not tile_dfs: diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index 6a40f04ff..5ee7dd750 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -5,8 +5,7 @@ import numpy as np import pytest -from squidpy.experimental.pl._tiling_qc import tiling_qc -from squidpy.experimental.tl._tiling_qc import calculate_tiling_qc +import squidpy as sq from tests.conftest import PlotTester, PlotTesterMeta # --------------------------------------------------------------------------- @@ -15,11 +14,11 @@ class TestCalculateTilingQC: - """Tests for calculate_tiling_qc using the tile-boundary fixture.""" + """Tests for sq.experimental.tl.calculate_tiling_qc using the tile-boundary fixture.""" def test_returns_anndata_with_scores(self, sdata_tile_boundary): sdata, gt = sdata_tile_boundary - adata = calculate_tiling_qc( + adata = sq.experimental.tl.calculate_tiling_qc( sdata, labels_key="labels", tile_size=200, @@ -32,7 +31,7 @@ def test_returns_anndata_with_scores(self, sdata_tile_boundary): def test_cut_cells_score_higher_than_intact(self, sdata_tile_boundary): sdata, gt = sdata_tile_boundary - adata = calculate_tiling_qc( + adata = sq.experimental.tl.calculate_tiling_qc( sdata, labels_key="labels", tile_size=200, @@ -46,13 +45,13 @@ def test_cut_cells_score_higher_than_intact(self, sdata_tile_boundary): def test_tiled_vs_single_tile(self, sdata_tile_boundary): """Tiling must not change results — scores should be identical.""" sdata, _ = sdata_tile_boundary - adata_tiled = calculate_tiling_qc( + adata_tiled = sq.experimental.tl.calculate_tiling_qc( sdata, labels_key="labels", tile_size=200, inplace=False, ) - adata_single = calculate_tiling_qc( + adata_single = sq.experimental.tl.calculate_tiling_qc( sdata, labels_key="labels", tile_size=2000, @@ -73,7 +72,7 @@ def test_tiled_vs_single_tile(self, sdata_tile_boundary): def test_invalid_labels_key(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary with pytest.raises(ValueError, match="not found"): - calculate_tiling_qc(sdata, labels_key="nonexistent", inplace=False) + sq.experimental.tl.calculate_tiling_qc(sdata, labels_key="nonexistent", inplace=False) # --------------------------------------------------------------------------- @@ -85,18 +84,18 @@ def test_invalid_labels_key(self, sdata_tile_boundary): def sdata_with_qc(sdata_tile_boundary): """SpatialData with tiling QC already computed.""" sdata, _ = sdata_tile_boundary - calculate_tiling_qc(sdata, labels_key="labels", tile_size=200, inplace=True) + sq.experimental.tl.calculate_tiling_qc(sdata, labels_key="labels", tile_size=200, inplace=True) return sdata class TestTilingQCVisual(PlotTester, metaclass=PlotTesterMeta): def test_plot_tiling_qc_cut_score(self, sdata_with_qc): """Visual: labels coloured by cut_score.""" - tiling_qc(sdata_with_qc, labels_key="labels", score_col="cut_score") + sq.experimental.pl.tiling_qc(sdata_with_qc, labels_key="labels", score_col="cut_score") def test_plot_tiling_qc_cardinal_alignment(self, sdata_with_qc): """Visual: labels coloured by cardinal_alignment_score.""" - tiling_qc( + sq.experimental.pl.tiling_qc( sdata_with_qc, labels_key="labels", score_col="cardinal_alignment_score", @@ -104,7 +103,7 @@ def test_plot_tiling_qc_cardinal_alignment(self, sdata_with_qc): def test_plot_tiling_qc_straight_edge_ratio(self, sdata_with_qc): """Visual: labels coloured by max_straight_edge_ratio.""" - tiling_qc( + sq.experimental.pl.tiling_qc( sdata_with_qc, labels_key="labels", score_col="max_straight_edge_ratio", From edbe8dfc6c301d3f518841815de59b57f06fb7b6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 23:49:50 +0000 Subject: [PATCH 10/24] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/squidpy/_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/squidpy/_utils.py b/src/squidpy/_utils.py index 4fbe84a79..1816609fa 100644 --- a/src/squidpy/_utils.py +++ b/src/squidpy/_utils.py @@ -4,11 +4,11 @@ import functools import inspect +import os import warnings from collections.abc import Callable, Generator, Hashable, Iterable, Sequence from contextlib import contextmanager from enum import Enum -import os from multiprocessing import Manager from queue import Queue from threading import Thread From 011c9c908475985fd01c566bd063dbdee5ba4aa5 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 01:54:53 +0200 Subject: [PATCH 11/24] Remove comments that restate what code already says Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/im/_tiling.py | 5 ----- src/squidpy/experimental/tl/_tiling_qc.py | 16 ---------------- tests/experimental/conftest.py | 15 +-------------- 3 files changed, 1 insertion(+), 35 deletions(-) diff --git a/src/squidpy/experimental/im/_tiling.py b/src/squidpy/experimental/im/_tiling.py index eca05dd57..9460356fa 100644 --- a/src/squidpy/experimental/im/_tiling.py +++ b/src/squidpy/experimental/im/_tiling.py @@ -96,7 +96,6 @@ def compute_cell_info_multiscale( if not available: return {} - # Pick coarsest scale (highest numeric suffix) def _scale_idx(k: str) -> int: num = "".join(c for c in k if c.isdigit()) return int(num) if num else 0 @@ -108,7 +107,6 @@ def _scale_idx(k: str) -> int: if coarse_labels.ndim != 2: raise ValueError(f"Expected 2-D labels at scale {coarsest}, got shape {coarse_labels.shape}") - # Compute scale factors to target resolution target_da = labels_node[target_scale].ds["image"] target_h, target_w = target_da.sizes.get("y", target_da.shape[-2]), target_da.sizes.get("x", target_da.shape[-1]) coarse_h, coarse_w = coarse_labels.shape @@ -248,19 +246,16 @@ def build_tile_specs( if margin < 0: raise ValueError(f"overlap_margin must be non-negative, got {margin}") - # Assign each cell to a base-grid cell by its centroid cell_to_tile: dict[int, tuple[int, int]] = {} for lid, ci in cell_info.items(): tile_row = min(int(ci.centroid_y) // tile_size, (H - 1) // tile_size) tile_col = min(int(ci.centroid_x) // tile_size, (W - 1) // tile_size) cell_to_tile[lid] = (tile_row, tile_col) - # Group cells by tile tile_to_cells: dict[tuple[int, int], set[int]] = {} for lid, key in cell_to_tile.items(): tile_to_cells.setdefault(key, set()).add(lid) - # Build specs (skip empty tiles) n_rows = (H + tile_size - 1) // tile_size n_cols = (W + tile_size - 1) // tile_size diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py index 918a8b886..c9724cae9 100644 --- a/src/squidpy/experimental/tl/_tiling_qc.py +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -99,7 +99,6 @@ def _collinear_scan( if seg_len < 1e-12: continue - # Max perpendicular distance of intermediate points max_perp = 0.0 for k in range(start + 1, end): r0 = contour[k, 0] - contour[start, 0] @@ -144,7 +143,6 @@ def _resample_contour(contour: np.ndarray, max_points: int) -> np.ndarray: targets = np.linspace(0.0, total, max_points) - # For each target, find the segment it falls into idx = np.searchsorted(cum_arc, targets, side="right") - 1 idx = np.clip(idx, 0, n - 2) @@ -236,10 +234,7 @@ def _cardinal_alignment(angle: float) -> float: Returns a value in ``[0, 1]`` where 1 means perfectly axis-aligned and 0 means maximally diagonal (45°). """ - # Normalise angle to [0, π) — direction, not orientation a = abs(angle) % np.pi - - # Distance to nearest cardinal: 0, π/2, π dist = min(a, abs(a - np.pi / 2), abs(a - np.pi)) # Map [0, π/4] → [1, 0] @@ -475,11 +470,9 @@ def calculate_tiling_qc( Pass a :class:`~dask.distributed.Client` to use a distributed cluster instead. """ - # --- Validate --- if labels_key not in sdata.labels: raise ValueError(f"Labels key '{labels_key}' not found, valid keys: {list(sdata.labels.keys())}") - # --- Resolve labels DataArray (stays lazy) --- labels_node = sdata.labels[labels_key] if isinstance(labels_node, xr.DataTree): if scale is None: @@ -488,7 +481,6 @@ def calculate_tiling_qc( else: labels_da = labels_node - # --- Compute centroids --- cell_info = _compute_centroids_for_labels(sdata, labels_key, labels_da, scale) if not cell_info: raise ValueError("No cells found in labels (all zeros).") @@ -496,13 +488,11 @@ def calculate_tiling_qc( H = int(labels_da.sizes.get("y", labels_da.shape[-2])) W = int(labels_da.sizes.get("x", labels_da.shape[-1])) - # --- Build tile specs --- specs = build_tile_specs((H, W), cell_info, tile_size=tile_size, overlap_margin=overlap_margin) logg.info( f"Tiling QC: {len(specs)} tiles ({tile_size}x{tile_size}, margin={overlap_margin}, downsample={downsample}x)." ) - # --- Process tiles (labels only — no image needed) --- @dask.delayed def _process_one(spec): tile_lbl = extract_labels_tile_lazy(labels_da, spec) @@ -526,19 +516,16 @@ def _process_one(spec): combined = pd.concat(tile_dfs, axis=0).sort_index() - # Sanity: each cell should appear in exactly one tile if combined.index.duplicated().any(): dups = combined.index[combined.index.duplicated()].unique().tolist() raise RuntimeError(f"Duplicate cell IDs across tiles — tile ownership may be broken. Duplicates: {dups}") - # --- Build AnnData (scores in .obs, empty .X) --- n_cells = len(combined) adata = ad.AnnData( X=np.empty((n_cells, 0), dtype=np.float32), ) adata.obs_names = [f"cell_{i}" for i in combined.index] - # Spatialdata linking adata.obs["region"] = pd.Categorical([labels_key] * n_cells) adata.obs["label_id"] = combined.index.values adata.uns["spatialdata_attrs"] = { @@ -547,15 +534,12 @@ def _process_one(spec): "instance_key": "label_id", } - # QC scores in obs for col in combined.columns: adata.obs[col] = combined[col].values - # Centroids (already computed without materialising the full array) adata.obs["centroid_y"] = np.array([cell_info[lid].centroid_y for lid in combined.index]) adata.obs["centroid_x"] = np.array([cell_info[lid].centroid_x for lid in combined.index]) - # Algorithm parameters in uns adata.uns[_METHOD_KEY] = { "scale": scale, "tile_size": tile_size, diff --git a/tests/experimental/conftest.py b/tests/experimental/conftest.py index 3e93b9bac..9bea8bcd1 100644 --- a/tests/experimental/conftest.py +++ b/tests/experimental/conftest.py @@ -59,20 +59,16 @@ def _place_ellipsoids( if cell_id >= n_target: break - # Random ellipse parameters cy = rng.integers(semi_range[1] + cell_gap, H - semi_range[1] - cell_gap) cx = rng.integers(semi_range[1] + cell_gap, W - semi_range[1] - cell_gap) r_radius = rng.integers(semi_range[0], semi_range[1] + 1) c_radius = rng.integers(semi_range[0], semi_range[1] + 1) angle = rng.uniform(0, np.pi) - # Rasterise candidate ellipse rr, cc = ellipse(cy, cx, r_radius, c_radius, shape=shape, rotation=angle) if len(rr) == 0: continue - # Check for overlap (including gap buffer) - # Dilate existing labels by cell_gap and check candidate pixels if cell_gap > 0: occupied = ndimage.binary_dilation( labels > 0, @@ -127,15 +123,11 @@ def _relabel_and_track( intact_ids Fragment IDs from cells that remained whole. """ - # Relabel connected components (each fragment gets a new ID) relabelled, n_fragments = ndimage.label(cut > 0) - # Map each fragment back to its original cell ID - # For each new fragment, find which original cell(s) it overlaps with cut_ids: set[int] = set() intact_ids: set[int] = set() - # Build reverse mapping: original_id → set of fragment_ids orig_to_fragments: dict[int, set[int]] = {} for frag_id in range(1, n_fragments + 1): frag_mask = relabelled == frag_id @@ -164,7 +156,6 @@ def make_tile_boundary_sdata() -> tuple[SpatialData, TileBoundaryGroundTruth]: """ rng = np.random.default_rng(42) - # 1. Place ellipsoids original_labels = _place_ellipsoids( shape=(_IMAGE_SIZE, _IMAGE_SIZE), n_target=_N_CELLS_TARGET, @@ -172,9 +163,8 @@ def make_tile_boundary_sdata() -> tuple[SpatialData, TileBoundaryGroundTruth]: cell_gap=_CELL_GAP, rng=rng, ) - n_original = len(np.unique(original_labels)) - 1 # exclude background + n_original = len(np.unique(original_labels)) - 1 - # 2. Apply tile cuts (zero out 2px stripes at borders) cut_labels = _apply_tile_cuts( original_labels, borders_y=_TILE_BORDERS, @@ -182,14 +172,11 @@ def make_tile_boundary_sdata() -> tuple[SpatialData, TileBoundaryGroundTruth]: gap=_BORDER_GAP, ) - # 3. Relabel fragments and track ground truth relabelled, cut_ids, intact_ids = _relabel_and_track(original_labels, cut_labels) - # 4. Wrap as dask array (chunks matching ~tile size for realistic access) dask_labels = da.from_array(relabelled, chunks=(200, 200)) labels_xr = xr.DataArray(dask_labels, dims=["y", "x"]) - # 5. Dummy image for API compatibility image_data = rng.integers(0, 255, (3, _IMAGE_SIZE, _IMAGE_SIZE), dtype=np.uint8) image_xr = xr.DataArray(image_data, dims=["c", "y", "x"], coords={"c": ["R", "G", "B"]}) From 630287ecffdebd1205c86d85eb713104f8dc42d1 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 02:03:00 +0200 Subject: [PATCH 12/24] Default to PowerNorm(gamma=0.5) in tiling QC plot Compresses low scores toward zero so tile-boundary artifacts are more visually prominent without changing the stored metric values. Users can pass norm=Normalize() for a linear scale. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/pl/_tiling_qc.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/squidpy/experimental/pl/_tiling_qc.py b/src/squidpy/experimental/pl/_tiling_qc.py index ee24cb13c..3f11dd3b0 100644 --- a/src/squidpy/experimental/pl/_tiling_qc.py +++ b/src/squidpy/experimental/pl/_tiling_qc.py @@ -2,6 +2,7 @@ from __future__ import annotations +from matplotlib.colors import Normalize, PowerNorm import spatialdata as sd __all__ = ["tiling_qc"] @@ -13,6 +14,7 @@ def tiling_qc( qc_key: str | None = None, score_col: str = "cut_score", cmap: str = "Reds", + norm: Normalize | None = None, figsize: tuple[float, float] | None = None, ) -> None: """Plot labels coloured by their tiling-artifact score. @@ -37,6 +39,11 @@ def tiling_qc( ``"cardinal_alignment_score"``. cmap Matplotlib colormap name. + norm + Matplotlib normalisation for the colour scale. Defaults to + ``PowerNorm(gamma=0.5)`` which compresses low scores toward + zero, making tile-boundary artifacts more visually prominent. + Pass ``Normalize()`` for a linear scale. figsize Figure size passed to :meth:`spatialdata.SpatialData.pl.show`. """ @@ -56,6 +63,9 @@ def tiling_qc( import spatialdata_plot # noqa: F401 — registers accessor + if norm is None: + norm = PowerNorm(gamma=0.5) + show_kwargs: dict[str, object] = {} if figsize is not None: show_kwargs["figsize"] = figsize @@ -65,4 +75,5 @@ def tiling_qc( color=score_col, table_name=table_key, cmap=cmap, + norm=norm, ).pl.show(**show_kwargs) From 68fdf5412dd618cbbabd2feadf57febd5507b6a0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 00:03:11 +0000 Subject: [PATCH 13/24] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/squidpy/experimental/pl/_tiling_qc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/squidpy/experimental/pl/_tiling_qc.py b/src/squidpy/experimental/pl/_tiling_qc.py index 3f11dd3b0..7011f26bf 100644 --- a/src/squidpy/experimental/pl/_tiling_qc.py +++ b/src/squidpy/experimental/pl/_tiling_qc.py @@ -2,8 +2,8 @@ from __future__ import annotations -from matplotlib.colors import Normalize, PowerNorm import spatialdata as sd +from matplotlib.colors import Normalize, PowerNorm __all__ = ["tiling_qc"] From 51db6593187964494992d552e5090f66cc84f756 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 02:06:32 +0200 Subject: [PATCH 14/24] Fix ruff C420: use dict.fromkeys for _NAN_SCORES Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/tl/_tiling_qc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py index c9724cae9..aae3bbb94 100644 --- a/src/squidpy/experimental/tl/_tiling_qc.py +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -62,7 +62,7 @@ _MAX_CONTOUR_POINTS = 500 _SCORE_COLUMNS = ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"] -_NAN_SCORES = {col: np.nan for col in _SCORE_COLUMNS} +_NAN_SCORES = dict.fromkeys(_SCORE_COLUMNS, np.nan) # --------------------------------------------------------------------------- From c7a2974a1824edc20153eb4f0e217080cd4bdc0c Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 02:17:01 +0200 Subject: [PATCH 15/24] Regenerate visual references with PowerNorm(gamma=0.5) Reference images from CI runner (ubuntu, py3.12). Co-Authored-By: Claude Opus 4.6 (1M context) --- ...gQCVisual_tiling_qc_cardinal_alignment.png | Bin 11207 -> 12313 bytes .../TilingQCVisual_tiling_qc_cut_score.png | Bin 9660 -> 11412 bytes ...QCVisual_tiling_qc_straight_edge_ratio.png | Bin 9421 -> 11803 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png b/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png index eb660a350418a80e1fe5e49142d20d3dc9abdba2..b37663df03845be688a38b46664c74350bb7f034 100644 GIT binary patch delta 12289 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 F{{cQHS!MtL delta 11175 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 delta 9616 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 Z{vVdtENP$rXpjH^002ovPDHLkV1o8bLe~HQ From 81385e229b717c8005bbb2da4eedb6ee839ae7d1 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 02:19:18 +0200 Subject: [PATCH 16/24] =?UTF-8?q?Revert=20PowerNorm=20=E2=80=94=20keep=20l?= =?UTF-8?q?inear=20colour=20scale=20for=20tiling=20QC=20plot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/pl/_tiling_qc.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/squidpy/experimental/pl/_tiling_qc.py b/src/squidpy/experimental/pl/_tiling_qc.py index 7011f26bf..ee24cb13c 100644 --- a/src/squidpy/experimental/pl/_tiling_qc.py +++ b/src/squidpy/experimental/pl/_tiling_qc.py @@ -3,7 +3,6 @@ from __future__ import annotations import spatialdata as sd -from matplotlib.colors import Normalize, PowerNorm __all__ = ["tiling_qc"] @@ -14,7 +13,6 @@ def tiling_qc( qc_key: str | None = None, score_col: str = "cut_score", cmap: str = "Reds", - norm: Normalize | None = None, figsize: tuple[float, float] | None = None, ) -> None: """Plot labels coloured by their tiling-artifact score. @@ -39,11 +37,6 @@ def tiling_qc( ``"cardinal_alignment_score"``. cmap Matplotlib colormap name. - norm - Matplotlib normalisation for the colour scale. Defaults to - ``PowerNorm(gamma=0.5)`` which compresses low scores toward - zero, making tile-boundary artifacts more visually prominent. - Pass ``Normalize()`` for a linear scale. figsize Figure size passed to :meth:`spatialdata.SpatialData.pl.show`. """ @@ -63,9 +56,6 @@ def tiling_qc( import spatialdata_plot # noqa: F401 — registers accessor - if norm is None: - norm = PowerNorm(gamma=0.5) - show_kwargs: dict[str, object] = {} if figsize is not None: show_kwargs["figsize"] = figsize @@ -75,5 +65,4 @@ def tiling_qc( color=score_col, table_name=table_key, cmap=cmap, - norm=norm, ).pl.show(**show_kwargs) From 4ecb3dfeed317d2b19f4ba310f00f431e23f86ae Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 10:17:15 +0200 Subject: [PATCH 17/24] Regenerate visual references with linear colour scale Reference images from CI runner (ubuntu, py3.12). Co-Authored-By: Claude Opus 4.6 (1M context) --- ...gQCVisual_tiling_qc_cardinal_alignment.png | Bin 12313 -> 12143 bytes .../TilingQCVisual_tiling_qc_cut_score.png | Bin 11412 -> 10505 bytes ...QCVisual_tiling_qc_straight_edge_ratio.png | Bin 11803 -> 10224 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png b/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png index b37663df03845be688a38b46664c74350bb7f034..58288c0c94b3ab446722c6cc949f8347bf65b51c 100644 GIT binary patch literal 12143 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 {y4 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 F{{s%zS(N|) diff --git a/tests/_images/TilingQCVisual_tiling_qc_cut_score.png b/tests/_images/TilingQCVisual_tiling_qc_cut_score.png index a56c041df2dc56769f1e82e5fc2b721a52b0ec25..d949b7ef199ba8f926237d70670b3049350a5764 100644 GIT binary patch delta 10467 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 AhyVZp delta 11381 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 diff --git a/tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png b/tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png index 24de12dac74089384883ebd51d7e87490e38d92e..bdf8898b6db679fde615ed07f822a6c156d282e7 100644 GIT binary patch delta 10184 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

g)^`Y0?>Vm?35 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 literal 11803 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 Date: Sat, 11 Apr 2026 13:05:55 +0200 Subject: [PATCH 18/24] Add spatial post-processing to tiling QC (smoothed_cut_score, is_outlier, nhood_outlier_fraction) Two-stage spatial-context pipeline after per-tile scoring: - smoothed_cut_score: cut_score x mean(k=10 neighbor cut_scores) - is_outlier: MAD-based threshold on smoothed scores (nmads param, default 3) - nhood_outlier_fraction: fraction of k-neighbors that are outliers Also: update plot defaults to nhood_outlier_fraction/RdYlGn_r, add clean-dataset and few-cells edge case tests, generate visual references for new columns. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/pl/_tiling_qc.py | 7 +- src/squidpy/experimental/tl/_tiling_qc.py | 94 ++++++++++++--- ...isual_tiling_qc_nhood_outlier_fraction.png | Bin 0 -> 12687 bytes ...gQCVisual_tiling_qc_smoothed_cut_score.png | Bin 0 -> 12842 bytes tests/experimental/conftest.py | 32 ++++++ tests/experimental/test_tiling_qc.py | 107 +++++++++++++++++- 6 files changed, 222 insertions(+), 18 deletions(-) create mode 100644 tests/_images/TilingQCVisual_tiling_qc_nhood_outlier_fraction.png create mode 100644 tests/_images/TilingQCVisual_tiling_qc_smoothed_cut_score.png diff --git a/src/squidpy/experimental/pl/_tiling_qc.py b/src/squidpy/experimental/pl/_tiling_qc.py index ee24cb13c..ac8256f4a 100644 --- a/src/squidpy/experimental/pl/_tiling_qc.py +++ b/src/squidpy/experimental/pl/_tiling_qc.py @@ -11,8 +11,8 @@ def tiling_qc( sdata: sd.SpatialData, labels_key: str, qc_key: str | None = None, - score_col: str = "cut_score", - cmap: str = "Reds", + score_col: str = "nhood_outlier_fraction", + cmap: str = "RdYlGn_r", figsize: tuple[float, float] | None = None, ) -> None: """Plot labels coloured by their tiling-artifact score. @@ -33,6 +33,7 @@ def tiling_qc( ``"{labels_key}_qc"``. score_col Which ``.obs`` column to colour by. One of + ``"nhood_outlier_fraction"``, ``"smoothed_cut_score"``, ``"cut_score"``, ``"max_straight_edge_ratio"``, ``"cardinal_alignment_score"``. cmap @@ -54,7 +55,7 @@ def tiling_qc( f"Available: {[c for c in adata.obs.columns if c not in ('region', 'label_id')]}" ) - import spatialdata_plot # noqa: F401 — registers accessor + import spatialdata_plot # noqa: F401 - registers accessor show_kwargs: dict[str, object] = {} if figsize is not None: diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py index aae3bbb94..69b3cce76 100644 --- a/src/squidpy/experimental/tl/_tiling_qc.py +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -10,6 +10,14 @@ 0° or 90° (axis-aligned tile borders). - **cut_score**: product of the two, combining evidence from shape and orientation. +- **smoothed_cut_score**: cut_score multiplied by the mean cut_score of + k=10 nearest spatial neighbors - amplifies boundary cells while + suppressing isolated high-scorers. +- **is_outlier**: boolean flag for cells whose smoothed_cut_score exceeds + median + nmads x MAD x 1.4826 (default nmads=3). +- **nhood_outlier_fraction**: fraction of k=10 nearest neighbors that are + smoothed-score outliers (MAD-based). Bounded [0, 1]; high values + precisely trace the FOV tile grid. All heavy computation is done per-tile via the tiling infrastructure in :mod:`squidpy.experimental.im._tiling`, so this scales to @@ -30,6 +38,7 @@ from dask.diagnostics import ProgressBar from numba import njit from skimage.measure import find_contours, regionprops +from sklearn.neighbors import BallTree from spatialdata._logging import logger as logg from spatialdata.models import TableModel @@ -47,7 +56,7 @@ __all__ = ["calculate_tiling_qc"] -# Minimum cell area in pixels — smaller cells produce noisy contours +# Minimum cell area in pixels - smaller cells produce noisy contours _MIN_CELL_AREA = 20 # Default perpendicular distance tolerance for collinearity (pixels). @@ -61,8 +70,10 @@ # the O(n²) two-pointer scan. _MAX_CONTOUR_POINTS = 500 -_SCORE_COLUMNS = ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"] -_NAN_SCORES = dict.fromkeys(_SCORE_COLUMNS, np.nan) +_TILE_SCORE_COLUMNS = ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"] +_POST_SCORE_COLUMNS = ["smoothed_cut_score", "is_outlier", "nhood_outlier_fraction"] +_SCORE_COLUMNS = _TILE_SCORE_COLUMNS + _POST_SCORE_COLUMNS +_NAN_TILE_SCORES = dict.fromkeys(_TILE_SCORE_COLUMNS, np.nan) # --------------------------------------------------------------------------- @@ -122,7 +133,7 @@ def _collinear_scan( def _resample_contour(contour: np.ndarray, max_points: int) -> np.ndarray: """Resample a contour to at most *max_points* via arc-length interpolation. - Fully vectorised using :func:`numpy.searchsorted` — no Python + Fully vectorised using :func:`numpy.searchsorted` - no Python loops. Preserves geometry far better than naive stride-based subsampling because points are placed equidistantly along the contour arc. @@ -191,7 +202,7 @@ def _longest_collinear_segment( closed = np.sqrt(((pts[0] - pts[-1]) ** 2).sum()) < 1.0 # For closed contours, drop the duplicate last point and precompute - # segment lengths once — rotations reuse the same distances. + # segment lengths once - rotations reuse the same distances. if closed and n > 6: core = pts[:-1] core_diffs = np.diff(core, axis=0) @@ -313,7 +324,7 @@ def _score_tile( """ regions = regionprops(tile_labels) if not regions: - return pd.DataFrame(columns=_SCORE_COLUMNS, dtype=float) + return pd.DataFrame(columns=_TILE_SCORE_COLUMNS, dtype=float) rows: dict[int, dict[str, float]] = {} @@ -322,7 +333,7 @@ def _score_tile( area = region.area if area < min_area * (downsample**2): - rows[lid] = dict(_NAN_SCORES) + rows[lid] = dict(_NAN_TILE_SCORES) continue # Pad with 1px of zeros so find_contours can trace cells @@ -336,7 +347,7 @@ def _score_tile( contours = find_contours(crop, 0.5) if not contours: - rows[lid] = dict(_NAN_SCORES) + rows[lid] = dict(_NAN_TILE_SCORES) continue contour = max(contours, key=len) @@ -396,6 +407,7 @@ def calculate_tiling_qc( distance_tol: float = _DEFAULT_DISTANCE_TOL, min_area: int = _MIN_CELL_AREA, downsample: int = 1, + nmads: float = 3, n_jobs: int = -1, client: Client | None = None, adata_key_added: str | None = None, @@ -436,6 +448,13 @@ def calculate_tiling_qc( Factor by which to downsample each cell's bounding-box crop before contour extraction. Straightness is scale-invariant, so ``2``--``4`` is safe and much faster on large cells. + nmads + Number of MADs above the median of ``smoothed_cut_score`` + to use as the outlier threshold. The threshold is + ``median + nmads x MAD x 1.4826``. Lower values + increase sensitivity (more outliers); higher values are + more conservative. Default 3 (≈ 99.7th percentile for + normally distributed data). n_jobs Number of threads for tile processing. ``-1`` (default) uses all available CPUs. Ignored when ``client`` is provided. @@ -455,13 +474,21 @@ def calculate_tiling_qc( Returns ------- :class:`~anndata.AnnData` when ``inplace=False``, otherwise ``None``. - The AnnData ``.obs`` contains three scores per cell: + The AnnData ``.obs`` contains five scores per cell: - ``max_straight_edge_ratio``: longest collinear boundary segment / equivalent diameter. - ``cardinal_alignment_score``: axis-alignment of that segment (1 = cardinal, 0 = diagonal). - ``cut_score``: product of the two. + - ``smoothed_cut_score``: ``cut_score x mean(neighbor cut_scores)`` + over k=10 nearest spatial neighbors. Amplifies cells on FOV + boundaries while suppressing isolated high-scorers. + - ``is_outlier``: boolean, ``True`` when ``smoothed_cut_score`` + exceeds ``median + nmads x MAD x 1.4826``. + - ``nhood_outlier_fraction``: fraction of k=10 nearest neighbors + that are smoothed-score outliers (MAD-based). Bounded [0, 1]; + high values trace the tile grid. Notes ----- @@ -512,15 +539,51 @@ def _process_one(spec): tile_dfs = [df for df in results if not df.empty] if not tile_dfs: - raise ValueError("No cells scored — labels may be empty or all below min_area.") + raise ValueError("No cells scored - labels may be empty or all below min_area.") combined = pd.concat(tile_dfs, axis=0).sort_index() if combined.index.duplicated().any(): dups = combined.index[combined.index.duplicated()].unique().tolist() - raise RuntimeError(f"Duplicate cell IDs across tiles — tile ownership may be broken. Duplicates: {dups}") + raise RuntimeError(f"Duplicate cell IDs across tiles - tile ownership may be broken. Duplicates: {dups}") + # --- Spatial context post-processing --- n_cells = len(combined) + k = 10 + + centroid_y = np.array([cell_info[lid].centroid_y for lid in combined.index]) + centroid_x = np.array([cell_info[lid].centroid_x for lid in combined.index]) + centroids = np.column_stack([centroid_y, centroid_x]) + + if n_cells <= 1: + combined["smoothed_cut_score"] = combined["cut_score"] + combined["is_outlier"] = False + combined["nhood_outlier_fraction"] = 0.0 + else: + effective_k = min(k, n_cells - 1) + tree = BallTree(centroids) + _, indices = tree.query(centroids, k=effective_k + 1) # +1 because query includes self + neighbor_idx = indices[:, 1:] + + cut_scores = combined["cut_score"].values.copy() + cut_scores = np.where(np.isnan(cut_scores), 0.0, cut_scores) + neighbor_mean = cut_scores[neighbor_idx].mean(axis=1) + smoothed = cut_scores * neighbor_mean + combined["smoothed_cut_score"] = smoothed + + median_s = np.median(smoothed) + mad_s = np.median(np.abs(smoothed - median_s)) + if mad_s < 1e-12: + # Degenerate distribution - no spread, no outliers. + is_outlier = np.zeros(n_cells, dtype=bool) + else: + threshold = median_s + nmads * mad_s * 1.4826 + is_outlier = smoothed >= threshold + combined["is_outlier"] = is_outlier + + neighbor_outlier_frac = combined["is_outlier"].values[neighbor_idx].mean(axis=1) + combined["nhood_outlier_fraction"] = neighbor_outlier_frac + adata = ad.AnnData( X=np.empty((n_cells, 0), dtype=np.float32), ) @@ -534,11 +597,14 @@ def _process_one(spec): "instance_key": "label_id", } + # TODO: migrate tiling QC scores to .obsm once spatialdata-plot + # supports rendering labels colored by obsm keys. + # See scverse/spatialdata-plot#587. for col in combined.columns: adata.obs[col] = combined[col].values - adata.obs["centroid_y"] = np.array([cell_info[lid].centroid_y for lid in combined.index]) - adata.obs["centroid_x"] = np.array([cell_info[lid].centroid_x for lid in combined.index]) + adata.obs["centroid_y"] = centroid_y + adata.obs["centroid_x"] = centroid_x adata.uns[_METHOD_KEY] = { "scale": scale, @@ -547,6 +613,8 @@ def _process_one(spec): "distance_tol": distance_tol, "min_area": min_area, "downsample": downsample, + "nmads": nmads, + "nhood_k": k, } if inplace: diff --git a/tests/_images/TilingQCVisual_tiling_qc_nhood_outlier_fraction.png b/tests/_images/TilingQCVisual_tiling_qc_nhood_outlier_fraction.png new file mode 100644 index 0000000000000000000000000000000000000000..829d65dd8debf7d323978b9aff60998579b3d5ff GIT binary patch literal 12687 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 JPDHLkV1kxrcUu4e literal 0 HcmV?d00001 diff --git a/tests/_images/TilingQCVisual_tiling_qc_smoothed_cut_score.png b/tests/_images/TilingQCVisual_tiling_qc_smoothed_cut_score.png new file mode 100644 index 0000000000000000000000000000000000000000..cbab8752cd424ebd7c85d81893c4048cfdc9b75d GIT binary patch literal 12842 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 IM6N<$f<+r8Y5)KL literal 0 HcmV?d00001 diff --git a/tests/experimental/conftest.py b/tests/experimental/conftest.py index 9bea8bcd1..3f791874b 100644 --- a/tests/experimental/conftest.py +++ b/tests/experimental/conftest.py @@ -198,3 +198,35 @@ def make_tile_boundary_sdata() -> tuple[SpatialData, TileBoundaryGroundTruth]: def sdata_tile_boundary() -> tuple[SpatialData, TileBoundaryGroundTruth]: """Fixture wrapper around :func:`make_tile_boundary_sdata`.""" return make_tile_boundary_sdata() + + +def make_clean_sdata() -> SpatialData: + """Build a SpatialData with natural ellipsoid cells and NO tile cuts. + + This is the negative control: no tiling artifacts exist, so the + spatial post-processing should flag zero outliers. + """ + rng = np.random.default_rng(123) + labels = _place_ellipsoids( + shape=(_IMAGE_SIZE, _IMAGE_SIZE), + n_target=_N_CELLS_TARGET, + semi_range=_SEMI_AXIS_RANGE, + cell_gap=_CELL_GAP, + rng=rng, + ) + dask_labels = da.from_array(labels, chunks=(200, 200)) + labels_xr = xr.DataArray(dask_labels, dims=["y", "x"]) + + image_data = rng.integers(0, 255, (3, _IMAGE_SIZE, _IMAGE_SIZE), dtype=np.uint8) + image_xr = xr.DataArray(image_data, dims=["c", "y", "x"], coords={"c": ["R", "G", "B"]}) + + return SpatialData( + images={"image": Image2DModel.parse(image_xr)}, + labels={"labels": Labels2DModel.parse(labels_xr)}, + ) + + +@pytest.fixture() +def sdata_clean() -> SpatialData: + """Fixture wrapper around :func:`make_clean_sdata`.""" + return make_clean_sdata() diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index 5ee7dd750..c88ef3c7d 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -26,7 +26,14 @@ def test_returns_anndata_with_scores(self, sdata_tile_boundary): ) assert adata.n_obs == len(gt.cut_cell_ids) + len(gt.intact_cell_ids) assert adata.n_vars == 0 - for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: + for col in [ + "max_straight_edge_ratio", + "cardinal_alignment_score", + "cut_score", + "smoothed_cut_score", + "is_outlier", + "nhood_outlier_fraction", + ]: assert col in adata.obs.columns def test_cut_cells_score_higher_than_intact(self, sdata_tile_boundary): @@ -61,19 +68,99 @@ def test_tiled_vs_single_tile(self, sdata_tile_boundary): df2 = adata_single.obs.set_index("label_id").sort_index() assert set(df1.index) == set(df2.index) - for col in ["max_straight_edge_ratio", "cardinal_alignment_score", "cut_score"]: + for col in [ + "max_straight_edge_ratio", + "cardinal_alignment_score", + "cut_score", + "smoothed_cut_score", + "nhood_outlier_fraction", + ]: np.testing.assert_allclose( df1[col].values, df2[col].values, atol=1e-10, equal_nan=True, ) + np.testing.assert_array_equal(df1["is_outlier"].values, df2["is_outlier"].values) + + def test_spatial_postprocessing_columns(self, sdata_tile_boundary): + """Spatial post-processing produces correct dtypes and value ranges.""" + sdata, _ = sdata_tile_boundary + adata = sq.experimental.tl.calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False + ) + obs = adata.obs + + # smoothed_cut_score is non-negative (product of non-negatives) + assert (obs["smoothed_cut_score"] >= 0).all() + + # is_outlier is boolean + assert obs["is_outlier"].dtype == bool + + # nhood_outlier_fraction is bounded [0, 1] + assert (obs["nhood_outlier_fraction"] >= 0).all() + assert (obs["nhood_outlier_fraction"] <= 1).all() + + # nhood_k stored in uns + assert adata.uns["tiling_qc"]["nhood_k"] == 10 + + def test_outlier_fraction_consistent_with_is_outlier(self, sdata_tile_boundary): + """nhood_outlier_fraction should be 1.0 only when all k neighbors are outliers.""" + sdata, _ = sdata_tile_boundary + adata = sq.experimental.tl.calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False + ) + obs = adata.obs + # Cells with nhood_outlier_fraction == 0 should exist (most cells are not outliers) + assert (obs["nhood_outlier_fraction"] == 0).any() + # If no cell is an outlier, all fractions must be 0 + if not obs["is_outlier"].any(): + assert (obs["nhood_outlier_fraction"] == 0).all() def test_invalid_labels_key(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary with pytest.raises(ValueError, match="not found"): sq.experimental.tl.calculate_tiling_qc(sdata, labels_key="nonexistent", inplace=False) + def test_clean_dataset_no_outliers(self, sdata_clean): + """No tiling artifacts → MAD-based outlier detection should flag zero cells.""" + adata = sq.experimental.tl.calculate_tiling_qc( + sdata_clean, labels_key="labels", tile_size=200, inplace=False + ) + obs = adata.obs + assert not obs["is_outlier"].any(), ( + f"Expected 0 outliers on clean data, got {obs['is_outlier'].sum()}" + ) + assert (obs["nhood_outlier_fraction"] == 0).all() + + def test_few_cells_below_k(self): + """Fewer cells than k=10 should not crash.""" + import dask.array as da + import xarray as xr + from spatialdata import SpatialData + from spatialdata.models import Image2DModel, Labels2DModel + + # 3 well-separated circles + labels = np.zeros((100, 100), dtype=np.int32) + for i, (cy, cx) in enumerate([(20, 20), (50, 50), (80, 80)], start=1): + yy, xx = np.ogrid[-cy : 100 - cy, -cx : 100 - cx] + labels[yy**2 + xx**2 <= 64] = i + + sdata = SpatialData( + images={"image": Image2DModel.parse( + xr.DataArray(np.zeros((3, 100, 100), dtype=np.uint8), dims=["c", "y", "x"]) + )}, + labels={"labels": Labels2DModel.parse( + xr.DataArray(da.from_array(labels, chunks=(100, 100)), dims=["y", "x"]) + )}, + ) + adata = sq.experimental.tl.calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False + ) + assert adata.n_obs == 3 + for col in ["smoothed_cut_score", "is_outlier", "nhood_outlier_fraction"]: + assert col in adata.obs.columns + # --------------------------------------------------------------------------- # Visual regression tests (PlotTester) @@ -108,3 +195,19 @@ def test_plot_tiling_qc_straight_edge_ratio(self, sdata_with_qc): labels_key="labels", score_col="max_straight_edge_ratio", ) + + def test_plot_tiling_qc_nhood_outlier_fraction(self, sdata_with_qc): + """Visual: labels coloured by nhood_outlier_fraction (default).""" + sq.experimental.pl.tiling_qc( + sdata_with_qc, + labels_key="labels", + score_col="nhood_outlier_fraction", + ) + + def test_plot_tiling_qc_smoothed_cut_score(self, sdata_with_qc): + """Visual: labels coloured by smoothed_cut_score.""" + sq.experimental.pl.tiling_qc( + sdata_with_qc, + labels_key="labels", + score_col="smoothed_cut_score", + ) From 0f8fe54cba6ab0df2c3b7f953b5de01d64012aa0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 11:06:11 +0000 Subject: [PATCH 19/24] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/experimental/test_tiling_qc.py | 32 ++++++++++------------------ 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index c88ef3c7d..f9586cfd2 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -86,9 +86,7 @@ def test_tiled_vs_single_tile(self, sdata_tile_boundary): def test_spatial_postprocessing_columns(self, sdata_tile_boundary): """Spatial post-processing produces correct dtypes and value ranges.""" sdata, _ = sdata_tile_boundary - adata = sq.experimental.tl.calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False - ) + adata = sq.experimental.tl.calculate_tiling_qc(sdata, labels_key="labels", tile_size=200, inplace=False) obs = adata.obs # smoothed_cut_score is non-negative (product of non-negatives) @@ -107,9 +105,7 @@ def test_spatial_postprocessing_columns(self, sdata_tile_boundary): def test_outlier_fraction_consistent_with_is_outlier(self, sdata_tile_boundary): """nhood_outlier_fraction should be 1.0 only when all k neighbors are outliers.""" sdata, _ = sdata_tile_boundary - adata = sq.experimental.tl.calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False - ) + adata = sq.experimental.tl.calculate_tiling_qc(sdata, labels_key="labels", tile_size=200, inplace=False) obs = adata.obs # Cells with nhood_outlier_fraction == 0 should exist (most cells are not outliers) assert (obs["nhood_outlier_fraction"] == 0).any() @@ -124,13 +120,9 @@ def test_invalid_labels_key(self, sdata_tile_boundary): def test_clean_dataset_no_outliers(self, sdata_clean): """No tiling artifacts → MAD-based outlier detection should flag zero cells.""" - adata = sq.experimental.tl.calculate_tiling_qc( - sdata_clean, labels_key="labels", tile_size=200, inplace=False - ) + adata = sq.experimental.tl.calculate_tiling_qc(sdata_clean, labels_key="labels", tile_size=200, inplace=False) obs = adata.obs - assert not obs["is_outlier"].any(), ( - f"Expected 0 outliers on clean data, got {obs['is_outlier'].sum()}" - ) + assert not obs["is_outlier"].any(), f"Expected 0 outliers on clean data, got {obs['is_outlier'].sum()}" assert (obs["nhood_outlier_fraction"] == 0).all() def test_few_cells_below_k(self): @@ -147,16 +139,14 @@ def test_few_cells_below_k(self): labels[yy**2 + xx**2 <= 64] = i sdata = SpatialData( - images={"image": Image2DModel.parse( - xr.DataArray(np.zeros((3, 100, 100), dtype=np.uint8), dims=["c", "y", "x"]) - )}, - labels={"labels": Labels2DModel.parse( - xr.DataArray(da.from_array(labels, chunks=(100, 100)), dims=["y", "x"]) - )}, - ) - adata = sq.experimental.tl.calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False + images={ + "image": Image2DModel.parse(xr.DataArray(np.zeros((3, 100, 100), dtype=np.uint8), dims=["c", "y", "x"])) + }, + labels={ + "labels": Labels2DModel.parse(xr.DataArray(da.from_array(labels, chunks=(100, 100)), dims=["y", "x"])) + }, ) + adata = sq.experimental.tl.calculate_tiling_qc(sdata, labels_key="labels", tile_size=200, inplace=False) assert adata.n_obs == 3 for col in ["smoothed_cut_score", "is_outlier", "nhood_outlier_fraction"]: assert col in adata.obs.columns From 2d3ab9436ff7bd204d8830cbb75fbc722f43a446 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 13:17:13 +0200 Subject: [PATCH 20/24] Use jittered-grid cell placement for denser test fixture (625 vs 120 cells) Replace rejection sampling with grid-based placement: deterministic, no collision checking needed, 5x more cells at the same memory footprint. Regenerate all visual references for the denser fixture. Co-Authored-By: Claude Opus 4.6 (1M context) --- ...gQCVisual_tiling_qc_cardinal_alignment.png | Bin 12143 -> 30140 bytes .../TilingQCVisual_tiling_qc_cut_score.png | Bin 10505 -> 30824 bytes ...isual_tiling_qc_nhood_outlier_fraction.png | Bin 12687 -> 28778 bytes ...gQCVisual_tiling_qc_smoothed_cut_score.png | Bin 12842 -> 30667 bytes ...QCVisual_tiling_qc_straight_edge_ratio.png | Bin 10224 -> 30688 bytes tests/experimental/conftest.py | 76 ++++++++---------- 6 files changed, 35 insertions(+), 41 deletions(-) diff --git a/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png b/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png index 58288c0c94b3ab446722c6cc949f8347bf65b51c..fbcd09fbb3d5a6b09ba129542f13e9398ac1b571 100644 GIT binary patch literal 30140 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

yutbIa5L|~nN?@w>d)Q}s#}_Z^t~k1JggHp9 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 diff --git a/tests/_images/TilingQCVisual_tiling_qc_cut_score.png b/tests/_images/TilingQCVisual_tiling_qc_cut_score.png index 0e3d366c1f32c813d566c482d683e8193b7d4ba6..0d1cf123676b075110d82843cc9344e7b9a94f36 100644 GIT binary patch delta 30700 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 delta 30586 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 Z{{dK1g)x%y^VI+V002ovPDHLkV1kSiB*Xv! diff --git a/tests/_images/TilingQCVisual_tiling_qc_nhood_outlier_fraction.png b/tests/_images/TilingQCVisual_tiling_qc_nhood_outlier_fraction.png index 8aca0457ed551bd917a91d3d2abb2560e447d825..db6c9193b14fb9898c80ef13be1a930e34fa501c 100644 GIT binary patch literal 29888 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 D-;&9@ literal 28778 zcmV)oK%BpcP)005u}1^@s6i_d2*0000wbVXQnQ*UN; zcVTj608L?ZaBOdMY-wU3c4cyNX>V>bE-^4JI4mG&baZfYIxjD6VRUe8Z***FVlHoT zXD`89bAI8sq_On)(TXElg_hIA4jbCHy{&x`bO*i0w30t;o!GjMzi1zK< zW6qp8m_B_v^78WVo8SBf>FMd{(W3`u%$R{?%a-AeJMKV5MFn1X;RQVN%riK2=n(Sr z^YM#c{NkH_jBgcAuYhg9-~ax1yzM9l;rIKc?CGbU#y$7kgJ++8R#vr|ni`ya z_SsTr#E21?KYu>Pj2VMVFTE7Kd-ulT#f!h`$M{y^^aN}Jd_EtXPNy6WheOIjp^*96 z_@0=UD4%0vV-XV*gS+p(8};?|IP0vla9ZkR$LTG&4fyr1e~nvixdk~nIp(Ch_10Tu z1?0BOl`kzV4XakI!r%V(H`#J;y6Gmo_S$Rs;)^d(U0p4cGb=0Wn|_pU4IHNh(XGea zxpQSpCB}{&EA-xJoWcpnH<|=@N=gbQOqhUcuf6uay!~nXUq_oJ;2;0^M9m&;|AuUWGOB_$<7-y|g^o%~jw#{VQd9uNBW z?~mNv+^D~Mz23G>z%E_7;P~<5=-9ENaC?ygSaOM9HXH>sAR{3a(*})2Y)lLSp&(vc z^BJZN9E%QVnZgOaympS%6F7jGqo)CyhF8|jm7?#Tbv_c~66AB8uO9DgS}31qj=Dq` zfNF0o79ZUpWta7u2&cm-*YyP}QR6>?jQIX=A{MCpD%{Al0dP3u%!k)}m2d}+1I}1D z(gq?Bsz;@FkNln$Kg47-${UJtw056-PL0h%_p~$QUQ70F!tu%yTsLZp{C23c08934 zM2yRYYtFt1F;4Z8t~;~?I|>g1Az)b7z8Kb}pOk;Hbp?XK5H1@!PTEg=x^*Q=JQec! z{C*?RHM0XY{x!YEo^(OWihMw7-<@1~C=fmswVMO=-7?j&n zp26tvvAu?%U%ReS&m03C*Nwawv91`~xLkYoMTm37V&0CmD6B4(ak^&YMR2=f!}W9l z0LRa%-)nDiKC+V2kiYk!{MOV2+`M^n+a}=6H{UFrV0?T$ZoKhEv;3TM&M{~F)}yuH z-2COVo6x&m7by>hLeM&$1B6=oG|l&X^^O@hPe#67G2g_Qp7F|xw|Ozt&FL?fY403{8Z;PJTthZo&bE`p;f z2U_iZy`}YVbh=2+udS_xR(A|ZUN_)Mgfn+Cyn!kltMwzz-5VM41I$U0SG^DJ(mFUD zF&NQq5;`Px#i|2aaU{PUNvT1Mwyt2=;$rN>a74$K&#uCcQIFiK0*3>bX&SvafP8JLX8_`~~8qcRvkTJKIMswqQh zeh7~AbWSA<7MdJdLz-YeP&pSK?MIdK?$?ieJ;CrW?6lD`uD&l-Y>eTPduH3lmY z(lngYV-U_i_k6gVPL!o<_;lMUnOx&1Opx=(PaKaMU;i`C?$#d{j6YvqtU$+P9IYtE z(tVqy4IIB1rxT?$m3Za76@b@)8-|W;aYt;^1mw#1=9_OeTj!5cZ<4>A)7zV6e6WiL zs!3|#m*>sEKNh_$pKl&}sR$%xO%03G?2uLR5}9bkPlsG3e{++w%`&Gm208JngFXHN zb*;2Pa3prIUB`qw2adE!W?`%|3AxD=5a&!cC!ZCu&KQ||#NbZ7ao;63nfE3JbnGEz z|62Awt{*+sc5aL_26tb413G84Gs}K7_A+<_K4c`Nnq@bQosKe373OVUjWarQGs}5B zt}dN(I-qw>XDr|M6^>VxqF?)N7?j&P+^>^n;Gxf7#`r!%W%3wcyV|8>Mjxxp_OeqE zR}PUm$>qeTS*O*RPqLkc|7L-7KFEZ&ka= zDG|ev4y>!IGgpI_z&Ft2Ymm=Laq;>J*0{`C*IL&6wF3wth#054$vRvCiR9$uR$VU; z3drZU7&R!(q0ZNUM1AlGPBMQWV4D!l-!BAzC;)d%T$Ams_cb683dyz^9~-V`^i_OJ zoH?n!DJ)vFNcaL{hm1C7z7|agJHen4`S-35{)u0||0MPo=bLpnkvO4vL@TpSG=5Hr zPqdX8_lTrL)pw_D@@ZN~j!0+?MFG1Yw2;p%(_4TTXPg`cHs|e;XS!$h zvyHCH!MC=DE2nirHunr6{WH&L4xF4Xu9}TFm%ScWll$kqfGx)q&Ds=rAGUw>!L7~K zYpR{rax1t6^SV{_>V;_uCv^hyjr0Zl*i)1z17tL=sHPl+)#Z5Lvlmfa?~$?!PYq_i z_JABU4XP{<2*~%<2e;WKFt2GG#zP;iES9>Yp^Um7UmfmU^|TzmpjxpsjemE`(P$EK zRSVQWE1a(;-La3Mm2ZT0Y!0-7d1ke*O7_S#A71|-SqXW+qUthvrji=P2w2e$^&0XC)*xQZx0*$i}(H^-$?{V z)>(6Kn>kn^gmB~Q597wy9+JN@0RjAe_Onv=zPT^Tz!9;oIGmBy14G*NgUh7h_?O#O zYbXuPa@b2l&`{@Zz+1cK$rj7OheZcWY&fz@+L&Kagh#)4!}d(%O#imvHM8u4&5My= zSuDR9cRNs=kFvUIB*eHev~ypx?%%$61Am_PsvMjI2CZgYX`92H?>!;o!nX0nC6?{` zvQgg?d~sQiFSfM@*u_sSc?Y$=dKrVycdpaNPag}*vl91w@|_Fkrc1QE!<-7nesz)$!w4KIMumMs4@dW zEAoSg04#C<(r2z1T-o-@+rLGm{^&5fJ2e!fCbjWA9Pls-}`=aY* z<>;2x(X4y@s41wfQSI;AJ}lC>>%!}hnqcQLe>UMtyt{c326yUXmfbe-N?8=f_8f$E zsfrP~@XWLE)`rH41ok2On+%6}zCM0NUvms*oOM3Z5|Z)Oh6T8B%rv!f)Jb}ofrfw&!B7xMx@?jwG`G2A zcY=9uZb9{augKm=vzq7neX^}lcyFb7J>Gixo8(s4Y!0nun%FnoUK8Tnjru=6){Quw zF$tI1$EvAoetC2+Y8vV=zV}cYbI5C0`@mYZWXX~inUIsZ0+KK`-bgkiEFN(-dQ;iJ z69uo=w|!TG5cLPkzL$`|co6u!CPH=0oIof8fVS4;UIoYA@5IKCv77lkq}YsVAh zI(Zm$s_~l)vd%16%M)VVjmoT_&F3L=q-i#@FQeReJmYzJu66PmWk!D+*SD6n1lAp< zlLXdw5|Mq-mg`D=oMdoi*j;!;2v@!_Mq^oSC2Vhc{b8v?x+#(iwAPIV(tJFZbj_i% zf=1`>Dc_9xfLdV{>TQgOVodlu31xl7YldUyHUG8recV3lF|%y#;qB4}(u0w0`|U^n z!Xsb2ZY%r4>}T-fxBemwmQi-^r_bTXZ~g_#_kU&HXH~&xCZl8Ct7twpmn>^U)Gx?? z8*>l8io?~r&H6l-f`2O-d_J9#cn~`a4x29szkjlAh3#JK`^f(1=Rm}F(uu}3DUh~~ z?aBjNq+BT)PT>S3H+%CN58wyZGJ?s)fc+cy39!naUVQ-N{4hnX_Ke=eDY{E8BE%j}4Adk=vx z;KS2P-@}peLJ>?G+KD}tU!uZWgwGDYid_{-&1j%LP=kXJ^eHE#h7h)wt$`unM>b}M}2u0hR1%4v*`35nyS&a|5FDb{9o=)FjKh^@O~(9P z>+ssTc^K1kkjO6|`s~FrYfmi`LS67VV5ULc19~}3W1Q% z)VPo_vkJbWwO7cMPy=F}ad7GMX^oF$kB0adceBE5wFN&QVw0bYyIge1*8cut_Xb?t zf3!?Mqn|0QXpUiw9Fx{CA*VzYXKcsOi0f!&1|l^d(FQP*fRA>rb&Iuf!OnMD}g#RH3SFYbM~=-kWR;H6SEP_Y@v6%egX8 z+HajSN)z&+c^In!wI){Wh;iM3ehsVIXLCL^4-bkY-hh$?D!Q$uwjQk7jyivhzDSqkdqM%&G2i})_*2km9%y`reR))p?nzRImO+PW!KUL+IK6v)Z*h@44ah57HoE`%HG?&NbXNHqZO~O zn}?aNJ%mT*zhRU2{r=-;P+C)Aa?L#d<~ROgdr^WRAC7qzz^b)?v~~WG)#eIEwHe2Q@<_8sLm_jVtSVPH7?Y0@i}L{&dK(WSmyAWhbfgHgQ#hEbDi>^X$~iS1-#?^$MMVe9>*`=f84Ze z5oo|0>pquBV#WHyJ59Z*sz=Tt`cg&3x&6&n^==vWoknF=_(GMa@f~VZUQ~A!i}K$? zNu3(Nq}UYXCiRfdD~~H<&C>dEtT?(^=W@OHVBbO%*OV)pIhr|r`hxA67xo{8vO&V~trJ2nF%v;&;sNRo?yZ2V2tEv<}OUZbn(X(o^62$@4NEYY%O= z)w%NnHBR{zNC*5A> z$t&+LKO0hi8ZiF+yem;v=P`wpT>8lwa>e@2knu>1Ns-m^sTtw(DP$(n5>jx@$O}d7 zGj+f@x^+wvp1SHz^LIl4dc&wokd~N)J~_%ln4o=Ms=Ei0W4lG|lax5cos#Gunll~) zvPQw7*UU-C#DvZxu zESo-foT$TG76vTc-ACHl)Vh%A?ueX(@N+eV9}oT>p5OX``TbARZZ;(ek@kRV4sA!5 z%&?IDWYf+=P&>(`TRCm=HrS?r`A2>9@!jOdT*rcCdFhEy8z( zPHeHQjhK*w2M^+^tF96+|6l#;R|p1!!d%evpT4bczx}rC`M>?`Z!u`lpf)ifL?e?b zgraIQqFtjkb(>>&tQrHQiqphmw>9^EckdTCSalS?8~H<%TU2HdieqgJNSj5rKhy+s z6?uP37_3YP%eYnNCQWRjUp4A^%<`u09eHlFdQG*-cz(Ht~8_3n@VE#IHG>JC#pVw@idiesV;9AWr#7`UR3daUmPz;c$_Xq8q9-V~_lpMny=U;6z zLVa$)?K z)PEFQ`b%h>zv;+cjO@{0NGq06sxeEqWxQwVjncZk#d#?ARAY3HfwF)ZVM5EG}u zYTdZgQjKreKNiiBNlBV9EiqZ%IVqFgfoNGsQ(C>W3{VvC`cB1A@TXe_Ut#{1S5t`P z2fjjbYyy7Jf12&Q5BD#@4Fjgj=UzFv=#Z9WTJR9H4Rv^X;}8d#i)yq{;zYFm(SxAB*2h89r zV7pFXRhemnx$?kPX;ZtD46*HdW4+=?DRge1s>Y5hA72;)QwrHNCbI{^&{;NvaJ5$kl}o^z)n*+K%8`#fS5)2)NrRfz8nIA6A58kW)s zmF8h~1|$Ivhq^|tHWUuHEP`|H4s>R6z~NBC*v{oZaYH2<{C?qLySDErTVY479SZ6y zl&xaC+q}m3GtYuEE*7!wI4SF(<)E;xLYRmccdS{Dy6Xa+qn5FXPZI5rQAS9=0+=!C zB0RBV7UB~U;Eu5Uj0)`}VfE_O+QNkkwO}wPhZX*S-#m=p`1xSTF>U>!osH^8g1=kO zZK=#!E@eT#c^IgvsnM#dtF>3Rf1-H<;c{#JmJr!)et&NHhnmM*->9y-W}w;Yg+f6s z6gsGdLOb-M+SXnkEg|yxTPlwnuW0qWey?`JD-UR!j_kJe>w%J^QhuzW*xujz`J4}& z7fpe`ope7 z?=?eZ=QzRkYc|Uqu5ON~T=0pi*xK@(VGcS(k1dfPv__r!jd{g!F6UJgVZlyikz#;; z2(PT2Yg0$D;Z=1tav18QpT7Nw&?GZoc>p^K4%*dp!GKw}DeyN&E1>lW>ze0MN$&H= zVLjg;3c?dmJ`Pq*Kx92`H-BIF7G}PBzicmsHRX75)u&>4eB0ZPnwHH3%YOC2llbfW zu!NxA=Z)$mR_AY!d)ZZ1)C}zs3vM;}0wQiH@GM8A*X~$FyGBj(+sbIR#&*tp^#Kv` z^EpVn8hvf;Z+_6QMDG{lTGU8c$Hh9Xr`#!t_~WO~ z*}k(u_k8j!7Vp`F{l&*@lj62nf0x5*4=78ALlaugVDZWLPzZgSu5y#IU;sM{4#{DZ zk>h@O%^W&}T21^gCZV!zqd9s_StKA2Wq9UxCe2%Cgkxee%YoL{AloZTV0oC^}TXB%SuinpL*!{m{|Pe z+{#f z(U6jmgcw(pb;ve%G@As2WA)hg?6IyTvW2cAC+;}!`>5C#HehWECzS@QuC2zK$JR;! z8-{K$Kx>u-yVi;;q18_A<~Njpnku!lL=`i}pkJ(38ls~-v|VIX-7-6v+;OzJ(GX2* z(Uc~Hb>G-E7uTH`4g+Gnm({5!vW#FEe~VV;biii&`1Durie>R_LuNz>qWL2Cuvz1H z#1O+NG+=nkJ*e9_hK12Ted`f1m>_<4(e*f^eK-94-G7Kanz-wN>m-B-@5eES>^rOP zGJoTXL!$}e=M%5O@UH!u?CZ!eIpy|%B$Ur%kfAo({zbFri@Zi_R94Zhc_LnBt-V)k z(X4t9jmtT~tlEvH+8b%JXuYNZ<7I74SyOFlPL&$1{2OCJc2{h|s>072sb^@Z98G0Y zH~5Z&ND`NU7!KAK6_nWSFUX-+gP*{yDP%ywiPO_jL#fg^;S2S2Ti7$ z0~rcq1u`)2@GAUi&9lOESP{_t;zke%8Nz2Hl0zs8vk}yf$mcrRsEpU7?V@#37=6vv zhBV;A>tDnlR{cwka`Nq|JR;{Gt`3{oDF(+Lkl>UuAr%cp z_^M=?n3o$3T9Ee+HWx30-!gc@guL^2Imo$2npu&HG$w70zYY(t`;Q#E%9VpRP0?w7 z&x1B{#^n2G|6v7Jbb!C5b^op)p%s%E4F(ScuHg|d-|()P}vaX&es-vF74k}VToZVv>l@#C=)5= zwZ~`9(~n4Qn%4{8zsy@8*F5gAJHi`%eXO!r`l!xte@P77`^mH76Y|klOHI;&ePkSl zV^|O&ytd<0`TWAR53sK?&vXjgRk5+vlklWYz@DiCMBBiJulCtF!NR)3sPfv4Hw`du zo*j-R3Fwr##=6CgMN69ejbK|=7tC$63LmOEiWjzi81nWXBJcZmaVb zprCez9A#c*Ll+G(4kzNAO7~mdP%SS>+fc=IwbivZ72AzjO;`x6X+6gwp@k@4DQ>0N zAlOGV@8Ut5$Y@B4jmMsf&EgbxplUn3A^U3I6i%{ZdIHYrawU$`>_vK$^iG^J9#gyDVAkRJ{W7{Y zs%OBe$hYFxBd%{uzgRfFSZ4~lrz)MW)l5IbJpci%9`%7@v`+}rIG6MskEuP*HNVHj z#33soT?`F!Q`%utmyxzsrN(8UU&dLMvT#g5g)Dv52IT#z9* z_`Kxky#WU%cO8Y?r0`h%=ej?b)<8zT+&AW@=5?(7s*EQTa+BJ@mynA6RogH$XB^zl z);XqqElx>IF&wQS!doJ2PXuCeui39>aKVw91*^$^v>=ty>RRg=VcjIkLMw@QXA93s z8n3oCx+Wx=^Hj8Zwbp^FEr@mvtKH={pb1e?2ON&Z(FH`}XKAqF^wgn_pX9@+vj0tF@K<0#Pwe}(J7i52juMw^P%zlWpuZ$wTYATjuG>Fc? za$R%$goz6G>nUVHN_7I7N2&QB(rL8^fa+bU)1+Y@OI;(BtF_FK`12Z-dRf3e`Sz_r zaM5$nN)ER;2}2E@D0OP|>uTzHhc?Rf# zP)}`709vU<9a*&#+VMHi3YS0&@P+X~^Oi#^Tnx=uWocs#f~($A_um)x9nnhH0Hv$c zQC|=)uRM<6#@RAqRXe@9c4Uu@G10sg>V6jbjjJ~qEgod5!hOxHK5XS;l&j|t_kr}K z=MYf6GooLuW7;z9`Zc;`mW0I#oOo4Rq1Eixqfc=HhQo9KhM$AA%!+WQ8_>8)98`=# z@JnUy7YYOrJoKe`$fPpLzMQKjNfXe5euVahZR1!!j9Ohd93B|&!F})_JtC9PyJrUw ztcT_~(0rE!Yt^7}G88WXf*xokE1-Fm7(~n44%Dj&87j>~sIIE{%We7;s5pkumU#$? z16Wa1?TA*oTHUX~(vKQ&ympx!AV&0ec66V4c3)cm=!rA8>xW?ZA*Z6Qu!f+cR!g$cyI21zt=JkLp368YEmgl!1 zZ6FY%Z1)=VlPeyGwFeIuc*+2)hglT3Cd^b}p21REfX0 z4#73bD%y4Kb#Ur2?yTDZCuHPz15JkJVD`%>bWybD@hq7S-+_Hdzxih>3`oQlZ@rG~ zw+PQuhh8suXfr}bw#a8^=l*c^9BDp7ZT>RAosHyn%yrT<)6-O+Mtd%UiE^Ca7(^da zpKj699g7w%YnxNje+!xqHT58o53lOCZUHvxSv$e$PK0yf4_mxXwEH%DuU5A+gv4=^ zkTgl<9ck`fYU?*9AXku>s0)Ov$8b5KwaJk+vQ^L5+WrrRsUzq>6!kPqeZDhfx?)VG zBl`1lN-3-M)`UeiC*Y19JMh=P{#DYAcIePS{61Ril6mStqP7)g-lqT>mHXw#fLxVR zqggP@f?sC}=z|>BR79>*2Vn#KiqT4p?Et44uC6HrrG9d3*rlLp)LO!)TvX^vuDp%yJUvF;<8awW3_oRWL8!pm-L=`-S`H20>wy*X%C0PCET$m5T@0V zVmg{$aN%p{*Q~eO)**p3VhE@&1QHmESKpF@L3sBwIHiIkCKm2qeZ{XOSW}ILJv-oV z#UQR%Z=lFxPS(CxxSfGIz^4<`u6Q`yS68a^Rt($p;Z+|x>#u@w1$!}QSZ)z!xay${5b0CJO~9s2xfJJDOgY>GW{w+ zx6IL_M@zQv*0^Na!A>cQ(kTfR?kdS-FoIeD)!uzbh{=XaFXMOfZ1X{bmh0*ds^@OA zO+e}&Sss@G7;%sNe$=lGM=)?ErN{)7t5%f4zjh^@iAjiKSzIE5dsoVS<7#j5>f-8U z+>aU_cNXAIMyPrlw5lS+=o64BA8hSnn2*>LfRn0TfBwX7Kumkf^Tg_mm=1R)P_hc3 z)<|9|GBNEDIy4`_Iv+xgIGKP-%wnCy>|^#JUlc?ze5H;c+pZ!I}%sI{q!k2Q(*OLqh}Zyz@?6cG+b(^UO14HEgX* zW;j<|9+H#An?P47C0JIwM4dS0q>M4kQj@0${XyD=QgpXI5p$EqN$MzG}Qx%2XR+9CEqP&`<}hp#jdMWMp3dBa?=S@7o_q!xU{LOhi%= zG^ZcIeQObuloTfH6MF(#`XsXw{6o)2aPudK(HR-dRRfKA>WH`uI5N*vOhh8NW0lKI zU4Z|EeR&%(3`rN;?jsnkqV6Z_?b5WKx;-FQtoEiPLDNVQaKcdS$%)FaBZn-Ll6@GD zo{3>*(a>CIT0i|ZU z-4T-jw40>FIx%hwM@WqUJ0eB~%9)UWj2mx*XXzJ6nI4Wn5G^u-3~YyfaAimLX^qAJ z#Eb}ALpu^W%F)t!C&malY`>|=5zY~3gVqxcTO@?W&l5dTgtO5Ysk*UEj7wA3P`gx{ zA|w3eFUsn*DbU-^@OWz)0n0MXw@+E880inJ5$P32OVv%wjJQ&fRfp*+qw_ck{k70^ zYZGpBTDcNVJF>?@i&tqGVluLj_MPwBJ=eSqGEx1t)re`=L9Q9{`%pXoQ#5SZgp42F zirC!Fx`tz$BsSDyQ{b>L5JDS<{1IjK>RBTg4NVXCMw-y97xV&7msw`kBPro>tC!5| zFHNTn)oL54D1+wp3i;qlwcN{B361T|Imb**+ZIHQi~4TWXt>o%8)Zz`ul|rKi*<(O zkf$&@7HJ4eW=i7$YWG4TbC5M!CZT#LPEr~Kr0Ls)Lsz+3S@(4HwQ4&wowj0LUoEAN zxCv_In}Pa#I67S>+rBaRf1a}eO+bi>g}IiqWw_*9WG8h`d^I1)NQW8D&#)#znvH54^iDYYyP zAbX5VF0FJe;I9DUGT~?+ezCRkO@OZqj^sW-hGpBXI||esLnwA6oQY|uoi`i4L;Dev z(;lf;UMDY^@!TM7$Nttcdukf{HKcF9?g$kpkt!2Tl~F6>fu?oQCm|=)am%>$Gdw_` z6{~I8(eV;9y~VLwWg5qnx8I0YTqAHhtl9|&83WrJS)voi1v-7A>7T8KehCXWH>J9>BT!k6nt30i=JVOA8{KZi_0YF3a^A}p()BJp`ADX>*SFG`6gbihTE_x% zyJCnMgjS>HBlcDR0jkeJ(8@MIGdOil9!?6;dZenAgOjf<@EnHLPz_YG-+u4HZ^y7MeTA2}8`q^UmAQO=Fe3tKR*Htjq;Ww}X=IECs5v$$^*)F*f zMbIybSPmmx#>u7!moa~gqw-gMHX_A)mBlcGK6I#ScbpPVGH99X4wnlKItl4%O(oit z%LTWE2@%Tmhqt2Y-Pe%$<6qc>ty*$lIFci1BL|rc9-;8P5^~|_^c~UfN}0QZDo-0I zE4O()cRN+DYz-V)(X|APKr+Ljwruryamf1hpUmemo7Hiu-Umh*>2XeW_MfBK;a6k8 z=j2OdkV|3a%U;G=cAx*W$T{l>#_&@Z=rl%W5aYv&a_>-DU}ym$W|#CGomr|zxRmVCiYwzHOo1!Zt#sa$U-16t({ zXn|VA(CAyJ8Kk_S5Ggr*+I~&hS}WjiG!7{B|7E`5NQeWH9^AU6dWD`+6jA6ZIXn~` zt~fZeN68^82;H$=x%hWMF=_(A@ICxBs7>i3hw)a4`IoN>aa|RoVMU~q4;c>DmBSV- z!Ha5dIcg%@3@RPjIOdF0@J9zjzm@BjE(XdXzRR0GxT^_b*6`_Ew%(yp?);fj7ob=EfHT#5QXrI^x z?wELK2;(AunZF0)`wYYA9)rXjU*bLMi!Woz(FA=7#cgl9@+_J;M8P^v96{Jr!Xn`z%D=uyP$aH0& z0|$lII*!)v$5*8*Ff3;Rx}@|*X?+3K7cM|R3t(vWx#*foCPLw#o8QKzy(VCEZkXBO zczs#22WMn-Hxo0`!RyJ*Z^`F-M*T=4c`=7_fu|HJk9{d_2IqGjCFF=P27S^7e=|(T zmXZ}RSVrn7hN_sg=?m;G%99jM%rMCW&Cjp=SibXM`g!8B!z%DM!I;dF7$FoAFSqyi zeqjqVY2btXi)?w!4D2dz9PUCG7=cx^pwp5xBGo6K)TJmxQe=5>pt`Zs5z~&*h0z}h z;Hf3=N>E4Q%c5PFwRb+2AKPr{lRfZ6c%kuyDyl2PlDtUgr&8V3GQ8S~&7HBPHyj6o z4bW=#(t;K6gtH7BsN9Y%G+MQQ>Ag7lS_8u=pM7245ZxB>-MtIs?+1Gq%H$)?u)IJ9 z_Eoi?zKdw=2c14nyR@H_HGs{U~F0;JBv*iLnV1 zSpa&nnBR$?q9`bv=+mw{>Be~3;=ig_53GYQGD>Cz|87G$pMuPgdq zp!c=Y=7{u*;nzs{cl)U577vcSO`eHI=VayRM8@R2&R592CU?22Rf6cRoeAMv#bkZP z8ugQL-?4?RwSqpUZ|+i-$f_fncOCq1pq!HGketj_wX@;?DaWf&Z?1!p@^zY#+ZYqr zjA$1QEy9eTpY2c<)J#J7y zM@kc%YAaT|(H#eyq{27BgnXl1u#wS+u8SuV44=zM-ki5rTex8Q!d81da=q+?XscH9 zU}&}!+AsbWUVgPFfopFKI3A2K9hvWs(a1=%M<%y!@Ocp%6B{*!**6j&aMgjWax};F z@*&BDFpl!eYvxM)J)_(>pNEx`V!SzP96g@HI!3551B`|DUnl^&P!9mf?tS?;OAV+-Gs@O0ab z*?mU#SL8)+mnR>ZH%tT4KSbkEYZqP%=YP;HjMua({h91>|BOC0k_Xw!^!SFtFz#G~ zr;i!%`?+t}=5Mqz|)*W7zQ=R1OMNY4y5#P1kWIbV6l9Z|o{p zc7kL$Rvg=m9_gKgj^+LL6dl2hW2T#v?}DtUsOb zT@34@IMMk>*5YVwF(!5i%MrEeJ;E$Gl6wR0bcBizBe-=Qf?6Cxnj3zchu99eIR5zx zcn%#!)vg2R_lp~l(#ueR(#SNRn|Ou$#pu^FJ9Lu>S?_IHgn2vHO4)VsiUT@c?4 zPU;GHw6X-lyPScmM_#C+*6VM|T^~G!rTaEv>E6v)duW>k&fylB6zj%sF1$`M@PwhV z3dZa9h=kAYM}Bz`_7)v!)@PMl?~{vX!7bZ_P5@KZM>Uq`sM1K-whD(%^y?8Ds4la_ zc`>~IjgW2(I}&GMF4)ecdpF6-K$Ll^P{Bmol5Q*#nyjYz<;AwLg?a1DRA5p<+d;XR zo+6>TNck$WdG)mjRjO66V#{untl9)$Wi`BI6)g^_>Q7Bx1k&0wMxHPI&m)pFxazFQ zl2_OOpZ}ptZ;5hM<%@k`JF%}QPvRr)FV1h30`H`*fZrK9Au0`+o0cO7aofZz z83IhQ*H6}B6XDP$e!7`xOwblVOoXUoVx=Y znZx05+0FSWYjZd{+SOgIL?FoR#{oxNI@%>=;fDUxW#uDh{{1s9lB#UWkj{PNKG%;{ z=@>?II}_KBnkq8SZhCTVrj;1dN$H)L_TbVX$uIdaATmD@!iE#H&U z0eyg-?gTjWDE-MjyTIXeAY;gx$Ub{;gy|KHUt?_j@~`jTg{Kz3i<#$KVkQ!Q?z+1h z4Z)z?-sqH`)5wWEEj~$}!${!cbU4iCVlYmQ6>}+*-mR>wLAR`qLIZv)xL{^5;&R^F zMAoeVX}?9gHegb}vzp|pn?sXcadZ@KC{jkQDXq(OaWbLNOp9_m+BxbkOsHTFYHMoX zNXkS?r?zvvZ2`xNeS0E(`mJC>)*ad*2e(55zxn7XJh?bb*zzIQAKHQAmHKvLlpR** z@@R>OC2g3UoGyg@iN*qqe&HCk3dV#ZZB;Z>+v4RJAkD|NQY3RSLKfu^IAgE4;tIU`?z>1$O%+pomcRV+%UHX1t*ji6Jo1Q{#w!v}FMCgd zS~K!hZ=HxGb`~DOvC0yh(Lu?a7}&dAayou}!F7^_NXnMJFG*5JT0C{t9f*rjW=0H_ z{q9D!od00-6rBmF$5Tt+lQJVlw4q;Jd2F*psWP?;%J)#Mn{-hyt#5Cd)}X7t=oF>D ziw(ulDoB&LfQ%uiiEW41cFqx@ab`lQDYN6`dwkJ5D6gx=piaGTMu#7m&q}V4sZN>l zp4fPJ7q%Zih<2$Nm^yHblx;e)The!NOP)69+_2e}Z2wfh9S4%SiD9cmb~x~r*gyu4 zB?4z%CT^+0UCZG}Z!Z(nz?RaL@C6$r>elEE7b0GNk=R!^kG&KVQ!-2q6=PgSG9hnm z_*}-1Dn{%0wFcBkaiQ6AY(Jj5>Q`->fSg$L1EJ&5s8OSE>#etnDgJG@-6n|(IU(oG zn}-b>Hb_Fl2OfAJYOc60DT>w$`U2)Q_t>RB6TRuIHJ=N;5FhJC*OY8YY4F_Q_wmyS z-;*W(AD7*Z#}~gX=e)4wBiy0~`hI5F`zWg=bD-hLs&f43+{`SiM{U=ElKyJ;rX}zO z{ix5%MQ!(5rL*ly87nzf#ce^gQeDDNQMaS}t_*7&d6_@lpS9j@TWbh;ql#>m*j3Jt^VXtMayYJ`!SPYV!Xpx6dJRUYrwR$NY9e*d>WInx zMq*EKp5#0xx@5G+1!s;D@*yY1BG?v#RXr?5j7rQ%IQxwQ_N=9<2(B)D;fPO$qsMS) z-Z~)OZu;(WxNuJH6x8`^ZR)h{nH`bpPPF^qWGDvAEgo?SEMxLWgK0GT#pytjoUi+) zIG}%542i14`{d$+{%4yaoEBlEP1>+wgP96y;>3yC-~ax1`F!iGw`vCt9MCSk^iui0 ze*Jpw-h1zjns$k)nZB(EHI!+gs$E)0Pbt;f)K}jY)clXNmuO9@E^`GW2Yb^^H;Fgg z<(FTMojZ5p=Rf~BGBPs6NqxqQ8Tj#!e~hZCDsfW(Z$W~0SGm#_^vmqtY|>{Ev|Eqv z$KcMrPF!tA;{sYX{}<}81C{ycm2UTWIoSv?+5*F^C8fie5?-DCg~vqzZH3r679Rvi z2gd7(thEs8bw~097mWmzfS=i;xEg0$R$S6-U*+vV|J)vJ;(Cqib;`(*Z19ogX8T$p zU@=F1{P^*5G=*!fxkiqbK%F7gHp~Oehh?MQ-k?l)F6=)FIVl-Z#z5IdyySt|y>WHF zi-j;YINI+Fn<$;a@Bd!*0XF9C#)z){aQmbgIuqiR3`Ca=884|`4G!#!JQbJkqV8i& zVK}|l=mbQ$o|Z9Ow+EzfSJR^bDDOF`%Q)8Jf5QaUd}r7(N}&lq}S3S_{wS^>Ft-1Mvd}ix(de z+Ora&!<&J$4!~KL3S&~yu*3An=$t%R;#1T7?UQXQ#c1N!=U*#wRrc!(D?Y-igWD7n zlAUWCzl#T)gRJBX%iY3q(PSbs#lNTlihF#B0KURwRBDQbCU`A5>$b%zam z#Bf0IrAI#&J3d=`iMmQaj}PeGwH=zzhlZV75iD1c2ZFnnA#_BKu3ud&BAU|rt*G+Z z_08{Y`~q{x?P?Cm1NYFpmrVWnnnQLwM^4InKYc--tD-Kf5u#*b;qDDmZirW6U9qC} z270BoW*NDsEOv;da z!g38~tR%N)Sd^V-HtwAk>u{{Ty@Kl&E4~)gRkm)q0K}{ZLR4h z4cJ=qCML&OTd)lix|}6CPAjN#qw4U4gM4ct9IZKkuBmoMqu~DaO1_sJw$m$Jy&SI0 z9AuoKjANTZg?BIFoGD0(4XYUEZeN84zgqRqKVu})EQz%L8*n%KeCJwRGH|Rpi7B(? zu5ihKF<7-?<+s}&Fxn(sx_>=fvGq8&+c>zIVN9AreSk^*Vk8a0*KJ=%0|}a2F@t!o zoYsUbJ8{%TOV#Bq6@yeOitCQS?MgtJ#ZQF&N(+@PneCC8l=gqmE3Pd_O{+tdb`W2d zEVpf|g;izpc12=m!9mj}gtX1aUoOW7n-{mr9xxgtib2J;7K5IXp8Ch4xA5q~H}TlQ zH*M;;$b89dx_`|9Xol9tT3&ld{iX*s*J=+#D_O1Ds+Z+e@5B1SFR-p~0V?$^o%ryp zrFeAVTVg6kLxHw}{X6f_N>NEhqR3Mgk?*)|IO$$-M{8B4o}Bn$aL1&{Hgnvg;x*^Q z4~08M(P50tzVdiD5cs*d)3NgS98~(0e)zcO5QgVWl!t#{?tf5OSBpPRy~(6asH=SB zi#JeQU5<>TG(3FiE%5q%rg}+CiS0?#76C!3={wg@y zohz!nclIa`ym*%zKOAtWY`I4(icwNqCG<{pLmdv392GU=+-8|@P_#r?qS!@7Kl?;>rrZp~EFF@l6YTLN5a{7!?~+Px|c zOJ9-1F!;|SgdiG%OwL`2ba%EQYj!Z=zJ|l)g_4^&UC&H<-`xLT`k-+b**(0i z`+|PFuq~WD>XyM*;$L6AgCb8UwwCO}&xcLjCAS` zhJrX)LhED)vXawpd5h#*_+f~)mW9Av~hx|BNQ)Ei~ zzc{iM7xfrp$)n2*QE@V;1PwBoiT!w$dXcy?&fc;dwcZBAGD3r)HGl(!o-+Asg(Egq zC3=pGJQYJ@1P`FwBTC>)aV-r;i%5=5MKNRKSb|Kl%`{OXIN7>nDiO{Ti)Z0r=`mX- zcaF;gYoC|CCE6us;)QMRqnH8HqeQ!+eWT0aY?St^Ay_Xj!STw27?RYy80MtMh|W!# zhzjp6Glm?I7S{)fvF&9=B>1MBn>$T%ixGV?2J0zA85gjJtbU!6m70rs$x8<-WqqPM z%$>Sp+_+TFUjE(T=ZVbkPt$M4CtocWg}*glFI)+5q=XgrVQ?@>L*<0^#74c;{_-a& zHW3p$kHA+YdojFyKU~mF(KB6W+c!wvpUlzNUW09ePL&+NRq?0ezbBT{lmkxet71Th zeQ_Q3KBV1Zw9d^KD)DF>@v5zkj3JHc4agdWSSRIi0r8F_W{e20u2wK1I9F;z{%2rZ z?lAN7q^@U+N8CNDl;UAVzYERDM#aHThg=13z>AE8FkMOGhjThk!O@z1NKCgo@<+qB ziU}dOw3pQvAUmPs2{9q9MO&E=ieuU(WZF1hZo}2}wdilr3A2ncv_ZPD<~P;elLfAd z%!EmFP3_QPlEZJ@935q7ZUY{FjV;_no7zQR55`>KaRRo3Ro*gG zc;m-@+qbyor_j!|7JJ1@A68g5~>^;F>m%Ok*ESPN``OWnoXN8p_{};NCR| zmD=y86}6BA$2gzqBmBy7>SREYKxTHAqqUQdS|-xgZBoUZEL3{;q9$+z9TUbPE+$p! zD;X_H7lhK}oPiUSZwEWM0~`*krL>Wmr&_|$k~v^f>ea{RVQlUc@yTE(Kez3DseSDk zQ;|wzO+ALox*|mYleQYuVT$Bq(~6f#RwCK%{MB&eoMZZ5gghI?3dNbNXq8aWK_II$ zoEDuk)6DLx{0jZj!`o9{MKOwN)fPi_*15fhiq_-VWgmzWl{+?0ULp$QKi#@Qv?M*V zI+=_~wf7)u{Q2+(RXDd)cTY9>b}nVgCpd${0bLHrvS7hspyV(@eb0h3lYuis2yU7U zE#QZ%&uBQayP~XqJL-d_2!v`y9hZ|Z04E|s)j!9~xX&`L>*Z;u4~ap;-WLm1wrA7+fWP-KSrmEoAl{t&ahmkZ;= z&(eOXFQbW%$Q1B}ttka`QB-jA9B5^EN^h*^iet(xU!Ve^kRN{0aVtmGln9^UZt{u~} zO@`x=fn%hFu@>PtRb|j)Jgd)SKyraRw_>g{!|FlTz{zmBR*O9#tz@JR+VzB{e@2pG zI1*zzqApM@ecvHrl&pS4_mqAJXnv%`W!n32*wwaYVlbn<%>M=rSqUBFg?A)%p>?rk zfYc%&W7uw@5?hI}tO4U5IdC|R{O>U#|1Es9hW4tJh7r1&%K7_E5%sMy$ATu??1{9O z`9ESDZd2acrhA7%DAJ?OX2o}qI6o~xW56i7Iq2>WZDm4Ex*)p3t1MSiV!I)xm07b- zCgNh^(J>~hLk-8HCa9o4^~#^^#|~hB$x%^*jqlTVg|)(w!By+T*My{4yTOAovG(iH zs=B81L%b#UxfNU$J0`U;PK?leCq9i%>S)yXkD#J{mmCG2l|qYz^O7AFC!nUlIt89p zI9|I#j(|lV>&AV{k;)HFDr8ny*+tlw*4+;FEm7{`^Cz zc;i1Nhe}OIsCc^ty6{CrY;lFa0`9xvBxAYTw8O+1w!=b(jzyK`?S5u zWCZeb&en*?ZdlLuk+Sv)qj0!d+0o_I%t!Z>X-YtipwM+8%R_OsEvc&zNxT)lkWbZ( z`gZ9Pn3Ka>k6>LLLPrjw^4Z6c@spoJE93+-G&l|kG+vw1TU1MI1H+D4L3P_#NB82j zwexWO=qcj;_UwueC7>pGC^~_YF{u?BNc*aGsCpOjYWE^d4`Zjm7uH~Y?6F-c-+2{` zSm*AN0N1E15!$sBT3J4vod&?wUuC)SYd)0K7s?SIlZ4L6jcM$FED9R_vH5jTGZuNu zk)4o%c8NxcR!#bE*|CptVb`k>>*SVfECvT9hO`Qu%svde)#@$P$C=pIb}NB;m)#)^u0R?ba3j^(5A}6EJpw5klB}l#P;ZecGbU86J}EW0gW+I@H1DEz zh3c^G?t$>u2N3dxxw{*BUjnx)4h?nTH3;y~b($Ef`KoxS`J#C(1gW7dRPJ9X`pD|L(GvX3)QQx!0 zX6}MB&z7>xxFqz?>VnFKTAb5mfO&q7vkUqps2##6lP+Nx4ypv1lP*S;*UbL}zSvj< zQIZv^P^TzmBl{DjqM|jN(0l+Mnjz! z!&3WVvv)VfcNm7mP^_g5A?fS-Km|OWI>b1vnLcGy^z>^~Z|XE6`_9Q{DTP;eD>cS~ z=~`Pg0XdW`LL-I>RBGws; zo>5XIr0Md%<{+MN43ZOMu*!D&cbDQEy@f~^c@ErX>Z^G=x#enG#Q!))JkHD<2~VIB znMTxm9g&`K?NhTbWq_UFZkL*g?~k}Z{D;rzz;t6_bkfz0;kG71W1o<&lKgrK@xw*{ zo_aVEli<+JsT}QlM^)MNNhggNLXw3E;WJZ)Nij^EzKWmSaUj|yWgsgeNG54y_H|He zfK#RicQiwMlxo>moIt8RCe9e$12G%EkO#HCBS>-EpS8sa_`wGspkv35*tl^cmM>q9 zfddD&IaeIF>y(tnL~zpx$3Zqgy0OZC2x+lB;XDCVTzq0Y(o?1)AtuFcD4Jon&Sjbg zEiDB}>FH)YWxZjTmorMgDo;i-vMtH`S^|SG(Lmvxo&!zJweVJ=m?lOG>xz`~6EUj& z`7QETG;z1*j^k%Hf(JIj$;8pkM3|-4~mxB68M8&^hz6qc8P5>oK-6ucQYlP(X>wC^cmEI zly8C~`)o5U82d9W%EHnV8Z9xLfW(LqBifuRj@$I%>N!Yv_eE-4Z&L=R7!KvBrD=-c zP+XFcO{cf{P@H_m-{W=5&>?Xg9$xpNl>KtpHAvIl4=KGjl;j3V>ccwF&yT!?i@RM1 z1bhfCds)g{lWvBSQTByf(}0pg@UK~gn8`mfz2HJecOtZJH9|*sAa;UslBe1Hwz4&d zb;RMkE-K1BLsw9}M!yigIL1U~h&nn)`9lsA)s&0b{>y9Th+X84;|C-Z-KgH(&9;`- z7a+zNhchyj&^lCE2vijSvGH*ARXdAlRgUMw<#qtxI>muj6aeMY4hC#2IA zK}(vh#>h>aAS+w<)LgMWYe_lQE#*vP#os)D_z4emhwR5im|m@nTkNfU!Jkc zk{h~ZoK!({VoV3*B=&>bm2Rqm!sw*OU@=xjI?Wh$!cz2{MElCimF4O)reJ5;0VL5= zOb6fA8U0kOK2B2B8QkMic_%@l~KX)X(}tFNmIrEG=fb}hHLP}aCES!>ax1R zHDrpdjA|)bXYVLqkDh6RkmO3ih^}W~W8NP8_}t6H5W&ENKEu$reHWxBq@aJt9^y07 zGbdO4h;N^Cl>{;(*w&7^(AT;xx_XX~$!B#)N<4QG>K1*D__34WOw$>+;ZqUZFx#d( zrrl*-pagNwB*eSIlbVxIVm}8xNYXQNUfOe_NEe8HncYkunw*#7N=Q zSzp;w_3tWTzgAyh%k~*gzTH?e@_#}V*IJy2Dvlw~67|leV?2GI+o#xV1fzj*tLe`Y z&8x4qs46UgD>=p1-jGMnF6vG)t#^FE8aN%XHiO`{LJ84HRK0$tbcXKr#N0~4P*Q5fid|AMj2&T3M1-+6>qMyXK~t`zX$E~uxKX=S8`** z-pTMCNf|cNu{c+XZSpP6-za^`qp6_ijjqc?->sN@;{QPg$8Zfe0i1Me7^=t~+oXil zzdGxB@zbD3n?D$UdvzQh{qF4&If=B>qZ?n5dcPcg9gk-!@ zB~ES8R%1?MwW;yd;fc*};FdvGNa_TZdwlgG;U|7O@9PUf1L^X&N;Ph6*kN4u{%qHH{i1uGmS?v_!M5 z639{uz`?-lNowm`l>Z*G+#NAEdyI0Pswu*5J;?h0%6$B6=nS+^%EI3kye=^gi964~ z2EDU8skCSTKmN8+F>M?Jw=)h8uP3vjHp)AP|3H!q(d>V5{`+EOvoP;nT-@ziG5VQ_1pFt4R@i& zeWI$q2G_s(0Lnd9mqJa>W%>k$^{|#TPQb@(<6b@Ectp7n(E5rSsD@Vgr5>!j23q-g zDNb{z2$9~~5}1gNM^v$~otz9b#UdEA8=*Zb7kuhLR|8Sk#isbCYi0*Y(70m%7JO%j(&L^en5o^GtdO8Xk|7NklRFfBGrCDIsJ;*6tUajW!>G&x%Grp0*e|2Ij2{<^EBYGg*24A3_|Zm^HkV5Kq8J!5qLhYE z5S<(wIQ5}92A!kK)-&SMWD6AGa#h$#nsgI|v~>03jWgV-W<-0|Evc_ShC8LjFl;AxoMY3grS&a)x0u&gEeQ*$D*v67H>}rn1R%&31V!5IQzj4&}R`=?9sRJ@!;x zo;+2z;0vi+>?s$G0guQ?`Ml2`KYd=3;~4klM7!g?$8BxkX9g+XdHj&Ajenl^D*ihE zwMKQ1)O?QehOpFtc8GK=I#jj87RD{V<_ihQW-a^8hfm?H4f7>ZeYAcxaQDa0NPjNc zy`jG8L>IM0@dn(n5oU!l|C*5`;kKiU{Hg_ACZsquQ?(4T z+K927?u#oAY%v?lEs2CV4-O2SdTx31Z*rb-{P@kkSn`tjao30cGGoI~Km3PP{}OJ` z-T`Dn8Z1!{IFURSqF>h}@EoQ$U|ljK_2DH60^}vM!%-XW=1iKYlqi_ zIEKo)Lpwzi!Up$j*BL{)^fe<6aH3`Cp*o1sJqJlJ$eYGqDtY3zAoEDv`+m(Vir!t>v2$F_wdVu#8<)i*gACg)My&J&-FcTFsP09UqCS?8L zohtp91Gv;kDWOi5_H!Jqsl5zGEJxM1AYZV#gjW`eZJZGt(Fh02)r+y^SZC&I4`O(i zzWDC2N#bc{kv zW^5VxJy41|e*v-*2ANLzHMKQ}b;cpf5|f#RA92n!v`-vm8VwvMIfg&Yd0z4|8!AGh z|CwIQ2xt8BS^p3l#qqs|VCFf~8l_>if@IK*um4%*+rO{53#su*a?NG?zC=Y`4K5wR zoGearXP~7x$8Xt^rT<&;0lDOpgJU+vuNy{QjO1hvh)NwnD1YFfO4ZeZ0~2L>M#Rvz zf?YOVP+&e`67vF>tu^uH6*X@riEB@ zaJvMoynW)8deEg19$E0Z)c@sq-0 zERzX&4ptq*;OxGb(p_mijJ8HjXznt1zV`&K7(NN-_8OuleVj5Qvp%Es8j;UyTr=`z z<7;a*N8@K^N@CdJQy!Xw(b#Kq6pi=bXD{OE@Bc<kXyZR z;N|F%to~`V+z$lE1VBU?i4Ab_rIXi<)Vfwt}n+wH>>PT z39<1K+uFK{g+f6YOk%^4T@ntL^b()#lWi+7ZO}N0M!&s)nh6I!+OkZd%9HV!yM2|= zPWMey*Ibmp&dg0*uSXyt))vi2wYL%nt9N2Zii)yNwPUrnR??DnO3o4C{o{+?#+GCI zOuBp8ps~^iznt}$_@w-2)oe-CKtZ@7dBWMQp1JzBBJigT<8MFumz4ec`@fO%$wV3% zOh;uAfxJEBW^ds5b-f*aboFDg7$5=VxUFFheiLUj;l zbv?t(G!%)%*aQsB4x5AZNbN7y%sKJlxX{m`cYZ+5a81??W>_gP*VL()U`?+_1@T7Szj}cv(k7q5dGH5{Nf15jZF4EJ}(XU@W zxZQ3uR~)_I_}9o4_vxpf+H%Di`+0sz0p^r*f~d9mnXA#26SZ0LkA!Ad41 z7(%>7@XNCNiehxhY-gikNVrpt)h)AwOjPDByKUBEk}=(20F+6;>h#>CY|A#x{BOD* zIW8^CgarLamM}Cx4Vy&hEiJd%f_U6NhB7M%uE&zqHyDjE*1UcdkN83~ztUcV8z?(BoK<9yq1(dzClJd7t6 zzk{F_Z1UP|ZG)z1*jc_2>kAhlzov1Z@|OC^=w}|*m^e*6Z-d{9FOP<0lKkz-C9}l2 zo_%Xfrk3t+oy5E*h2X7)xySYD)l0nKxB@aq+-IMC*6Lhw#teUT#iy86vO)4jQ0HlI zRaRp6p-X>)>z?QD1{Q-hUjwyXXcnT_;%gKp_1H>Vb_i zhB2x4mmnpsJ8}}kE&-n(c~d;#hUSb%mt^H*{j;|pHDAk^G%eDrBjO=zM67(cBlm{{kz@pvC7T}$YU*Koww~`A!8JKj&NR_*{3EMvdj9&Vk zp%ZY&c~^_5#r~uHT&@;3jhQZIaa%BCPM0x2xx?Ord_%|NDj(Sww|yMt&Wu^t+#{14 zHzEa)erjyRV}Q&Aa~@|UrQ-TgQyM)X8H-5ulz~3&yW;+7Ka%ugImv1G)%n-hvRKBu zlF-8vk1#u)E1biodSfP}PD$f!{=dY?c8wJQzo6f;zD>>;FQ2ienPC6(cb@y>b1yed=UD!OQB!dL^dHGFT@NCEO6>thpQ~0;Hr|ks zGpEM^JtY9e5ag_)X%8p|ocTJJb_edcI4s}eq%#!b#<@mW41ghCGPYofLGGV^ zvnjx?vpkcWFHx%kB7daX&5D|uN@-6^PE^#Q1cE-<`V9?9wEl~FuBBe&_!04O@s0HE z&Eb@5LP&&0dqBpNp+UjL{YN*NEQC?Uzpvf!C-Zk}xuL_f{>Cyxb7Ip3Fr2S`E+-tf znp$5Tl4Co|=0XBpap$D*lvu}rdL5OUr*WV2x+q#E+Q38-K<-8y8@2u|bPL1hiyM)*jw&dtf8hU*trkLOh!7;F}xf3qj2Dcs=7N(}`(% z`X8?T1f}&~iSjh_goDQq+ehP~9vM|7FP@{Au;Sg&{Gp_Rw}|E3Hhd2x}44 zHE930eE$~FPVhN7s0_<-q-M9=r`lJJJ$jrN5rT{3RD=kJ9(@c5&ZBx~#3T&Ytq(9o zR|P&h{Hh!@mnZ(Q=?%G8bIgg=M)S`!l8vCu_SFQ{v4V>M*e`AIt3UN!*q+SvBgp8-cuxD0l>e>bm-rclF`v2z> zud+Xi^_qx9x?8Eg+9jSXVhaP=@f{^__nHE`A8%85X3KjxQl;dhgFE#`pPVju_%r3g z*fJc#G0)%COd>-~kB09|1X9AmB^~KQfHXaXoa_+B1SChw=TUSaqpdQqB+(_guS5uI zEB-oPrAoVe$ONJJh@VZoQrb@!RO8OH0-~mcV3zdA_3ocb-itcnzjh|%>~j^tnHZN~ z60Fq?9>mAQn%t5hN8)yIjEwUh%y+KG(GvnxKr+Cw`ei8GlH{zmu7RRy03EjljuQd3?iPEm$$ ziUl<_DuqLGN?Oz?1O%^1;|O*CSToZUjTYYDyHG-z(6`y3myP~2#wuEwwXdyZM)_wu zR^y$G3-QVge>AT#f9G2920XswKxbdl#bRmTX;+tR&^2}mxj zwe335XHe}5*0Rzcu~W()msGNmFKVt?`OGsavoj%>Aa~+sbgzPOcGQ zAH~Us=NpH?;T|a~5F(hK{8k$_qmC7u^AsaM0|2Am?ux^>ch%E!7>?lt-@R9Nero2s z6)WGPo2A~L*T2-LeUX#r-^)Lcdp-R5D~+Dn3i^cnJ{?vrn2s#0%UrhBNyReS|M9Qtwh;dC31w)&y`MgBPD%y`XPtG2cbezZ z%m1H?-xb38m%3+KeZY&?cg_*(Umj0<`KH+hM%>z0k%#q#%A~8Xt_%x~td@Ene;sD+ zo^Nio#Wm$9tug#XAf3GS;C8v!p29qQzGIE3w^)zPRgs9?W|;Q%kE{NT=eLG)^C~d8 z%YnvG=9!%O$RcRP76whvZ>$0YDdgAAmq72HK$v5tmCRp0e@(2QBN-0W-w&IS5m-(~ zF_u#%$nUiKduZOvLhD)0u}VFaQm@8aXTDT)2Y6=r2QpbtITNCwiJHk^Lbe@moMev= z^}uH@$>+B>eqnOK#`%%j5aB8u5Te&uMU?7F!_&*&H^n|o=X!~5R@7S1>wm1SJ;{zw z!{D4ql^n4C$PV23{*&?o*qf!=nVX&^;dr;??~{6W&;ECd_Z`(?0Dd&+d$_#U#3;XV zMQ&N4FFEiS#X-*uMdT!mL|jY;5@Nzy9A@v_Q^-Gdl5%t|IwsO%hbM#cvB+4mSBW-AbpL+T%~+hb9wR&S zM_OE%Gwhq$18K?OSkh#YzSrk`vGMy}AF8ZWXVYtMNasGbpInm16 z3Qea0t$J(Wf+a3^_yw}ke@$`5&4FVO*?-Z>P88po_<%L_9-$SiL@aOYh%%r}5%UJ^ zXN9CJjZ$tn{hSCQ+hB+lC^q`}tj8MFizF6AlY9c1Hm%^qYiu+jSxxLr2aPcty8#ES zd<-{*P*g@F8lv?dh5qzgp=niHpM&*zo^hOV8jv@nV~TMYljaxiJtmU$Cl=2VMuFiS zsQ!6=#Ybj6BCn!Q?CGp!R(X?k0+Vk1;p-3Lhp#_muBQAg+WqHgeWR`Av<01U;wTHyN*XS$S1b+0@GI=(`Fu~fdcD1R!oRgX783$?4mT=NnKzc=y z1N~z6`o^rkzFa)A;5FR)$@7xv`IqlMA(M#@@W)SIkb(W>`;Uv7&3IV8m9#AriM#Es zw68y$+`oM93Av`>oka(7eqX$MBkrI3qG{|(?5#M0M>iq?KQJe8S4JVHN&Sn#MbTJsW-ORDUC)z=M>2S z-g55cCKI%}Qy<)L&eTTjbh(^jVQgS>*HIYPNg0zeuSli0NHV)S;lc%7XGlI|I};){ zJNC;m>~7XjI89HwPWnV;C(_8)?xWl%ZHR3*p?rd^*R-A+4b&h1^zBEK$cColdI$_7GD2cflFdYF z-j3CHd*ed9^n>4<0U8(VT8}r@&lAq>nQN4rYP7b7pVQGS4cb;MkVaLQo;T0RG(|JV zYU?umHCF~MPce7vyT{|h*9 zKncjBrJemY;=un{dx_ZCSlJbu0`n1?6Y#FP?h=3B%*;&Odh4xNuwX%(z2YK2|1aQl zd%rnwAvFCoIO(P6F<| z_g-zoh7I!hqKhulzHL~#bg5QYSSX*TOqrtHcH3?8`H@E+(H1RQq)nebUGw|>T5)l) z_Jbe%K>Ie}o_p@muD$kJZQZ(c{}b)K{r20n`|rPBn>ll)_VB|GYmYwqsFdG&>#f>> z0|&H=FTPm5uV24j=8J)ovH}(s7Me5K9N=lHGb@KCRv=twG@PP>X=ggTS3B@CE005u}1^@s6i_d2*0000wbVXQnQ*UN; zcVTj608L?ZaBOdMY-wU3c4cyNX>V>bE-^4JI4mG&baZfYIxjD6VRUe8Z***FVlHoT zXD`89b#{c495dI~=fAP2CUjnQG27>{~$;p5D zeG(E9@c%3RPZ3~LR1~I7n}%7lW?}mD=}1gW{I9Ne;=~E8S+fR5j~>P1#fxin&c%xt z@$S3t*7zQAadG(c(@*jLE9~%p2!{_J#)uIk@YrLIAv!vmSFb~d4q@NEeW+Ed777as z(WFTeT)K1#n>KCY7k}r@9pvTZVbP*RxN+kKR<1q&8%`^b?a@#v$EV%V@@`1$9b@%ZD9BPl5fp`oGJuwetPU%!s!%a=2O zZQZ(+&lxvv92PEI2oDbre%bx|_s54Heuz<{Mj;|1f(g4%pFT`*XV0F+u3fvB2x--% z4?)Ja-+qf%UU>yATeigI%a@q|)fhBr5PuLve1!7ya_-Z+cW-p-)(uCF96{^Wt(oYq zT)Dy@$keG*nRs7*`DGq^KtKR~{P9P=4-u)myE_v#5wo4$Kl>H`vqyKApw)m@uBV@V znqMNV7PRWPy1K%~#s*GKPTY@P60I)uzYJR088jv$2qKKq(o#Ou_aM-sw?85x+V*H0qwSMc7&Y3oX#)ob2R=6=BZIf(2@@tT;S+&0XwX3E`^+=X;GK8g zVdAHcfmUJqomNCIFE1uuS{cK_!qC2bdnOtp?4Y0^UipR(AI{gHvC%c&eDh7dFRhH! zw{6?D%Dv{!or{-VdI_~_*ESo&KN*^T7196Ve?|%>hMM>f`qE`){a^fx`?dnoc0|lM zNpK`>l63hm{>6Rc0aH^`nJ*%cs4s)m55x<(xVSLG|1bUpfiwgptPwwJ4P|9zcSnH1 z!NIIs3k(coiA#;x*jQ%3uWC~uL4vo7J4UzYC8R!s9)Dcei&3q5p_aQ3OKz*L9DoFI z4GlDy)?qlwbol+ESXCctKL{=kLTW88FTuLdL;UlM?xR@>%qhvot{bPgZCb|>u(Pq@ z>&E7!;>4ZHnACP4T3poS;*4H!QRFmjXb*`yC@Iat{&&V zKha~1B5g)zB;aJsRsOlIS8WV#-i7aVBr+7qxfyt*`$+!Voy-&*xpfhCwzinoZ8+>~ z#7BBQHUi! z5{7_id z`NN(-W52rGt|yg7T@Q4v-%Gz9jjkm&78jOa~_$SM&@TjJWJnY|pxi(QSHRQ0GD1kKh=61*i4#u(Pql z8vrioS}tgc7)V_+s$j!QAiMop2m2j)ERQs4f|=kDS5nX%}?3VV?yLXLn2( zFb<9V#k`!gO+;*N3JL=4F|qXkZaY~Li_8o`0PVVUM(6rMsl7RT19A$B;aR&5a-~A# zOAc^=zv$Pd6S@Yr6hy6$fK*-rov#~ucJ2*V2WOt|t%fkPY1I+E>I$iu+ScWs2QgsX z>b1tuE`#|a$nn!)cf@J#({Dh3xH&rW|Icpu44s2pVrbVP{9zgDx+5_!1IJ@7EAP+N z#s-;1dH7@d8K5u`(>wI2c1OG`0;H9%I^pBZVPewjc-B(dXkf!y_Au)=r^iHmeP$E? z{CKBPEDf2jsTR-xGkT0xh~o7@;y(4gYb$LIcJ`Rrbu|BcDM_ebrgj~Uo(yLc2OmxUafj>%fNGw&K_(Jl12B*||i# z{~7Wq>Ux{zWk$!5DAjA>?c}DkJ=uFKvWoJs_xfqH2&k{L_Xy|-t=<4X4}a)kz}eJr zq!wnQiB}!8@-?YkW_Nl3Uz}Zwp22OI_+-4?Z7Td+gf3IYYXctV|Lc1B!_HQa!lZTs z(W$Ojp`Gm=jbpdv`L5&X&vQ%|)}lMKIvx5q?jXM&hL@8o-Wv7<|9t0)brslOqJ|+p zu(-HbSq-WKeSyW=QvR8?N?E~MR4&?F9YmYlm)g~BRiRv`L%F^jZjNHRwFX)N32ttt zmtPr3aa^Jk3Se3hszY&kslq-G%5>%YvgGZ*Iv5NFXbn0z+BsA@-cnr|bOr~mXGV}!J%hpcGo4cv9Bl0Id)U4T{b)7$@Zhhwni5^*`E;K*4}OPp z3E@@tt8AR=b~R}Aes$+J$SW;EO>j>MkiJOb!)|9L;7ZDEWpL>QIY=wW#)tcVL4k2# zIYkASvFd$3PoRL z@)tgI2CeycB`r$zdAO3fg;y=Q-ghUq;Mp~c@cf1^lzyjUuJYgJtos}~y^imfR*=O< zMnSI9Paf-AyT9WVk8mme7N0w7^(VYCtLN(713zNcrbXCt{g~4B>DkqocVHQ|MV?Ug z)j=oeq1Ee^XWbcj5?52Bu=ctT&Sbo>eHqVnskTgMvz$L})9a94l#3EoKlL-H=l|(V zi+G%uk|LFM;>+dt7oVNV?KC$FcdkHMVHR?W3s@kzuLQW`#tF>X{y9EBu^MONuk(be zLBa_Qi3U4=;}Ioh$7Uw-uHZS^<_vfcP7Y!lvw;m>AN;s-$m$C5Y~~N>VCR6RdyU5v-N*1YEE8ZW zpLW%bnfRzl9fc%niS~7yvS316>*P*@nGYP$xD)?vZodaB^rw41(p9KtNRVh5(11K3 z%=*yzJ}w@tu8^Ap!r}k!DL>y2QjR1H?!+L z+jAls`39kFfbg#2F%Ec$rG(y%+MzbuS-t*WDum?b=b=ykzWg#}X^B8zOksHm6Q9f& z=a-0W*TvD)R#VXRBGcmW;l5w7aOiZj4QgDaa6F^|E{pJu~(RSNz%j7#gS>l z-o}a5MMY&L{C9S1QV9(u<;3*sl{Q+TNf2;za8~Y3EJU%cj3-`wZmG7Mw>47U6E7*F zNF{JphnfmayoKtua8mKBJpW}S+$JvyEZAvF;b=?ms_OZtzF{d*C@3pNp9byBghRS6 zeURn?V+l*(Naa*r#2d|HP*_iJ#)F#ije0>(IR03dCpuX(`o0#24zPFnA~ABwFct(W~};v`I|92p4(>3H$zax6HyTrkUqa^#n%Ag3$=Wje94sLxjm3v%1a(_8T3_AiyT zv$5BC3?#f*j_uX0EAZLD-_6?I*#0e^Uh@eHSaRE2JHNxzt3Sc)m)C*}<9 zAlt~JvQ5Tfw<8p=|Ueg#zAd|56+Ciin&3Esf{t@3_-OBfs@y5aLxE~$I zW3RAa$NeP7F?n&MWBZ-9yK!H&PLvbc&CN^r=zZiiLrgL`xM0GrLexp)j}{) zgC^^hU0?Ihi^tAmrk%c;$GeZhZ|8QK^(B5}^@Ric^RxXXiZSWRu<6!OvwkEYJKDO# z2KMlDA8JzL%g|`>){gJ++Q=Db>?dremS_{y2u=L!ASKsCs9_1W5tbB%g+r#HeXy{Y zTuY2*Rm=;6roi7_SR!bJ8QQWNA8OrVW$0h07YaNJ;B05UwLR5!Jia=!0lk9T!pB*7 zMH6o4Cg5sjG`a=|^W3xDCh$8TH1G~&o;$lJU+KTfB!R zYSfnXmmlu=se*95aL^-WD>6+XEf8NF*}(JnSoaaoB%ALpf4LAsw&0%qg#EE5;4ciM zIJPruBWBm#Q7E3}-wAS?($A|1&HM*Hz77V8OtZWr1YijSF6{-)7ecStdjB)WjvL& zRfbYsIm+}xS4jqcwL;t4czF)Wi{WhNqzDr9JH1jTJ4c1@tZeR|T>BBLN@n$Z06iPD zG0k^r5f0wGfDx^FFagT*OxlX71V+nuQWGKMzL?_VEv_cQf;Gmvvc8t>GC^AkCZb*N z8*+PP1SnsR9VjfAZpkR9{2eGL5Iijf9NjC(tc!YHDtl*@y+dn|`__a2|MJ81c|VwQKum@~lC_QK(>ltbP&^2!Pkns%!qW31C*edrmq*vLu<*j>WoDE3>)G9y`NxOm1TSe(R9>J67s*AL*dBEf@1Fie z@wKBDz4gX1%-OXBFYQ~w>;SDCo5POqB&Qc-n~i_Et>Nbq$A^B}(`HNlgKj<5UshdiEFw|*_=mjoUX9F5E%%>ijTT`}==3yXMdqUEyKm31t+N6r-fP6fbZ868mqSQ`&U~J-#}=QTcuU?ej<}FbOp^ zf`x8S27Q>RdE(=EXWx%_Y1@}L7iaEx@XD?gczNe?B<5!D?=-h$1|^VBq?0ThvMo-7 zk<1fX7n@~B%K0`%@zle?6%(5F#n#&=FsNQ9?ng}S^2s9b+|$`zC|ezz@o2Y^@NjZN zQ$Ld_tATGIdl&a@CVbZ{;b||VQ)2obX*moNoA!ssX!5J==7$kYdSG9aaFpdXcOQ&x z-4{E={sb0oUtXafnKsYGN3cJjj9<>|#E=$U@ldBh z{NCOk{Ui)VR*2@jG9l!h5yCfeWXqmBtW9BuF}_`YREG*eNK8x&CQqKsIZi0XRIk^w zaItdbN*p|R5Np@2Wgg+xS6?-YNv(+xLZ~PlNK9zeF}F4CTb010ZWpFFNeNo7?%qFN z+J&203HWU2vx>ARL>poItqEwQwKO}!DuXAtj?grM|*z5Tce(^m;-akl>WCg!_i+F zH1w)KEY{}L+VjwT=I!|c<688=&_>-%_o`x+)db7^4MI)>lEi0<=4zvGqu)A?r-PSj(fYm}6fFb`I&En#AJvUg(tz8}x+NfATpXR1HeWk8oQ%4H#%_TKaP#H1l>97&CEv!d7TuJ4 zi}Q;R8W)MK4M}0`B!Z8!60t2pDESxmeT2CIGQ*ORyGO$|ynvA!rp5%Q1`!?QA|X(k zv(BA6b2`j&+U$$?~ZBZnp`8^-PZ)bO#H0D;mhy%CIp;bTw_Fzsc7Um>1 zXhr<~svwG|+Kz#Tqbq-N-(B9W^m(D%WY|{n<&wwBHy5^u+tWn#7DP!%E=omc!ZoB{iZtNe#e4OmTBNO%J@S{jA$b`4EJ4c|A8BfNRu%mdStNAs{ z^m_I{kqMBY5q^f`!E!4%nu(7Po1cWn1@%zRLqwEC=U;}Wqd(kSTJ!In{97ZnNC*!y zC~{3!U7fyj4Q&G(!{5ytcd}Ek?#e-Kf2#Xf)N&IpSwkCl!vUj!#rMok!J5$h{Px-f zHCEz!XjT2<(0XFnm;gnaK_Nc13ToX&ai2CpCU>wuMS%6{)#LqJ&NM~QaI|tzWE`y? zlqpJvyvJwdWn)ISemE0<4I`WOd|*1wHv(F?(~gxM`X@<&>k z@Z7d{a#XI-+qDC19UYXmK-5NRX)Y6>ouh-&kE}x}B{`;d<>bm19(i5~Jl6oGbRUjo zN7lp1*%^+G)tedbxg~_dCM_9TmBN*r7U^&FRVC!6Bdaivqp+$IEG(Jos@nKI#&%0) zS>}agA>?4%35;ztOo^?y8{xuIfM8+e{4PxEG^|1lh*+64W>T*u==@*8HzTcBsA3*$ zIs(mn8s3#ZU}ZdDW$l)Nh_!x1fKRXf6weQwj1G01D)Snbmxj+y{(-j#Jb~J-KBoDW z4E&z|7E_!x0<5VShnzuoTs?t@IuEgG9;yjydN28f(gfAiyd(<;1ln%@IKL0yOkG$Z zDvc&oZN|GB==pr{VbMkCMOu@B|E!6vI#?5e#PuqgIOYD8-Q&JT#Stwh(vD<$b7aFELUZnC6SmG2Z9C2PF|cIAm@apaH#i;Ab3-zKobmQ=kidRr9wj z<)gsp`^TWALnGnS1Ai!6Ax-e6>qoJ0-wLy~sGI~o5UB@%M99EdJs)721U z7MUXD2;0L?;FUcq5SNo`*8auOwV1zcDRzdRtaLt;3L{Xc6Z}_kd9h+iN-fI7mseI{ z*`;4`Gh3vZCh}=4JdrU%RM0~Z^x~Du~eqlZ~=3c^- z_Jc9BnJHR}zKX+<7cjBy05ds6joG3EQJm8fU=R;@kTV)~;C@s*);edas(Irslz_?q8WhYGneS4EbZNNn1^>S(Em^O$ga^ z=`cRr^K%977E<6^^Kl~vmJT%o``B;q^AV8}Yt~MRU&?%-Zlm8V+fK$`#nrUv8u`On z1FZmbFZDIa%UC|hBc?j9X4!*V#`-IVFni;t6+D4Tv}N2^ErgIjW7%dfXxSZ0(wDR zlwRJqoDU){0uh7UCZ_=*;``&uK74a-v)Kd^QN-k$Qh3NH*Owx@RHT)VaW?TfUOun_ zQQ0B@C$%UWZ=L#HIaWvPXCkG)%SW=xg=+KlqwJEVmUQED(%5A8?!KQ`N|o{Hf#3Q0 zw}*+;9E8OO*KphBOCiR2DnVA+8RV3OB0uXikaoxH8Der{aXZ)4Mj!6nwTp4y!bfny z?l1YEv97*;z|1_U##=j9a!kn9D@PU9fl{r=hrGqo{4O~tvOiFK_O+xa?t9?Id91&9 zsK!KiPYG~XtDdmY02ktJAjy~lLI$Ojh|f;5dY-2$J(+-}QYpg2O2(`2FAB4qr=#_l z-n61DEWfg`!b*`-nu-f)!uDL@nxVq{r^doA)A3Mq${PrTrAOh53+wsVa?3RrG^=Iu z(IY06a_MCh<|+Y11d@c`+x>(2bsb%?V$93Rc?5D)klW<@w5{E^LO%iWL$OZLeS;pX zz`v0GP3|4w>cdhtU(;yCAxvo254oiUxRD))XF82n&YjY3Fdk|%Nco+73~Rgj@HOju z2VhL=K4$l-?-PJYolN~-AMrRd{5JF@lcL{!sbiuKR)t?asF(TXI(y8_+47gt8s{Yull}$ z@NxCPuInf9bf1Y#3pK%C5|mV#z)=$>ygJ7A&%oM!WGUFvvT!%|uWI~v!^GQEcOS`s zqC)GIkg5c^s@}o9m}hI(P><)n3n64Npr92}R$4~q6D*_a$z`7o;*(_UJmprQLk$)L zN=?Fw>3Vvr?Ut})pv|vct_1qfbxI9oeAEOL0*~}MEI+!DQ?aS}UE=>}PH4qZqf}R3 zVO(?`J(D`1N5i}@Ip67EP^n31ycEM>rbaQ8qs&lV!B0<~2g^CJMxj4~1kf;C$*898VIi_tRTUKpl7Cxl*PpMWHqy-i~7XB9!P#ur+EQ`qt@&VD~yK zn5;R!9~a^xm}Hh6UZ>=U-V_>wz2Rq3+rt}gj+_BUdq+-g{>`z?cyaJl1pCzHev~Br z!#%$sy)c*KFQ#`lx^o%g07C(E$=N7JEjYClDTi;R#beXu5WG0(Va~pqQ<{r)w>Cp7 zX)(0kK(zD`sdi&Cllfz%%viFMF3l_DRwU5Qfc2Ytqd8ST!cg}XXjV;*=zA^&3!YkotzpMF5Qhf3`N|Reac&>Bhn+yN z(QYc|hbBDJeIoN{D^)&zGFahydS?Zpq^Pt6JFcDL_GKaKxQ$kW6N#7kIGHHYP0*^m z@A?@m3t7)*smefKy-a+BZPELcpHqqx5R$kP(RoB%0(bHfkXVp{4UxMLnG?grbLiFu z!FyTz@HG;r>Tu+WcMnOgYNHvxoUdu#C zf(NN@P9~jY;mXKyq;x%<1z3A5v274s6<)+voP5q-0b2bi`avV>YYn zcytPC#%)Um&BfBe^Z4*|P`T45i~G&e1Iuu< ztpz_PksY2aBrkNDg+6t<;i)!L@pQXKES^k*`tD85+oBN}-$ zL~}3GSU;UK4;||@MV}@WgR;!VMDJkWbLbn~(X4Gy^UmCF-oS^Hj9`PBcj2}<{U&n8 z3e)vSD$|{~O#*mVB#Y;mOwl z8VbIt=H-##AaDORcCh&qWmF6Q%kf%*Giym=Od8nLkO0N=Dp_hPxvm@lbU5S)TwUF2 z78OV3K&ecqr>7^EC#ATLnucWFH%MiGrg}H;`vOBLpvwjvf~wzYin4$LV-Oc*2vcPV z`@2A^PLVd5e|E7CqEwyLoMB+0&C#}+=jG*0&b&qZe$^k0LV%f>nOMAdG1r=PBK{~ob77CR%4I+vSg5t5Z}|G5VjgpOs7LKwh^3cNjldcqeNZhJs1AYB2RU( z&g9?eVka~PI)h1|DJd;Mb)^Fp0;H1k1PaUS(W8e_`MbK1Of||4IVjSZ?2?YQzC0;* zHl8Rf7bzbc9K03ThrE3g3nJj{5MV5RXu$0}*@mfM0_1llX^~cPgMapPtZS4sEmBxe z#sISa7TyNv9&(OqB9dH{^hW_auExM1B7(9MfQXd|&<-#dC)GxkfdHk@OX4H4(NORW z&8h=nNC(JFW+XrZ^)tv$ry58aU)T|0m1Y1XMj^vZ z2IER;=LwX@Ag{0(S}lwOm;$XqwkvC3XX^<&*h8yNg@Lw8-tFB`q)S1m&a?nH+IYg& z)*e}3 zJX6(lQ+snj8wrhr*k<$w9kd4VY_=LoV^NR$N-mV8UzMq!AJJ5@%aVtbT>F?kgFt6A z_7l-(GzTtHS7enO=T*$Zp%t8X1+;;Sp(~1X7vX5z0QNRMaCh@TQsGe;jH{)Kiz^)M z+|b%Z6*6j^e;1d2NGmxEcZa5MwG(3}^mcs!XH$iKwrj01aI_OrudA!bh%W?R(brY# z4ZR^3wi*|BxKyvuSA>w)UV9B8At7kmv?&)Oq?L~NKMKjD?U%OU-+uc|3CW~>)}&zn z_66{AY>Z$xk?`=ZghYH83jt~;QStSYVpJj4@&ZWN*P*G^4H{zw%gUH~vSyGzk!-l? zNU@rvtN1HXco$jn$@#XrN=x?xH8I60qx|F(;hkI=DB4Yqc&iNg+F~5Nl?Vxmc&1$~ z1bYOS`Toh7MCCSe39`(dZw;hj&ngjFm;9VX_#dH6Z-cb_3ME{ zMxw4;9pPBu;0{edPqTYVq&#)7g`_J0Y{hCvO6%Xw?qSQz`(tOZLj|>whew;hMx1y^ zwptMK$_h}XD?=?;Kcy|Fw16`?)HNFTWhCciva+25-1*$nLgbehb0*YUuEdrIWEAIc z%mz7IcsiQqORN(nC3AjR9?A_`INLh&t|B9;C>{G_Phon?(Mr7V-GI$$+EPWgN57{O znb@5`V}@Dw9W?4G>v-2ztRobFMj*XsO>j>?lXEFoVP`az$)G{)xOM_z2~l`q&}4WT z%e7Lhulk%DapmQ0oZ(?s`*CP% ztacQYp1}G1Y;A1u@{nopbalsfVcU_ApN58>L3p|QRAt<2ZXQHzeliBs?S%17`k5v} zmx1hpWR#*c{N25AD&;g13lrh(;%r!LpT^m^Ia7oS=Y%NynXKeN5u`T*8>;rb#e?SJofAKEsa3fzJsw#(WbY6sJ0}j@j!3UdvI`qHLa(jASOKSY9ma=zy_P-=uzbji`1Z;+JlnxMdahEC0@#KM>j)l} zs=PneLe%?J^QH^C&cKq;-(Y9VKQo|SN1RN!$^=E{s6lyl2y*Zfzk|Wg;e7H9)HhaO zU)aTZ6d%p$s>k0pZ?m<-$HSh*qT}YFu2nwPKhYABke?18CwC>8B~`pU7%#&8MmHG3 z|9`UoSKQ2q#}^ak^Oi)QAnRkvqTj%}!b3wwSVAOP1vY}c(F$=dEDND&*O63^ig8WE znC=Dk-Z_J`qHMJBZ-g$!EmTQTuFHnIw@PJGL$KK}Aq)fRo75%$I3eV(gzP7#uAf#} zza(S2SVue43P!6Q3MzKJeB-3lr^iddk}lfP+};#UrJ#Xyqw&sEvrF& z<+zt1qer!@9Y`z8Mu3|i&#n6X1*)>HR)u>?fV7yNOA&loYu`rfIl+u=_!(SIxP^XA zJEBL!wk$AEIakh@1)y7SOJ35+XOJXLVjjk}>y3vx4K~KFYH>dC2D;X5A^g@Tx1KQ$ zM2)xinOylFYCj0Wn{{Wxe{H)65}ML^Fjwc~qy|zM^eBSfPy~%l0B@zM&+o-y$|WrU z&-8mh@gBLB5sg*h`}ui3?JokdDf_{S)0>c5n2qOqJ%m=ZMG_%GXxvSX3vOFS@R@OW zsrdTR76iEXU_tkXm3}{7+=bE2d!k){i60G1yv-j)$Kd9sc{St%`gowI08(lR(0Cy7 z^clFFdjc)I2f^LJBym&OuOCnDP{w~FB^HYhtwxzvi>LaGQ>ro%K0N*_9&R%P{Tp;N za~i&o9Kiw<2^*qKk9QA=tP)GdyudZ)NU-5FEHM`_x@k|0ZQh5q6|ZgkmieZ!ZF|F4 z(%gR`Wc7`M_#@&VGD-v!OWE4jhaSYuw0JJzM0rxSTswxJ&h5fa=XUTR7foJsfqd{p z-s7FuPO>i`5%BU;8}ZBeol25LHGaFi+bjZ3#-^)BDzt69blCWl9x&F3(;5<$)sKnK zh;(dNX$>?Rbb`0ZMc>ytO6&a!tl-U&DeR>ly2if%FPNF!l=AeJ@49P+2kiS>&L>$3tcBGZ5;!fp_ZF>1-hW~D78njMO2|O&L)EZ zM|ZUJ9-@?FaEAsrnDG2iPgS(?MU$-jI+&tE91h0H*!G?CHcZWR1 z^ZIz_QT(@WM!$rWV;1t!z$<{;Xd7NUaUS1mDf=qg{QW`*eN|MfPxd@}rtgFbx%1S^ zKlLR%-FrN{ng3NFAw(|~!pS8c4mM3#5ly~qzY_~UX)Oj$QC>o1b^?yXU&5?*V@++D z3D_SgJgDn?1z=n&b1Atd*c2{S=?7a^t>BmR$tWx=0Ln_?>RcN(?t<^Um2(W94z&^B zN_N}31HG4(q1({Een+&fWnv%hw-EBTO2M>!i99ORxdPoC3QLQb$g47)-HjAXfkG7f zKwq?M$+#O(`Z9H$yFY`%d+ZNb8R&fwOC$>`=I_cp4-TQUybShs_Et-n{Vn+cPeotl zLoVr5*+ZU=xr&XUA^7FYZWc1sg;L~0?XgQQQ5`8pJlnbW@CxOi$m;RskqtE}ep99| zLS~719>Tn`JVfT)<|Cyjg^6$F@hx~|>k7QK?Hk-o74Bl01v&hjmY&X(XPE@78)>2+ z#fp#>gbL+cOA>sdjPO)bS~WE;rQJfJFq1kd)Ls7Sb*uN~zC;#9Oo z#-X^2*cp8a1A;rSJy}S=aqLG}l2!s6r!u(KuY>ccVVtBqEdOXAd<2&@_ASFsP5S|*1wn0tMUNX0bTf;qF0jcCur{ET>^_L^) z>C0HSc{z^W4#m;POE`Py8e1}Gi*&Vj#4E!d;c!Vy$muKyWSl1>H{~W#7Ywwv^?n($ z9**n_DA;={r%Lywukzt8L(H~8avQVN*df?WgdmpcOBLc%`e-z4MIq3sz zQ$|c~Jg#R&qDWVaymHfOXO@9q1tDNb{2`FKWMb?7oLHR>OJQMh=fO&53t0$xYtR!` zt|}srf>_06EMLE9kV z<~6(b1BxYsvhBYyWCnbk-K$I-PQ=y7F9=Wd9?vVPJbCTwHo=p<$5s$(yq$s(>}Iky z*xNY5&A}Cgo5#g zlA}=1TYUYVE^cUV)CbbF#(hG%pt8@ zY9+jUK1Cb0uHA^|liM^J<+e5u6s&QAyM>$A zy#{B8(3MxJskj^bEkeloxClPfO5<0yF2|Q4CdQT?^8B4}&JG}h+hQYdJ~o_>>X=yC zHfniz<3?88pUwqn4F;VJ%8Tq!UTlovV1Xmos!($$GnqYIZl7E)Wt zolwp;W|_;drXYJf-T$tIkgHd(ay$r8?1K+Jhz%Pyz{A6XUGb^?mtTIt*|TSP<@oHg z&y+G=miYGMX4ZheHGC%AIDW%4*<>ed5g?4|l-RqLn-^Xl`iP?1pmXKC$6robplqWg zglxGcs`5nADt{5o{I5(Q~PnjPVc7=vP;y z57tXXDAQ-a!KS|AQcf8OC=H0ctt}q!F$(SLHp7y`YZ2h#!@=jWR|^r}(!=YJU7U}$ zbsD2ZfXQoQ`?ce6wsXL+mOc3Qi?KKOy7a+}Y9qGRO9?kwf*jkn51R)G#HZ2?3sNP%K`3lch=iPUY`b_A z9(GQMPKifhgZ6x`qhyOf7jjO}pljWh@UnLiS-i@#P(s#9tu3UIQfLbDkfObc%+ffN zJL%zUFm219jGoQ5UqhJ=*?GCJGl;rywH>`+qmz_zj%d;qS7L9lpr9=)SF(lGcJO5W zPN#Z*vKnk{=t0crK8oKTh3tNRM%d#Y?>36xA0=W>&&fovt1n7RO75;!T(4fe5E&VX z88c?!op;{hl}{ZNM}(>V-5Tg6zB<@Er3Ha_wC4vsge{kk^GZYg=u z9rjp-^B?On5?il}B#;kx7@`nMWA7l0Y|_J&Cs70Vx_H7Do|xF2YW@npW)D(FlnE)9 zT>53$YCPa%XL7M8bO>(7*}8f+ZqMhF0=j{ZDRl;=z#y~^YQ%>ns7N4XL6!Sat>VGW zyW&=QJf;~}Pa;mL$$LE|+RPh<1e*rNG##})eN5FR?Hd54G30OuO`|^0IJzOou{Fx{ zC2+Jg=V8g*_S*2rxjMTny%R_%AQPDkk*`oh2MVo$Ks~Qo=oHujLGI=XcP?|LGL_PQ z!gOj($01}$o~xm)x>f7>q(Cy_!i5V`K|ulkJYc{8Y4PI4{PUbSbEN3#XldNIas2!F z^XH|v-g-;2#Oc$gr9+1fN&i$N7p6(4lR_oEUeCYNv&zr=zkq`OvGEd!9*8a~1N}`| z0ZD>=^2sMT8t#Dy9zaAy1fGBXd3bw!bCCL!DO2$D(@!HWFOQ?-{#y{kdnHwPaVVNUmm7%0YJis0rkI)baM`KrOTO zBvTCbUF8St*RLNRm0{YnX?#=%k`~EqGo*1BepnjRhN~1TBw=vVuJCvD;x$Gm|?OGtSc$C`|9-%ru+ zk!ogV^lAS2fu?;GA*7(Z0DEH(vR-ds-F_nMLn=j?z6|+=kqB@x5oSU`Do1{)^^GKO zoQ}TAQaTmfCJ=9TDoTt$$jcuCo160KS>jUsP4>$p&+TEYx>q@W>n|S0?TiG}cK7Do zfkcFoHU-eeL!0A-^1|A12oP3_wHFR>-a#V3mxoM;hqEis;qL3Fc#mB4z#Pq$aFvmO}@pxf8@AI39jjQbNfnu@V9n;$Hd1E-%->ck;Q$QeEPdw zT!r%g9f=F&L#>*jFv;xFY~0GZZ5$}Y&X%D}pO1`^TZk<vod=*Syc4?|uOv>8HmwffvX?7wlAKPLJZNNqwE8B&<5a}<)fZ=ca?htj=$dh`#) zetsd@^bQC#hW8Ktf&;hCBUe>x&tQ-^86`chtX?5Y4VgX3b}X0vvP5J?0`9v%U}`}Y zJe=I%ta7Pu;2p^Ezw>%OsN@V>HtKl}6O<3rP()#2*}f~1Cra>h^W-mFUa2U=v3Wo} zuGL2Az^c*(lKITp&KdsBg0Z%-v4fq4T=X5`YVVH*?tK;0oWF}V-0WS+>Jwd>)Pp^x%bD4QT@Ty#JBeNx*2im*VK({rLS zw~f8)pow=~<#(FfHwVu^Gyi&u5XIxPv&Z5GpXYnY$;($xeHC?h`&AhoH9(Mu*plmd z)j}+58_ zqzno(XkVx5)WB82Kwd#{*U_h8J9Dq-uw!hdBmJU`f}9w@#tH787Rf9vuOC&Y!BQzhY>A$;MDPx|7?FiONjW9 z)11ook!~X^_@31S6hLIBv8_NXe}#V?xzuNu7O-bFG5CKa3ayNnQu{WmWuE*eDmMXc z_Ra`UWow{$4Ns3jUC-KVSHEAl@20r_7W5@VXC$-l+;_*fm~E@6d0A$e=Ve5s#3tMg0DljD3z56M`BE|C3lPD!kb7e zH07d}AxT+~N|IqP<{2appT!4O^H}4v#rAzU?FQD|*u_Umk;&_Z=Hsi=8}ap-&5F0q z-GF%U4VMp_Re4gzo0nl$R_tzZ&!ghrHm1#;)q6afk?2MKczqKS*SN+55$Ni#Jk;W| z!sa@#Oxl!Q`e7C|hP`Nir_w-b9}u;Uh>yzU0tq%WbDCBWkJE3?! z9Cr~HQ-pe=cipz=Q@0(C#b3tR3v}@1PTf?qACOga+Mf zz9}QGv;f(~1<1)r#N;kRao-4#Uit^)XJN~wqwsb$dE@p8>V&4=^%cH^UgW|a)3D>V z2wfb}xCghsKt%3HZOnj|v{T$j^jOzbp>C*rjMk7D<&(-_vI zyP0C!)!r3dYE{e%;BN1Qrk?H5+`E$^*^X-~?)9Ltd=|ajkZcmO@ub zE7$Nw!l|K_ix0X5nfwZgsJhh^s~4?`kGCDkgh*z>UUfxk<9_wX{wtY%D1@foy(*d9 zAi&)VHpXbfN4t-#&}Bq}KCFG9JU6wC0rV4F53qWpteO&hGVqvICLR>03jdV5bm&H<6%|=g`>=3kN=elQCD}|N z)Asw1_6MY*CX|ls&w`f!nEVvZ3#|t6V%CI^nxLS(5T}#R<4kfzg>Owj0YX$zv-r9W)l!d^UNkRrC650`Y5)m2ZzJfZ* zsFbb-Y<5dCAM1Yu`rz8tX~IWMi7zEDlb`v%m+B(yxOyB%ZiV8t5s$MOi6&%SWJ zKR<9Xyp08H$jb8NNx?u95BF;S>FkcRF>(j;%k!Ck$t=ym*hV6?Y<6i1t{2{dqpb@% z`im`>QmQrgt*68}5RwWqu=mb6jA~^1l9P)vky#>K#4e`YK)1k_h|W#Gx|;_$_JiEH zh-0E8t~;-u;E1?JzI8C8*JwWHZ1PoHO25f`APEjVg4!|hZHPF`aV&!yc0ntDv5J=I zW1-V$ASpiywgrJ`5!is|fP^qgxiP8Z0JN#om|fE%a}rqqIdta&o@h6kxBV{;t>N;i z6b{faSO^?^{s~dMfvc{(_l&uQ%)ai_)F9wy5V7z&xDt{YVnWP0-(D@!gpCEl8 z^fMv5B%g_|B1Ex5N=8I^1_@N2j8ss!(-V+iCNl1)6lEbUkCKv?aiS(U>X3xB+ZpjJ zp{hamqJu*%B_J+07123Ke0+H9SN@k{?5gll{p(iDjYleiw+GKO zYon++byOCe|IxT-u=%pcEFfQx0;HSQuFs*8g#EY9VOaBS=v2#OY3LJVGLE}Ac%r_8 zN!8)*;EaI{D>@Yfy82?Us(7DVM|e;@A=uP*5hf>pXK(baBihKM*EO&;|2(=)FaFZi zf>A@yI{eb)p9xL8>#$b}tv1blObTX4+eRq10eqZYVDBjIMWLOwji#|DDAOYkyeA4BpF zeP{Gj9P>`Zdz1UW_gj|n07!aPK2GiXBE1vaVFO!jv%_0=INJCXC@ zs0Ew58E<$-3_Kj&5bSaH!ArF2UrQ6g^JJf|NnjE=>{5C+Iq%}%njes8IU-Bs9d78^ z49<4<#^!i8Ag^5tkCZ{B6DX4up{`roza`UsY+eFViqhcj;EpzarnGC;P|HhkI_Q&p0a`OCmZ7XhMncs)r)ur^kC@L2bbo3mV#b@}? z>dn)Aq!ph=M)6stFb=h4m!9K;3W47>0TL5Q6_YMryvXIaUU=aJ_JZcD_WSp9yvQSu zJi-A;)=;D?P`+LrG5f~do&HTPNx|`?11L8#=_39AUOx1OGS;%U@EU~t@>D)9Wo%Rg z0kV3;6(m8YQq9n6n_8I3WewCQ(U;*)ev;Mv358lyxd92Z(&$J;L7DCv7w*$ZHzA== z91>YHVv$>xgCmItkXoFKjAHY|;^{@%xRDc!?NK6LyhLn`3PHMR4(a{nl%?W)+IDCSWymZ!fpRH} zkBrij&?|&Rwc|3NNHV%H!YKl10OAQ;Fawd9rogXrave7c2sad306PG&h3UEQsfOg#OVsJz!&(^Fu z>g3yo+nn`|@RR&dP+Ev)wHqqu*K@3ga?f&pKDkZOxj`SN;WWIZ-X$okCEAn1Lr_#E z!P(Isb&IJE9uXkDI-&Z|Xhgq8PBe}TE`g>m)u9l^>q-(DIyOaaaUOaH^+s87Ioi87 z#reGJ7!cS6E(Uwk7$gG%?OGwNAOnR3MbPW)jg_JViYcQk-(L^pip{qe#gsV*MLMcB zU?M4^A*$?DBLXCXq8f2jvyIAj$#K7TQ!CETsWxhR)kiH)A2=DyIf)6-MQkA_6Pi}rA`bwZcg-PkdpF>-|hpSy9*lHY6s!M_s&z~uKYqbQpdGlrj1_tu>d;Iuuv}x1ku4~1S z6x^k0MMA3_6$yx(7%rw=N7veI{!{>xlZz92yN~4L-Lk;p1~>S5n~zyk=k$b|tB0v} zoPoYpqa&@xQE^Bh$+M1s&HeqzRf@cfdp2sLoL^BiunxBt6@`@6ZcS<|1=F)u22Xc$ zqV4Kl`MZ+uBT4RnB!3JJX2r7MUh)088k)g?VA#MJPEHl8)K^M?+qa7#<9FYE7h}eZ zVS=1Le?HfWqX2cH@TZ=7N~slhx5z0fV8KBh>17Gp`hShsij<-ZglFBxQ*DInlQoc% z^v6p=0GQit0y{2zen@Ec2@3{Itybct8guFi6+b((<${x$SCLnlVm&C2HM!ouFxZrM z{Lqc_SbcuKF=3;Go{ie#=r;S4tm{d5z*P z=(*(cDMcMwH?#%~$9r5!ip1}s`N%PD^23sMoEpUQRK zGc@V>sW8mfNhHed8b557bDUlq4>E+~(u60^s%gtk) z@RH7<3P=mOJxx<&yGd|kE%ll{t`9JmE=e^!JUk~iY%j@R0a){qW;N7 zN|SLg?gYy8<$P48_j;nugDf3WFbui<7&RM}VsMKtXzDL42y*lmxebwHY$JbBxR5{$ zbh)vxGyPnsGsUu!b%H)5GNH+!loNFSjKVxDJF*_B1=%7Sy)i*KMU0t4!?_PB#~!^X zB0d6b%fX(t;p^;){tY|A$=-=$De8HdEEH{g8}q6vr#RvJU)T!hwXk({g@eBj!c*=j zg#u};vUY$7pXQQ2WI4yq#1{QAxIq_m3TVb|V`q}Wc}xp7eZ|j22RXFL#Rk`0JIMBU zQMo|87y7tb_zM2Fg|E!VN+SEd@!e8Sy6+pOR$$GIy^0y|z6T|_Hw#34?*Ig-m|J?V zv$5CFCaAFz5JPP@vIUdc+=uec3BnA|GBK{LeT5~1h>4Q*bg9=u;S0&A@W~0=Vi^@nu597H6 zN?uMj&o$@viA$(PRHxK}q)$f5sF?Y1;hU#S5gscuK@b z_Soup&4SV*6lu#4P=heV%21G%292Yu*?1|0fL1&rcKPF?icF5S4(wd}XHi)~a%-S? z5VCRqBa)O?^+4*B4VCvZ;LGFdl^EH78f4-l&8J;#7Cgo!)oH&5q5$LFw$X}B)u}w3Re^2qW~wWSY??g{%&y3y7L9%up2iSD zwQH2T+K_9}t6RUu+oNV8z{6K;wPnS4J4BR}S~PTyGKsV;etJL%Jl{OLP`O4*Q9N#? zU&5#c)08627t_LVIQ|?5AU)qftMWg4ii~kEd#d{)rJYqJ#KXT)G&OxE%8D>+^CIS9R5#=EU)l1t5|&A)6lzQOP*-LmhMf8q zTV(wtuWKp|do@eE^z@Q!?2I|e=CiDlT&#~2+4X&0Ja~(ttoLfcggkHPnI(gyxJJ>~ zsjb);s_5O?NfYu{14@tbS}9*(V>3?~QrF!wK#Pd>OCGlPmFLNBW6e@bSOa-6KhaTm9LtkOsO{m)!h&UJowuVuy14X3 zT{n?|z|+wUO}*;lcCLBKUCQV%x921@QsoJxwpl$NP%JX70)!yZr(t_E_N~LJ5dsM; z^ZGu-c~l5#1z8C84&cIzXX3A6OpEHBHYg8Rle4^1 z!EQ<ljQ!&A-`g1@_$ zlADD47G&`xscU~&14(NXd$8s5Q9RRc;#~(YRVIW`{gDErhcS&o4!8U(kXe)qKNW9C zp$ByExE!1njR83+kX=>-37+mg(Ae1X>PM0(Nv~>?B!z=I+u6g@$=$r5O{ zQB8RJ^uk;OxS0!LrRC*pwmo*_$o=&PB$a}trGo~hjw6s^%_72mjo!W0fhM2yPo#pV zNm0C-f)v1X+-s0vLN@J59Zbr6KMTP`F5YMfdmC5S+lqC9h|f|WQlplO7grA$+_a0? zyjEp_`m>hrdFZi%50c9C`A-BoxlyGS7 z+Rv3kP6MISY4P#CU%4_*W#`HuW?Md={w7;ON_FW-DLSa|MRK`S>i6mv5f?&HZSuL6 zneyrHlnH{0KW_goD_+n221lm|3t(_&T-(;*87Y);Bfz}Y0zq>{q- zvESb3W6}OqEL_Z9{V4}I$;Z>HKT*{s(_-P46^al-w&q!zK0!o!tl0#R5JKn5TPvGX zsP-E4q|YZmC}m8k`I+1|DK8Vtk8Wf>mbN)+`{nd*<(fo{RN0d%4@D%$;961??qsFl z%$@6OF`@CxAXQCLUOHcsQn7_++`%(DKEthyI5x>q*(@19T;I%D{j*E+l$a5nR1Te? z4B=_F5NgbRN*^XY&+()yxU32pC8?a0&cw>7325%VB{-90szFS1MQW7aF782mu1W1h z3Vtf^{r>Ksl`z=!!W_J@^IPPX6yk-=U-0#4&S$RukPotL%lFDI%2(c@`oq3&Ldc^X zMw&6}gh}lOVpCWMdNydo84YAm2qa0tT>@M3KwjGXm7q@z@NB;c%;-{GIZ6h(`}%2& zY}EsGe8g5lg3D9A$BBoqP=b<4uvIOS#9GV4hijzC!AktyX-J?Et8s}w9j-QYdBUSO z-G^Yxhqmm>sc#nyo{F1kapwy#+lgb znAu|tI@D>V#9dfJzq(zp=EfeD$f;tJnwRr+@kT>mk!B+%FPYQURfed{#6MMVhBOyc zX^J2VAs6CJtLd25B6EZqp$WIp(Bhp_AeJVt234}}RYK~jl9W?o@VM+0sZ?8L)~?lS zr4nNs^?CG{ccrC=)<|(#DUw#NQ}xps+q6}VL8sSC@j0oIR#&lKen}BuL!G2NJttC1 zD%>gQ4Wf+@a`U1z{pWY2n2e+egV5O8>VxD|FHaAh)9eqOiy{J52O3O}?vT`%b`n`JW8)^BajZ(3;L}`o3Op=~h z_n~y^PMFe0&zz8#CKZ+yD{U`sT_!!g=6&ghGux#yZF!YrFVmJukF9!_kNlEC<(fw# zL#3@@MI99394c*;t(D@8N!?JL ziH&r6a>mfR1;^tW^jzY=QsQSG3I?-0)z+kTTH#0lqfD#nb4i&@b68bfJ#reM=dZ4x z`kDk9tNgt3wp-cr|1D8*qzxy`8~6|!8!Ilpc4#I4|5T^3oH>;SOp59M>=*6t40?iN zf90$PmJeplYEaWQQWn3q?OXnN(S$jC4@C&kr=y@a8UZd;dqkX1`Ybi^Su)e=$+k>_ zNqsk7Im~<@WjLMNcamaZA;$sg|H7b$MR|LT4Qy@AUmW#Y8nO;?S*aM*yfYr?&|hgk zk#xo^rkV0f6A#%nxD_V18>HNaU`f!#OTK=1CB`@JhaPoXabGGnqvjFiXRGXa)oFY! zp>{{3pQ%z3r7gbisW~=XI*dYp!Q*|f=O=vq@GGo$B1;A_q)X1M#plDGV^sr zMRBkM^0=P)hj4cN@}UqQ73UQ<^mdc24G>&>3q)SD@SmdYZHqPN5tXh)`y4{ZzTfvav7n zyCNUPSGTUvx4$tja%KJ~0>1 z4W3dZ%_!tdbwRpy>&B69OO`C*njtT~_#$3?Rg_hwT5+>y&&KrW(~*=U81>2_nVHgL zsO^Mg+8WrnGrH7isU$R~2OH9&o7uUvB0bu5BsvGT8dR=R88K4jNw*5) zk>{9>4VMlp))&*n}gI8DpFE#>i&96seVngv5DuA|TqDsg_!>Pc1XvgxsG~IY|(x03p@UC6$i4uuE!T7Ax;-yZR_$3*_QO5;)Z!QNtP! zNH0A;H;wc2(dtaA*X!H9<>wvLybB)bHiEZ(N-ZZ#%#?JJtVXQw%S*$pj09Fwkq0}0 zR$yWS2rH+)!YqqAr%he2+Prv(^My65jwih<8&*YqdO+B=pYAgr<#AaY6;~sFKw1GQ z;*Ba~y1TpMx8Hul)TvYP$tRznZ{NOLF_Q={B_#!Kz4aD;{PD*MVVM*`*R7|CPoasV z31;_qomTn%Uf{pICdIZ8oSpAo4dcHOB{dwctf;4IpX7vF9b`UDoQ{!53GKK$kVkg#TT;PbZhdK>bq^cRKOxyK`Ptz=Nq`~z{Meh!1CoV-GQsz6+EKY?W_dntp$n@ z;w@^|SNf9mVENJYSUhPyJ4r~)ALetl$zt0}@OPrI+9NJI72luR!Tif}o0p(-y_T3a z;34d~b_$y=ALhWRZ>PP&_bSsEa5F0r^ENLwP+t?IJQp$iq_!c?W4Ucx z)NaJ(C!mdgOAHP+<*a`D)OYNX^>B+}=u%toVE;L?5(UPzCUZJHfR?@uScUWIZo$94 zr8_fJ;AaLz;HoX**~SmFOZAO0L`F|;}zUf(1H6T(BaMW(E( zV52VAx^CS%eEY)%S)kX$3mitx7l{6_o`y2DHWXzSOC1IMkt1uGYk z@AdVittc~Sxe9?Suvoc*X+8`F%-gXP&+S-(m~2y-UP^dQ_vskeOyS{Kux!?uWdJ(X zT{O?7^OxI#DGwc$nSxX`-#~2txYm6zuixZ~*$pgs4q7dq>_z@)8r~LUozvLXqRO}$ z#BdL9MLeivW{Z_4bX*B@7^SvjVRk8GTa>IaNkvN?&z3nhjL|Wwx(b%gYCN~?8 zF11Yk2s2ubv6_%v#skgz!qLVa{Tp}0+e2saLC(X3=LSp`?++SG>@Yy_)3gN7fAcy4D^cD>sLEyXu0dXuRa1Ox6*3`=_=NV^S!(Ze<^# zdal&(PtJq>wZux-pLXSjV!mt+I%>GuD#Y5d*6)Mx>Ti)ly zoiKE-*P369tcDS$IM*u2R9Rb9W3e2AFs%uHZ21LNHCAiwm8oH@^|gkYT8`B1)%B|m z_uUjnI=oL0{f>o09#wRGH27yXe8w9X@lA4VGg8pb-?)^$nbk44w2E*+7mEq0tbO%` z{Wy5zJbr%c4a{6+N*S{B!57(LLf$s>w+rq3s?fc>)qOU4F8`id9EV$(7ci>+*ZeQHcbg3pycb6-)zC>=bg$hX^*kDz z#%0v`(JD-1qg9QpK(Y`>Rh6jUtc{}Wt)Wk_5F(#X68@qCtJo4ktGg^jzBy{9^8V!K z=lj@LpO>28p7MZOuO7pV)I0d~%uXe7xcmYe_y)q?&087d{Ef?)f&b>{7LJ?ccFBO* zn?6HCnn(j7gZ%(Ee9CS?^4CZbCrPLKBTSB)iWc4gytv8a6so8SB*8qJLqd_xJd1;D z8kBJ=It(*^|A++=85Ai;VviR|+FlP4YIf)&)ksXJViC4LeGVt#< z7TKo16|&jV{QlXc=aE%*7Writ0bK$Uq3M36zGR+DE6Kt~=T`DT^^Xa!Y+fz|jtbse zB!rkdlakxn$NN`R7z6!&J3UdEQ})%|^cf!%b}F}%F!jvl&p8aYCY$R$CBXhoJF!>E z@#xEl&k<#~WONB`VKtqaI!=gmSFaCw9F2U4N(d~^^qRoTw+vsW0C?E@;9RPReybW9yu15H_7oS zeSUIY7WUsTeK3}wC^NE3__%mtxGLe0r(+wq+Z&UqtCDo~tuq{hg2$k?i!jmchzY^U zFj1zWgMSNnIhh0-QGX28V$uHJ`2Ppm_lJ{_w|#EFLwr6($I0YMJKWTcq6EW=Q=%52 z8sD7WQlnJE_go0+-bd{B&Qw;xxGd9`Pc~UuS`xa!5BTew*=sBYH0@L^Z$ZmCNyO@< zzR<`VQveSkDkA~!@BW4BRy3|vR|)E&ueGGSgw0i!^@5#Tgwv&iF%E=QrggUtqlyHdeqthwOK3O5CAF(AXPi*D#W5Hgv@ZQ*`__`&! zaxA;JfrXt{x=vM6j?i|=ys3q-Q&2#z@H)7;dYY$5Q-O4Qa!wc$SmbSxOnl#++=@B< zC-EG}rZic&a8b1ts@l|S6t%0{Z{UePK42k7?sp|Ik{M}Qb!nB5LEqk*o4Yu^Lheg^<;+zd;JNjS zD+D1~63;isH}iEr+V^XPXI5iF*kR1u@H z+n3mL<21)9$RJAz_1znO#za(-0khVAtQ>Nsqj&ax&oAJ;eLpIb9+nb?*_#&OLZV49 zp>2W!iAdizfAccM67t32wMGF&!s}a2X2cuWFWYb!q2d}iTY()6m}N!kNHNkJL(i(4EYkvE^IVwKb*K1 zyJI(@OlMISPZtG!YAE!vrW`xDWw|&Izh9|FKzM$`5}sGeX()q&iarlnZC1TX7C5Ny z%vB#LnGvX+Bz9^ic7T3=>W`1`;oe_3HJ!Xg6X-dg-uQ`9y@}q<2M2#)XIXONy6-}W zfW#R=rI{G6%IVJMTSXym@ynHzw@AdQ;yczNX-ajs$ zttwE_>iJzJV@k`4EK8BL5aHRvPFxjs#q2~vVIt!5gP}RfywXX@Xd?({-ns3Yl*RKd-ELE1ZHVes=z(f1CDLq4}JOx^9yAYmHqFk z!i*lH*pN*i;`-{rmz2NB^@6{gD7=u#lUm-!I@N8?dc7C=PEi`>>BaxwE z91c$Sdg{yAcI6lbH0#7sZZevBH-M*`DVH?alF5&aoEqqV7vnQ@4rqba{te9vUU#kE z3TNwH<1D3AvWkQTdX5eOO_gk-GAMD;s8;4FI4F0YuPT3^jDA5wu`On8#fh@34_j{s z*m_l6NTzjQLo^=#m{~Mj3;%lf@__|xUbMu>);%z$T_437^ZWTd7}l~I#<%aMTx0o^ zm&IHTkqzkf*OT6WHC@EG_S&7AWZV{SjwbfO&rXk_!DSRcmx+RRT#( zU_*(%t&X3R$);-)Z%X_dr3h9FXJpT&qq4bFu4a4&bwBbn-+t|Qjn21(`rdThcOH;# zNG|E}ArsAuTgd8R!17}on29B+m?YaD&TL0!q3A~-7w;b~>{QNGKNto3sHHGcN+0e%JIn-`jZP6q{R^tl^%ofUoZT z8n5j68X?gaE10xoEI#}P-rf5HOKLA|UB)IPdVr5Ye#QCta6W%u8m8)GLpio z`YMUIU*7&D9}BmA#clL*U)Zz^AvZ7Lz1=@4&aQ;0+;}XzVzOjV>Wl+MOT~vqAxRDL zUitC#4pobU_jZbiIl|?H+s0&&B1MIa-M3HU^~2xs5fT&1L`<<4Z|?XGAME*AR_hy|osX(nZlne*SXu9W=nt&6jif5lFesj-nPzFg>FvDr5S?+dIC;3!9eW>>X2T zj!zE$rby<$o!_k}(5->gQS_eZkd@c`jKz6)b>G)~$gIfJE>v|!co2$;JA3vl^G=_A_L)*i$r6i4&*R$@V=5ci-y1ax zZ|@eV{|T=Qc?2(znnY!Xq%G&OQF9TOn})Q)Y!3f3hXyYV5t&TYc)sssMF=5_$kGWf znqAX$x`ut-$Qht|SbR7}W|Jhq*?mM#z^?UM;&h#+c)aJR3ge`BU$rmbm}b2(tg-M8 zrqm?2QewHzuAPl7zM8xM9?qtex+Cfj7v;q?<}t@qfhfqm9o&t5=k}X~7d9?MsZNUr z+V@iuWXfY0*R~G=i~&&Zj+w7J@1N@f$9+|1h{bFLXP+K@$tc&IdgE}z=6AtinILre*yoF_wNHO zWcN%F{V)E-pTT`mME{F_@t4|y6A}{e$}6w1nW%sN{+z(*pM>!6a4cH12%esv%C(A#=l&Am;flV;4AA$|1GN7Cn?f6nc5=FE|zqobt}BS!G= z=g*&KdXaHYR>0KMRE45#ZL8O7-EYvUOrS5ZM~@yXovBqy#0Ha^iIOvAWeF49--%VL zR`ED#E=ju}&+R{Ty#I|F@1F30!NI}GMeo*teLp}iktF*L9XfFSL(1@_Rw>aoLEBkI zMh1L+O{qfuE^OYsnU(#!cJ1N<;{WvV{x@p8dm;tX1d-K*^nfEqjKD(=Q54lb2d};M z8bU%s*uq0&q?LpCDN>x1O6lm)qx{8E3N*@vL;d~75@_8zxZ46F9H4w b{GIrJ04vQM_}vr)00000NkvXXu0mjfzkz|d literal 30667 zcmV)rK$*XZP)005u}1^@s6i_d2*0000wbVXQnQ*UN; zcVTj608L?ZaBOdMY-wU3c4cyNX>V>bE-^4JI4mG&baZfYIxjD6VRUe8Z***FVlHoT zXD`89b)gz*|5?MFnhZZ1~VuhZJAa+Pft%AJ9Z48fBrdd zxlcXy6qYYvj=g*LqM)FFiPP8D_io?HzXqCnis;&7$BrGmr4st|>BIcqJ={S8q&J!v zZg+Qg3>Yu~k390oe|hZlPW-u~q7^w48;^WL!02!+J9i${@JoXekww&;fXJ^@H5j7LU6 z20R@+(bTUQpC>H-EV4@TxnIwqwrJ=Xz@OJgg`r%hMW?{#Xyw5_ z^y~^d~zOJ4~jE?2MRYid3&Yin80(|=Er&$toa&p4->C=_=UcGuL6d##U z#six({7E$N3+8q`sVag!(5*omCQKsUwT0o3Boh%28ax<~3|NtQlE3#I(4YGfa*Ok^ zCiN^)Dh3T21lZVM=K9ZI*U$(38+XL8&O=x=QlZl#`t&x~Nj}(GbP+#J`VUgwwFr%( zb84_5GaSD^{x0_|Dk?%oX&mCqb#StAMX#VCh|fvGmh6id-L^LdcNxt62#zrqa9p1N zI~zMp={Er#gPY@6%tgc}mcrG;7ej^&;eMxXM&e+}4d?-c>r(LM$Z6c3eny8Y_Sx`o zcE^N)yzFZ#9ZjBbIg1X1gwAXSt?=j(=EUHZV)!I|fKlOY0aTX#b5;C9@P+E(YC z1~FjW>$kzMu0!}G$o11;N7Qld(|_OqxH&rW|Icmw0$oB{VOY1J{9+k`-I0`^iNmqy zmFH(`V}q>XeEhZL1W=TOM>_VbaYwu*0;H91#flZx_IZ1_nDly{b(A(5*zi_8&HByi zIT7EUSkIrI=sb!QlIClw1vJ34o}(3_cyqA0P6O|{N}Ge7J*IaX&7aRDU*-QF>UJM` zHEL`1l->@3@bwrC8;w}00zG{2{^+OB*sq>)PBonD9hmqC?dvt=zUqE$0vmDL(nIU< zc+XL0za`@R&(OyZ>}{HtX`M!*Os|Evlbh1^RG+cPF3!iU%g50&pn=lfGoTl=dIS7C z{Go>dC(|O4R+NLLUiHx0x1rK+X6O6y)yY-p71EB0PsXd=AA+BYm)V%!82AMLAME81 zJ6k~tliCkL=U}lyJKH-N$8O8>UC+~>=a?|OWe;d|It*yiQGPrOFDF;LGyF;ZeDi{M z26sdaLwsOKNr|!=)C771OSEPDnYK!LkknROA=+FWM4Q}~+SP5TBUlnvZ9ZGc-yv5LpP!mcj$`tm2P_C=shb3?SHNjvoKx@#!(axdD@s{bz zp)(j@Z)0oLkLOia1}8fQCi=UH{rmT`Tp;g|)@bG*v4qeh$UGwb|N7RYe8glWDSe2L zi16r8w-J$95*mGWcXBanldoaPi_&-E2i3%9tsf!3JOvjrH<^uAdvt)z`MSu`?sc>h8f{{7k>84h}Z<_%mX6rGB)Ue7yH}TuhCr z_V;w1xA*>lQ;Ct)_N!`~>UK3~^?rTZcgQa*Ms09g36S1M;=`_ICE`Nrb!BiFg}F#C z%)!T@zoF1Lu-xK8Ok4gTA95S5H1z#=>?JdzpmWNHeA7vJ8QeEED_QAVP*#lTD?j0* zLRZ0UWx6t~j{c1gok43pUP+5GeLgN^ZRAyp&iBKSjd*V5e7v~!E2ZD@*o*wPS*yQ< zPOszZr59%Nky)6h^pnT>&W;~=#Uq?cxW>PovEnmcnbmXk{+^#PWBq(=ynIM$`~2hz zys&36Hb);(_0>Tq>7mu@m3!S5eH0hdZeZ1AA)Lv0Y0F}s>oRS*(q=h-+@{wdqc{(x zs($KwP|yD}>*w=0&m~7I?ZlVM&o3b-joWE%=51Sw^rCF!l@!*>?08!VaO;&Ln6>3g ze0gLAP9|LD2~~rH6B-f?cFwx5V2}WV#UQEeMC>KyVHse+GwbFnhe4ti;LR<|xbOQr zeo?ODWM_{~!OfZHvoWp=v<(HjH&7(I>LA7=4(864c8S}H%1iLg!F4Fnmg9VKbfw>) zO}K)mSAK%T+;l7mGx5sw+j4CMKHsxkY1@4H5Hs=WhZL8W!qUC7odep|X{@xbyt*BK zMs3DV=hq=T;TpG%Z`mJ?_O#Mk-dE-OoV#u@rZ4{l)BpU0UtGe`_z0_WLRb1o5u4Ca~Cy3y=zLWU> zQLX#H#lf_V5k|M|16LCYbf1=QOp;P(0jiIDensdkhm2J)4I+-)B_IjIw(Ee^dy`E67LR0sZ)4%F+^n z-k73_QYJo`F)k<-+pdeFsjar4^F^m8;N#uDW8Sbw&@QM+wZaMYKbLtD9sRq(&cLp1JM;Aw?4SO3WRu>hQm-639;2^$JMrj2x{d%R1R%j9g+#H;hYZD7mqATZ#SO2z5 zTfy5JDesAwlu@h_xN1Ueg(luY^;$To_*I_&@=|V-7X=pVv}JI#rDs+B{8QhE)Eg)) zFG1gi?ahQkIxoGD<^p3WOW+3%9H>zUxvgRn5uLk}t1=LIQ1ritv0X-Oq{*s4=WAZK zK7N1VZC)WQiBElP8J+#j)j;CCvw?%HlbO26!`Zst%F)gqjxfDcEa<3+kK63*;9+N{ z@Tv0ONPR;JUCXgK8-*2ho3*i18;w`(_9eHg=S2SB$;Nz_p*DHG<@2*(r4j(E1NH3? z*wpMg^0n2(C;wfo{;BcYxXqxIAvz-gPp|n5g=HnmV2LSLGqx}8UWD1ZzQXx5ldxi~ zuQd?QH*NVx%-7t^PObF&_2E|s4rPPwq81lIqMcG6CGEWCi)wBMp`wU?8wR@AtKA9h9Mlfejd}8e}vThET!#u z+$Ee&yka(?L<@Azm)9;bd(eyatwefZF8Vd?r04*@Ij{zaxtVC-6NtV|JFtZQ?ZI_y zc_GF0z~+Jn+!=cUH}g~R@_}!#<%UTLrcoDG6ySWOAYRiLNFbB2>e60h7|nO@AO9IY zUfjgjmGRczAGjYKhvP1=V8{I>2^%jSz`+}WfazFsb}y#?`7!ogJ)^YU$V%q68!9y# zy$pIu&&OLke^7+Wv+-B(j0yFLO);!T;6#h81!>ljyBP-7A;m^V zUPnao4a^(*FgkQX}KeGcp8n))G zb8?p<2)%L&%TMh>@5b#|fBEswUn&XL^9Da^wj$FM(gN|#fweq;kM|e>O^W&M@{bE4 zWDD-qU)UdO1AfCmieo#oHez<&9fjgq{!WnFlzvA2A@QBmPJ#{T>RuW&6`kw1P=0?Z zEeb2I?89r_A4WY_KgAYojj5;Ai3E=SZ2q1l&N+jpvH-E<=z7HEq+rR!SCqcA{c80( zcsjc&gjHHms*I6VOw%H2R=q2OuB8TfWVW?j_tQq?o7>KR&t z+_yFa_>a#f4d&DR%b977&PY_+iCNweYt8^u+e`buQ4V?A$S*HKc>1-Q!76~Ua3h4VX4o8xT_j#SmHTkm*z8}SrWGFKBipXXcbXIZ)~S~QN!}P z{Ci8#JzML0JueJtB~gk85%<&S_^>uFHQlQ$$hkT?KWbrv~W~UhY8n7x{@Z;6twy%J1?EW7A3H^=_+1o|N%JX~pVW@E-^G2mN zzABteziRPji^-VT&s;?}bPbj0Xv;?IUWq5VV*9g6ON@>>_^!VoR zI^}!l_0vc#Gzm4ef`x8S2ECYR`QqhxZ}-o5W%JiK6>si%@Y?pJcy-$nB;{rDcbZ!= zgA&Lm(n%H$*%qh4NahKx3r!z}{>J~49r{*q+x>MuA30n3EPJ|;KiTX)lZ+Ct(d-5r zOm8z5zeaAu@CM!C;b_NgANPMo`Mr%%JoRvJ#e`=4u<7~{46fgq`w^47WXfFryQj0e zP_{Za+G;o^HX8tq(d1Xx%?~4* z_QdWR!cmsn+%O+RdlG^t8t1bX`6G1VMP`z9%tn%aTg{$h3JXA&UJ0 zW&Czx8-}**hRK}=^K*N5^iwbxSs|M9s)UgDMhM@?k*#|1u+~TH$N2UGP!lQ%A+fQs zm@;JwNBO_<$}7<8^(u3EKH=Q_1tz`%}&G@!=6*5MIqV<+iz_^E4?)V$)*<9Ck=yI2w_F`)*tZE zxEWOlUFO1ARoAwhD{K9#8k2ngd=AxbODF9bEXD#ah8Py4pJ{ zfiFeIHolI%*w&XES`A-YL3Cg4`xCDX5OK>SoT$e{=b%&>#DkS+OPSc6?48)Z@8?t7 zxZmtP55UXF%Uwu}#+Hb~tP`6z{88mx#MG1fk^%|X8Fd0TbCdC6zbR%;sK1@t34^4= zV;x7r!B*Ime>%E_SK{SIw_|(<+O7=P9(w?J6@_T%Q4jrtyTR5NE>KvM4~>eTLgSC3 zqO1b@ZX8ALAYn-%EIhE1ef)YiYKH+$yTDeSFQb!%i=(sB=4&TMx?NI62V8=N!T1El>GDhJ<8kwnPExE-Lp|!Uclru zCAA_zHHhd^Q-x1hQc@Dd{ae11k zKBi#$l;SjmCtiY!oipxlI>PLCf1KHYIsHZEgC_n#%*V+dJTg&lh&+h2!Yp_@yK@8@ znek+7j5vr#yP2P}T(4&j6qx`S8sTS19xT`LVwm^{aRtd}Qdl4LJw!xVOu>10I{L%S zr44`Y?B51y#X@+HL6K{+>gxE-OK2C^1paQ`xS5lR)fe`1`_nzfqK=zz$r{$AJN6g_ zEWTz=DprPv^3!V{)I^Evp;h&(eQSteV*(Uy28H<4DyY?G#dX>SncTtt76I0;U!V7H zN+(8{peP!SRt}1cqt)Z%k3UxW%6oiveh#K}?~fA+moTzfFMcpH22I4v>lPWEJOO7H zXSg~#BfTt7QGZaIo3k6bxwJvEy7jru%TWjxw4_gLI|x5SY=x7tAGJ+xKLp>N+k|I2 zj)jM-;ENvWHUf)}3F-CCflu)GH9A|QR|u5~2?lDOPg8D#0u({A5ejK17bmo<-yD0R zPs0m3MM+Kn&m1&~iNwuSwAt$%@L(6=4@U&$Z102;gN_9g@~L~H=SaAzJZtg{C2(@E zM~Gjb(l)*SI1V%-mo!=}ql#lV;!TFFlbte#)^&Tr#>UocOpkg_U~30iLI`#3G{`6~ zVEx;umc0>DN0{9LB!8rr3(swPCr9NReOx=j*3m&}3q)O{mE|!3+BrHX{m43$TAFKm zR!**L;gRQ+z;g{?YLEM{_`n)CIXlDAv1T*lZMTGQ*rX+6t5Ud<(<1$i-m1jB3}hGO za}-uhf`uhhU0oYr$JlPkEX%x*EQIV$KZ3E1hbyraw<26v3J@%;oZgOyI}fiE10q%? zjhWPI3HtqSksFX+B2+OCG#i2DK8e2y0fO+m-tX3D(A z=cnU~qkrMufls2YtB+~EB?CX_yJCv7Mu4?7Py9on)~Xt_|J~-u;7r%5<&q&)}q9U%1d~hY74~=7uVyhqu*iY&0|b_ z6i9U;a~mSEcHw&NSuC;5=)JHMn*3Eq-S|0XZukO6;zS#P+UekPmzw5_e`CDP9S=$(e6-KpGC%|R zV9&2O7;_%6S*Ac2daLGaT*ODA(f5x*ONU0n=X?HAwnCcV^_LG~-tMJlZ8vfg`H*j( ztSoYGG$JHE>0)z0$VUro}$MCJFFzE2XfnWKaFmbZ)=B{J{(SajN3_MW(RgVqz(5m@krW77B zD)eQ@DHCZWWSmU8j92$8#f=;hfRk37gLjVos2nSzLYYYE@A8qNa-rIA`5?QbsU_Wn z+;leCy}$bxmQrPWzUNQA|1A+BH3wnA-j&?8;hZSvpfi*ryZi)l%fnHSeH=)?X?72> zd2zU&XKJGtclN3UIBnr0ICsa_e9%}|T;5}5o>b$Vt;;wjWYdL%3hO|rR^&t8VrhOC z?iJY|C_ejA@(u30=gMiUIlHgcM0i^XaCqxpu+ac#;;$gtm;yourIbj>Nw@ktPgQy{ z0Zo-sgol-kS3jN=W;sts>oL9Q#o1VLVO^z_BDX9JXVQi3xzahqh51j7d0ijDPF8sNl}M`9x^dPt}aW%^|3CG!=vIxIb8@-M6klUoh0 zF&N6-(N!Ui1;j;Izl5TWY)JYVUStsy+R0{TVcEwkdUc!Ov z;hf5XK+E>x$uA=`>J*ySG5P2blS;YtGK=z*03rfO!XNDT$^5*Iu2?$eRpoaCa#WDp z9;n2>kp4~X9pLK2QZ}E{XvHB+Xx<-rWrets6OU&*k5_&> zwfzuGZaY}{PCkZp-F*0*4ZH&|rcGb7Yc=o*z@*Nm{%?+Wf*F1rdXq^}Zrd0Y`b<=y z7`C4Epz$`hu@Via?@aLD@+T8M8U8H7ldqzly9ml6l@jd?qnq_Xh`X@)Qv1)3zGa+0 zTjgGtj23>Emh);HB44Y4Zyg_M<+(fI_+ z=z4P5r-S$;Svya;Rp?NI1%Wb?uwpu&-fFugEE#C?b5|&VK6IWkLpdL{L8ZVWy$(wb zuH#f}YJQjaKbjL-anvZ&iONfA(C_G;)B!yj=7q`mP6vZZO+w?P7!ETvilGAKhKfpl zdh$G2&WSZ5HFGhm0qi8KB0jp$V&gs3W^KEzTQD)xD^kdHUBZM812Mki0A8|X=9F|% z6FLrJs=t&TizUa`D!*Me;dNZgj%N=S!Y2csfwz;;d6C_fOkcE>`?-564}asi1K4`; z80HRrNHLOE1u{EX#^#pmGf-M~1AflKAQ=oeopu3-lZEU3BP}POp1bf|Dc6;uNLv7J zN3neoN_C~!bYnOA)$5KB_j)XttUMixGx1SOGK=@GR&qqI4-dnx$djn+;f=RPPJ^Sp zBPTci?$8FjJmevS_|)ZolqCJ*oxdTYD39YW9_e9p=Q6|thC=94a!`RfaB3w|4qr=8 z!20uHczN)HoP9O7EDx)%ZGcwNVp#n_XyqeP?Z#!L@XJb>v1BJ*npeuLNTBP}mP~CI zGh>ijR)9ebx+wFc?%U9>p7Km7djjPFoY;9F>o@gAbE<%ZVeT!_yoManw_OSrJhcX! zA`WpN4h?j}g#-BO)NX8vID!(R-BivGO?bA)MCQ?!seJrou)_8Dwn{=taak$0UOL9@ zi^EoP8?6RMlFsvSG)bhJpjCPIJ%OKiG+ru>aaw zCO$gB<&;=t7FPC;RAbTpRZN5=c#!($X!1!WK1(dvy8`cT|AjL&sPW;>Uw9lTs_YIw z8+|Wj&>WI*LH+0)RIxyQrj$K_(x4QVtAo!ZV{Sza_FORqVBH}CBo}wVoW3|{vXW|d zP_r)FK6}6u#c&hhU_!#~EssafK zB)#ppd6W+VISi~k8)}vwScao*9r!tk?C@kEd8zXZ^sUz&Pq%#t&$NHk;?6W^;NHx< zO`~D{EFv=sb=ag&E zIeeb>^_p=)@sW*&!okK7jXfHng_mippHF%Lo$5D3-=>v=vdqRr&tTB==oiw-tZi_M zF5K^hL6en?V1rw9<+fSj$(unic!XA3tEg^%c+=6QGx5}_vgSCF7fPSCt z#=vJ2W-BgHmW**#%yvzg5o)?VwH;1Ag_{Klc%s$hYOM>F z@$LKb--t&oD!d9vu5fb?F>}qYN(i|XA<$ZXOVsxH(W?E~?%(nDsOdO&;!KS}Np~$v z{@;NtEXW~~{|#;>OTN{y@Z{?N4F%uS@bE}*khgyuJJ{5a5b~cGuO&FMmL$fcfn6;L zP~5MQrM8Om$^k(8!w$gJ)vb0>agmXcm_L6$mm3WT2;jJn+J_Zlq!N)e`?TV@LZX*}R)z8uXl%Wdeg>GV z7B+B#M&ksDRzC-0Z9Otkk#HfYeIP|YK8KbB52GMq>j{mGBP4AON=r&mtkof}#1~#J z?kLyih%qR0P4j9Gt$_$#Y-)BIZZA|)2RlM#us)(SY??&sZj`W zX#m*yi{COF09#YyaoBkP#SwrV-GgzZwDSZiVv%1|0<9KC0!)S0AlsESu(S1q9qggi zr@=s5CGYlbDAuK-OlMjE9Bn*dYip0}vK!DzLV9(w^@OdR1B!JCFc{lB?5RYUcmWfO zqLfHS62=4pl9Pt8%lkT+gqCu>N!ZgGNTL@(W;GIESy>t8&Yg?#Zg4epLqWxPxH^z7PAvB>k_-B}KcI?z(8JbA+;qR7 z(QvgFQg4Oc7EK*{!reYl;Z-E56=0B8TN1sEubTTPVM;cxvb@SUkP^3o!pxv)FkE5c zCCLeHt|Au5|T;%tVzNC9SY&)*aRVNBH`gb35obH76Q~xqT=l*#i&B8 z6@`#;E<;nNJ2b`$mQ^wJWX&LbBH3`&kz%z;SMg7x=oYf%lk;s&m6q-VYGaC1M)}!i z!aKPtP_&yI@m3WIv?VxrEeR5m@ND}!2=NFo^Zk=EiOOx{5@eY@-x^56o?R-kF8Mi& z@IOMi-UjIfnF#R~mV}ssSR6gj3;0{edFSBb)q&#)7g`_J4Y{hCv zO6xyP?qti$hht~3Lj|>whezAM#+-OawptMK%L`GiD@PqyKcy|VtdKJ~1RD+fGE(xh zSlLbi?)=-bA{11Va3<6`uEdrIWR~P|%mz7IcsiQqORN(nC38V}J}L}aINLh&t|BA3 zI0K<^$M8t2(Mr7Vt$@vG+A>AAN8eM6P3%sfF~cnT4jT28^}OpU))5LoBaq&+Hn^>? z$*I(furr#h-WMlQE~^U^p?5uD zaypWH66Z2Rz21KHdZ0_)4!lzRd~6F&-i*YrkG(Biz>UO52#wo~r`kNl+Y33wh9`*1 zjRTr>0xHT;kr)q$2HrqX9N^pvIy-+O@trerI)W8QFUUdIwX=NCL;3#U*SS5nEFY_{ z?co2Xv>1h^UJW=m;i@Dh}eR}f^;-;O5}MroFee{=fpyw-3(a#f6meABKsbreV!`!1r!M#aY9~ z^9Rt_KZt$CWNf{91hKg(SaETW;$^%#YCl#+?Ntskbki-!#78)mB5K@{<0cVbZ9w__ z$ec&1#~2QdaA+iWKSp^hZ@c1w2vZulNfGLK`Qw33Cgr+}q@pxrmF9Bd%~NT@$1lDh z4ar4W{BZubyb}@WHU&un(yie$+}Kv@AXr6 zJ}Pcl{hl~$ACCbcT~W`?|KE-_CHt1!77U(^_m2F^rB>y>bbDmwkiA2k z?3_4oJ1Xs_l7mo=L3y~v!&rGu#N#^Jn)HRVx>8wFDi|YQOJi#b$;KZrO4_tpeKhtN z_VOjmih8W$+V|tbY~pO}V5_lV0(3TBt7DyJSUT)wEIzZABlOz&ixu#pZo~PI&)3SQ zA(jk%8Q)*njORLFx9fBPE#Lr;J^EjPy1r3Z9*ynY%9>qs4IcWd#hA7 zwFH|D6C*INfk|ERuMiTI_^-DIUi*>X!tzfk3QT`TnzhUiqA?|F3qEewY zDnHuFQ>Z)Sm}2>yKCYgXGTf7rTFzra;DkE`*~-={uPo%Vm{(TBUdjQkCKXg;j|K>I zHmPT-0~Lm$>-f2tc;w9DT==U55W>ht)*lv7!KxvN3TGSb-laOK9a7mrmG0Nq%~Q!w zLs_$$xCgPv3?+t=`=u6T!^_F7#5cSpd3+wBjY5dGn43vO3W@R{-XY54ZsMg+L{U~Z2Gm3}{;-Hy>MdZB%Qi64zf zy3Q{}r;rw=c{LOO`UIf35K>wx&}0zu^_jSycLXiH2gBXLBym&Oub+=@RmOiMH4Y2* ztw6a}i>LdJQ>ro%K0f?A9&9@l0~&TRa~eLA62$@(2^*qKkN5Y9tP+dHyu>x;NU-5F zEU{-Wx>+xbZPAyt6>n_*p82M+?fSr1(%g9=WW|-e_$z8JGD`&$OWE4jgzv@G^aL*9 zM0rv+UOI$dPHo38r?&DT7foJyhJ5fu-s5eTj+sv@ZAy|wHU2oi!z=<$ z#`=o~Dz&XUx8L|l4;X92X$?ur>c_-q#OgD96}8IVc=N0bgqZAPBo$=vDzNO-W?V`W zR)M28BJkbe4cKeWh7XcV83QkaPy*G`zVZ@zFC-yU3#6S1nOHa!U};%$|3 zZUWj;Bo{?;R9{A^$@EEnkH1>@PKHLEV3)MoxJJ=jQ|Ywj7k6>CS!?*^j1c7hxUh?f zkI=5JN}w}dXWOM?cc)%3y&aU~yMepVmr-3=0n=cvXC<(&Ac^^O$Tn9|(NSZT;G87k zguHZ4U@32vw1Unb_8i>pUGPYU`;>IP3&+05{peV7|6FdP>kza2X!jBL{-M{!_Cc9H z+4N=tsa>3m=0_SUWfCQjU*doeu@ZjLZ-&)-Cf9oTfl+y@`rdWTvdK?u-k*h&m%2?+ z+ByX`M;$lsN_0WLqtqTL7Ey)DIGYXz9Np2%d#F-+Rz^%#GV4U?etS0-tjLRlrXtAG z5AKf6eBSCnbMtun5xnxL1smF(-XHoj&+8LiM)BXi8~qBFjhV+sL$3gCqiuM>#25Hl zi`ZAu=I#q2^j1-^KH2l^*?to$<<3(t|J0Z8OrP=WX8uosgb=+{1SgjQIM_60MKt-c z{YfkUrL`C|Re1=}If*!sa1Jxtk2SSrB_cFhcu+U+3c$G5=2CKPus%|((hsz$UcoQv zQ&3b?2$Yw>)wwQg+y&oxE%y*S9qJ;$mF%{+26`^b!Z%|;gHC8u$HYF|X(8mUO2M>! zi99MbxdPo9ipolu$g4A*-HH@UfkG7fKyS2c$+#6z`Z9H$yT5~?+w2cm73g^oOC$>` z=FiGJ4-TQMq8#>i_Et-n-Ie@+$6_w>A(wQj>L!oJUc|caF#L962MZbMLMig0_SmI| zsE!mPp6ygZWTkRYWcB#^z}i|BzbV%jBdgRr4`F_JKB9B4^O0Jd%EY(q@J770X(`^= z{2i{Q33suq!d$*jOHXIYvrGckm2}aMVnxUbLWOcJB?~@LMr4{Pt(qF=(yt-Om@b1L z849^Vl4SH$QO{#ak@;4AHRlE*v!an-USQTwelBvAc4|A77|DmaZCBI@EIGK=?D=sF z$mK&=6|qOjcp#sX`1;Kk4k`0M&*Q|+OUg67qf#){ij7J-iu+piM2|+oj7A`0`2F}! z<@=Mp$6(pvO-fDK2fGaAYU?EZEjuO>iW9muY{lvnB7(1vtYs;b5{J{rNmp|NKp zwDD+G7D}do1^l&q-y;IJcw#E$TKztGW#l zo0)>xEOAgag69TIR3zLDmkx3QaVlCPV_*DPY>PRDfgv5)o-8Ebc=jVKO)rIwQ#o84 z)Whkt2u@NSUyzJR%|;@~sQ3?!JIqNp$21xOPe+qW8I6_DDxd-84SN)uuN=m{7$HQw zHEc+?fb(bJs#qL@g4hdkP;;th)jz? zyP&4%Aer04t>Lz=fK>9Sb4W|p`pXgY^k&T4umlIMhvQ)MIh?$Ci7gqlMY`HM;E+DTlrwup=R44xsBOs>=5E6 zLJ-UJWeV{reKZ=jq7dk(OJQM3mmx}K3t0$xXYi9&&MG30YG7hgLXl}&1+_#`xQ$DW!ryi=rs5^yH}eyoQSKjUl5+| zGoDvedGb00H^ozZ##Rz)yq!W2;%2fo*xNY5&A}B#6~#u!OFyn?{>sotuq*O7oE;o_ z`~)8t4|E7_#@Bhgrzm36sa|tD+;KQAq})J#Z}Ikfy11c(Q6EU>8rQ)jtTgcpX33vc zb{WsMzaN`pj$lmV-o`m0X_^Q`4;!*!y9mW|pj#atV-xTCXys#4gUoFA2-aWU33q$* zB0WnVoQEZ0YcZ|YXuc1^*P~ymG>5cusg>~Z?XcD~(^9|NfYGPt(+o)eTH5ha@s3^8WMTs$ng9VN} zt3u7qtQ7WixtgYqnW#OYj1Cntl5#UR`1{ojORzOU*t7{68*f0e1t=(7RkGF^!sD;- zn6e5@Y2avnXnR!WuIBkph~h)eTS#qTH^VvGm}M@*+Jfxybp2ZvLM~ps$nhXVu@5}( z0M@Qu3l9$ucEzXm-+ucICr_T_mE(&qzEH||S>pSn8(0JW&VAG2#_=1b$tF8t%K%|a zr^McM+`RDWutycu2K`pfd;ImJxym+5LdeETqAJfrorbdzLOG&;JhzqGmW+5=vHfP2 z+5s3iIB5Poa^o z*qzp13ghROUX+W*KDV}Gksg;88cJNbWQw`BQ;h^jghg>66nNC5M-R-JHH)hw&7M7* z3l|bW?%K5rXU?4Af`%V{_@UKWalvka*VC74m2Ga}xaaZJzExOrVmI>(PWFzd@9xJY zq94N6F_4Z>^o6>KDn76G+}AM8cgpxhRN-@_T#bX>LCsV zAYvnl_xDRXP^>G%4|zFwyzK~1xv@27FH435H+xqUd9~)y0#Zb4^*P3fG9fnD8#D-V z^JZVW#EewbclU>`yc|iHsYuRBgRLG+L>W0*aJO@Wzjr;%>UFgKojC;AQV3 zvUpWwqm-N)^@!olf=qWHs2T@V%JUV-!C>3fcYfgs{gy(R~y@ zKT5=&k(-4OS6`Hsmfl*exZb^cBRV=7)22Vr9d8MI#^mhJrD%4D3B!9ivhd*BF_m6iSiA|S9637QT4poSyiFXi2HtlK3 zlc)iFT|D6nPfTnPgqy5U+z0vpmShL1i70l+_}t|%2Z1K3Dc=D9fy!1d9H@F?p~wklLEC@6X@4O>f;`s67(!PEBq<EY- zujlV{uk!u=FQD*$Y`g@b2cnCrKz~zKK$2jedg>{ThP(g%`wQp@Q%rnT(&*vz){}#mXUPu$39PR2huGUaa4DH3F8)zTgTzXRaA;ur%<&QxvO!@RIaW3I1`{j}6 z_VCs{s-3?zXZPcJW+LjkdvoqUB0@=<3TP9c&2>UWQC&C$2&=`aGkZAiAQ9lJLmz>M zvn$Wxj?2e*kDP!1ECf5$!KTQ=*m?Chd+E&SGX-A8nk;`_-i^~KQTR`cT!R1)Kh_0K>NE&WMCg(MOOKe+?lmcK!_YQD z5UUEeT@CZWzF#>Yg*=F5?7M!NOQ3#vaD`%bJe@2u9T37(uCebQIj&NIYdYTEvW##1 zoozob@$t=f5;aIVBI`T%=!;qg0ZKhCNtvIzCp;u1w%S0~& zsZGctLke?sjzTi`?KXPtP`bCz5B{at&(EZoo&kZz@ZsLyu;|m!M7kx*# z+WVuSdq2fA=kMYTH+vT|-Q2Iowz67d(PWe5z|+ZTcmE)JyrN7b(b8s%{no>uOgayj2N4|IN&c<;Vvp#6-?O|g~wnEuc$!gJ}ZhgEq z>@nU7WfLTgi>^oCC$$@>2n&Q+y(TJi+r+ybntBH--)U~&9x@Hh{p%}26pz!+9t$3L zk*_5uFJJc1>!`=uugd7C0fIclmK^L=2X)-deJ<}ve!!9-N3;oOj3z$y%=ANXIVouB zXVME=f(VGWl&F(v8`Kzc22JG&r1GugF5jndd#kQcqy#1+plz8}#h)&2XC2(*ZAY19 zbWbbJKpkgOJVR~Wo5;In@72?+uaotXGAPWTL%r%#16KzFc?HE^M&Cy5&Ap-{4zZbz z^oueIb7KJ;C%AiBB(t=@_De?*=;4Ph4NN|Qq1R6Gi%J;Oq;sv30n`Q*W3oHyB-_HACrJo(R!yhOO!J0n1qt%2q>G9wnjo^{!-ey4E9O>zG%=uL>p zOkv--9}aIc+g8)^v&}Nk%ZN&iRkH6BZ?p6232eP`)M}haZ4i^0%qwwC<~@oB`TpEy zd>6hE--d5gDk~8V#F}DDZWSp-SCLd?%0(?hlCmL{rodp#Ge{mj3-+wwu_ok*?fZQC z6|B6nosZOFlh+N+$2Z5<;oB1%6mOkd0rBE%&+j*@@}!J6KhvzN*sbEWN5#EsOq)BS z&v-T?(S!W?@_Ht&aZLsx(A8hLsRbv6)r0VA&xi5Rj$b&gfk^RGd?cR3MD|VlaL3Qc zD=EUeqn=WX~S5JI0ZYEn+Laz&kdt9r&fKdvjyfS+e$o*Y|Db4Oz zw#=;36r9VuioQX@N05ko;l33pC@o>%zW?0!1cy%kbXEl75MMN>r%1<}Qk0GCQt?2F zv?aKipMs`7!3e!^inBgY$m7H9h2nXC{8^k$73zsT!R^pDxIGRfoX5$OCBC(a)yu!fbx96U<0`OvOrT(QO*Uv8~6sGzE1$6a&B<-&HRcYjx7#! zt%LQK4q%VbmoFhdUF7I-a^vUn<>^(puTeL2tlM0<3<()uonE7QE)Q{uv822VoQ%JW zk4DX8KAs#?Ki$8aeILnn?$eRa^1P76gnTy%y=+W{iK@bFj|Tzr9UzPuE_HS$SJ|MO!DZ#n}zby_;uk`WHN;gIiBraE2erSTXTs?vb ztwk}i(7Ib)Y`3?%TR6lJmCqJ}Hw1%zb9pU{ER z`@&ub6clJgRR{>=Dn;;h_J$@e!A$=~vCNH(7LSq5dm`9V=oWvxu$99_3si*_>AAeJ zZ;7&d1iJZQ{{BCevTN!JQZl_DI>qE5IH4<$jwZ`l&-^Y#|V%f`bXnuVB@)i z@OCwMj7i=EPA*joA<)$q$uK-gsFIp9!Xg87x zk<5g>gGFlN{`JZJE1A70gl68otC-v%z}*Wr#%ROGdW@{pWkkcitbL$7H+78x^b^|* zw0gQ{I*!A(8^@Fs95RMB>Z&-Bj%w12rQWAjf68N>+53KF2O_7_cZNR6P9gqoB0(q5 zp|cz24SEzuV=uzXuVyyrUnPXdD-J1bTLm`yTS7=}ajQZId1R}z0ua)Qvv~y}OM(o_ zAV3AWZ+E0w(H#m(vIMP)ms3UT3RR1z?e|~p4@gB#C>`0~1ug%v1*x1DS`FgGtO+5t zL19G^j;EZ)iImC;-`aozgf3(nmDnmmqZDi3M{L6BRFgtCUt5Tzk~Ex67lH)&JW@cs zwd)!v3xP3{gbYd~v^DxDqB6~W1$B~9DP05D?3Qjm*8c|d!nLp0l#kjHUuu39-}4g#_-ndKBl9 zuW~RnZLP#OFF3Laul0LGG0%Op^EdAQ;-D$;HWsiUE6dkM1p`ey-0K4#VRx)`(OXea zQNa95R#`5_HWsO6bIMY2x#$`kZC%jGUu?OQQmut=eI?F;kX)FFT{ll*RAbYdoKl>H ztWx13b~gPAx(BvGOkN^ZU){s8ALPzO91|sR-FEQ^N5nPut%qs7NAqt^rd-6ijH}EC zlHkxYs67+k+Nk{;$1MNC=~p8MB92z z*flLWH;Dz1eK*hG$@Zgp+y83cN-m#D;Q*aNguubSKO*Y=(vx|)&s6+zey3u=daUCJ zUh&x!8X}6ILy9>xx1nl~*?_tAS z1_L^Ww7}G^!;zSi&cd0D-10)sCrB>{eJ13T7BKNuhA37@$%rV=Ac4x0kqYX1Mj{Hz zMaKQq;%vm{Q&RGBPShkv9g?tiJu`tNR5j>Yba1Gp1jOg1AtpDOkB<-i&M)+Wvnx1Z zW?X&>zCOQN@sy@~;h*mQgP*|*YZmgoQrp~hi;-PYz;*FPx2uAm{U=vI3dtmRIh%x# zZgo2-(QJJJyD5CsfZ)ox@kmAR?vUwbZ4@=9j>@9ne=_b_Y&b763&`iA0O=NW8*r#3 zA@tfQ3~$jLo$Ht^4Sj=5#&H)1Pc(2asXE*poH3|TWv7BbS6>WK74MVl2oJ6=1e>}p z!sO)d?2Uf)L>rm(x&^l3&!gM+<~Lm}7&Y>&#}7^ZOlay|kG)c8wQ1pFQZPH(Hb#jJ z;N$E9dq;6C3hk_GGjWH{0CBn)Uu4B!;Te4$@HPGC22sE#LP!n98 zxXjPr#%+BXaRt$c$~lk7oO3vow3CY`%S5n0ff9OGEyC}oN!Sy=0|$~s$~GB?lFs3`OXlTG347uW@%<2}r0cfWeK?YQ8W*$7 zO>9S#kKkB}DUDk}c^ooJBlyTGx1P46I$X&h z6Ru>NUx%L6xr|*Xt`HG)bRStIC-~6n&C`9PmmEiC$w{R!4z=Z!o#KNEf!{I#5)(-k zlg^$!%jLLUdg&$hg66FDp`jcv^5~l8tNtRC@&$K6=iW*12szZ<+xdpY&CyE zk=9ghKmx5aIucP(uDisA`*hM(NGKAAL>7%W#4Z4C8DyU5S@1&S*50`Q(8kYKTIl@rPUXi6-LxY zY=hzYen|Q&khsb_Sv;;llH|%vfL5wNc4-=}G|cBr{Q$^7HAFS$SOU83Mre9%(A1Gu7>&G zgAWiA62cFjBARZsR-BiwKg#m#;O*jxp8ma1QL04+v^fnL5Hp)b>-NNaj9FLj#?XL|>fm6%pbLzx!A4jw2iE=GmM zmQ@_~}ZeR5~_no1W1ogs6I3r(XX)+jU$swpy|tW zD1!04l7vQ%&5&1;k3K$|ssr+pD@G`4WFZw%;#g9tQUDw45*w}b3+Xv^1dwQCGpjU&o*$#CNNGi7hB zkpMSr*nq&mK;C{2A3lt>ZQI^*tvHf`yEdy#XjP*!0g)5K+4RfkR=4fn3P5slaY7&W zk(|6+7C7AC20w4}F^lS)o^W&ZFx8GT(A#Qsq}4bo4hbZA*7L8uzaP0uk(Y6=#%-0~ zR~8Md!>wgyA*GF5(^^Zxbgxyx)7_kCySZ2WtmNxRk~<*DFN1?wv23_ketxco<}e@x zHgJZMQ{^i4RTAKqEh5PH{rBI;m@#9RAm_}P!?oflK%FT3>8GDoYQ^0ua*GRDa8O5j zS%S9y-=j7mwKx-z+1K%OTjBa-4WuOf`J4~{W_O>!jtgJz6PkU(+`$jkDDhH_IrW5! z&(3VQ;AH02gb`<6L<&f&PhkMgTSQow@vDqo;6x`e_ z(CLS>ThQ1$5W|`XM+w3&=eMI+SBjwxP1cp#f?h(MWXHabgr_@<;fz|c)#JyboALaB z2b8=&H0L&4O|*8Xq=q2^By{cC^_FYJkplDi%?mNQWpB<MIA!x?{OhH8h?iGW}=EpzsdJb z@g-3iV(eEk;#v7Dr}#}MOhZCJ8rOM~OE!=YBIRd5pH%{#XJfuzbVefQL5xg^g_pA% zx;JXWIbF`DMsoQ!Fc4C+I~Y6PgT4IYHOYEXv2? z18b00m?N^$8xxdM#F#lWocoY+?9qcF;v>+u9O79QzRsQ)(5Mrf?43B4qP~~OLebW@ z39qVhiW9#6nN5IR3tLxLIQaV@GWDiXD3Hb~YX^w%X)ftSmUHY(Y&if!8g@nJfadHr zb|N{F$252SH+)ZYkVC6nY;fhJy=;#cl?%jkp_i+rui$@M`pSH)B(m=tpDp#I>%Mht zDOO(DrI-QlcufOmK<4&_}p~N9q=I91e&?32k=wiR_4=_A(+jG1)vv*=#F};gl3u zC2yhh0&a*rz<+zNJ!RszQ(m-788PS-&`fz&^i0F!t|G|W9}_wVC*6x#!V{;pZxb9j zc<6sCDCth(@0j8!O`D&)cz_fbPl*`G9$OQySy)z#Vr@ABY7wSb6$-P{p>cFI8!v?r z(27UIF27tgG_t` zdf*g`yXL&e7@)?g@I7YV&nHKtj&bGryU-Zj?$w|$RT_g#d<3dJtR}v#5l6THBOR7W z(yIckaJ3;m3UH!|RhEh3Zw0sA8-}*KS2r%<&s4PJn^WtNUX;ySh2zCgd^A`TJW&e= zpHG<0WenzS{hFEJs~Pc_Kl(X%8bb)xu2J%8L#{=yZ~7MRj+%}D4_~p>mY3k&Fi}!! z{;*lfB+|C{`5qzgeD~lyBWwZaQmr*D6BXi z%0+lS8zoA0ok@to@27Y0eH^_RfeGyfU}%f(SaWV4$HitA<>JKwQ&|XEer6X|pWln7 zz9E=9=%Fg_Y1g$A2sH)}4QkX0<68^&|MZfRC@d+2v#mc|UD~s>PQRbK;cH%jp6Wf0 z6S@=LJ@_+wvOL^o7@s#bD+%Y5M3QyNQTWlgnXHMR`Jj0r%pLkLn)=n_{zOc#ZWGUM z{^(ik;{Vb%@tg>sj+n{MkKDN4+WP~?(Yzk|9Tts#5ihR!%8d7$;BR70s={seh@Q3j z3r>(2=;6x(K&iHj8Cvo=D=se)%&NhFXIFmC{fKB}lO5T733O9(9XUdNc`;^en9n?n z>SFx+*EW8ugk{oCinOJCs4FuOLr#55EV6!**EN-fy_hW?dPZpuw#6P~^I3Lj9@a#Q z?E1bg9=yd+)_b*JLY_Bt&yqn>T%&00)K+2)RrGfDV7`|k*m6q?6ya!7)M3or{5d{9 z{Fic0`YpLW(V2-HSAyqsHy=8c{mKR@HN(*N=p%k<)2iRY!nO5(Xvs*qhZ zk<33=E%TA?_pyX`f2;ni9;k}dq>Kl0j_0WzhGNzEz3ADXt(p5btvpY4A8VFk!Wzhn z`N>Yg<5-?NLR}AE78Wc+>%1NP(bc6Ng55+00#8RbH1leJ>v`rWcPXR8>|T@5Sd}M` z+Gg~+U$Mxv4iJJw-$otK#J3)+MhGOZywGnl=TRY~7iJ^GJAex>o=CWaF)eF$+N=^9 z4La3tjwb%**=osaxrw*PLNTIsFV6Bx1-mJckgUd{)$WBsQ*bi&l39*G+J0yB9EWy+ zO+{fyg8|dKjWwHN(a#3Mnsme7m@^pNoctYaFsuJ0bPR5W3rW|x3|U?+6w$X`3U1j& zn4&11E!X}q7?4(+W9G<7H%~cN2>$L~N^TPFTbRw0q^|v84J55m?7_zK2k~tGiMJfU zRFx1y^+yVg9>z2VIo$G}Kvr=c{8YRlg&xqs<8p9TGzR3PKz3OTBzU^}Kx1Ris~<_G zB)zIlk`xZ=Y-bNoCwKFLHu+f`sdy_vMYZAWGm7#M;ASp}l~q)*+4j(Z19#RRkW>nm zmJS-2I*vewHH!%MHG22f1e$!(KamQeHbwDj3sL~nal1i+3E8wKbu=mS{VW6%xp<=` z>}_0OZ!6XbB0fujNR2u!UR*t3NVBeH^IDw+>hFS9OF0>l8cxRSy0yV==K){cy%dMz zE||4b0QHL-zv9EP1e9g$h1@2$Q^KLytG-kYISqtPr^Tncf9J|PRsB{5G28O*>2IH+L_?nhX1ICb4qr zHFdvtcK(Ptn-<}~b@Nnq^f@snjq}c!Vs{Lj8R3QX3t6veIoFoIxAqLG!fjW>(Do%O zIOPG&TEBo5#B|8Q0h^O@5^*xwG^wQUef*CP`IsNNoP~>-D?aBSC;510#b>IzWLnJI zxKt5B$kse#{bz{Eh%=i25<=*=^47{G6{@`kJ?Znw4@wzRT0s`~P0r84l7s7*kELyn z+I~B}LpdiABUSdK%0p2pvAC3c12?l%apLA>wwTcPWss^SIX{EXNvYT(GjHPAtzY0; zW;~nZsBD&upDu6Uto}J=`AW=)PO5;;P>#s-YX~=HKcyFw?&omw1)NufjFMDNN@rqa z)C4qp_d=XVHq{`exgs^nA7^(WAG9~VvUr@j8O4?m z8gSz}!RTNNcYJB^RJI4J`LZ4j+TcXoWlZlm1|91)SK=4Xk_usDG*DO zUyCZ)w<{rabxF!8F?f7Vs#K;eH*44GwNk0Ejru(H+xya@eJiE->{Lms*QxsHjBVO# z$Dq^erG(rxNvo^eub{M;&!J9Io{<|ZB^Paz^ajyJ2)lY#dgRylq}a^lYOhsPUMhXO z^H=Fwdc2fTkR#QEw1RBqGu`u&6YHcIn?94?*t1N^D>Y9(9+#IS?T9&|d@rsjkkWIK zrR=;+vwp81`c7JMZk<%3EmhiLvy!DJSAQ%WyBVRh(LE>Tr%OfUB}&`Nn-)t?to%^= z>BJVPTw77?*vqx$(&NkD=cAysNIB<$=x}LM#6d}GoKpflBl-E&CQ13f$`nT{5IHMY zi?F)gkn3W&x;jClA%{vEWoxB4V^TNNWMU(oo}4lCR>ASO20fQJu$1_jhl0T@Pqj6v zomMy!z$nwI`nRM^ra7#xt{yp!(EZocPkl}Tja9y1dE2e({_jdu9BIP|FASQDCdP`3 zZ|qyf|3BS%EN4!o0h40-KcS-iy}?g%?5~{l!1BhdSq*C2M#|zhHh<5b=TDf$*HDBI zeFh3kVi4d$wMWG7NuQ-AK1*g=J=vB?Fsbjl3;UT5qztFC`%O|TEaW&q{a+gVpeS#z zv4O3v`Gcc=i^5hTK06JATXezw9S11wN0LvN#WYiXY2qQfg|x<$_Jft{5G)Crc*!^S zFT?m2{n0bHHTR`rGin}DzPGCGSDnV!5^8re`b?FQC~ff_PtCFZ+G6_16YuS_dg$(vmFH``M8jI3H{uK;+pQCBvLZ_HS!KXj|OeAX#XliBnyG$flfm(rd=PthyU#R zp0g(`kJyF!o^?1y8xhLPO`j{*SUmP+epcke`1+=$-1gmrukr6++#(j089l~x1t;O5 zq{H)D7jXNRqh4V9GwCMhZdk0GQ=gQF=Z8$KmSz-krn(^AyLacvw}lHAa?OyJUw#>{ zzb?wEQmwd|GiTzFM;<|PvS8G!hGb?+lcBZ~l4)yDlP>65ua%O}oNjDr%kE~sr4{M1 zZX?kpq!qtW$Ky=2LE~6ik48?M&3r=mI?08? zazQC=AMHGXk0~9@*^9rzcVq4rlbw|O9c6u+H%*b7Pa`-j8|NYVOBPHn*0=6x`-d2dB(B_bhlUY!Vt zwq~lO7UEOKj5i_oCsHktuc64qS%^6s7valsFL3=0aXteQ{Cu=J)9Ur+=I{A_2e;^oN4t;U zZJ$!h$r3Xqog}Lf>-+N4aV;~E)l}rcPM{T-*Z{(^hhAfrMV-?o*sCrt9^&`HnpMw} zo|O%&qCVdvY}?QD9gm9mY>tYnl|LY@fE4jY6*Ar3-SNjCf8e2q9>QmzeTIJh`f2-@Y2g|0GIl zIbK;&Pt`uj3AZN5e40Fm^1Kpmb#5(xd*sLwuC!Gvf57l?p%JH*j|fgKNJvp}K|w*L zmKG(RV&3rQi`#H2#XN7IwYj!-9eMuM=EYt_8%OEJ$VFc7FOB`GHXhVbj-Z!-@_76!@$ zKcHDB<(yd+1-O=%31E;=!_%*&(xyFF2*-3a| z!y>c|YKqr}Kg!bPkHk1z1KL?hf(3sX_R_FWC%C{k_a9-ab_}6#*r=y`yAe#`$iX+3x*@^T1$toDmd1#!| zS=$yU{NI=NJ8@SAVGQ9>}O zP8|Jh&6+jv^Q&xtRtp~#t{BVN?oE&x(>J#)W2yH@Yy=uwi5>Z1`_E=fFzLhI+x`=N zIlh(E8?pdGIfyMmt1b}@<*mD#F3fS9wDQ0jKHtG>=5|jpVj#QRl%GYpuJM1e!mJJ7 zZ~SgrJsSH3A;{C0+vNulo_H0f;xF@eGD#)om`Wv34>EaC83~F7ITCk4VdCR*Q~8DD z8c|k+w#Rx>-(b8oXc~N7y!d#r&lIyN zmflWo7#JcFrxPA&H(V5vRyjj7@oI!A&Bvo_9aBHTv^Ha`CM1_}fAfBDw6Vv4CY|u^ zu<3k|^DyE0fm6iug9Z~j4pjU!Ey45OqA%VU@HnP*9F#LUw0+Cb zV>0O6vb~iEq)clJ2i4ec1xXnnhW*O%wQml5Lh)TJtte-0fn1l3906#nrP2!OT6=`- zyjZRc+Oc#c~Y7 zv?lzq$DdD#8U_EGDF?_7!JBvG>Yp{QCG?n7-VUGGx&MFSEsjylv)e z5!(6X;k$UN`(pHL{+?D6k84?HFsi{5%6X5cT*lgKVOTuqMWszL=FPK%>H5~jM3#{6 zj&9`7Bn16u*yG&q=VM!NG$sPg>eRlQNu|J}ij95>7Dk^wWfNjBfI=03d+v{xI z)AdY!$vl@{nvG9RE#rgg9}`~NutW$PmAtn|2r+jiCAYIrLzh}dUnH?9EMw)&Goht;DBbG*{kGm%y}f_iZWa>x`wp0nodm}Cq%ldH-|of z#=hpvyStM!?rYgYiI*T0l@+seO0@Fgz$xapqBs~#G>zvE~26ehF{XpE+QA(+2kE$meP`;`1_gkCYdFqWVwGqOtfxOn0|Rl*@p z$F^{{Hzre8CF$%}?>-C;8H2hm!bG<qDh@#C8&qq z*3ybnHdk5J3wCl5PL~eGI1pNyR$tqXZwAd#C0EjMG9@ae_`%p`6rqC@xg<1D!Xdtn zPNy*YWQCx9#Fi{OvWd%&g?QD$2Vz6*3Z&bUbHb3oB5#9a;``y~Cd?WziRVBzrOCpDi>j?i)uv{ns9oJAx9`4o z66+$u@bi>6m2>R9ews^dBwxBwdsEy$?GLDS*^$5Bs<2TTMw`w`y=uCaOn}5BTlS?b zn2O9;UhnVTgY4g@eu31#x2eVb|F>EFYcqc}{hnZLPGndLEeC256?a>=VB*WjNmGtx zkU?%k>mv?Sk`gUz`WlSCmk-%DkSr8Wt^NczvrVxFqOVA{t;V^8D|qs+k66f&`&~$i zW=5J;U0Nk%(7U(t>UNH=koyu}Ieqy@cz(@-NHO& zDu-O@=)GM(@&ou__s`0tN2K1s%=PneCdnk2&^AGVM5J$aHu@D3$SQL(_A>XqmX?6sktbN) zME$ZX3Oft=$9$vNapM?X4*MF5&#W_R-=DM#JL1-(TxU@iPj>_Qv~cL-OgVP)%JZ-% zAylbGKzMQOLY`O3X()q&ioOh6VOG6L7C5Ny^yQx@nGvX+Bz9^ic7VP={nsb>c-L>7 znoi!L33Q*&toux<-bBylqrJbevn;uB-EkpAK;n#`2{}Rtkt;2#K{xf`PO^;xtIqCK zq~MzHa2K)&*eC^32+NLBNd`fHE)I@thps#%Blm4(LMAjFf}Y0w)0AF=%EVgYd|EW# zIruX^J0|kWSXym@ynHzw@8yhGydCxvK0GY$tvXQA>N#DfU}~$%EK9Mr2$4C$PFx+f z$8JMnQ4$gggkVINJ>UUWceSf$%0Hb`T8L|z36*>&S>P}RfyvKh|JAej@ujvcf#`5C4hJWE`_QY{eBlrVHt)<)ZZevAH-x8~ zDVH?alF5&aoEqqV7vnv2322En{*BBEUUzHI8YhDHa#(>eP6{I^XKWE7~ZNo#&_tioMXwRudT3Ao9p}?7_6K_ zNWqjB+`UHOrnaDGU^)NR+Ws#7HTeN)i=DCZGY-mDCbtS{)sm^M?r+3%kf*OT6WFcT zEG@627AWX@Xw*p-U|w9auu?xu)f)Y>I)S7%u%SfXR>x1uWYf8cHzod!QUt4oGqPvX zQPo^3XEWY|x*vI(Z@F~1R=>A|`r35daUPH^NG|E}ArsBZ8_DWnz>-62nTaK-m?Ybu zPHaI|k?2Pt7w@0WY*T)#zA*~+QA=T@lzwL2d_LsWl>SEN<3n|Q3YPi(#SQ^hxDr>8&K+GLpiodn<{!U)}OGAM-YU!)^3%Us}HyVOP)M zgB`yp&aQ+Tc?np2!DPvx)ERq>mWq#!LXsNfz4G(%t*RCYA8Zp5bA_MT!a; zJFXwcoBMy@BP=$YiI`$9-ro8HKHB-K$dPEoo`k(vb!`>SWr(7WeE${XJ7|EPn=j|| zBam{N9YrmcV7f<9RL1m&cennCm)0-B$(yFs9G~s|Ly^q?IK4wrpj!i}qv$!&AuF%> z9!v7^`tEP}kXez3x>Csrao)`lrj#R9LE$KG-n@xVKKX=sA}UxD9UaZy(Nv&@;z1}X z?&Qgn%sYMY#TQB?B}*(A{Q_T}7*pB6{=ujjcz1_L{ZDvp=%aXv)Fdi9ByBlgjGB%3 zymX`&<#70)IW%}>sK{ih#*6)?C_)HXL>5hW+3cLApKI9Hjhq2$hQ*6xWHw0xoY`08 z1nkzJ6^_?yh9`QBsx(fD_f`7>j%nTp!34--0yLg2L$LdgA|Je`RUn>B03 zgmz&vtG-|=`gZE8 z@HE<^Wp^wWS64F^sa=uBvFhwT{QB6NY#yVwJy%ZSuhY9&3jh9L5vFQwtg;n_2*5I5 zP38FzM6OPxSzUj*Zk}3b5_4#7wXxPF+Vy5_q^F&^<})Uid4nHS;;3&0)mfhC{tkv6 zsL>RstbnxQQ4}1N<)WLUs5o`4I7&FE{%(09B222P^iSc*`uz}b`t0BSE#d45k&0I? zq(`72EH#{r{f`_vqO{Rk^kn`1iez^;P+rA&{~J6SAXGzXQ8)Rx-H3>YK!*;MYy7Dt zdxZc40s@pR_wPi-QGr7zCnpxW{}&JwBQjLAYu66{3yAq28!y4$-kx{GszCJ!6#|?$ zZyv|{`uO-@)~s3BvuDpON5xrw{$Ieo@!mbqLU!8}(f4oPp6B85h z+H0?|nP|X(0i3|---O7>NX(xLq%dmIvUaVTRiXBQR8PmUk z&(i61tWlsuQ8c!H`*{Dh8c(_nc;}sWq%&vE@aOyPyHEPJ;o!l8Qd(LXe;zq zZ2tVk7hg#G_wSd+jvXs$wOT17BSU)ZvB#u;1Kxi7ZRwFm9+6I+I`uy>-WOhYLHgi> z52R_+rb(ZC@`?22mtS)GtXZ?9n3x!8#E236{q*V6OfNES%LSEtvd}` zl?n7F_Uze{r8BikiP&ILGf{G;>}+9zyPH_Pd^wMk=907v^4$Jg$NS%?@oozb7!neq zob*-=*mnZ-5J|G{*s&w$Kcoy_YLyag6SSRWW@f_I*OV&cZehcQ4Xo_nzI{6v5dXK2 z_rFo&-4-dBCWx#iqz4=^Vgx2nrYNd^58im=4TOb-v4w}mNGk{NQ=~X2mD0h32l2>)p&A#p?hkW zd$_B(r-r$QyNY`Rcn^0K_XzMF?kesP;631O;{O0zq0p=rXJ4!U0000gP)005u}1^@s6i_d2*0000wbVXQnQ*UN; zcVTj608L?ZaBOdMY-wU3c4cyNX>V>bE-^4JI4mG&baZfYIxjD6VRUe8Z***FVlHoT zXD`89b6U z>6>Ss?A{%@bLY&x$B#;{*X!{w{>9$}tH0~Q|KeW|{w2VF@weh%0#qO;C+CWtOQX@C zxVRYq>-X_jp?V|0Mj+&VYnlZ@rZXhKPtBGCc$$j@xd#4U;BK;(Zbl z60l^+5?p`%^_V(!s!V)@w6rw%`1s)Q#~(+}o;`WH>86`dQ&WR)zWIiUf{1YZ`0*$# zEJS{OJ|B1Bzybd4i!Z*wfB^%zjb>sZ@;Bdn6FYY7z%|!g!~LLs5s0WOD=V3>va_?9 z&>S2b@cHMTbH50iHf_T9-+zyXAAXp>Q@>Rz6LgVpI!v8b@(hNiok%)zek&u^{hmSt`h=1$V zs~68E6%`fm_4VahOo@dH7c!yJ!#RHZxZFXbw7uvM>KMt=s=J0TOP%{dQg&rRA3%0zJr$8#m(Y*|R7r zD#CyM^B=5VzaAweCCn>Ipf+0ehxQtfFkVh2&@xzQ+Vm6 zCGzOeqZS`L5$y8i%b`}Q`THGr+<^@nHt>>3#}fOX*X!~0(@$gf?%li(5gGAs(vnK7 z1TEFHgi_xvAv81;adB~2x^yWow?zE3BJAJ4U%oE!qt89}91}2I_n!pSzl!Kf2NB}y zufNXADM`DF7cZ7)#6N>iKKX=~dEytJdFB~JL`2~KJ1&U;iCL%Fgm@C-i|Fn87ysg_ z5g@(wvuDrd<&GFX?lP3JQWH z5c_gT1V{`o@hE|Tfh=7qk(rsv(qSTspobnF4z8FMJ_0t@HfYxAusUfkCU+SMKW9&7 zzJEQt8#;)|R|OSr?>~iPH2ijM54T<4dpw+M9r$y7Qv=o~2u1Df1E%o))s3|{m>a`w zv${@zmCB0Gn^RqktNUm;**IWJx>3PAezN(=Vd5xK{v$jK|*HF|n z)*-4eR_q%(PL>|i%5rfm>m2tl)I9(byA9%N#TF%^SY3e`UB>c$+1153mLCrrl{Kyp z9}gRq;0t4O&m*Zg1GLr*2nt94!0z0>DZ0 zDb=w|fD0$wjc#6Iwj^S;>F$Lgf#Gm>aOLl7YEQ`oNSJudHMA$z)Su?>W5$o;n;=xE zYp}UK-mu?9SiuUf9bW?1hyV=nkHn;I6IckKf&VdS2kcyZu~(If&#rkAja}_7m^nt_hAd&Y09`5{m0eaq)Z}hWZb{*x=!^VBwG%k7!jMKcJgO z%tim89*8SWMor3jc-jPE(g>k*JYAH6QwfFqIoY!kPYk-5KbOYok&;>sH%Dj8895W( zyv4Z0MinBvx)AkY4ww@zh&VZ}44P_jj)4(F5$V&FKWCNhfv(ve{%%8XI5!>@wbrnK z7ys6G@IVX?jpWb!>{I!Lg@+qPMvj5Aodb{e+J@7J=r<5!!urY2WKG>ECYYfi5tuw^ z5|3-8pEb6h7b>Z76UM{Y-Vx)P$K#1zpJ8xdI41X-3>zye*!S{AVO<$c7AEq(*NnY} z$E!?Th4qKx0F>bR0R!4y5if}VY33unQ(Jgp!d?77*v(gNqmE7LA{3(%9vyxImPD`P z&-V{SzT_geP3=4eeSM9}XC-_b zgD~EGmOT4-I(p#tUe_bQ$tJKg#7F4i8OD83>ezaEhT_>Fx8a9`?YN~Uy--Hj zSX<-SvGWk(?kBh16?q*r+D3TTix-V>Lyt+Q($wHcUL3l57-tSQ+dhD;igk@6LL+fJ zI{^i?rRd=uib%gM@_zUCnTfB?ti`Z^NG3iBFO0quK29DcefrPXJNbWzn=fpv1S#Cm zXFLW5iScrzesGO1RrQV`UW1Xq**wR#=TJ{QaLaJJ~8+_~b~ z3KZ9tXC&mB^@0Ga(9|(F~h((|I+ecx2;8$fzuk z_pNEDm(SVQEX-OB%?7|jngG-p>Ay8<5t9M!IN7)!}B|q$os_< zUBFWZzQ9XIzu`X8_4uCZDo|<=1eAS!Kk6smkC0ZCiN$A@Snr6{SdKtr=e zZWCkI#G7<{qpq2S9ktfDpL7q>Jxbpn+4K>QbzDKJajY9_`Mzi)-kFcnHsggIU!$m| zf}d|k7S}6EfLoG}V&RTY@yUtb5S^FEgRF$qA?oZ4JC;DF*YReu4|Gg`T8M{5g38nT zKbJQh{{e6B`;Pbh;NXw)b!ge?7uX%cLL*^im_cY6>g3j0A?~ye>IFfFqNT2> z0pFk7#!Fm$aaxPx6)=NWsAvJKuS%HoVha;35=gUN zi?8BVph&GS{prPXSsJ~b$AF&Snc{PNJZ(RoUt@Bwgtzy8-=Q)8OP1h4f#JA!zzmsT zePqP-{C`@nQE*f+#)Rv_hs(?|2^iBl&BC~#iLf;+V^&b%=^?kunI{Gx1S#BgR?$EyAY@I=KbF-pUrUyOU(;C`*&`2hVP?KV9?YUK99p zh-(l+U4_)E#JEoV;pylGFGqL&Oz7+$ga`Uuj|cnAMOP2wF~b8#VpQO0^!FdgLWqQi z`_I8OVZsJ3;eq}$(aAlK`z-G_QjGt|PJQ6#>dBu+1@&*?Fu{FSS>xs&bKq?+_TzgT zW_pjr3XKUGjtQZo`1|Be<3+p53iAeB%b)KYbRB7JuC5SLSzU!O6UOnIDG?um-k7>Z zH4~r2+t6}J@0FvS{UtNYbiRvaIr!+vuXtkAEi47LC7jUyQH4<$8ZZ>LR<<%zuh(l~ z?_>{p4z^Yfyad)a3g-cOIK+2KAR&YV1Bth6G6*Kl3c-k$E;R`&BrMn&k8RY7W9b2r zBrT!7(I9Y{y_A1OXks=%*9-?U!Gy-2W>)FBNCF={D-vYdJ7;`h8fqKsF)FODiE!AU z)xg2p-lUDLMK3A2t+gkFTv0KJW*}F?L!*vJoudD)4yO7brHbHELFeo49g3xMpXV9T zocNU2mM|hbV#UNl=ZB;?c-vk*ZWKTHw^^wnt47NS`v1R&+{N?}22TXAL!Ufj1-ZcD39$9IX} zv5Lif-!J2S!H?%Ro3#C&x(?qa{D73oi*nnhjE(r|!jDL;OqJU{KJgn13rhZZN!)r? zuxrg0t7o=Hx&m>?f zzdyF+6Fj>4Bi{0>OH7_^LRm6Ch*<{R)fPhPn$&nZY8h4}te2T<>QH8NA)ea%InpbI zM=^okXu7HI;Rv*PGi&^4^iT8|CV9_&9o_msdDH-~)O4QQlAnF9%Qb^yAsv}{CRe_Yvr~zDW?0WtgN6?*~8A- z8?FwP`IDt*SL43O>k;DWZ}InF=V16b`k|uHsD??Y%tUHM7Vhdj3*la!xh=ao2N~5_ znBI8`TYZmR!Hlm%F-_Oo`kDGc-Ll2M6^6}9HN%-Z$9=tH@4g@<3(_L#!eWSJ+8m$Ij zo%xNW(s{k6vmR~PsSU`gD#RyK78>^@!9?E-CtD|l5TcR$Bejva&C$AjD^5dmBQys6 zC8?B@f`q01im|EZ@s@-O`c5+=Db4NL5H7?L`~j~-4-A`)5n++?c+t4V7A9bLV1Fh+ zY5a*m+ftAV!A9&$P9Gf+LavG_PFgxUA}m;9thrsUlWn%GokI|`;44~KP0ZR`BS7hV z=6!DM9Ma5yiz z1p~Zb^T+Z=OE-Z8it}YgExdGI+JAfIaoLhWI9G5H53m0aRcb+C1eW>?OGJBp-IsNW zJvt;wQEE3=nwwh;%-f~D8}H5Xe&(R#ED1ry>Jz9|rznICon?VRZ@FKVK)O=e%wJYM z-Y{15xvHTS3wM9U8>wRC{j|;UCS8wAaWww4NwaxdxS|9|lWA2$4Jr(qG@INPc>@nj zew|TTBAhHdgPd9;V@uFNCvU8R7iY${jD4tSGD^0zOuTet2@d6)!aLD|$)+Xvt7B{U z^Rrup#48QrFK2gS!N!kGuCLWMLET&<6IOm*DK=g_g4d6Jhm!hA`Pe_s?85`UzKh4# ze8Q$gdiWd9AI75_KVoy762Hao!6O?M;j^QwO`H=xKm7|T8meUz*_O0pc=o^&RB7r= z^n!2g{SNQ$H?=PptB*scZ$?8w8Z_sH`_os^Yq4PKC%nbxUr;;*;Iq@;;z%C(8jAZO zevb%)mUsy?4&~}9-joEdg%-=tea~B?t`YAX{sAxUUkaU$%z#?}pg_qysgl}hCxZ*S5N3lQPW5Z@{XWX7~m>-4`DHUlJX97z|GMfb@+!jvGtgR!v zvIvJWOeIJ{nK}u5V+Z!F6*_8YJT`1ocw{^tRyt+wD|U{QC+hu^&|>vN^vC+Qxt~^ zjd+RP*}oDm>|BDFobx98(2Mrkkrl`{T$9E&r9!BQ2Ke@aotZvyQkNlcY(-#vYsYu| zpB+~(0ax5#=lP-c$)6n!QZOlPZ|gZtW|#@IC|=)vDmGl)iBW-rVPj{*ZHumZOg>&R zyE)r9VM6F=9Lza}p#lB4of!RBM?Ap4yV^R*3eejJUI%vvXLR!xp1*`J4}VPPI*7IS zmf&nFBuHZV?~0g$8^XuS{APf=4`xJ;!L~%;v=r+6;{k_~arOPmk3mss>)K3c^jtN}{%AVBbu=5Rpy{}N&w1wMx&c*M^ z8|CjWPq-T|?)EnVTW;ZeCC@(lEbEVmu$C=bhCO@s;J4p?;}j8; z_@*O4&eWL)etK8_{`sxXz|Fx~UUpk{T)YqFgW8b+As4Avwl3rEpI-kY+#OxoJf2Kj zEv042AJ24X=8vAk|B3jd^I39?knX{pD4EdA?x|U)#ge#nSUBJ&xt$1$)Vs=Yq5tM) zIQr({Zg26N#0Z)boB91ve||Xs0|xsIMqh8EeYY(riIex&wG`~6edv0YoE^+z(ksec zLTN5YH9>?(fjg8bfKpvh_9n_zLfHf;)ddmfk3aq>Q}VfU=Qv`nu!7up1QF3PS*uaQ z*U=4<0I9B1L)E0i2M2!Q8EA6&Pz(v_&7CCzS{b*E_ggUZ2DU5HKEy*2$Pqvae39Cu zcEaM_Kf}jP5Z(LRSK^f^_wr}+ed!#Ov4H&RG};D!m}CkrBo0!()SlX9=N6+r;PKfhWt3PLG|*QOGFI$K#`KGI6%uoJJNGEoO9?2wQ96 z5b=BR9@N&=U|r%qOzAufTCEN%W458Rt`fcdI%8JkSdK#>RMl3QsG+uH97dB`gPkcy zF)n0~+`jn8?@%{tFsgH3jO{uQ)@I}7WalWiIcOb_Sda)GD{r{ldvIGpZ8;K)(r`_; z!LU||Yg0S%?iZ^v5$@5I9V)0Tr8EZ{3>F)5@27Fhswv=rvA*6tn0_o}jcAnsDHX+s zAAZO=Oq3y*lm?BW;pn22-huM0NNFle2v}2#l?hwee~$1_-?>;7waw^vX5o$4lM;j8 zeqGpIog696LG!`aG3)vBBSYpgQ4lRlZG>k>&0{{(5{UU?N9aw6e}*ll=njL0_==I#%FXD?K1jOre8bUj%VjY>@woNb-qVeOAy7f#8) zZ%8gF!`ec3_?5nVxnP?6;3=5n?r zO4vioFU^3Il}UoM#+OxB;P!sw5L1|hNu7qm-OdFMO}qh5uURb2HhRF($&n+iiZoTS zy_niu99=NfsSmmbbmBHo2Ul4keDi>7@zu$7aG?F1T)6F)fm85h^cp5gHy6Pd-8pIo zKHevSrrwzLAoCxpW*ZbYi7-cw=}_=|)>hK7sIURpmV@jr*ZOfV{2uP@+J+oCLLqN{{9slmWRmiR=l-Ym* z!Qq$W4`_+EZmZo~=&-aO5#U#G-(yzSDd_4JCXZ`YRS^~){u!@db04n|%JHV-{}xl6 zB?9cIWJQYD9jQ^6(|cUI534nF^jgvbr8nA=iLbTuN;sMwk2Q(=@$q$!w}?uUa5?>N z=HtZ!l+IyE3cg$uTYIo%wp8}1Bj(ggiHf_TdO)J(!unEVROMlG@Ibk}SY3`&MG3gB z^H^Crlnm(vSA+NPv%9`zozt$gXgoRM7WDS%Wb$U#HEG~#Yc%wmgU%UKln57FCxp2L zz}3!KmJI6*-p5LZ1`;5ev<NI z`gm^l5`1v&qq2i7Ez|Eu{{(MGH#sn!_)v1olKLZ|u2IboSLt~0S@iEntH@)e?@hfY zqFL93gSlJLP}cxIr(g_m9wYaQOq9ghP{f@S9amach3B_?$)6t?bpwWm^kM--8GGVt z@62L!gSLT{&C1z7r?Lod?fD+}4xNE9o%``KdVc2;cCWgt|8*GCsXt%8T4BKTZP)`e!RF)A*vri3jSuN+;@5r`7r+Py;lyzKaTexY97`VF2~`>DLK zub>`SlkzK$<{v_n&S;{0d+$pA|3l0+jy+y<~2~~}? zcrW@p-a4|hUeOsay($;DOiz1ydtMxS7b{mKH4N#v2;>fQAX}vDkU)d8^sLCN@Zq?} zd3hja{JFt*U($64`%M)}wGM#t+ypxN@r-(1x8Xcf)AD=Yz!@g{*{ZB@PvmryHk#?y zryRtSgKxQ{{&n++L|$D6&&rNuiLkLjMpZt(jo*qUg9_-+z`@$F%|Nf#p4F=(go;ZE z$)S~SSHw)@pAorX+QJp(0jq0kaKtGE(>ssGD8&*?O9go(k5j#MZ?; z3qCybdJG8c-X;sAd?r_22q8w9l4M`1@1MEPnS@I@9{?7Lejlb#;eWgM@;+|CDWTZ@trG5$NUW+AhpcMhqvbEc-4fE zyxKx+PTMO7#ZZUdkNF;Jl6RTiZ8y1xIz(CN64wo!_u>> zkX&J!xq`Un~q|{)R zP^PKCn$%5bhAGqDq%B9K=9EQgZTTr<8Vw20555C8g->K&E~O$JKV6`(%8l5UEzD1r zKxx?|6-#Md1&(HlT!pPcZ}z>U;UXHerc!lV*qX7o-F@Z_oXj@iwm>n@l5F1v}e1;;{jD;Y@KNf}BMjJeszjA94>)D ztH|QX?XbdA18-%OMWlCE*}LMUv3KLcqd%LR*WJz;i?4Z7bl9*AkUntn#3zjBv$8^8 z|8Dqd=5r?dNodV8!^>fG3q>@2m-Y^D^1_E>9~b9T2u2e_N1?j04jI)sxG8*^d@Ski zZs;k}auA64{9L^F`kg!jF{AewlWPSy`(RS2F=+nzG4t3ICS51UsV}NDd8pOY!6l?C z90N`B@wMjVV~+n`Gasi4E+EKN1Z6qc*r1`w3Um65Wq(QOT4G+x}l)UF&S z385YV@N#y?-mDnTd)U!Q^ z0b4sqTm4r)gDWx4md>H<&s7&f$fJXDzR>h*9)v?swn<4RX{$8|65Q6T;Y|r@C+`z; z9*)jOK{D+L9OewP;>>8)X-tCXNyunV(2(!fjL#uH@5_U0@X#;s%Xwc!Kb!fUG-m1H z8k&t2mn6_}G=`=b7pQ;D00j#vgb<10SDu6Pqco=GS;wStFdq|3L`s<{ItrZ`@hP8a zN9MLGx&&`dJc89_B60ZKzT?=RP4XT-oO>3v&Gnetc_dRkNl+A6BVp<6=W(Gl3tzDc6oWE{yqf_XjX!Br0K)^dt7vK>D@>_+tQGc4n+fP#O_&3JXqg($90 zL>ITYOoV&0W3eSoxY<85_!e|Aq{t=du~c1&Fjs%0N42INUq`R!j9TG7VJtoWdU6+H zvM4RB3ZL!!9WPH4%33<-{_NB6b@ITIgKy?6TltkG`1v=$Dw-C)&K1e}xa-M;K7+}>*j`yLk7l(89&gf5Ep zC7(b-c2yC3-B5~NW$vEr8X^4#IeWv-#*W*_szL!}*CC6O$d`(^ISYz6uq7nBT@3&58t_Ap-FIgFo^{fm!@aGo!FJ`4Dzz#Xzk{ zt)j%fbTJuSRRUBQ{vI216C3Dh#uydUhka4+>oX0`hV;81T(^MtdvNe93=9A&%ATgP8!36VN~r2=5g_ai;l`$vA_&u>h)Pj-niXN+58w%f~$(BAc_ZGF-q z)_=V=;l4Jl3+DYYhm~Q!9SO&==X^AO9@}Fe=JXpU&a2ml9}zLYHamLLY7%CcHR)s8=* zNC#(l*rejQjO_Kbf3m+V`b7PagbfNHYG+I-6B)>B#>%eEeZ_u4*xGmCAe>#?I_3{Z z)wQWEt-HHB7egku`#&2Icg4|E0~lg>|8D4@L9?y`cGdyyFEowSfaJbz?*S;%-~Mf& zX{T0Ld*BibSheFmuWN?BEE6hUs`Atpv1*~O5nOTh-Dns*1KjLHAi53}u!6gM4NAjX(`d{|V`XIn7u!G%D`?i% zqoyg30vq9M6M!m>@tp4VA+kbOuP4S{VzepT&>2nIdek>pL4_K)@qNP3W(?MHuy%*N zjT@)c&>8w;-KYf`D*&A_JsPYWpi&9xRIjgv-jJYO1!t&Kw$NzH(V(se^w!X7{kTqF zeNzdV^+r{XvuyyZRko;YqI(sKnxl;$)Xi0VpAuZ{19?Bawh~Yo9=}=*m8uD~O=PY# z3Tm!)#G6{7t~p#tUU?vUlp?VB-sGNM6xRC{ZWF+0G9(+(sGl zMM-&LV2J<;T3r*eYQ%Yc9Vyz%3S|u`3d5DkK!92_Yl~oKP0N(w8qgW`HQcbZ0}~*j zQD29;hBR2I?3n=RxBOa4;h|>&G@=1oy)YwMsVMly88%jqXlSlLy|!E?K#i^jr47cq z8=m&vm;klvrZ7TuTx)nrYmnCTeHM3QUDhbpblkfVS^5GQ6@@P(uOfXRJ#O7>Hn!nGF9#F z-Mcr>h8>BBBS>p}TFFVkUJWZ)BiwT`oNYY}<{B3`JC8|t+jCdFHTEQC-5 z9F=*eNH;1*NHbkWBjS`&a6_jogt>QiS44b4@sv7#*d4zge%SrAAnmaea9 zu0e@90YT2xC+jwudMUM79wSpg1-xw6qNM-`|r1TGKzMS zBHmg1TR2g8{819rq{EkZa&5O%1Cv5=q&jwr6HM1ZrH zQBP(k;hQLtl;@f8w;|GBSV!z_ToK|r(lo!czKItVb#n#mt=;);Cq?$Aiw6-~l!V6z z-hxoq05(f)PCJYqo}ut_@?_@$3FKNurmqkW<7`G&1X7ZRxEb3BWThas!rxU?xTKtW z)tY)H6bfmSP*hXSFA-(ym#T$wpLw1zn)0YrE0su~U?7U2mOy!&*Ph#t$4B0LS(OOP zp9=>nRT-CXDz+$DwsVp5s{39^HuNNzkqY9EtY?!3LCagKVA3M*BSc6*zU5jbGN3w(Ky3~C* zTat=*$1Gs)8j1J_pB?@K-`@P9><~-tV1&Vb5u`o_nyXN!S0k@6fq57g+fbSK2qc&g z${H#WRd9|sQn5TxxIO&@E>`5C)R3T)?E97+8`{I3l<2D; z6?bFb3D{PffEf{^(Zx%M>a+xYHT4rTHR&r`ru`e<7dUl?a zDj3n*M?{%cDF#!jJVg6{JZmAIGsMIymmd;RC>V(NI%Af66{`*coQ?VR77nCZzgzJ1 z;M-05dQIpM-jtvO;1uIbrZ}lE%K-l#STglle0p*<&nSI;h2U{>pNYIl=Zo;^%=;}p zy#bFZk{z`T8)4issD{XS;NuAkOvaV)@$|>>!p^0zHSoIRRB$BoEa%-ZudFF8vr=9i zI?tjB3lLLqo=cMv-kbJ_<=&{Q@VUYtliRFq@ZPjX@xcMpq@8WyA884p_*pM|H<^gY zt^J2+;r0B;7z)<}mY-XXw2EB3H2glfL;+=mS{Wmp2FIsU9= z;b7WnTrA7QgJ!kV{tPxG9ztPFIY*z3?9|sZNqKV_Ts=kkhf4u1tyIj0GG1LxT=mQd ztw9JO4YDgxTl-PESbE2m=`JX9*5l)DGTCp4UtgRn%93*yQyV20pWSCHf0trishu)2 zP}*Gc_*cEYnFSKbv_zgWQo$F=bC^JZLzU`U{!UH>5~zB5xKGEjK+z0Df)3R=kx-_t zGWkxpK61R}u|WeD*U?igI>XphG*rRU!Sr~#Un;Ug_baUqM9|bv^3#-FYTBMaVSFs zz&|i_7DgIU`kpIE!_P^3;9}>1_s5DQiG+_Yj;ujZZ5f^%dn+OXx|#$E(Q?<@M=DlR zh-GIt!r#fuBryG#^E+{E*ic0H7>`XU&tev%mzPmFt~yA*-&4 z6Sq^E;~*EKj`D2j1#C?}fH~c+ML*x3xKNyh&kwJLM%%>cHpX=|>i<58{RKC4pNLVx zLhnc*6;5nH68iXdlk+YTpZm^Xkul+;$&a%~%;}P3=4B7(p2oGEhU2MQcAP&{i&@S;lC~YIDS6Ai}#~V@<9IMoU!=w zj+En~HZY~fJ-rb>#_vF_1;4YOlXkZ#iNM!YoJ+!rbFMP<|O2GP4!49HCkSx3eIA?ENBVrO^IRR z>j-G9SHx|`j|sah=4vGTU`Qak`obP2K0<_{DwGoYvSa?9dcpK|+|Xk@IvGk_-55#C zx2d^4y*i)wqZx%ZDWSKMozWof$jgF?CE=XvVvf3!H1ni$dVB1HaJF;8ZM`SSO5%@a zKEWkcY5QW%Ga~rL+8%F>d<@gNjKxdC9^^KatsSgFgo;E0G55-4pZX^SM2!y-v&K84 zAGCPS4NV#p)rto;G@uuPTzuhZYdqK7Zey8YUpUanM)dXR#vaP%p#Iue*|tgmR=ux< z%H9<>cAsI=UqV4`5&WFI@yf7A(Z^dD3KopI0fBBlJSOHsNQ-k@S>die*YV7!O!!H{ z)@$SLV`1ygep7ir3e@^&+!MTo8a&16@5N#FaB`@Zhu>$CsQqsfLg=lcO50N9#0Q7W z<{H74K-2%yDB&r6|KORN$nviO2PJ81;9_3|*oU(ziL#Uac2?B3cx=RtGOt4wCJ*ME z#)Exl8QY4pvGanMQ7PJOPT%%3!kc5u#Uo7kGrNsxyRS_bQCnLB>xM>nJ9UDUyI69! zr0qe7TObDdwsbUY5AFiRZ zV9F#=p{eB@ERrSTQc&Gc$Fs_xG3C`>VSm8Zz+nu!MmU(&`xDidNd05eBCv|;DE}i; za}X_`DoVzwq6;n3P?+E3>7r!pNI#CXsR!5uCbdUpC&-)9W0y=<%1ALfCbsZGix>#H z?(fMvTBHK8gxaQBq*a>MD<%uaiOdAvQi^jpu4P5c7QDWDIo{m&9a2gJ&sd?Z;(IXn zbj~U-Ky-Ej=Xe(T)!>WcYq%t8Qc;Gg=O{b-Yd$a%lwcx*{0zP!OSE+pkB{TuC}|&nIGR$N&uV6{%$jBqaQiEG!s=+j>r72~bMC zF|+GvR_v0-{oANb@_s{Z>cxBo5y6s^>)G!4*zg-!iY8&^=kq)9+KBt$t>A@9)#b>b zG;sz{?z`v$;pR>l6*yXcTT9d>h^dH1X+tT72aG^PeKkHm@&^}SCJYVjh1q?^;jAI` z1!cwGl^Tt3-!NoU7vh)mJCI(Pi<^3iSwE|y0AHS1i;DUh^z!S>neHiLerAQ(9Bm!( z;LusL{!!_%-I>QRDtG{bT>Mb2$wyA@2{boY!>$T&s~-xx zpkNNPqNL&}WjSp2qcW@nDoIAd8l{Z$aW<-GXsig`JwiBnJk=xKn=Vpu8v%8KpiBWhrY86i8C-Qc>IGG8La`{n7(TDrZWx_ItV6X)fOW8&9 zs!Nbskt?fiT3dR5y|9B5cT4;)Dw*#ZBov9FzLAL)6>WrjBd78W{ddg6El;4b zLZ1LJJ3KUemYmMl-N6+vjJX4zWQcD=k|U`r*u@WXyI&(qd^EVBE}9Q<>Gd%pfY$a zTam`VP!WJkWhDJa`gX;jK%+VFzmw+UtLSwmo;38*y*=_l{E)aEH-=9%rURZP(w!*L z*)5cdj++Ou6Av5d(^-Bd^m8ABsgWWZ>A8G9`zd|_E7dg!^9*1f@b8y`^<)L9fxQ(K zRc=3Re@8*Q-_g8yj0)~6Yy7VSQ=eN|jB^EP{8nGnV#0K$wqBW zHSDb2;O7~JzY?5BYHIxT_TN^(I;tuW>hyb^G>{$OjWH*eg5*+D zA%vFa_YSPWE4!Cro1q#f!NWcb4mK{Zrhp$q0`S(5UYUv1%5>Cdj4>xPKJ-k?1(Vpk z3%p5bM5Od;E6;6jQ;2K}oV&Y{T>Cqg-a}r`;^X5v9)u|NrkifUAAkG-H#awS#i#a_ zD_0^aDvD>0MT-{6Rg}!J{NyH1=lbG=yV1?dxKEKf4^>T-@Usz&?dp_W>~L^b#4LC_ z3We-ya958|+~H<)NT8(S4mP%!*h$QwlsVyiNhW-qJu#(+;5W%tYt`B9nA&XwrgRf+ z(Yfc@saHB?bf>=T09vI~wl~Hf91oqoA_3$A;8Hyc7@eH!i_@a}IL$dtV11 z%)Eym{8sHZ;l0+!X)0IFi2yvDwEkl8eIF!r$5h8cieCoZEq$!l&>u`qrrX zu=JF0D*Z8b8}1!2gT;{FF6=~=Mx1L^RV8i;7iG2X>Nbt}B?<)~XU~SFMyxu&gVhS( zR#xE7h$-yaMK1;Aav^v)x}vsIEr%B9^mS;~SHVW*A-g$QHvzuZ?o7OSWkuZ2riKRO zHWVUHRSfGU9VT@din6LQIB0F*YU_*H!4u_sjmbZc*t|ppyZB|P__C8a%vJ*urt~x6u>v@saGXKoci`8XtSGhu6ufDWe zaid0!LP|;s?!EV3yz#~xJo71|;)pPn-z|Y2;o8@peFU54!IGrNtKi6zV}5EDa;etI;C(X2|_4dLTN`U|Mw zZSWQ*&uFRs8No{B0$VFn*YV!oU097V#9tIpq=64L_{I_J4g6*o_fX!8(jB&H%SlY=$MC?g91qojEk!aE+!CI>W z+{2)_Bh6QvX!bWT4fAN2K(Y$5Qq3cUd_F){j@ni~E*VZsFc#~**p zpBF4xpifIn)6bqgo4=ntc~bw{Yp?0eas2pk{ocKM_5W0)m*wfVo@4fYE)^~gPM8)x@=uw=@@n!B>}r|! zy;1?nIW@+(P?W{&0>y4fY1;@CgG@2K=3_|tu_@d^3QXd0HG~30_;%)1g$2CaWOVil zf{%+)IZZlJ;zfIThr#I*0+{H0sg;?muJLyCG-*GRXY}H^r2K&6#*O2xHQavt?Yy-I zl77f+GqKY^cDAHWtw|8BP2`d5>+Hd8RCVWQmPmItIH)J)51GTRTU=F>gpFRKInxvE z`}>7mNGMH1q)%7e*=srz5t)1r<(|aYkRfulNNU@bE|%)q-N(p62&p!f$8AEGn?LS| zm?AQ$=^MBJPPQfyy*!Ny>Ws>Kj%ZVQjuh7wBc&=0X_e`?Cqe`eWmOa+Do6M}2Do_f zGTRz1l&2%JDxa6j;ekfqJ4;v_w;vZvbKvXZg{Q{ff?y9nls8;NaeXq}wSI7F>I5qT zVQxr0%y|ci03RJNmtE}FpFf1%X(C4D&4~}NW9{0w1K5^$6rH>R@$|%b@N^P+7gwFx zj;OpuwuDGR2tU8%Bbd~AFza065Dq%276MY@$unbWxHcct}y`UR6bcpbl8&` z%lpyx_WtjAFusgi&BRBT(#d!;ly)t;@GMrG`$HD_DP!sWoYTDNBuZvIS`G4ROA%cl zU6X7vji_s`LPkv@PL~LUDMhm_J+l$-9{bTmwNu(qj`$K|U0o^6QtIpJeBqOKu`-99 zUuoNTQJ5anD|4_ubuUg7#38ZNG>GbtCeQ1Wg=bsMyO>&H8U%G!`~i#VD&S`4ESr7^VIBeOBL4U& zW6r?OW;}@=-l6hl-W4*D(NtAz&=u0`;cV+9&r~!3l=Qq&+k~IaZ)#H)NG3n(6Zx(2 zO{;8RrE=pc>0b8!800II=VVzRmwPuw=s=me90zlcz{k-Gcl9y~SQK7Bw%u-CAqX+V zz>>EN^_w?C02I~u4RG>CC)YsuD`JYpJ=mbMp%Mw@>BuuUACRy>Og*`xNg)glHneQ2 z01_4qE^0URoWM(GcaLB!7;ruOojv73*i^hQ+$)s(aPy!^9LObM;kcV*0jaxZ2=7Op zLwx^MR$QT}yH_ZWnX;evN8W~D*8sT;?lXfQ;3e1uDj>*Bj0LHW{5s${bj9-nYC1b{ z)R&armOzH<%<_D6Hw3C%g0xiAj1uAB6$^&nz^*?BvSWF^BDZ}XgT7D+$`Bgr5@2xM zZ^U;A+nD(8j+|zaDW3wiL*4x3Wx1p7P3mSf&Xp!&kl%n7X27!r7tz-c{C+vm5zka| z0fP-{7zvxt9YI&0VDt$zy6Weaor9efSwhu>F~4APH=FDoRI)yFc@P zR|{9&6n7<%QBi=y8E5ca>=u({wM<>fE?DMBEze;lnLxbF&WlmlntIHl>8vB50HUpF zN82^;QB`wt-CBJ3cPu`Y|!MAhpjU)li>@gZJEVndBKb+pq zpI;n%r@Un5*XAR!C=qkI%;7eQ!}#vpX4E#-Bd@ju5BI+w#kCb|Ng5_pc;1MeiZH(#@FARaukKNWti7TSZwxY#3Huf0)HM8(idaG`r~kJ9HI-(bB21B z%oX*DrR?<+!iQd&t z*T(O|u2eB5S(Qax@6O#(R3`oC2C#|3jDp_)=?w8pn0r>2Ot=90#o zZvK<#)yS$AZ)t$DH&4YcjJp$$Zdzn=KAMM=-oX;cW-L7@PkW&*_&i$FE~B!p%4$KH zrbc8|6|@MFp_Cw{>Qd~>-HXX#Q#cV35g$Q1o`jq%Lx}>i7gNUg8zPOBkO)-qoJ@R# zGIcf27({>sN{6vCEs9?l(sfGbrLiceD}}XLp8}n{`9*G-_16w68(UZ#vKf%2f)XPU zBw@wh#S2zNlpoN@RZ*hOE}nutnBH@wyfiP5+l;KLLQaq*kF`#R=k|TYL@Yg*MTdTo zeI%6?qzGh>r~W(JntCJAIV&_ZD9g^q+z8XL`b!Cr2KR*#cVgScyB7#bQWI~a@!7Dj!gGpN0_EuWXbwMR&T8+8Y^ zUyQ<(u0u@}+e94GdbH$2JnTI%z-Isk`-$^YNThOzY$5j?tk)4>&eNI0cwzlE1C@ zwU);gL2wB2fU`l8C%;2;+|qXvzv%SRkhxDvmtqO?2h7Hniy~)_5|b45K}7uzYs_Ew zfjDOPY*}GV0@?E;Zs+A!GIdIRk_!jlh^YJ|IIG&P7x#}6LI~uBm0X&MUOt^KO9<&G zE>#Gj7+__#1VVmgF)ADC5D{PuBB$lPvY`eMzFq#-{$43a0t}(6cgQ8BeEVDc0rzD^ zan`HL1^bhg<+Epnd65??l5#m9OUTBg!@OON?;vHoI#+I5{xqke7@r>e9Ut%i701%! z<@VCrN~DzJut31qZm2+1L5#)g>I@}jl{lOphYjZrBB9W<+`Y*C+&(0;+m!+rfeh@< zTStknOkIHkInh_YR2Sh$-YJ|eNyI(9=fcm~n+N3Uv+LOHhwwn3*}O~;q5YP;8I!}t znIwHAzGmBnqd1*+0dHRWAO|23Og9rY~o(<#_A(jlA4W>oS64d;f^r zhvbrM=0A5PpTI*S=CbK?`PogJbaG0kp={11un=-gyIr0{K7quA`1}XWzVbc-p z?#KImdu}~jswmVUQ1Ps2reB%39rOFnmOX9AKl11En>bcQUr>+9-P?|N{!7#_R9j71 zm@likfNi0)eRXDyJR1nJj;=+0U6S62hf}^kbc5CkMR0wy8u_(_Sds9HY#yQqNxCuK z%5!As~xi_*0_yN6*^&~Ub> zlr|U>cvIX-T16h4vFJ0m)m1X_wS>r&*r=_Q`?ccS7EUCYURl7`B~ZRXio&BTVPwXW zW}vK^BHpjM(X>c430=}g$S5yhJ2Y)?>|DWu)8}V?<>yE0sU>l%Wlw1~lb%_}=Y93~ zw{qdcFVFnQ#7BbR$iUX^LZr-v}f^;qVJf^c4i-CUq*$+}w z0uUhcqt?J?2va1`!#500X{R}h1ch}<@N*i3CbbQl;v~P!K0aN!_#t1*5b!lHq$l%h zZVoP3IQk~|xd>C)nBcxFEJ#T=r7?VUf+(gaVN93)*qnHnuiw+J6XzHl=+}$WD@%~_ z4w4Y^%-~z`&ACnRFcgra=P)EdBy<`VJPgMUwXE^?j~7DzEGQFcYN-fq>=)R*RWsS& z#niWll+qlYP3T3soc>ahBzlR-rhKX3YMJ@MVIthGQ-^py()*Db#!|H6RnHGdw0xml zcxZHT>jB4hiVOY~AS3>OU}aEzGg2yqCrdBS{(noR`%-ltDm5i=uy#g>t7&xsbGSM* z@bZ1RAYs9xBwHa|-@3c^f}@S)SPvQ-nnf=K)+$=QFF)Gxiaw33>J*%>IF0iar*JfH zJ7*=3h+uW{W|XKc7q}siJJRXmT{u;=gSSRSY6#-hc4Tg2#{db$i;%{iHf01>c|$qx zYvc=?kx+J;xBa=oyhqi5n)TIOz$K+(ugq6zb@iy$#PL?sWOTnOtjoor-0e7CAaWN< zI8}5Oo6;bN%G1cLH9Bh&_GTTzzHH+%m0z2Rr%zPD4xB97#f5}K8-?JW<4tFH_LoF}!~j#pq}bS4F30uMQ%|uMG@W?Yu3a22 za_60QasZMg)N3geP^{?9lzmjOy64p7VSVa$CMKz~MfH1l)9N&=W$*7Z3FVqX-i{Wm zHWG$ji^BSR6GGD)T)&h82BA^g$opDCg{I6TJ8HAG0X0oUNUGS%17F=3gJyjtZ%x`V z)HWrdN>hR31$$7eE!~)HU!u34P=gW_wPO4*P7+1cq>sK zh1Nh=Bo>uv3ZT|1ZOc>;sG7IB=GaSD!@Tv@TL=ve6$M{3nhw{Bli+FZ2RD@`9PAu1 zz<(6%ti{w!>WD%9eKE+Fg2*MlLI;})F~}-^J--UHUzn?DOj8Z`o3O+8*hU4!|4D3t}l(b^S$jy*USsI!|0mU6argO_a}yNdZc8wHF0 zzJ1W7)0)^p-0c0}o}q=VNdr6oM!?{1r`BYnxsh@uI-sljc-YxEa~(HZYiGFF7`9gNLA(M)C+2k zD^|g_p$S&9=0FRTlU|;=d<^8nspR!KXte3D*0g-t+JgM#h@hxO9MvJCvRzW#Z%1my zDZ?`RyA9|4^codv4WX2TVV(oHG?~Oq)A{V0MN#ECwFWBYC4gXCqe+W|8VQju{m|6V z1p1TU1Y77EwWw`0UdL9i!U(S(P}flbKJj?_x($QIUITl3dp;*!yRpFG8dsMamAT%>f?h<~k10XkcaKCbu^>x{}LLb+Gg8k6w`FMZpaCkU&g00ThWIuwJsyDQ@TBz$Zux;)R+hRlR8rKli+0(OX z;xUYH5&5_^>P9rGw9xAVNeTpNGXa+_&}g!_v{;7-aNW9f2n-D5<@fO6!|2nePls#8 zNuUQ#O45#iiNm|4gQ}*f38!+;V@PQ4%gh_-0BcpJHv2{2tyFf<>nS~vv#~0se*{#X z1{0c{v7KH@+B%B3ycF14*&;GfoJ%VF*b&$UwDc>av8U3x9f4IVPQP?7%6n+v%G^pVC@K%%5wTSiv+l7ldvqj`R1FLIddixfT2m8HU^(TSQ(8UDL7vl#cC6sog`+tMcw?%tgjfPu zJ-&+<>A@ZyG?#TyU!4-!RS63QU*BdTBMB}0>y9J2r!d-cV4D*2h0-kSOpS(vwJjbQ zW~}wGFC`YgpV`Aa?ft`NVtD6B97sKd*zEJ{i861<6l7H7vyYynW4x`O(E(vy@8s0Zma2>{Wqq3-5wW=MN*JvJn0JyWyIyMhAkWQ5!fT#guT7ZGrGZ!gkK| zPqD#VIJH2S~{zKREd#^9iqwcz`=g1oYD0W&Ha)*F41Kt0;Rt5g#F| ztN`!q{0^^9y$?@s6UArVp7a1b4T0RmKb=TH@Vj(0@B1?LpvwMw^ zLkGxBjm|sEV8)_jDT_l>eI**3MMT@hiagFOlU$m`6_^GG^}@2K4V=>BOnwSH99=Lh zGyJO7RDL$8mAQCg;LV)Bn*^Pgk1UtR>#foEb95nvgub%(8*Y1V@}sN^qyR7S zv?ly#_t*Gh`cphvytr*Cn>wjD&{x+#C-bv$#TU`dGx+MOVb12KaO}actay|ga-1lo z(_mK-lfky!b9r| zh*TuHDwYPRjB5_p2o}&%0wA&kNK3IHERp;hDZ1|WlpP#0@N@hw{*6+99JJs8O+?kj zCy;&Xq=+|rTYFXzll#*6&I6dB$>toUaG&q**PUloDS(QgZcgOB+BiDG(a(!#U&%+0 z{30cfaJpwMZl>4DR+c&4$Ksl>K^WlIoojcTEJ)()v2Pz=33YQLZy~N!!`X(P%dhA5 zusvS*8X5!+D-|OAy2!D{5~S?=GzJ7B>c{si#)`9B#29w~S3D@mH9QcVJOkvScyh3G zNh-oUL)qs}YKzSmx~>6%;UYsSrG3pZ>ad1)67_b;OPAj2fkELiUr6@LxFVso9~{tA zo`ERIQgoW+U_ixbYU?UFv{P?a2QT~1^6};BD&*D{a+Z0ijS9k$htIC8 zqqrq}8vLDn@crqnh$~FxOr#@2je--|VhgLwc~&Aft%|y8uG5iKR)}XO-C+`FlvtF` ztc~<=B@lu2@-gzU&ALjISEaz-rZd<7B~aOm&!hg}mEgfavoI_qg3|{tKDwGsa8Hc7 z8QzKvskE$DYHHahkq}>UQGQ7yygSQjHi(!hKAW5zh&7Pd7&7HirdW#MrZ#$3*)hh#Ip z9Msg5L#47a=`YR1L;r^6RV z|KNb1eea2#J8 zTf>`qlJwTVg&jLUe3ZCpdGw}#PEZnoB;Bviiom1={qMk{JwKzMx||by(?ESN`!TpW zIB|sAf1^bCrx%9Z4QCq%JiGM^W`fDD?)|Bca_|g6=^7<3wT<=oZ`3M0J@{7mIeKtA z9sBzJ75w`LlNZQ?NO_UJj@!VW-y1XEn1-V&3(=V|xIf}ETk>Eu3In3@omQ#;xNIA?=Z4@juf503hm8N5T>OpKx zJAzK`fq1a*+*a>t+l6D;WhnhRvD+XykKwt}eWG)*NB4CV}mBc%idRJ zciuZGp38rR-pv6=&+Yn3=F;D}=0VQfN|mKv-nEP)5&yGe2|kLwZ zo9`W05VV>vKJ`7D+q@k-I8#8KrUB|kHP3=XAk;w`yjPAcV<$=4BrZVmcqXP+8CXLe z7Ynw3%w@AAkU&BO5Qzx22ID;)L8;Y5NiV%wn&1XjMJPe-G=N9*Psncft70kXWId7UGE{exkxOXu= zjWI-^8H5P(=AliQA(jNCW_=UXRq4=|3rYX?l&z?0tYIO`-PSnc(F<`r_Z*j8H3v!O zTEn=E4VnTU2Y+a^4cMErg-vvZr^xPCRK0ufi$I?# zS*27wuQkvNOF{ub%78%db@ag95!bcY-_OYxlfot-+(USf5YtZHBvRcsWis)3y{9A8 z#VDC}^A5rNLuScKb8mzD)QF%+baoHq5?=%gL%pxhEELuY>k-+mDYj%#Ku<&!Bw|`O zqnGvNpoe=G1SuqDLZFKex_JtP^tIiGAkx1pemb**lcjqZ5)RR9H#%?oBBn9*yr@bBzD9ew<|;9PM!e4N}-YUb#0 zRixnlqlDw8hl3kunBr2O)uqP4aT9?(RH%0*N_xk?0%i48CJ|*d4RtKV6P)dxSdu2Fn`=;4Tgw?zyTKy}7wHFSuv^YE5 z7$f1WAU*;m5mF`+lHh3L3ayPHp4jkW5?f#iG~1gOr@oYNy%Z3USvqfPwMwoE5BTPZ zZ*d~u)Ln~|n#9P`Mi~wy2;V%@rCDl|+R2OLiS?h#8|8tP{QTCWZbl6`BB(4MDuO3>?vDFfCYmOnO<|yY0RPOuM zvG1`q`G85=YkR-NnsfU&E54<1mG|4e98Ydo%w|IK>k}_baWzsq{U;00)0;oz2t)I+ zHb36dGiVK0Tn$46MtS;_9eR4_7o0DUHf4qLoZ12;lo{)-RW?-P{g|b^{hGX)+ZU|; znDuDV_So8wZ{{VA%E(r0YVpgN-6o3NpD%1jZcP#A1x%^TMovvJD`HF4)mRcI z1Q^2l@%|Rm&bqvKF-WgZbCp$9{2*$g-NEYMnf$NUCKN%B&fW#?>l^W_$RrJ zb4gt#UfZ>t$N#x4Ul;4ieN8F5* zvTTepR8Z$@lw3q&sfgVTarNh_NrVUb&SL)7-Ok8c4higy*urGo5jh!s{kq{?p=pe< z64!MZ#%VK%fGFpTvf_~q zCC=ohqO&2nx`b;x4T37Oef{7S=K+TYn%1r*BD${Ia2|MyQI&E$Q~QKa;U_1Vb_n5~ zT`)Fy7$>77jOjXn-?oum`XI>NN0!!z==%DaIV0-OiKMPCamD`Qj~r8*&=va3fB zB7KaeyeCK9g7*%t!tl@t6XJVu*c~S6Qk0Q!Qc_7V7FKdJpM=RhhGG3Vp@7*{G{ceGmojlXd$VhsIIdc$ ziZTZ|jnMs5`jhs?o6l*``B7h$g(wNF-T&Vb75BvIPx`(iyOE`e&tR!^x4#p!R=E@e9C2<=#rgnb6+1y5iYi(`% z;Ap>%X**F=UyA;|5f~LDW=1yr7e-;IzfotnDq#n^R}JzD$K39sI;qrGdU=!}2ZNXQ zF2kH&V=*E`ICwZ1+{l#os62=H{Yo#1C1O*$qj3aYNjfK@y6UMp)}G#nT3?}5erNl4 zSaREc*q@A;UGgbgbnquEp7|uJ8mMoQWkV7oh$!DYzLY;dKlDD%`$x0HGY5q~AmPoC z_p>s!rb&%gk1WR%gKk1M4?)z#SU5Y6tSg z+j&7`lRuSPjqMlwFtyhx{F1aw_R!gp5sew$Mq+FFaqP{GMQ67FJTv4r{_R*nEG|}N z%BkZd?8@4KN_7)2?IG_LO2{7O>W?9Tz3}DHHHa?|{N)XO$8%*)x`!9` zEM+0;$Fn;S=I+mqu|z13ZU02R#wSx2@{&ys4zFw%{(xW1eHvEQD!g!5_-)=DF_j5k znCzPI#11jpESmfn`*V_B^Ob$#SVH5)Qam)m=&WlAGC5OSkYU4yapc=4pM1hKL!N&6 zX}s{l3;a9PihKCshjGUpcOWk>uN_j<%jFhKS`}?H15E5Z5JQ3}PE`;s%|63}`k8nK zQbxL)!zZG@Z+AXEw&;TK&DHC1y2v!tk>uJ>kNzg7;Gil%{d`PgT~)*b+M4R%2p;w> zOw4qS{5qjLce8WBtZox{o7Q=h$^NSo_u-{|;^7d;*N^h45U9ifSyf13oL6f&m%TIk z8u+z-zTM!`N<~VF+wJKgY`cUA?@09Z?u#I2qr3k2kO8>9yTMi7?EdL*-MNFTd{)Ae zR4VPyzmth{$2TTz=SqYF10A|5aVMKjmFJVr$?Bth%jGuO`UmvrI1fnm-?nYr1`iJp z^z7M_-KnKoaTEnd|D{@STefU5sTC)!=Q$+>*jgUXt~{ihTRKn7fai+R*~?{i#2C!z zP4zpB{1yoqO2s9$kv5+)$}5wM6Td?R^g>*O(VXnVFCYE}Z;yF^>ye0Kb;zp{p_7y~ z)aa4j#3cm?0ZzgaLp)WJwh>kiV%c@I7YcNmMawnSZ2Ju| zd5QBkWQnJlp432;Jl)@rMuSjTSI#O-sg3rjYpUaT5@i9H)_6eH+0~Y?k01H-kyYZ2 z-QTh;eSEipm^WYwJ7kbvPbvaQW;$wPHCS~qQppF7N_I$C~@q)1E!-srHF%)I^+*XGayC0QH4xbS68fBwF>j*&BOce zzmKtF$8yC?BD{iv0=)LxYgn;jMT@97il7@da)e3dP!3el>v>S5?^gnRPHhwOJC}1# zifth{I$n9J$6o<;2m4FeVCjL{+E{blxb`6NX>wqe;aL$b^?8{ed*sLwuC&!5f520x zghrfZJ|Z}&AR$G?1qB7kvx)S*wGPmQX`_mY%Fa`p@`k0)=8US;*4}<3m2FPji#kQN z1WU(SI$pV-d3$`pMSOi?y~%Hu_RX!$$ELJhywtRI?n~{1Ua!ZRv-|Mnku^A)E>dZ< zhSsh_c6AzSrEavf`z5Q=xniSEl79O(ZVP@)*nw5&w#zQ}?Ok6<#7+7}RA@|-1$0OV z>DH|qN5RnyNHyZNZ{ObGT5%GE?@m2{3n@7m>OTNuf`q<^i29L@i{wteKIs8=;jU_| z!}}*!Vt&8t(cMG1InlnP2>$4p@F)Cg#+P4DBu743RMTrP;@nhq;1PW^T z@Tk!mBHDoE=LBCtyb;A}5aNql=1!sCySaD9ru1!?-E{_nTmsp;@nh09{{3WOBChK+ z!YnH@P~8{}4~Nkv{gnQb6ui?=EL#bGCtr9udZ1igDep^C@X2fu(^64i&E*rico|m< za*W-c5```v0bFK5LRMv=(Z*^)Q20J!6W8y(Is96Q;J!$y5Lv*Kpu^42LEof4 zei5|>U(9$KF?r`ZWGZ7b-j2^%Q}M!>JLMwe)4Pwr*3{z|92hS1@bqF0@QuKk5-|q* zbB^PtNTVy)Uv3NT>l@J_o`EiUZRjxE6FIY0uMXwDv%85z+v`&IFp;t^n;~(z5;WWN z^%ZaZ=Jf4KpH#-A&>?LqjVa6gs4$T)kTS8}XqF9M2`@)a+}M34Ta1Xqk+}R^$;YiZ}B2qI=?rDtcy`lR=PMM)Jz4i0$&fehHb}|j0eROC` zwa0>CA|ou}#)t{bH;?VqA1{r)i#M_y5gzP6OHP_Tqx&e6a$QQ$7|!fDnvcC_;0)QF zj@qYm9)tTLZsKipV9Q*Kf4M*4=n2Bz$ll7RF(=6~y*wXP4Rsh8L}}aXEfNAv;S073 z-PCiVZkLtT^cFT4%07^bxYVZ6HJV(9K<$l&1Ui(r#nQ1NDz1hT?!Z11o_1qkWym{2 zp4)==Q5j-lb=a2^gWg_U;O*!pSLT#J%af#}rT$Z92Lf4iND`JnOEA4WFO9oL4i!)v z$}EtiNg#K4T5hTI0aXfBqP(htRZ8szQBi+s)+attTK=UrzE&$^-`0LoR#Z~rx0Wd2 zA7Kfh+0UFHB#S|oDl3!0r~i{eMb=YG4^C-Dqy9_8qy+Wr zr3v@&Y_7Bz*qd1_XeN=&XG-e=|7NzYa{SE4%G{rk$I8NNW`4YMthqI$wVCir;EEEU zlsEXXfj7!JJi3`hG2b!|671rSFt;FCH}=YbZ*X7#876VPq(G*JU{0v5weQV2hSRccaB4OYV&8@_S5Md@OJXRhcg!N_exC;QtD4*pzrPSc~2E3 zVN?16ygl+UlWS2hw~fw}fJpC1_bIgz54bE^R0$$W%yZ*!=l#Bq-il-CXVKj^6t7IV zm)m}c-;E=gXIUV7Wx~BO;e8#ymh&->4H}4921PTaj-%z5u0m!+$!`73t}j`bxPRab zjtiFhCB?{)E|dC3A)&M{;ni{X$d(YP{>N*R?&Dg*((&n4d02jK1Ku1tpI41HqsTg? z#{+$Cls%pJ{tdcCiXAZ>7xAn*f-A}c?#PHjN_h@`JHN-IhAge|LC(H%MI+XlA6(7? z%lC0xxo|YMLx(4JF6O{&B}ig^a`$IAU1;jK>;O6Nc|pGT~@?9KV3%Zci@+ z`2!x#6m7ZHCD?4p6I0)$Mm+~Q39&)K+0s2YTe1_Wm6X4^P~kvJ76;>OMT+babvYKF zTFzU!K^^k?f$t3IJz6@6DmgGFzUn-D6ED@n5!RupoOgRKK*8lv_e9&tU!cQIyecd_$_gN-LrD@`+>wuTi6 zYmrke`~`b@hM}{25SE@bRtRqoh1I3llN{6P?;5r(>)8fACfMi_749(t-Q1-_>rz}B z@Z|7YSTdE;W$ey6gjGqROhsRxUT`=_Kqi58WV;}2yn`_109HpyP``l8NA6&$6SiyQd!AITC__{tny~)cxjU) z+^mX1%wPKfC;n0LfR?Uxwjc$MZvMz5c!o+3Jox*2cyRT5vR0o!?_O%<0XZm}_T7;Z zg#{Zw!ZX{yXc2^DPCVbnZec6W$47o?GYDth`Ga_R=a;5JjX{XfnPtQm4jL_s)d=2F z+adtSye=~F-sa=N{GWvdk;hQm%v;Oz8r$giteOJ0D7DN~0SWRquIv{}`F?pLn-u7p;fj{2-v)W#dLhZWS8;p^!2Cb?N& zIkX&4@BbVzg+?NvJ`r!H+)olXUOBpiH`1v}?H4Li@pb$P)~B+-c4sfw`T%vRaeh;(q*b-%Ps16|xkb5d@CuZt&_i8V)j=|#L3y%L|DHm1=~ zBEZFmb&QE+nRx5?O1yv4)SPGuW5fF6nGy3auW!q;s}-7R9L+Okzi$m>GfyZu><4pAhTZyOa2wO3yc zI3r>d#*7#BbfqdgA#VOs9(9YykRjdGRxt6zBYikY=;*|EI!=YfbDol=VQCqoD&M~) z?8Re4ZeZtDz8NcP%#9e!Z#t(}AabFr4jOWuoTP9)qTH zhJyPB&ybbM{e8o^7@)GY@4%p*=oip~GnBqG@ov73i@hWI`E}zOZc5DVH5OC58{O0h zKF;pEnd7#eGw|st;kclLwJHqu0d{clXxqs%+$$7M47tffdEC`47_X0f5cURPO$jQa zHX&><8xRPG^NyjvPah2RA0$^Lcx?oEf$L2KO9EMjKA89@=f07i-=b?DpntUerlURK9bO336_2n9Ae9M4*I#w0c1;p8Kb=`DGK-g z_zs>}{fTLREGc#kywIP4mBPBB=$U+73FPVh_}0aoibE-!NrFsUf)Ro4lQ!jk6u-0e z!ZB7KwRgNZl-H*1s`G%H_`9K6-Xx-Ve(RU4yI z&g{WMf4t8L#<@?GCHN&~Hw!SND6Ur5$wJ7Zn?B<30SV+x@I&HOyn1vQTO}k=x;lyt zp-oC<#`n-vkDA6BXcTRfm4VU(D}|6otr{1~_u^vNF*!2=Whr=m*H>IJ>-TeeIGBh~ z)=-64j(*KsvB7dfW=}e&QUgHl`}0@7kB3&j$2k$Dv3g^IYjsI{~9Qzt7i!_(1 z^KdMGoy?x*SCOScB#3-(k2qcls>8eD_-2!~_YeLge?DKHiKMc0J{`rZNH~@ki>2{D z@fKSY&yKU1)md1Rx*qEJA#U2F{CdVkL<*++2INvgxwdW9oW^}Mii32&rnkWj9v;q%f)AXeb| zULsosVf#gqcdj^Q#=So#YII$G4Hf!(IUB$k~v-+ zCTjhXCSPJ$U%U2xyuC-1N+3Kn>Q(_gd4g~YmtUy zUa#qLo0E+LULG#4PXdGaGDc>?=SR2iRNDduW|MNnJUnKuEQCmKrywB;U{b=y+7TgcedWvu4-J`(7k4k^ zS&hnK_!_b6(_wn?F{8^c|QNrT`g%2X#&$XS0 z@OW)VK7^UwTlz`1Duj^xy^oI%6Jn1ZJ(%z=H7c$(Aw;rJa3>8Nl@yrDHfdk!W+YGs ztZ(9f!b5%UlpR>x5<<+AB|WoKc!GR1KEjkHV2d#*9_uiFaSvI9am$JD_Q$ zzkddI1_---VNwQfR~l!}o<;xurg>(RAjw`Pz<_`NdC9$;s5oMdsrDF&-Tw$NPGDd11kV1=ziN_a#TgnScIYz`yHWQIHJ<(o;I-FY z)5pZb@aOBUyH5X4!@+|G^@W9n{CV26Y5K<=dyGFXTC_;NZ{I%stXZ@4O-)Vu;^Jcc zU3cB3|0m$pS6|iNamO9{=;-MGiT*BJxKRJrTW{&_z4u=IyYIfM|LCKSxP8Hb1^TqK zH2u`6Q~CSJlP8&8BwUdhu&}UDrszwlEPk~>voe9+#1SJ#$Q8^bl@hVRq-LVzOl4)J zK}LTEe*E!A?k9~UX&0oi{ipW#XP2oD$<8Y-XkQVrNw1N0C{vL7&D0OvoX3|~r> z5-k(7oRyT6z}x%sD_UMDtXsE^mHk_{Zsh{v|MdR;88zM&k%DP}$ZA4*z^PNG;^v!g z#y<%!z4Q|H@88cB9_k~_9K=tN;+#}U2M-?PH~fjCdhw! ze~HhQ)OgdTO=C44Db0x}sgJ+@`YZQaQsa@;jqtA;=3o4+_*V_{FaB2iOMw64Z^gd^ k_%Hre{7ZoU0)Hp|4_*-l$A&%lx&QzG07*qoM6N<$f_?300{{R3 literal 30688 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 diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index efd3c16fb..5c1286d8c 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -151,6 +151,47 @@ def test_few_cells_below_k(self): for col in ["smoothed_cut_score", "is_outlier", "nhood_outlier_fraction"]: assert col in adata.obs.columns + def test_both_gates_disabled_raises(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + with pytest.raises(ValueError, match="At least one outlier gate"): + sq.experimental.tl.calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + outlier_use_cut=False, outlier_use_smoothed=False, + ) + + def test_invalid_nmads_raises(self, sdata_tile_boundary): + sdata, _ = sdata_tile_boundary + with pytest.raises(ValueError, match="nmads_cut must be positive"): + sq.experimental.tl.calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + nmads_cut=0, + ) + with pytest.raises(ValueError, match="nmads_smoothed must be positive"): + sq.experimental.tl.calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + nmads_smoothed=-1, + ) + + def test_cut_only_gate(self, sdata_tile_boundary): + """Using only cut_score gate should still produce valid output.""" + sdata, _ = sdata_tile_boundary + adata = sq.experimental.tl.calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + outlier_use_cut=True, outlier_use_smoothed=False, + ) + assert adata.obs["is_outlier"].dtype == bool + assert adata.uns["tiling_qc"]["outlier_use_cut"] is True + assert adata.uns["tiling_qc"]["outlier_use_smoothed"] is False + + def test_smoothed_only_gate(self, sdata_tile_boundary): + """Using only smoothed gate should still produce valid output.""" + sdata, _ = sdata_tile_boundary + adata = sq.experimental.tl.calculate_tiling_qc( + sdata, labels_key="labels", tile_size=200, inplace=False, + outlier_use_cut=False, outlier_use_smoothed=True, + ) + assert adata.obs["is_outlier"].dtype == bool + # --------------------------------------------------------------------------- # Visual regression tests (PlotTester) From 1ce365e39b23ff1348c2004c5b42aac07e5f8c6a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 12:41:43 +0000 Subject: [PATCH 23/24] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/experimental/test_tiling_qc.py | 34 +++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index 5c1286d8c..1b8c06835 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -155,20 +155,30 @@ def test_both_gates_disabled_raises(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary with pytest.raises(ValueError, match="At least one outlier gate"): sq.experimental.tl.calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, - outlier_use_cut=False, outlier_use_smoothed=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, + outlier_use_cut=False, + outlier_use_smoothed=False, ) def test_invalid_nmads_raises(self, sdata_tile_boundary): sdata, _ = sdata_tile_boundary with pytest.raises(ValueError, match="nmads_cut must be positive"): sq.experimental.tl.calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, nmads_cut=0, ) with pytest.raises(ValueError, match="nmads_smoothed must be positive"): sq.experimental.tl.calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, nmads_smoothed=-1, ) @@ -176,8 +186,12 @@ def test_cut_only_gate(self, sdata_tile_boundary): """Using only cut_score gate should still produce valid output.""" sdata, _ = sdata_tile_boundary adata = sq.experimental.tl.calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, - outlier_use_cut=True, outlier_use_smoothed=False, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, + outlier_use_cut=True, + outlier_use_smoothed=False, ) assert adata.obs["is_outlier"].dtype == bool assert adata.uns["tiling_qc"]["outlier_use_cut"] is True @@ -187,8 +201,12 @@ def test_smoothed_only_gate(self, sdata_tile_boundary): """Using only smoothed gate should still produce valid output.""" sdata, _ = sdata_tile_boundary adata = sq.experimental.tl.calculate_tiling_qc( - sdata, labels_key="labels", tile_size=200, inplace=False, - outlier_use_cut=False, outlier_use_smoothed=True, + sdata, + labels_key="labels", + tile_size=200, + inplace=False, + outlier_use_cut=False, + outlier_use_smoothed=True, ) assert adata.obs["is_outlier"].dtype == bool From 1ccb020058bd20767326356c8a81725825427918 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 14:46:49 +0200 Subject: [PATCH 24/24] Add visual test for is_outlier boolean flag Co-Authored-By: Claude Opus 4.6 (1M context) --- .../TilingQCVisual_tiling_qc_is_outlier.png | Bin 0 -> 28475 bytes tests/experimental/test_tiling_qc.py | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 tests/_images/TilingQCVisual_tiling_qc_is_outlier.png diff --git a/tests/_images/TilingQCVisual_tiling_qc_is_outlier.png b/tests/_images/TilingQCVisual_tiling_qc_is_outlier.png new file mode 100644 index 0000000000000000000000000000000000000000..d656c9921c380d7af655b97fcf0dc34acabcd0de GIT binary patch literal 28475 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

yutbIa5L|~nN?@w>d)Q}s#}_Z^t~k1JggHp9 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 literal 12143 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 {y4 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 B+H?Q_ diff --git a/tests/_images/TilingQCVisual_tiling_qc_nhood_outlier_fraction.png b/tests/_images/TilingQCVisual_tiling_qc_nhood_outlier_fraction.png index 829d65dd8debf7d323978b9aff60998579b3d5ff..8aca0457ed551bd917a91d3d2abb2560e447d825 100644 GIT binary patch literal 28778 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 diff --git a/tests/_images/TilingQCVisual_tiling_qc_smoothed_cut_score.png b/tests/_images/TilingQCVisual_tiling_qc_smoothed_cut_score.png index cbab8752cd424ebd7c85d81893c4048cfdc9b75d..41788c8665ac685af2a5149010a2d32aca5a343f 100644 GIT binary patch literal 30667 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Π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 diff --git a/tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png b/tests/_images/TilingQCVisual_tiling_qc_straight_edge_ratio.png index bdf8898b6db679fde615ed07f822a6c156d282e7..e7e1f8fd42c4122c8c6e180332fa7da91f76359b 100644 GIT binary patch literal 30688 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 delta 10185 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 diff --git a/tests/experimental/conftest.py b/tests/experimental/conftest.py index 3f791874b..3b1e0c5c1 100644 --- a/tests/experimental/conftest.py +++ b/tests/experimental/conftest.py @@ -21,11 +21,10 @@ # --------------------------------------------------------------------------- _IMAGE_SIZE = 600 -_TILE_BORDERS = (200, 400) # 3×3 grid on 600 px → borders at 200, 400 +_TILE_BORDERS = (200, 400) # 3x3 grid on 600 px - borders at 200, 400 _BORDER_GAP = 2 # pixels zeroed at each tile border -_CELL_GAP = 2 # minimum gap between any two cells -_N_CELLS_TARGET = 120 -_SEMI_AXIS_RANGE = (6, 16) # semi-axis lengths in pixels +_SEMI_AXIS_RANGE = (5, 10) # semi-axis lengths in pixels +_GRID_STEP = 24 # spacing between cell centers on the grid @dataclass @@ -39,49 +38,46 @@ class TileBoundaryGroundTruth: tile_borders_x: tuple[int, ...] = _TILE_BORDERS -def _place_ellipsoids( +def _place_ellipsoids_grid( shape: tuple[int, int], - n_target: int, semi_range: tuple[int, int], - cell_gap: int, + grid_step: int, rng: np.random.Generator, ) -> np.ndarray: - """Place non-overlapping ellipsoids via rejection sampling. + """Place non-overlapping ellipsoids on a jittered grid. + + Cell centers are placed on a regular grid with spacing ``grid_step``, + then jittered by a small random offset. Each cell gets random + semi-axes and rotation. The grid guarantees no overlaps as long as + ``grid_step >= 2 * semi_range[1] + margin``, so no collision + checking is needed. Returns an ``(H, W)`` int32 label array with IDs 1..N. """ H, W = shape labels = np.zeros(shape, dtype=np.int32) + margin = semi_range[1] + 1 + max_jitter = (grid_step - 2 * semi_range[1]) // 2 + + # Build grid centers + ys = np.arange(margin, H - margin, grid_step) + xs = np.arange(margin, W - margin, grid_step) + cell_id = 0 - max_attempts = n_target * 20 # allow generous retries - - for _ in range(max_attempts): - if cell_id >= n_target: - break - - cy = rng.integers(semi_range[1] + cell_gap, H - semi_range[1] - cell_gap) - cx = rng.integers(semi_range[1] + cell_gap, W - semi_range[1] - cell_gap) - r_radius = rng.integers(semi_range[0], semi_range[1] + 1) - c_radius = rng.integers(semi_range[0], semi_range[1] + 1) - angle = rng.uniform(0, np.pi) - - rr, cc = ellipse(cy, cx, r_radius, c_radius, shape=shape, rotation=angle) - if len(rr) == 0: - continue - - if cell_gap > 0: - occupied = ndimage.binary_dilation( - labels > 0, - iterations=cell_gap, - ) - else: - occupied = labels > 0 + for y0 in ys: + for x0 in xs: + cy = y0 + rng.integers(-max_jitter, max_jitter + 1) + cx = x0 + rng.integers(-max_jitter, max_jitter + 1) + r_radius = rng.integers(semi_range[0], semi_range[1] + 1) + c_radius = rng.integers(semi_range[0], semi_range[1] + 1) + angle = rng.uniform(0, np.pi) - if occupied[rr, cc].any(): - continue + rr, cc = ellipse(cy, cx, r_radius, c_radius, shape=shape, rotation=angle) + if len(rr) == 0: + continue - cell_id += 1 - labels[rr, cc] = cell_id + cell_id += 1 + labels[rr, cc] = cell_id return labels @@ -156,11 +152,10 @@ def make_tile_boundary_sdata() -> tuple[SpatialData, TileBoundaryGroundTruth]: """ rng = np.random.default_rng(42) - original_labels = _place_ellipsoids( + original_labels = _place_ellipsoids_grid( shape=(_IMAGE_SIZE, _IMAGE_SIZE), - n_target=_N_CELLS_TARGET, semi_range=_SEMI_AXIS_RANGE, - cell_gap=_CELL_GAP, + grid_step=_GRID_STEP, rng=rng, ) n_original = len(np.unique(original_labels)) - 1 @@ -207,11 +202,10 @@ def make_clean_sdata() -> SpatialData: spatial post-processing should flag zero outliers. """ rng = np.random.default_rng(123) - labels = _place_ellipsoids( + labels = _place_ellipsoids_grid( shape=(_IMAGE_SIZE, _IMAGE_SIZE), - n_target=_N_CELLS_TARGET, semi_range=_SEMI_AXIS_RANGE, - cell_gap=_CELL_GAP, + grid_step=_GRID_STEP, rng=rng, ) dask_labels = da.from_array(labels, chunks=(200, 200)) From 070a336177a026ba70b32c89ff11bd7d48133afa Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 13:48:45 +0200 Subject: [PATCH 21/24] Enable colorbar in default tiling QC plot, test with bare defaults Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/pl/_tiling_qc.py | 1 + tests/experimental/test_tiling_qc.py | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/squidpy/experimental/pl/_tiling_qc.py b/src/squidpy/experimental/pl/_tiling_qc.py index ac8256f4a..a41a440c8 100644 --- a/src/squidpy/experimental/pl/_tiling_qc.py +++ b/src/squidpy/experimental/pl/_tiling_qc.py @@ -66,4 +66,5 @@ def tiling_qc( color=score_col, table_name=table_key, cmap=cmap, + colorbar=True, ).pl.show(**show_kwargs) diff --git a/tests/experimental/test_tiling_qc.py b/tests/experimental/test_tiling_qc.py index f9586cfd2..efd3c16fb 100644 --- a/tests/experimental/test_tiling_qc.py +++ b/tests/experimental/test_tiling_qc.py @@ -187,12 +187,8 @@ def test_plot_tiling_qc_straight_edge_ratio(self, sdata_with_qc): ) def test_plot_tiling_qc_nhood_outlier_fraction(self, sdata_with_qc): - """Visual: labels coloured by nhood_outlier_fraction (default).""" - sq.experimental.pl.tiling_qc( - sdata_with_qc, - labels_key="labels", - score_col="nhood_outlier_fraction", - ) + """Visual: default plot (nhood_outlier_fraction, RdYlGn_r, colorbar).""" + sq.experimental.pl.tiling_qc(sdata_with_qc, labels_key="labels") def test_plot_tiling_qc_smoothed_cut_score(self, sdata_with_qc): """Visual: labels coloured by smoothed_cut_score.""" From be32f07d2dd20d1ce053028fb899720e8daf8de9 Mon Sep 17 00:00:00 2001 From: Tim Treis Date: Sat, 11 Apr 2026 14:40:40 +0200 Subject: [PATCH 22/24] Dual-gate outlier detection (cut_score + smoothed) with human-friendly plot titles - is_outlier now requires both per-cell cut_score AND spatial smoothed score to exceed their respective MAD thresholds (AND when both enabled) - Separate parameters: outlier_use_cut, outlier_use_smoothed, nmads_cut (default 1.5), nmads_smoothed (default 3) - Validation: error on both gates disabled or non-positive nmads - Plot titles mapped to human-friendly names per score column - Regenerate visual references Co-Authored-By: Claude Opus 4.6 (1M context) --- src/squidpy/experimental/pl/_tiling_qc.py | 11 ++- src/squidpy/experimental/tl/_tiling_qc.py | 75 +++++++++++++----- ...gQCVisual_tiling_qc_cardinal_alignment.png | Bin 30140 -> 30600 bytes .../TilingQCVisual_tiling_qc_cut_score.png | Bin 30824 -> 30966 bytes ...isual_tiling_qc_nhood_outlier_fraction.png | Bin 28778 -> 29888 bytes ...gQCVisual_tiling_qc_smoothed_cut_score.png | Bin 30667 -> 31108 bytes ...QCVisual_tiling_qc_straight_edge_ratio.png | Bin 30688 -> 31273 bytes tests/experimental/test_tiling_qc.py | 41 ++++++++++ 8 files changed, 105 insertions(+), 22 deletions(-) diff --git a/src/squidpy/experimental/pl/_tiling_qc.py b/src/squidpy/experimental/pl/_tiling_qc.py index a41a440c8..0a4489c4f 100644 --- a/src/squidpy/experimental/pl/_tiling_qc.py +++ b/src/squidpy/experimental/pl/_tiling_qc.py @@ -57,7 +57,16 @@ def tiling_qc( import spatialdata_plot # noqa: F401 - registers accessor - show_kwargs: dict[str, object] = {} + _TITLES = { + "nhood_outlier_fraction": "Neighborhood outlier fraction", + "smoothed_cut_score": "Smoothed cut score", + "cut_score": "Cut score", + "is_outlier": "Outlier flag", + "max_straight_edge_ratio": "Max straight edge ratio", + "cardinal_alignment_score": "Cardinal alignment score", + } + + show_kwargs: dict[str, object] = {"title": _TITLES.get(score_col, score_col)} if figsize is not None: show_kwargs["figsize"] = figsize diff --git a/src/squidpy/experimental/tl/_tiling_qc.py b/src/squidpy/experimental/tl/_tiling_qc.py index 69b3cce76..10dedcc42 100644 --- a/src/squidpy/experimental/tl/_tiling_qc.py +++ b/src/squidpy/experimental/tl/_tiling_qc.py @@ -13,8 +13,8 @@ - **smoothed_cut_score**: cut_score multiplied by the mean cut_score of k=10 nearest spatial neighbors - amplifies boundary cells while suppressing isolated high-scorers. -- **is_outlier**: boolean flag for cells whose smoothed_cut_score exceeds - median + nmads x MAD x 1.4826 (default nmads=3). +- **is_outlier**: boolean flag gated on per-cell cut_score and/or + spatially smoothed score exceeding their respective MAD thresholds. - **nhood_outlier_fraction**: fraction of k=10 nearest neighbors that are smoothed-score outliers (MAD-based). Bounded [0, 1]; high values precisely trace the FOV tile grid. @@ -407,7 +407,10 @@ def calculate_tiling_qc( distance_tol: float = _DEFAULT_DISTANCE_TOL, min_area: int = _MIN_CELL_AREA, downsample: int = 1, - nmads: float = 3, + outlier_use_cut: bool = True, + outlier_use_smoothed: bool = True, + nmads_cut: float = 1.5, + nmads_smoothed: float = 3, n_jobs: int = -1, client: Client | None = None, adata_key_added: str | None = None, @@ -448,13 +451,20 @@ def calculate_tiling_qc( Factor by which to downsample each cell's bounding-box crop before contour extraction. Straightness is scale-invariant, so ``2``--``4`` is safe and much faster on large cells. - nmads - Number of MADs above the median of ``smoothed_cut_score`` - to use as the outlier threshold. The threshold is - ``median + nmads x MAD x 1.4826``. Lower values - increase sensitivity (more outliers); higher values are - more conservative. Default 3 (≈ 99.7th percentile for - normally distributed data). + outlier_use_cut + Gate ``is_outlier`` on the per-cell ``cut_score`` exceeding + its own MAD threshold. Requires the cell itself to have a + straight cardinal-aligned edge. + outlier_use_smoothed + Gate ``is_outlier`` on the spatially smoothed score + (``smoothed_cut_score``) exceeding its MAD threshold. + Requires the cell to be in a spatial cluster of high-scorers. + nmads_cut + Number of MADs for the ``cut_score`` outlier gate. + Threshold is ``median + nmads_cut x MAD x 1.4826``. + nmads_smoothed + Number of MADs for the ``smoothed_cut_score`` outlier gate. + Threshold is ``median + nmads_smoothed x MAD x 1.4826``. n_jobs Number of threads for tile processing. ``-1`` (default) uses all available CPUs. Ignored when ``client`` is provided. @@ -484,8 +494,9 @@ def calculate_tiling_qc( - ``smoothed_cut_score``: ``cut_score x mean(neighbor cut_scores)`` over k=10 nearest spatial neighbors. Amplifies cells on FOV boundaries while suppressing isolated high-scorers. - - ``is_outlier``: boolean, ``True`` when ``smoothed_cut_score`` - exceeds ``median + nmads x MAD x 1.4826``. + - ``is_outlier``: boolean, ``True`` when the enabled outlier + gates are satisfied (``cut_score`` and/or ``smoothed_cut_score`` + exceeding their respective MAD thresholds). - ``nhood_outlier_fraction``: fraction of k=10 nearest neighbors that are smoothed-score outliers (MAD-based). Bounded [0, 1]; high values trace the tile grid. @@ -547,6 +558,14 @@ def _process_one(spec): dups = combined.index[combined.index.duplicated()].unique().tolist() raise RuntimeError(f"Duplicate cell IDs across tiles - tile ownership may be broken. Duplicates: {dups}") + # --- Validation --- + if not outlier_use_cut and not outlier_use_smoothed: + raise ValueError("At least one outlier gate must be enabled (outlier_use_cut or outlier_use_smoothed).") + if outlier_use_cut and nmads_cut <= 0: + raise ValueError(f"nmads_cut must be positive, got {nmads_cut}.") + if outlier_use_smoothed and nmads_smoothed <= 0: + raise ValueError(f"nmads_smoothed must be positive, got {nmads_smoothed}.") + # --- Spatial context post-processing --- n_cells = len(combined) k = 10 @@ -571,14 +590,25 @@ def _process_one(spec): smoothed = cut_scores * neighbor_mean combined["smoothed_cut_score"] = smoothed - median_s = np.median(smoothed) - mad_s = np.median(np.abs(smoothed - median_s)) - if mad_s < 1e-12: - # Degenerate distribution - no spread, no outliers. - is_outlier = np.zeros(n_cells, dtype=bool) - else: - threshold = median_s + nmads * mad_s * 1.4826 - is_outlier = smoothed >= threshold + # Build is_outlier from enabled gates (AND when both active) + is_outlier = np.ones(n_cells, dtype=bool) + + if outlier_use_cut: + median_c = np.median(cut_scores) + mad_c = np.median(np.abs(cut_scores - median_c)) + if mad_c < 1e-12: + is_outlier[:] = False + else: + is_outlier &= cut_scores >= median_c + nmads_cut * mad_c * 1.4826 + + if outlier_use_smoothed: + median_s = np.median(smoothed) + mad_s = np.median(np.abs(smoothed - median_s)) + if mad_s < 1e-12: + is_outlier[:] = False + else: + is_outlier &= smoothed >= median_s + nmads_smoothed * mad_s * 1.4826 + combined["is_outlier"] = is_outlier neighbor_outlier_frac = combined["is_outlier"].values[neighbor_idx].mean(axis=1) @@ -613,7 +643,10 @@ def _process_one(spec): "distance_tol": distance_tol, "min_area": min_area, "downsample": downsample, - "nmads": nmads, + "outlier_use_cut": outlier_use_cut, + "outlier_use_smoothed": outlier_use_smoothed, + "nmads_cut": nmads_cut, + "nmads_smoothed": nmads_smoothed, "nhood_k": k, } diff --git a/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png b/tests/_images/TilingQCVisual_tiling_qc_cardinal_alignment.png index fbcd09fbb3d5a6b09ba129542f13e9398ac1b571..ebd316d26daa9b13c8493ec46a4b9b3d065c6430 100644 GIT binary patch literal 30600 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