From cf2aad28ec8770a74f1bcf2faa5ca2e69713c8c1 Mon Sep 17 00:00:00 2001 From: leefer Date: Fri, 31 Jul 2026 02:41:56 +0800 Subject: [PATCH] migration: preserve market insights slice --- app/backend/application.py | 309 +--- app/backend/features/auction/__init__.py | 4 + app/backend/features/auction/repository.py | 63 + app/backend/features/auction/service.py | 13 + app/backend/features/dragon_tiger/__init__.py | 4 + .../features/dragon_tiger/repository.py | 61 + app/backend/features/dragon_tiger/service.py | 288 ++++ app/backend/features/market/insights.py | 1314 +++++++++++++++++ app/backend/features/market/service.py | 9 + app/backend/features/popularity/__init__.py | 4 + app/backend/features/popularity/repository.py | 37 + app/backend/features/popularity/service.py | 11 + app/backend/features/themes/__init__.py | 3 + app/backend/features/themes/service.py | 14 + app/database.py | 146 +- app/market_insights.py | 1313 +--------------- app/tests/test_preservation_slice_market.py | 1 + ...test_preservation_slice_market_insights.py | 195 +++ app/tools/compare_preservation_apis.py | 111 ++ app/tools/compare_preservation_databases.py | 92 ++ app/tools/run_preservation_runtime.py | 46 + docs/migration/evidence/slice-05/README.md | 69 + .../migration/evidence/slice-05/api-diff.json | 61 + .../slice-05/app-light-auction-1920x1080.png | Bin 0 -> 165864 bytes .../app-light-dragon-tiger-1920x1080.png | Bin 0 -> 67791 bytes .../app-light-popularity-1920x1080.png | Bin 0 -> 139569 bytes .../slice-05/app-light-themes-1920x1080.png | Bin 0 -> 139155 bytes .../evidence/slice-05/database-diff.json | 51 + docs/migration/保真迁移状态.json | 10 +- docs/migration/保真迁移账本.md | 17 +- 30 files changed, 2487 insertions(+), 1759 deletions(-) create mode 100644 app/backend/features/auction/__init__.py create mode 100644 app/backend/features/auction/repository.py create mode 100644 app/backend/features/auction/service.py create mode 100644 app/backend/features/dragon_tiger/__init__.py create mode 100644 app/backend/features/dragon_tiger/repository.py create mode 100644 app/backend/features/dragon_tiger/service.py create mode 100644 app/backend/features/market/insights.py create mode 100644 app/backend/features/popularity/__init__.py create mode 100644 app/backend/features/popularity/repository.py create mode 100644 app/backend/features/popularity/service.py create mode 100644 app/backend/features/themes/__init__.py create mode 100644 app/backend/features/themes/service.py create mode 100644 app/tests/test_preservation_slice_market_insights.py create mode 100644 app/tools/compare_preservation_apis.py create mode 100644 app/tools/compare_preservation_databases.py create mode 100644 app/tools/run_preservation_runtime.py create mode 100644 docs/migration/evidence/slice-05/README.md create mode 100644 docs/migration/evidence/slice-05/api-diff.json create mode 100644 docs/migration/evidence/slice-05/app-light-auction-1920x1080.png create mode 100644 docs/migration/evidence/slice-05/app-light-dragon-tiger-1920x1080.png create mode 100644 docs/migration/evidence/slice-05/app-light-popularity-1920x1080.png create mode 100644 docs/migration/evidence/slice-05/app-light-themes-1920x1080.png create mode 100644 docs/migration/evidence/slice-05/database-diff.json diff --git a/app/backend/application.py b/app/backend/application.py index 8aff479..ea5bbdd 100644 --- a/app/backend/application.py +++ b/app/backend/application.py @@ -42,7 +42,6 @@ from heaven_engine import ( from backend.data.providers.ifind_client import IfindError from llm_strategy import LLMCompilerError, compile_strategy_with_llm, test_llm_connection from mentor_agent import MentorAgentError, stream_with_mentor -from market_insights import MarketInsightsService from screener import ( FACTOR_FIELDS, FACTOR_GROUPS, @@ -53,10 +52,14 @@ from screener import ( from backend.features.accounts.http import AccountHttpMixin from backend.features.accounts.security import SecretVault from backend.features.accounts.service import AccountService +from backend.features.auction import AuctionServiceMixin +from backend.features.dragon_tiger import DragonTigerServiceMixin from backend.features.pools import PoolServiceMixin +from backend.features.popularity import PopularityServiceMixin from backend.features.rotation import RotationServiceMixin from backend.features.sentiment import SentimentServiceMixin from backend.features.system import SystemHttpMixin +from backend.features.themes import ThemeServiceMixin from backend.data.providers.tushare_client import TushareClient, TushareError, _sector_coverage_issue @@ -142,6 +145,10 @@ class DashboardService( SentimentServiceMixin, PoolServiceMixin, RotationServiceMixin, + AuctionServiceMixin, + ThemeServiceMixin, + PopularityServiceMixin, + DragonTigerServiceMixin, ): def __init__(self) -> None: runtime = load_runtime_settings() @@ -753,28 +760,9 @@ class DashboardService( } - def _market_insights(self) -> MarketInsightsService: - if not self.configured: - raise ValueError("行情数据尚未配置。") - return MarketInsightsService( - self.database, - self._tushare_client(), - ifind=self.ifind, - ) - def auction_center(self, trade_date: str, force: bool = False) -> dict[str, Any]: - return self._market_insights().auction_center( - normalize_date(trade_date), force, self.current_user_id - ) - def theme_library(self, trade_date: str, force: bool = False) -> dict[str, Any]: - return self._market_insights().theme_library(normalize_date(trade_date), force) - def theme_detail(self, code: str, trade_date: str) -> dict[str, Any]: - return self._market_insights().theme_detail(code, normalize_date(trade_date)) - - def popularity(self, trade_date: str, force: bool = False) -> dict[str, Any]: - return self._market_insights().popularity(normalize_date(trade_date), force) @staticmethod def _ifind_field(row: dict[str, Any], tokens: tuple[str, ...]) -> Any: @@ -3074,287 +3062,6 @@ class DashboardService( ) return result - def get_hot_money_profiles(self, force: bool = False) -> dict[str, Any]: - cache_kind = "hot_money_profiles_v1" - cache_key = "directory" - cached = self.database.get_data_snapshot(cache_kind, cache_key) - if cached and not force: - cached["meta"] = {**cached.get("meta", {}), "cached": True} - return cached - if self.configured: - try: - payload = self._tushare_client().hot_money_profiles() - except TushareError: - if cached: - cached["meta"] = { - **cached.get("meta", {}), - "cached": True, - "stale": True, - "notice": "名录暂未完成更新,当前展示最近一次收录结果。", - } - return cached - return { - "meta": { - "source": "unavailable", - "status": "unavailable", - "schema_version": 1, - "cached": False, - "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), - "notice": "游资名录暂不可用,请稍后重试。", - }, - "summary": { - "profile_count": 0, - "described_count": 0, - "organization_count": 0, - }, - "profiles": [], - } - payload["meta"]["cached"] = False - if payload.get("meta", {}).get("status") == "success": - self.database.save_data_snapshot(cache_kind, cache_key, "tushare", payload) - return payload - if cached: - cached["meta"] = {**cached.get("meta", {}), "cached": True} - return cached - return { - "meta": { - "source": "unavailable", - "status": "unavailable", - "schema_version": 1, - "cached": False, - "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), - "notice": "游资名录暂不可用,请联系管理员检查行情配置。", - }, - "summary": { - "profile_count": 0, - "described_count": 0, - "organization_count": 0, - }, - "profiles": [], - } - - def get_dragon_tiger(self, trade_date: str, force: bool = False) -> dict[str, Any]: - normalized_date = normalize_date(trade_date) - cache_kind = "hot_money_detail_v3" - if not force: - cached = self.database.get_data_snapshot(cache_kind, normalized_date) - if ( - cached - and cached.get("meta", {}).get("source") == "tushare" - and cached.get("meta", {}).get("status") == "success" - and int(cached.get("meta", {}).get("schema_version") or 0) == 3 - ): - cached["meta"] = {**cached.get("meta", {}), "cached": True} - return cached - if self.configured: - try: - payload = self._tushare_client().dragon_tiger(normalized_date) - except TushareError as exc: - return { - "meta": { - "requested_date": f"{normalized_date[:4]}-{normalized_date[4:6]}-{normalized_date[6:8]}", - "trade_date": f"{normalized_date[:4]}-{normalized_date[4:6]}-{normalized_date[6:8]}", - "source": "tushare_error", - "status": "error", - "schema_version": 3, - "cached": False, - "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), - "notice": "龙虎榜数据暂不可用,请稍后重试。", - }, - "summary": { - "trader_count": 0, - "identity_count": 0, - "operation_count": 0, - "active_stock_count": 0, - "seat_net_buy_million": 0, - "unclassified_count": 0, - "directory_count": 0, - }, - "traders": [], - "unclassified_seats": [], - "rows": [], - } - payload["meta"]["cached"] = False - if payload.get("meta", {}).get("status") == "success": - self.database.save_data_snapshot(cache_kind, normalized_date, "tushare", payload) - return payload - - return { - "meta": { - "requested_date": f"{normalized_date[:4]}-{normalized_date[4:6]}-{normalized_date[6:8]}", - "trade_date": f"{normalized_date[:4]}-{normalized_date[4:6]}-{normalized_date[6:8]}", - "source": "unavailable", - "status": "unavailable", - "schema_version": 3, - "cached": False, - "notice": "龙虎榜数据暂不可用,请联系管理员检查行情配置。", - }, - "summary": { - "trader_count": 0, - "identity_count": 0, - "operation_count": 0, - "active_stock_count": 0, - "seat_net_buy_million": 0, - "unclassified_count": 0, - "directory_count": 0, - }, - "traders": [], - "unclassified_seats": [], - "rows": [], - } - - - - def _apply_seat_aliases(self, payload: dict[str, Any]) -> dict[str, Any]: - aliases = self.database.list_seat_aliases() - result = dict(payload) - rows = payload.get("rows") or [] - for row in rows: - for institution in row.get("institutions") or []: - institution["alias"] = aliases.get(institution.get("seat_name", ""), "") - traders: dict[tuple[str, str], dict[str, Any]] = {} - unclassified: dict[str, dict[str, Any]] = {} - seen_operations: set[tuple[Any, ...]] = set() - builtin_aliases = { - "国泰海通证券股份有限公司南京太平南路证券营业部": "作手新一", - } - - for row in rows: - for institution in row.get("institutions") or []: - seat_name = str(institution.get("seat_name") or "未知席位").strip() - saved_alias = str(institution.get("alias") or "").strip() - builtin_alias = builtin_aliases.get(seat_name, "") - if saved_alias or builtin_alias: - identity_name = saved_alias or builtin_alias - identity_type = "trader" - recognized = True - identity_source = "manual" if saved_alias else "builtin" - elif "机构专用" in seat_name: - identity_name = "机构专用" - identity_type = "institution" - recognized = True - identity_source = "system" - elif "沪股通专用" in seat_name or "深股通专用" in seat_name: - identity_name = "北向资金" - identity_type = "channel" - recognized = True - identity_source = "system" - else: - identity_name = seat_name - identity_type = "unclassified" - recognized = False - identity_source = "raw" - - buy = round(float(institution.get("buy_million") or 0), 2) - sell = round(float(institution.get("sell_million") or 0), 2) - net_buy = round(float(institution.get("net_buy_million") or 0), 2) - operation_key = (row.get("code"), seat_name, buy, sell, net_buy) - if operation_key in seen_operations: - continue - seen_operations.add(operation_key) - - group_key = (identity_type, identity_name) - group = traders.setdefault( - group_key, - { - "name": identity_name, - "identity_type": identity_type, - "identity_source": identity_source, - "recognized": recognized, - "buy_million": 0.0, - "sell_million": 0.0, - "net_buy_million": 0.0, - "seat_names": set(), - "stock_codes": set(), - "operations": [], - }, - ) - group["buy_million"] += buy - group["sell_million"] += sell - group["net_buy_million"] += net_buy - group["seat_names"].add(seat_name) - group["stock_codes"].add(str(row.get("code") or "")) - group["operations"].append( - { - "code": row.get("code") or "", - "name": row.get("name") or "--", - "change": row.get("change") or 0, - "direction": "买入" if net_buy > 0 else "卖出" if net_buy < 0 else "持平", - "buy_million": buy, - "sell_million": sell, - "net_buy_million": net_buy, - "reason": row.get("reason") or "--", - "seat_name": seat_name, - "seat_alias": identity_name if recognized else "", - } - ) - - if not recognized: - pending = unclassified.setdefault( - seat_name, - { - "seat_name": seat_name, - "stock_codes": set(), - "operation_count": 0, - "buy_million": 0.0, - "sell_million": 0.0, - "net_buy_million": 0.0, - }, - ) - pending["stock_codes"].add(str(row.get("code") or "")) - pending["operation_count"] += 1 - pending["buy_million"] += buy - pending["sell_million"] += sell - pending["net_buy_million"] += net_buy - - type_order = {"trader": 0, "institution": 1, "channel": 2, "unclassified": 3} - aggregated = list(traders.values()) - aggregated.sort( - key=lambda item: ( - type_order.get(item["identity_type"], 9), - -abs(item["net_buy_million"]), - item["name"], - ) - ) - for index, group in enumerate(aggregated, start=1): - group["id"] = f"identity-{index}" - group["buy_million"] = round(group["buy_million"], 2) - group["sell_million"] = round(group["sell_million"], 2) - group["net_buy_million"] = round(group["net_buy_million"], 2) - group["seat_count"] = len(group.pop("seat_names")) - group["stock_count"] = len(group.pop("stock_codes")) - group["operation_count"] = len(group["operations"]) - group["operations"].sort( - key=lambda item: abs(float(item.get("net_buy_million") or 0)), reverse=True - ) - - pending_seats = list(unclassified.values()) - for pending in pending_seats: - pending["stock_count"] = len(pending.pop("stock_codes")) - pending["buy_million"] = round(pending["buy_million"], 2) - pending["sell_million"] = round(pending["sell_million"], 2) - pending["net_buy_million"] = round(pending["net_buy_million"], 2) - pending_seats.sort(key=lambda item: abs(item["net_buy_million"]), reverse=True) - - operation_count = sum(item["operation_count"] for item in aggregated) - active_stocks = { - operation["code"] for item in aggregated for operation in item["operations"] - } - seat_net_buy = round(sum(item["net_buy_million"] for item in aggregated), 2) - result["rows"] = rows - result["traders"] = aggregated - result["unclassified_seats"] = pending_seats - result["summary"] = { - **(payload.get("summary") or {}), - "trader_count": sum(item["identity_type"] == "trader" for item in aggregated), - "identity_count": len(aggregated), - "operation_count": operation_count, - "active_stock_count": len(active_stocks), - "seat_net_buy_million": seat_net_buy, - "unclassified_count": len(pending_seats), - } - return result - SERVICE = DashboardService() diff --git a/app/backend/features/auction/__init__.py b/app/backend/features/auction/__init__.py new file mode 100644 index 0000000..df48ecf --- /dev/null +++ b/app/backend/features/auction/__init__.py @@ -0,0 +1,4 @@ +from .repository import AuctionRepositoryMixin +from .service import AuctionServiceMixin + +__all__ = ["AuctionRepositoryMixin", "AuctionServiceMixin"] diff --git a/app/backend/features/auction/repository.py b/app/backend/features/auction/repository.py new file mode 100644 index 0000000..85d1a2e --- /dev/null +++ b/app/backend/features/auction/repository.py @@ -0,0 +1,63 @@ +from __future__ import annotations + +from typing import Any + + +class AuctionRepositoryMixin: + def upsert_auction_factors(self, rows: list[dict[str, Any]]) -> int: + values = [] + for row in rows: + trade_date = str(row.get("trade_date") or "") + ts_code = str(row.get("ts_code") or "") + price = float(row.get("price") or 0) + pre_close = float(row.get("pre_close") or 0) + if not trade_date or not ts_code or price <= 0 or pre_close <= 0: + continue + values.append( + ( + trade_date, + ts_code, + price, + pre_close, + (price / pre_close - 1) * 100, + float(row.get("vol") or 0), + float(row.get("amount") or 0), + float(row.get("turnover_rate") or 0), + float(row.get("volume_ratio") or 0), + ) + ) + with self.connect() as connection: + connection.executemany( + """ + INSERT INTO auction_factors + (trade_date, ts_code, price, pre_close, change, vol, amount, + turnover_rate, volume_ratio) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(trade_date, ts_code) DO UPDATE SET + price=excluded.price, pre_close=excluded.pre_close, + change=excluded.change, vol=excluded.vol, amount=excluded.amount, + turnover_rate=excluded.turnover_rate, + volume_ratio=excluded.volume_ratio + """, + values, + ) + return len(values) + + def auction_factor_dates(self, end_date: str = "", limit: int = 80) -> list[str]: + where = "WHERE trade_date <= ?" if end_date else "" + parameters: tuple[Any, ...] = (end_date, limit) if end_date else (limit,) + with self.connect() as connection: + rows = connection.execute( + f"SELECT DISTINCT trade_date FROM auction_factors {where} " + "ORDER BY trade_date DESC LIMIT ?", + parameters, + ).fetchall() + return [row["trade_date"] for row in reversed(rows)] + + def auction_factors_for_date(self, trade_date: str) -> list[dict[str, Any]]: + with self.connect() as connection: + rows = connection.execute( + "SELECT * FROM auction_factors WHERE trade_date = ? ORDER BY ts_code", + (trade_date,), + ).fetchall() + return [dict(row) for row in rows] diff --git a/app/backend/features/auction/service.py b/app/backend/features/auction/service.py new file mode 100644 index 0000000..456f261 --- /dev/null +++ b/app/backend/features/auction/service.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from typing import Any + +from backend.bootstrap.config import normalize_date +from backend.features.market.insights import MarketInsightsService + + +class AuctionServiceMixin: + def auction_center(self, trade_date: str, force: bool = False) -> dict[str, Any]: + return self._market_insights().auction_center( + normalize_date(trade_date), force, self.current_user_id + ) diff --git a/app/backend/features/dragon_tiger/__init__.py b/app/backend/features/dragon_tiger/__init__.py new file mode 100644 index 0000000..fe18b6b --- /dev/null +++ b/app/backend/features/dragon_tiger/__init__.py @@ -0,0 +1,4 @@ +from .repository import DragonTigerRepositoryMixin +from .service import DragonTigerServiceMixin + +__all__ = ["DragonTigerRepositoryMixin", "DragonTigerServiceMixin"] diff --git a/app/backend/features/dragon_tiger/repository.py b/app/backend/features/dragon_tiger/repository.py new file mode 100644 index 0000000..d8c43c4 --- /dev/null +++ b/app/backend/features/dragon_tiger/repository.py @@ -0,0 +1,61 @@ +from __future__ import annotations + +from datetime import datetime +from typing import Any + + +class DragonTigerRepositoryMixin: + def list_seat_aliases(self) -> dict[str, str]: + with self.connect() as connection: + rows = connection.execute("SELECT seat_name, alias FROM seat_aliases").fetchall() + return {row["seat_name"]: row["alias"] for row in rows} + + def save_seat_alias(self, seat_name: str, alias: str) -> None: + now = datetime.now().astimezone().isoformat(timespec="seconds") + with self.connect() as connection: + connection.execute( + """ + INSERT INTO seat_aliases (seat_name, alias, updated_at) + VALUES (?, ?, ?) + ON CONFLICT(seat_name) DO UPDATE SET + alias = excluded.alias, + updated_at = excluded.updated_at + """, + (seat_name, alias, now), + ) + + def upsert_lhb_institutions(self, rows: list[dict[str, Any]]) -> int: + grouped: dict[tuple[str, str], dict[str, float | int]] = {} + for row in rows: + trade_date = str(row.get("trade_date") or "") + ts_code = str(row.get("ts_code") or "") + seat_name = str(row.get("exalter") or row.get("seat_name") or "") + if not trade_date or not ts_code or "机构专用" not in seat_name: + continue + group = grouped.setdefault( + (trade_date, ts_code), + {"net": 0.0, "buy": 0.0, "sell": 0.0, "seats": 0}, + ) + group["net"] = float(group["net"]) + float(row.get("net_buy") or row.get("net_amount") or 0) + group["buy"] = float(group["buy"]) + float(row.get("buy") or row.get("buy_amount") or 0) + group["sell"] = float(group["sell"]) + float(row.get("sell") or row.get("sell_amount") or 0) + group["seats"] = int(group["seats"]) + 1 + values = [ + (trade_date, ts_code, item["net"], item["buy"], item["sell"], item["seats"]) + for (trade_date, ts_code), item in grouped.items() + ] + with self.connect() as connection: + connection.executemany( + """ + INSERT INTO lhb_institution_daily + (trade_date, ts_code, net_buy_amount, buy_amount, sell_amount, seat_count) + VALUES (?, ?, ?, ?, ?, ?) + ON CONFLICT(trade_date, ts_code) DO UPDATE SET + net_buy_amount=excluded.net_buy_amount, + buy_amount=excluded.buy_amount, + sell_amount=excluded.sell_amount, + seat_count=excluded.seat_count + """, + values, + ) + return len(values) diff --git a/app/backend/features/dragon_tiger/service.py b/app/backend/features/dragon_tiger/service.py new file mode 100644 index 0000000..b86ebd2 --- /dev/null +++ b/app/backend/features/dragon_tiger/service.py @@ -0,0 +1,288 @@ +from __future__ import annotations + +from datetime import datetime +from typing import Any + +from backend.bootstrap.config import normalize_date +from backend.data.providers.tushare_client import TushareError + + +class DragonTigerServiceMixin: + def get_hot_money_profiles(self, force: bool = False) -> dict[str, Any]: + cache_kind = "hot_money_profiles_v1" + cache_key = "directory" + cached = self.database.get_data_snapshot(cache_kind, cache_key) + if cached and not force: + cached["meta"] = {**cached.get("meta", {}), "cached": True} + return cached + if self.configured: + try: + payload = self._tushare_client().hot_money_profiles() + except TushareError: + if cached: + cached["meta"] = { + **cached.get("meta", {}), + "cached": True, + "stale": True, + "notice": "名录暂未完成更新,当前展示最近一次收录结果。", + } + return cached + return { + "meta": { + "source": "unavailable", + "status": "unavailable", + "schema_version": 1, + "cached": False, + "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), + "notice": "游资名录暂不可用,请稍后重试。", + }, + "summary": { + "profile_count": 0, + "described_count": 0, + "organization_count": 0, + }, + "profiles": [], + } + payload["meta"]["cached"] = False + if payload.get("meta", {}).get("status") == "success": + self.database.save_data_snapshot(cache_kind, cache_key, "tushare", payload) + return payload + if cached: + cached["meta"] = {**cached.get("meta", {}), "cached": True} + return cached + return { + "meta": { + "source": "unavailable", + "status": "unavailable", + "schema_version": 1, + "cached": False, + "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), + "notice": "游资名录暂不可用,请联系管理员检查行情配置。", + }, + "summary": { + "profile_count": 0, + "described_count": 0, + "organization_count": 0, + }, + "profiles": [], + } + + def get_dragon_tiger(self, trade_date: str, force: bool = False) -> dict[str, Any]: + normalized_date = normalize_date(trade_date) + cache_kind = "hot_money_detail_v3" + if not force: + cached = self.database.get_data_snapshot(cache_kind, normalized_date) + if ( + cached + and cached.get("meta", {}).get("source") == "tushare" + and cached.get("meta", {}).get("status") == "success" + and int(cached.get("meta", {}).get("schema_version") or 0) == 3 + ): + cached["meta"] = {**cached.get("meta", {}), "cached": True} + return cached + if self.configured: + try: + payload = self._tushare_client().dragon_tiger(normalized_date) + except TushareError as exc: + return { + "meta": { + "requested_date": f"{normalized_date[:4]}-{normalized_date[4:6]}-{normalized_date[6:8]}", + "trade_date": f"{normalized_date[:4]}-{normalized_date[4:6]}-{normalized_date[6:8]}", + "source": "tushare_error", + "status": "error", + "schema_version": 3, + "cached": False, + "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), + "notice": "龙虎榜数据暂不可用,请稍后重试。", + }, + "summary": { + "trader_count": 0, + "identity_count": 0, + "operation_count": 0, + "active_stock_count": 0, + "seat_net_buy_million": 0, + "unclassified_count": 0, + "directory_count": 0, + }, + "traders": [], + "unclassified_seats": [], + "rows": [], + } + payload["meta"]["cached"] = False + if payload.get("meta", {}).get("status") == "success": + self.database.save_data_snapshot(cache_kind, normalized_date, "tushare", payload) + return payload + + return { + "meta": { + "requested_date": f"{normalized_date[:4]}-{normalized_date[4:6]}-{normalized_date[6:8]}", + "trade_date": f"{normalized_date[:4]}-{normalized_date[4:6]}-{normalized_date[6:8]}", + "source": "unavailable", + "status": "unavailable", + "schema_version": 3, + "cached": False, + "notice": "龙虎榜数据暂不可用,请联系管理员检查行情配置。", + }, + "summary": { + "trader_count": 0, + "identity_count": 0, + "operation_count": 0, + "active_stock_count": 0, + "seat_net_buy_million": 0, + "unclassified_count": 0, + "directory_count": 0, + }, + "traders": [], + "unclassified_seats": [], + "rows": [], + } + + def _apply_seat_aliases(self, payload: dict[str, Any]) -> dict[str, Any]: + aliases = self.database.list_seat_aliases() + result = dict(payload) + rows = payload.get("rows") or [] + for row in rows: + for institution in row.get("institutions") or []: + institution["alias"] = aliases.get(institution.get("seat_name", ""), "") + traders: dict[tuple[str, str], dict[str, Any]] = {} + unclassified: dict[str, dict[str, Any]] = {} + seen_operations: set[tuple[Any, ...]] = set() + builtin_aliases = { + "国泰海通证券股份有限公司南京太平南路证券营业部": "作手新一", + } + + for row in rows: + for institution in row.get("institutions") or []: + seat_name = str(institution.get("seat_name") or "未知席位").strip() + saved_alias = str(institution.get("alias") or "").strip() + builtin_alias = builtin_aliases.get(seat_name, "") + if saved_alias or builtin_alias: + identity_name = saved_alias or builtin_alias + identity_type = "trader" + recognized = True + identity_source = "manual" if saved_alias else "builtin" + elif "机构专用" in seat_name: + identity_name = "机构专用" + identity_type = "institution" + recognized = True + identity_source = "system" + elif "沪股通专用" in seat_name or "深股通专用" in seat_name: + identity_name = "北向资金" + identity_type = "channel" + recognized = True + identity_source = "system" + else: + identity_name = seat_name + identity_type = "unclassified" + recognized = False + identity_source = "raw" + + buy = round(float(institution.get("buy_million") or 0), 2) + sell = round(float(institution.get("sell_million") or 0), 2) + net_buy = round(float(institution.get("net_buy_million") or 0), 2) + operation_key = (row.get("code"), seat_name, buy, sell, net_buy) + if operation_key in seen_operations: + continue + seen_operations.add(operation_key) + + group_key = (identity_type, identity_name) + group = traders.setdefault( + group_key, + { + "name": identity_name, + "identity_type": identity_type, + "identity_source": identity_source, + "recognized": recognized, + "buy_million": 0.0, + "sell_million": 0.0, + "net_buy_million": 0.0, + "seat_names": set(), + "stock_codes": set(), + "operations": [], + }, + ) + group["buy_million"] += buy + group["sell_million"] += sell + group["net_buy_million"] += net_buy + group["seat_names"].add(seat_name) + group["stock_codes"].add(str(row.get("code") or "")) + group["operations"].append( + { + "code": row.get("code") or "", + "name": row.get("name") or "--", + "change": row.get("change") or 0, + "direction": "买入" if net_buy > 0 else "卖出" if net_buy < 0 else "持平", + "buy_million": buy, + "sell_million": sell, + "net_buy_million": net_buy, + "reason": row.get("reason") or "--", + "seat_name": seat_name, + "seat_alias": identity_name if recognized else "", + } + ) + + if not recognized: + pending = unclassified.setdefault( + seat_name, + { + "seat_name": seat_name, + "stock_codes": set(), + "operation_count": 0, + "buy_million": 0.0, + "sell_million": 0.0, + "net_buy_million": 0.0, + }, + ) + pending["stock_codes"].add(str(row.get("code") or "")) + pending["operation_count"] += 1 + pending["buy_million"] += buy + pending["sell_million"] += sell + pending["net_buy_million"] += net_buy + + type_order = {"trader": 0, "institution": 1, "channel": 2, "unclassified": 3} + aggregated = list(traders.values()) + aggregated.sort( + key=lambda item: ( + type_order.get(item["identity_type"], 9), + -abs(item["net_buy_million"]), + item["name"], + ) + ) + for index, group in enumerate(aggregated, start=1): + group["id"] = f"identity-{index}" + group["buy_million"] = round(group["buy_million"], 2) + group["sell_million"] = round(group["sell_million"], 2) + group["net_buy_million"] = round(group["net_buy_million"], 2) + group["seat_count"] = len(group.pop("seat_names")) + group["stock_count"] = len(group.pop("stock_codes")) + group["operation_count"] = len(group["operations"]) + group["operations"].sort( + key=lambda item: abs(float(item.get("net_buy_million") or 0)), reverse=True + ) + + pending_seats = list(unclassified.values()) + for pending in pending_seats: + pending["stock_count"] = len(pending.pop("stock_codes")) + pending["buy_million"] = round(pending["buy_million"], 2) + pending["sell_million"] = round(pending["sell_million"], 2) + pending["net_buy_million"] = round(pending["net_buy_million"], 2) + pending_seats.sort(key=lambda item: abs(item["net_buy_million"]), reverse=True) + + operation_count = sum(item["operation_count"] for item in aggregated) + active_stocks = { + operation["code"] for item in aggregated for operation in item["operations"] + } + seat_net_buy = round(sum(item["net_buy_million"] for item in aggregated), 2) + result["rows"] = rows + result["traders"] = aggregated + result["unclassified_seats"] = pending_seats + result["summary"] = { + **(payload.get("summary") or {}), + "trader_count": sum(item["identity_type"] == "trader" for item in aggregated), + "identity_count": len(aggregated), + "operation_count": operation_count, + "active_stock_count": len(active_stocks), + "seat_net_buy_million": seat_net_buy, + "unclassified_count": len(pending_seats), + } + return result diff --git a/app/backend/features/market/insights.py b/app/backend/features/market/insights.py new file mode 100644 index 0000000..226521d --- /dev/null +++ b/app/backend/features/market/insights.py @@ -0,0 +1,1314 @@ +from __future__ import annotations + +import copy +import json +from datetime import datetime, time as dt_time, timedelta, timezone +from statistics import median +from typing import TYPE_CHECKING, Any, Callable + +from backend.data.providers.ifind_client import IfindError, IfindHttpClient +from backend.data.providers.tushare_client import TushareClient, TushareError + +if TYPE_CHECKING: + from database import ReviewDatabase + + +CHINA_TIMEZONE = timezone(timedelta(hours=8)) + + +def _number(value: Any, default: float = 0.0) -> float: + try: + number = float(value) + return number if number == number else default + except (TypeError, ValueError): + return default + + +def _display_date(value: str) -> str: + text = str(value or "").replace("-", "") + if len(text) != 8: + return str(value or "") + return f"{text[:4]}-{text[4:6]}-{text[6:]}" + + +class MarketInsightsService: + """Read-only market features backed by Tushare and shared SQLite caches.""" + + def __init__( + self, + database: ReviewDatabase, + client: TushareClient, + now_provider: Callable[[], datetime] | None = None, + ifind: IfindHttpClient | None = None, + ) -> None: + self.database = database + self.client = client + self._now_provider = now_provider or (lambda: datetime.now(CHINA_TIMEZONE)) + self.ifind = ifind + + def _trade_context(self, requested_date: str) -> tuple[str, str]: + """Resolve trading dates without making cached feature pages depend on Tushare uptime.""" + requested = str(requested_date or "").replace("-", "") + try: + return self.client.resolve_trade_context(requested) + except TushareError: + latest = self.database.get_latest_real_snapshot(requested) or {} + trade_date = str( + (latest.get("meta") or {}).get("trade_date") + or latest.get("_snapshot_date") + or requested + ).replace("-", "") + previous = self.database.get_latest_real_snapshot(trade_date, strictly_before=True) or {} + previous_date = str( + (previous.get("meta") or {}).get("trade_date") + or previous.get("_snapshot_date") + or "" + ).replace("-", "") + return trade_date, previous_date + + def _latest_feature_snapshot(self, kind: str, trade_date: str) -> dict[str, Any] | None: + return self.database.get_latest_data_snapshot(kind, "", trade_date) + + def _auction_session(self, requested_date: str, trade_date: str) -> dict[str, Any]: + now = self._now_provider() + if now.tzinfo is None: + now = now.replace(tzinfo=CHINA_TIMEZONE) + else: + now = now.astimezone(CHINA_TIMEZONE) + requested = str(requested_date or "").replace("-", "") + today = now.strftime("%Y%m%d") + if requested != today or trade_date != today: + return { + "phase": "archive", + "actionable": False, + "next_transition_at": "", + } + + local_time = now.time().replace(tzinfo=None) + transitions = ( + (dt_time(9, 15), "pending", dt_time(9, 15)), + (dt_time(9, 25), "observing", dt_time(9, 25)), + (dt_time(9, 30), "selection", dt_time(9, 30)), + ) + for boundary, phase, next_boundary in transitions: + if local_time < boundary: + transition = now.replace( + hour=next_boundary.hour, + minute=next_boundary.minute, + second=0, + microsecond=0, + ) + return { + "phase": phase, + "actionable": phase == "selection", + "next_transition_at": transition.isoformat(timespec="seconds"), + } + return { + "phase": "finalized", + "actionable": False, + "next_transition_at": "", + } + + def _stock_master(self) -> dict[str, dict[str, Any]]: + rows = self.database.list_stock_master() + if not rows: + rows = self.client.query( + "stock_basic", + {"list_status": "L"}, + "ts_code,name,industry,market,list_date", + ) + self.database.upsert_stock_master(rows) + rows = self.database.list_stock_master() + return {str(row.get("ts_code") or ""): row for row in rows} + + @staticmethod + def _expectation_label(actual_strength: float, expected_change: float) -> str: + difference = actual_strength - expected_change + if difference >= 1.5: + return "超预期" + if difference <= -1.5: + return "低于预期" + return "符合预期" + + @staticmethod + def _auction_confirmation(row: dict[str, Any]) -> float: + volume_ratio = _number(row.get("volume_ratio")) + turnover_rate = _number(row.get("turnover_rate")) + amount_million = _number(row.get("amount_million")) + return ( + (0.6 if volume_ratio >= 2 else 0.3 if volume_ratio >= 1.2 else -0.5 if volume_ratio < 0.6 else 0) + + (0.25 if turnover_rate >= 0.15 else -0.25 if turnover_rate < 0.03 else 0) + + (0.3 if amount_million >= 20 else 0.15 if amount_million >= 5 else -0.3 if amount_million < 1 else 0) + ) + + @staticmethod + def _attention_score( + row: dict[str, Any], + expected_change: float, + core_tags: list[str], + sources: list[str], + prior_streak: int, + strong_sector: bool, + ) -> float: + if core_tags: + identity_score = 35.0 + elif prior_streak >= 2: + identity_score = 27.0 + elif any(source in {"昨日涨停", "昨日炸板"} for source in sources): + identity_score = 21.0 + else: + identity_score = 14.0 + deviation_score = min(30.0, abs(_number(row.get("change")) - expected_change) * 5) + volume_score = min(10.0, max(0.0, _number(row.get("volume_ratio"))) / 2 * 10) + amount_score = min(6.0, max(0.0, _number(row.get("amount_million"))) / 10 * 6) + turnover_score = min(4.0, max(0.0, _number(row.get("turnover_rate"))) / 0.2 * 4) + theme_score = 15.0 if strong_sector else 7.0 if row.get("concepts") else 0.0 + return round(min(100.0, identity_score + deviation_score + volume_score + amount_score + turnover_score + theme_score), 1) + + def _auction_candidates( + self, + rows: list[dict[str, Any]], + baseline_date: str, + ) -> tuple[list[dict[str, Any]], dict[str, Any], list[dict[str, Any]]]: + """Build a narrow, explainable universe from prior limits, breaks and top-20 hot lists.""" + snapshot = self.database.get_snapshot(baseline_date) or {} + prior_limits = list(snapshot.get("limits") or []) + prior_broken = list(snapshot.get("broken") or []) + prior_sectors = list(snapshot.get("sectors") or []) + strong_sector_names = { + str(item.get("name") or "") for item in prior_sectors[:5] if item.get("name") + } + ths_rows, dc_rows, errors = self._hot_rows(baseline_date) + candidates: dict[str, dict[str, Any]] = {} + core_tags: dict[str, set[str]] = {} + + def ensure_candidate(item: dict[str, Any]) -> dict[str, Any] | None: + code = str(item.get("code") or str(item.get("ts_code") or "").split(".")[0]) + if not code: + return None + return candidates.setdefault( + code, + { + "sources": [], + "streak": 0, + "sector": str(item.get("sector") or "其他"), + "name": str(item.get("name") or item.get("ts_name") or "--"), + "concepts": [], + "ths_rank": None, + "dc_rank": None, + }, + ) + + for item in prior_limits: + candidate = ensure_candidate(item) + if candidate is None: + continue + candidate["sources"].append("昨日涨停") + candidate["streak"] = max(1, int(_number(item.get("streak"), 1))) + + for item in prior_broken: + candidate = ensure_candidate(item) + if candidate is not None and "昨日炸板" not in candidate["sources"]: + candidate["sources"].append("昨日炸板") + + limit_streaks = [max(1, int(_number(item.get("streak"), 1))) for item in prior_limits] + highest_streak = max(limit_streaks, default=0) + for item in prior_limits: + code = str(item.get("code") or "") + streak = max(1, int(_number(item.get("streak"), 1))) + if streak >= 3: + core_tags.setdefault(code, set()).add("三板以上") + if highest_streak and streak == highest_streak: + core_tags.setdefault(code, set()).add("市场最高板") + + for sector in prior_sectors[:5]: + name = str(sector.get("name") or "") + members = [item for item in prior_limits if str(item.get("sector") or "其他") == name] + if not members: + continue + leader = max( + members, + key=lambda item: ( + int(_number(item.get("streak"), 1)), + _number(item.get("amount_billion")), + -_number(item.get("open_times")), + ), + ) + core_tags.setdefault(str(leader.get("code") or ""), set()).add("题材核心") + + leadership = sorted( + prior_limits, + key=lambda item: ( + int(_number(item.get("streak"), 1)), + str(item.get("sector") or "") in strong_sector_names, + _number(item.get("amount_billion")), + ), + reverse=True, + ) + if leadership: + core_tags.setdefault(str(leadership[0].get("code") or ""), set()).add("市场领涨") + + hot_records: dict[str, dict[str, Any]] = {} + + for source, hot_rows, data_type in ( + ("同花顺热榜", ths_rows, "热股"), + ("东方财富热榜", dc_rows, "A股市场"), + ): + for item in hot_rows: + if str(item.get("data_type") or "") != data_type: + continue + ts_code = str(item.get("ts_code") or "") + code = ts_code.split(".")[0] + rank = max(1, int(_number(item.get("rank"), 9999))) + if not code or rank > 20: + continue + hot = hot_records.setdefault( + code, + { + "name": str(item.get("ts_name") or "--"), + "concepts": [], + "ths_rank": None, + "dc_rank": None, + }, + ) + hot["ths_rank" if source == "同花顺热榜" else "dc_rank"] = rank + if source == "同花顺热榜": + hot["concepts"] = self._parse_concepts(item.get("concept")) + + ranked_hot = sorted( + hot_records.items(), + key=lambda pair: ( + ((21 - (pair[1].get("ths_rank") or 21)) / 20) + + ((21 - (pair[1].get("dc_rank") or 21)) / 20) + + (0.35 if pair[1].get("ths_rank") and pair[1].get("dc_rank") else 0) + ), + reverse=True, + ) + for code, _ in ranked_hot[:5]: + core_tags.setdefault(code, set()).add("人气前5") + + for code, hot in hot_records.items(): + ranks = [rank for rank in (hot.get("ths_rank"), hot.get("dc_rank")) if isinstance(rank, int)] + dual = len(ranks) == 2 + if not ranks or (min(ranks) > 10 and not dual and code not in candidates and code not in core_tags): + continue + candidate = candidates.setdefault( + code, + { + "sources": [], + "streak": 0, + "sector": "其他", + "name": hot["name"], + "concepts": [], + "ths_rank": None, + "dc_rank": None, + }, + ) + candidate["ths_rank"] = hot.get("ths_rank") + candidate["dc_rank"] = hot.get("dc_rank") + candidate["concepts"] = hot.get("concepts") or [] + if hot.get("ths_rank") and "同花顺热榜" not in candidate["sources"]: + candidate["sources"].append("同花顺热榜") + if hot.get("dc_rank") and "东方财富热榜" not in candidate["sources"]: + candidate["sources"].append("东方财富热榜") + + normalized = [] + for row in rows: + candidate = candidates.get(str(row.get("code") or "")) + if not candidate: + continue + streak = int(candidate["streak"]) + expected_change = {1: 1.5, 2: 3.0, 3: 4.0}.get(streak, 5.0 if streak else 0.5) + ranks = [ + rank for rank in (candidate.get("ths_rank"), candidate.get("dc_rank")) + if isinstance(rank, int) + ] + if len(ranks) == 2: + expected_change += 0.8 + elif ranks: + best_rank = min(ranks) + expected_change += 0.7 if best_rank <= 10 else 0.4 if best_rank <= 30 else 0.2 + expected_change = min(expected_change, 6.5) + + volume_ratio = _number(row.get("volume_ratio")) + turnover_rate = _number(row.get("turnover_rate")) + amount_million = _number(row.get("amount_million")) + confirmation = self._auction_confirmation(row) + actual_strength = _number(row.get("change")) + confirmation + label = self._expectation_label(actual_strength, expected_change) + is_broken = "昨日炸板" in candidate["sources"] and "昨日涨停" not in candidate["sources"] + identity = f"昨日{streak}板" if streak > 1 else "昨日首板" if streak == 1 else "昨日炸板" if is_broken else "人气榜标的" + popularity = ",双榜共识" if len(ranks) == 2 else ",热榜靠前" if ranks and min(ranks) <= 10 else "" + difference = _number(row.get("change")) - expected_change + direction = "高于" if difference > 0 else "低于" if difference < 0 else "贴合" + reason = ( + f"{identity}{popularity};竞价涨幅{direction}预期中枢" + f"{abs(difference):.1f}个百分点,量比{volume_ratio:.2f}" + ) + tags = sorted(core_tags.get(str(row.get("code") or ""), set())) + scored_row = { + **row, + "concepts": candidate["concepts"], + } + attention_score = self._attention_score( + scored_row, + expected_change, + tags, + candidate["sources"], + streak, + str(candidate.get("sector") or row.get("sector") or "") in strong_sector_names, + ) + normalized.append( + { + **scored_row, + "sector": candidate["sector"] if candidate["sector"] != "其他" else row.get("sector", "其他"), + "candidate_sources": candidate["sources"], + "source_label": " · ".join(candidate["sources"]), + "prior_streak": streak, + "concepts": candidate["concepts"], + "expected_change": round(expected_change, 2), + "actual_strength": round(actual_strength, 2), + "expectation": label, + "attention_score": attention_score, + "core_tags": tags, + "is_market_core": bool(tags), + "expectation_reason": reason, + } + ) + normalized.sort(key=lambda item: (_number(item.get("attention_score")), _number(item.get("amount_million"))), reverse=True) + matched_top = { + str(item.get("code") or "") + for item in sorted( + (item for item in normalized if item.get("expectation") == "符合预期"), + key=lambda item: _number(item.get("attention_score")), + reverse=True, + )[:20] + } + focus_candidates = [ + item for item in normalized + if item.get("is_market_core") + or (_number(item.get("attention_score")) >= 55 and item.get("expectation") != "符合预期") + or str(item.get("code") or "") in matched_top + ] + mandatory = [item for item in focus_candidates if item.get("is_market_core")] + mandatory_codes = {str(item.get("code") or "") for item in mandatory} + optional = [item for item in focus_candidates if str(item.get("code") or "") not in mandatory_codes] + focus_rows = sorted(mandatory, key=lambda item: _number(item.get("attention_score")), reverse=True) + focus_rows.extend(optional[:max(0, 30 - len(focus_rows))]) + focus_rows.sort(key=lambda item: _number(item.get("attention_score")), reverse=True) + return normalized, { + "baseline_date": _display_date(baseline_date), + "prior_limit_count": len(prior_limits), + "prior_broken_count": len(prior_broken), + "hot_candidate_count": sum( + any(source in {"同花顺热榜", "东方财富热榜"} for source in item["sources"]) + for item in candidates.values() + ), + "core_count": sum(bool(item.get("is_market_core")) for item in normalized), + "notice": ";".join(errors), + }, focus_rows + + @staticmethod + def _auction_theme_evidence( + prior_snapshot: dict[str, Any], + candidate_rows: list[dict[str, Any]], + ) -> dict[str, list[dict[str, Any]]]: + prior_sectors = list(prior_snapshot.get("sectors") or []) + carry = [] + for sector in prior_sectors[:10]: + name = str(sector.get("name") or "其他") + matched = [row for row in candidate_rows if str(row.get("sector") or "其他") == name] + changes = [_number(row.get("change")) for row in matched] + middle = median(changes) if changes else -10.0 + positive_rate = sum(value > 0.2 for value in changes) / len(changes) * 100 if changes else 0.0 + if middle >= 2 and positive_rate >= 60: + status = "强承接" + elif middle >= 0 and positive_rate >= 50: + status = "有承接" + elif middle > -2: + status = "分歧" + else: + status = "承接弱" + carry.append( + { + "name": name, + "status": status, + "prior_limit_count": int(_number(sector.get("count"))), + "leader": str(sector.get("leader") or "--"), + "matched_count": len(matched), + "median_change": round(middle, 2) if matched else None, + "positive_rate": round(positive_rate, 1), + "amount_million": round(sum(_number(row.get("amount_million")) for row in matched), 2), + } + ) + + concept_groups: dict[str, list[dict[str, Any]]] = {} + prior_names = {str(item.get("name") or "") for item in prior_sectors} + for row in candidate_rows: + for concept in row.get("concepts") or []: + if concept and concept not in prior_names: + concept_groups.setdefault(str(concept), []).append(row) + new_themes = [] + for name, members in concept_groups.items(): + unique = {str(item.get("code") or ""): item for item in members} + values = list(unique.values()) + changes = [_number(item.get("change")) for item in values] + if len(values) < 2 or median(changes) < 2 or sum(value > 0.2 for value in changes) / len(values) < 0.67: + continue + new_themes.append( + { + "name": name, + "stock_count": len(values), + "median_change": round(median(changes), 2), + "amount_million": round(sum(_number(item.get("amount_million")) for item in values), 2), + "leaders": [str(item.get("name") or "--") for item in sorted(values, key=lambda value: _number(value.get("change")), reverse=True)[:3]], + } + ) + new_themes.sort(key=lambda item: (item["stock_count"], item["median_change"], item["amount_million"]), reverse=True) + return {"carry": carry, "new_themes": new_themes[:8]} + + def _auction_amount_history(self, trade_date: str) -> list[dict[str, Any]]: + dates = self.database.auction_factor_dates(trade_date, 10) + stock_list_dates = { + str(item.get("ts_code") or ""): str(item.get("list_date") or "") + for item in self.database.list_stock_master() + if item.get("ts_code") + } + history = [] + for current_date in dates: + rows = [ + row for row in self.database.auction_factors_for_date(current_date) + if ( + str(row.get("ts_code") or "") in stock_list_dates + and ( + not stock_list_dates[str(row.get("ts_code") or "")] + or stock_list_dates[str(row.get("ts_code") or "")] < current_date + ) + ) + ] + history.append( + { + "trade_date": _display_date(current_date), + "amount_billion": round(sum(_number(row.get("amount")) for row in rows) / 100_000_000, 2), + "stock_count": len(rows), + } + ) + return history + + def _ensure_auction_amount_history(self, trade_date: str, target_days: int = 10) -> None: + existing = set(self.database.auction_factor_dates(trade_date, target_days + 5)) + if len(existing) >= target_days: + return + end = datetime.strptime(trade_date, "%Y%m%d") + start = (end - timedelta(days=35)).strftime("%Y%m%d") + try: + calendar = self.client.query( + "trade_cal", + { + "exchange": "SSE", + "start_date": start, + "end_date": trade_date, + "is_open": 1, + }, + "cal_date,is_open", + ) + except TushareError: + return + dates = sorted( + str(item.get("cal_date") or "") + for item in calendar + if int(_number(item.get("is_open"))) == 1 and item.get("cal_date") + )[-target_days:] + for current_date in dates: + if current_date in existing: + continue + try: + rows = self.client.query( + "stk_auction", + {"trade_date": current_date}, + "ts_code,trade_date,vol,price,amount,pre_close,turnover_rate,volume_ratio,float_share", + ) + except TushareError: + break + if rows: + self.database.upsert_auction_factors(rows) + existing.add(current_date) + + def _with_auction_watchlist( + self, + result: dict[str, Any], + trade_date: str, + user_id: int, + ) -> dict[str, Any]: + personalized = copy.deepcopy(result) + if not user_id: + personalized["watchlist_rows"] = [] + personalized["watchlist_missing_count"] = 0 + return personalized + watched = self.database.list_watchlist(user_id) + if not watched: + personalized["watchlist_rows"] = [] + personalized["watchlist_missing_count"] = 0 + return personalized + + public_rows = { + str(item.get("code") or ""): item + for item in ( + list(personalized.get("rows") or []) + + list(personalized.get("one_price_rows") or []) + ) + } + factors = { + str(item.get("ts_code") or "").split(".")[0]: item + for item in self.database.auction_factors_for_date(trade_date) + } + master = { + str(item.get("ts_code") or "").split(".")[0]: item + for item in self.database.list_stock_master() + } + rows = [] + missing = 0 + for item in watched: + code = str(item.get("code") or "") + if code in public_rows: + rows.append({**public_rows[code], "is_watchlist": True}) + continue + factor = factors.get(code) + if not factor: + missing += 1 + rows.append( + { + "code": code, + "name": str(item.get("name") or "--"), + "sector": str(item.get("sector") or "其他"), + "available": False, + "is_watchlist": True, + } + ) + continue + stock = master.get(code, {}) + price = _number(factor.get("price")) + pre_close = _number(factor.get("pre_close")) + change = (price / pre_close - 1) * 100 if price > 0 and pre_close > 0 else 0 + row = { + "code": code, + "ts_code": str(factor.get("ts_code") or ""), + "name": str(item.get("name") or stock.get("name") or "--"), + "sector": str(item.get("sector") or stock.get("industry") or "其他"), + "price": round(price, 2), + "pre_close": round(pre_close, 2), + "change": round(change, 2), + "amount_million": round(_number(factor.get("amount")) / 1_000_000, 2), + "turnover_rate": round(_number(factor.get("turnover_rate")), 4), + "volume_ratio": round(_number(factor.get("volume_ratio")), 2), + "candidate_sources": ["我的自选"], + "source_label": "我的自选", + "prior_streak": 0, + "concepts": [], + "expected_change": 0.0, + "core_tags": [], + "is_market_core": False, + "is_watchlist": True, + "available": True, + } + actual_strength = change + self._auction_confirmation(row) + row["actual_strength"] = round(actual_strength, 2) + row["expectation"] = self._expectation_label(actual_strength, 0.0) + row["attention_score"] = self._attention_score(row, 0.0, [], ["我的自选"], 0, False) + direction = "高于" if change > 0 else "低于" if change < 0 else "贴合" + row["expectation_reason"] = f"自选观察;竞价涨幅{direction}个人观察基准{abs(change):.1f}个百分点,量比{row['volume_ratio']:.2f}" + rows.append(row) + rows.sort( + key=lambda row: (bool(row.get("available", True)), _number(row.get("attention_score"))), + reverse=True, + ) + personalized["watchlist_rows"] = rows + personalized["watchlist_missing_count"] = missing + return personalized + + def _dynamic_auction_rows( + self, + trade_date: str, + baseline_date: str, + user_id: int, + ) -> list[dict[str, Any]]: + if not self.ifind or not self.ifind.configured: + return [] + master = self._stock_master() + placeholders = [ + { + "code": str(item.get("code") or ts_code.split(".")[0]), + "ts_code": ts_code, + "name": str(item.get("name") or "--"), + "sector": str(item.get("industry") or "其他"), + } + for ts_code, item in master.items() + ] + candidates, _, _ = self._auction_candidates(placeholders, baseline_date) + selected_codes = { + str(item.get("ts_code") or "") + for item in candidates + if item.get("ts_code") + } + if user_id: + watched = {str(item.get("code") or "") for item in self.database.list_watchlist(user_id)} + selected_codes.update( + ts_code for ts_code in master if ts_code.split(".")[0] in watched + ) + selected_codes.discard("") + if not selected_codes: + return [] + + display_date = _display_date(trade_date) + now = self._now_provider() + if now.tzinfo is None: + now = now.replace(tzinfo=CHINA_TIMEZONE) + else: + now = now.astimezone(CHINA_TIMEZONE) + end_time = min(now.time().replace(tzinfo=None), dt_time(9, 25)) + end_stamp = f"{display_date} {end_time.strftime('%H:%M:%S')}" + start_stamp = f"{display_date} 09:15:00" + snapshot_rows: list[dict[str, Any]] = [] + ordered_codes = sorted(selected_codes) + for index in range(0, len(ordered_codes), 80): + try: + snapshot_rows.extend( + self.ifind.snapshots( + ordered_codes[index:index + 80], + [ + "latest", "volume", "amount", "preClose", + "bid1", "bidSize1", "ask1", "askSize1", + ], + start_stamp, + end_stamp, + cache_ttl=8, + ) + ) + except IfindError: + continue + + latest: dict[str, dict[str, Any]] = {} + for row in snapshot_rows: + ts_code = str(row.get("thscode") or "") + previous = latest.get(ts_code) or {} + if ( + ts_code + and _number(row.get("latest")) > 0 + and str(row.get("time") or "") >= str(previous.get("time") or "") + ): + latest[ts_code] = row + prior_factors = { + str(item.get("ts_code") or ""): item + for item in self.database.auction_factors_for_date(baseline_date) + } + normalized = [] + for ts_code, row in latest.items(): + price = _number(row.get("latest")) + pre_close = _number(row.get("preClose")) + volume = _number(row.get("volume")) + bid_size = _number(row.get("bidSize1")) + ask_size = _number(row.get("askSize1")) + if volume <= 0 and bid_size > 0 and ask_size > 0: + volume = min(bid_size, ask_size) + amount = _number(row.get("amount")) + if amount <= 0 and price > 0 and volume > 0: + amount = price * volume + prior_volume = _number((prior_factors.get(ts_code) or {}).get("vol")) + normalized.append( + { + "ts_code": ts_code, + "trade_date": trade_date, + "vol": volume, + "price": price, + "amount": amount, + "pre_close": pre_close, + "turnover_rate": 0, + "volume_ratio": volume / prior_volume if prior_volume > 0 else 0, + "float_share": 0, + "bid_size1": bid_size, + "ask_size1": ask_size, + "snapshot_time": str(row.get("time") or ""), + "dynamic": True, + } + ) + return normalized + + def auction_center( + self, + requested_date: str, + force: bool = False, + user_id: int = 0, + ) -> dict[str, Any]: + trade_date, previous_date = self._trade_context(requested_date) + session = self._auction_session(requested_date, trade_date) + phase = str(session["phase"]) + ifind_ready = bool(self.ifind and self.ifind.configured) + live_dynamic = phase == "observing" and ifind_ready + use_ifind_snapshot = phase in {"observing", "selection", "finalized"} and ifind_ready + data_date = previous_date if phase == "pending" or (phase == "observing" and not live_dynamic) else trade_date + carried_forward = data_date != trade_date + cache_key = data_date + if not force and not live_dynamic: + cached = self.database.get_data_snapshot("auction_center_v6", cache_key) + if cached: + result = copy.deepcopy(cached) + result["meta"] = { + **result.get("meta", {}), + **session, + "requested_date": _display_date(requested_date), + "trade_date": _display_date(data_date), + "carried_forward": carried_forward, + "available": bool((result.get("summary") or {}).get("stock_count")), + "cached": True, + } + return self._with_auction_watchlist(result, data_date, user_id) + + if use_ifind_snapshot: + rows = self._dynamic_auction_rows(data_date, previous_date, user_id) + else: + rows = [] + if not rows and not live_dynamic: + try: + rows = self.client.query("stk_auction", {"trade_date": data_date}) + except TushareError: + rows = self.database.auction_factors_for_date(data_date) + if not rows: + return { + "meta": { + **session, + "requested_date": _display_date(requested_date), + "trade_date": _display_date(data_date), + "carried_forward": carried_forward, + "available": False, + "cached": False, + "notice": "该交易日暂无可用竞价快照", + "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), + }, + "summary": { + "stock_count": 0, "up_count": 0, "down_count": 0, + "limit_open_count": 0, "strong_open_count": 0, + "median_change": 0, "amount_billion": 0, + "candidate_count": 0, "focus_count": 0, "one_price_count": 0, + }, + "expectations": {"超预期": 0, "符合预期": 0, "低于预期": 0}, + "candidate_meta": {"baseline_date": _display_date(previous_date)}, + "themes": {"carry": [], "new_themes": []}, + "amount_history": self._auction_amount_history(data_date), + "news_feedback": {"available": False, "message": "隔夜消息反馈暂不可用"}, + "focus_rows": [], "one_price_rows": [], "rows": [], + "watchlist_rows": [], "watchlist_missing_count": 0, + } + + master = self._stock_master() + try: + limit_rows = self.client.query( + "stk_limit", + {"trade_date": data_date}, + "trade_date,ts_code,up_limit,down_limit", + ) + except TushareError: + limit_rows = [] + limit_map = {str(item.get("ts_code") or ""): item for item in limit_rows} + normalized = [] + for row in rows: + ts_code = str(row.get("ts_code") or "") + stock = master.get(ts_code) + price = _number(row.get("price")) + pre_close = _number(row.get("pre_close")) + list_date = str((stock or {}).get("list_date") or "") + if ( + not stock + or price <= 0 + or pre_close <= 0 + or (list_date and list_date >= data_date) + ): + continue + change = (price / pre_close - 1) * 100 + amount_million = _number(row.get("amount")) / 1_000_000 + volume_ratio = _number(row.get("volume_ratio")) + turnover_rate = _number(row.get("turnover_rate")) + up_limit = _number((limit_map.get(ts_code) or {}).get("up_limit")) + is_one_price = bool( + up_limit > 0 and abs(price - up_limit) <= max(0.001, up_limit * 0.00005) + ) + normalized.append( + { + "code": str(stock.get("code") or ts_code.split(".")[0]), + "ts_code": ts_code, + "name": str(stock.get("name") or "--"), + "sector": str(stock.get("industry") or "其他"), + "price": round(price, 2), + "pre_close": round(pre_close, 2), + "change": round(change, 2), + "volume_ten_thousand": round(_number(row.get("vol")) / 10_000, 2), + "amount_million": round(amount_million, 2), + "turnover_rate": round(turnover_rate, 4), + "volume_ratio": round(volume_ratio, 2), + "up_limit": round(up_limit, 2) if up_limit else None, + "is_one_price": is_one_price, + "signal": ( + "竞价涨停" if change >= 9.5 else + "强势高开" if change >= 3 else + "高开" if change > 0.2 else + "深度低开" if change <= -3 else + "低开" if change < -0.2 else "平开" + ), + } + ) + normalized.sort(key=lambda item: (item["amount_million"], item["volume_ratio"]), reverse=True) + self.database.upsert_auction_factors(rows) + changes = [item["change"] for item in normalized] + total = len(normalized) + _, baseline_date = self._trade_context(data_date) + candidates, candidate_meta, focus_rows = self._auction_candidates(normalized, baseline_date) + candidate_map = {str(item.get("code") or ""): item for item in candidates} + one_price_rows = [] + for row in normalized: + if not row.get("is_one_price"): + continue + enriched = candidate_map.get(str(row.get("code") or ""), {}) + one_price_rows.append( + { + **row, + **enriched, + "attention_score": None, + "expectation": "", + "expected_change": None, + "expectation_reason": "竞价价格封于当日涨停价,已从普通异动评分中隔离", + } + ) + one_price_codes = {str(item.get("code") or "") for item in one_price_rows} + candidates = [item for item in candidates if str(item.get("code") or "") not in one_price_codes] + focus_rows = [item for item in focus_rows if str(item.get("code") or "") not in one_price_codes] + one_price_rows.sort( + key=lambda item: ( + bool(item.get("is_market_core")), + _number(item.get("prior_streak")), + _number(item.get("amount_million")), + ), + reverse=True, + ) + expectations = { + label: sum(item.get("expectation") == label for item in candidates) + for label in ("超预期", "符合预期", "低于预期") + } + prior_snapshot = self.database.get_snapshot(baseline_date) or {} + themes = self._auction_theme_evidence(prior_snapshot, candidates + one_price_rows) + self._ensure_auction_amount_history(data_date) + amount_history = self._auction_amount_history(data_date) + prior_amounts = [item["amount_billion"] for item in amount_history[:-1]] + current_amount = round(sum(item["amount_million"] for item in normalized) / 100, 2) + previous_amount = prior_amounts[-1] if prior_amounts else 0 + five_day_amounts = prior_amounts[-5:] + five_day_average = sum(five_day_amounts) / len(five_day_amounts) if five_day_amounts else 0 + result = { + "meta": { + "requested_date": _display_date(requested_date), + "trade_date": _display_date(data_date), + "carried_forward": carried_forward, + "available": bool(normalized), + **session, + "cached": False, + "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), + }, + "summary": { + "stock_count": total, + "up_count": sum(value > 0.2 for value in changes), + "down_count": sum(value < -0.2 for value in changes), + "limit_open_count": len(one_price_rows), + "strong_open_count": sum(value >= 3 for value in changes), + "median_change": round(median(changes), 2) if changes else 0, + "amount_billion": current_amount, + "amount_change_previous": round((current_amount / previous_amount - 1) * 100, 1) if previous_amount else None, + "amount_change_5d": round((current_amount / five_day_average - 1) * 100, 1) if five_day_average else None, + "candidate_count": len(candidates), + "focus_count": len(focus_rows), + "one_price_count": len(one_price_rows), + }, + "expectations": expectations, + "candidate_meta": candidate_meta, + "themes": themes, + "amount_history": amount_history, + "news_feedback": { + "available": False, + "message": "隔夜消息反馈暂不可用", + "detail": "待稳定的新闻与公告数据接入后开放", + }, + "focus_rows": focus_rows, + "one_price_rows": one_price_rows, + "rows": candidates, + } + if not live_dynamic: + self.database.save_data_snapshot("auction_center_v6", cache_key, "market", result) + return self._with_auction_watchlist(result, data_date, user_id) + + def _theme_directory(self) -> list[dict[str, Any]]: + cached = self.database.get_data_snapshot("theme_directory_v1", "ths") or {} + if cached.get("items"): + return list(cached["items"]) + rows = self.client.query( + "ths_index", {}, "ts_code,name,count,exchange,list_date,type" + ) + items = [ + { + "code": str(row.get("ts_code") or ""), + "name": str(row.get("name") or ""), + "member_count": int(_number(row.get("count"))), + "list_date": str(row.get("list_date") or ""), + } + for row in rows + if str(row.get("type") or "").upper() == "N" + and str(row.get("exchange") or "").upper() == "A" + and row.get("ts_code") + and row.get("name") + ] + self.database.save_data_snapshot( + "theme_directory_v1", "ths", "market", {"items": items} + ) + return items + + def theme_library(self, requested_date: str, force: bool = False) -> dict[str, Any]: + trade_date, previous_date = self._trade_context(requested_date) + if not force: + cached = self.database.get_data_snapshot("theme_library_v1", trade_date) + if cached: + result = copy.deepcopy(cached) + result["meta"] = {**result.get("meta", {}), "cached": True} + return result + + try: + daily = self.client.query( + "ths_daily", + {"trade_date": trade_date}, + "ts_code,trade_date,open,high,low,close,pre_close,pct_change,vol,turnover_rate", + ) + except TushareError: + fallback = self._latest_feature_snapshot("theme_library_v1", trade_date) + if fallback: + result = copy.deepcopy(fallback) + result["meta"] = { + **result.get("meta", {}), + "requested_date": _display_date(requested_date), + "carried_forward": True, + "cached": True, + "notice": "当前题材行情暂不可用,展示最近有效快照", + } + return result + daily = [] + actual_date = trade_date + carried_forward = False + if not daily and previous_date: + try: + daily = self.client.query( + "ths_daily", + {"trade_date": previous_date}, + "ts_code,trade_date,open,high,low,close,pre_close,pct_change,vol,turnover_rate", + ) + except TushareError: + daily = [] + actual_date = previous_date + carried_forward = bool(daily) + daily_map = {str(row.get("ts_code") or ""): row for row in daily} + try: + hot_rows = self.client.query("ths_hot", {"trade_date": actual_date}) + except TushareError: + hot_rows = [] + hot_map = { + str(row.get("ts_code") or ""): int(_number(row.get("rank"))) + for row in hot_rows + if str(row.get("data_type") or "") == "概念板块" + } + items = [] + for item in self._theme_directory(): + quote = daily_map.get(item["code"], {}) + items.append( + { + **item, + "change": round(_number(quote.get("pct_change")), 2), + "close": round(_number(quote.get("close")), 3), + "turnover_rate": round(_number(quote.get("turnover_rate")), 2), + "volume": round(_number(quote.get("vol")), 2), + "hot_rank": hot_map.get(item["code"]), + "has_quote": bool(quote), + } + ) + items.sort( + key=lambda item: ( + item["has_quote"], + item["hot_rank"] is not None, + -(item["hot_rank"] or 9999), + item["change"], + ), + reverse=True, + ) + quoted = [item for item in items if item["has_quote"]] + result = { + "meta": { + "requested_date": _display_date(requested_date), + "trade_date": _display_date(actual_date), + "carried_forward": carried_forward, + "cached": False, + "notice": "" if quoted else "该交易日暂无题材行情,已保留题材目录", + "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), + }, + "summary": { + "theme_count": len(items), + "quoted_count": len(quoted), + "up_count": sum(item["change"] > 0 for item in quoted), + "down_count": sum(item["change"] < 0 for item in quoted), + "hot_count": len(hot_map), + }, + "items": items, + } + self.database.save_data_snapshot("theme_library_v1", trade_date, "market", result) + return result + + def theme_detail(self, code: str, requested_date: str) -> dict[str, Any]: + code = str(code or "").strip().upper() + library = self.theme_library(requested_date) + theme = next((item for item in library["items"] if item["code"] == code), None) + if not theme: + raise ValueError("未找到对应题材。") + actual_date = str(library["meta"]["trade_date"]).replace("-", "") + detail_key = f"{actual_date}:{code}" + cached_detail = self.database.get_data_snapshot("theme_detail_v1", detail_key) + if cached_detail: + return cached_detail + try: + members = self.client.query( + "ths_member", {"ts_code": code, "is_new": "Y"}, "ts_code,con_code,con_name" + ) + except TushareError: + members = [] + bars = self.database.daily_bars_for_date(actual_date) + if not bars: + bars = self.client.query( + "daily", + {"trade_date": actual_date}, + "ts_code,trade_date,open,high,low,close,pct_chg,vol,amount", + ) + self.database.upsert_daily_bars(bars) + bar_map = {str(row.get("ts_code") or ""): row for row in bars} + normalized_members = [] + for member in members: + ts_code = str(member.get("con_code") or "") + quote = bar_map.get(ts_code, {}) + normalized_members.append( + { + "code": ts_code.split(".")[0], + "ts_code": ts_code, + "name": str(member.get("con_name") or "--"), + "price": round(_number(quote.get("close")), 2), + "change": round(_number(quote.get("pct_chg")), 2), + "amount_billion": round(_number(quote.get("amount")) / 100_000, 2), + "has_quote": bool(quote), + } + ) + normalized_members.sort( + key=lambda item: (item["has_quote"], item["change"], item["amount_billion"]), + reverse=True, + ) + end = datetime.strptime(actual_date, "%Y%m%d") + try: + history = self.client.query( + "ths_daily", + { + "ts_code": code, + "start_date": (end - timedelta(days=190)).strftime("%Y%m%d"), + "end_date": actual_date, + }, + "ts_code,trade_date,open,high,low,close,pct_change,vol,turnover_rate", + ) + except TushareError: + history = [] + history.sort(key=lambda row: str(row.get("trade_date") or "")) + series = [ + { + "trade_date": _display_date(str(row.get("trade_date") or "")), + "open": _number(row.get("open")), + "high": _number(row.get("high")), + "low": _number(row.get("low")), + "close": _number(row.get("close")), + "change": _number(row.get("pct_change")), + "volume": _number(row.get("vol")), + } + for row in history[-90:] + ] + result = { + "meta": { + "trade_date": _display_date(actual_date), + "notice": "" if members or history else "题材成分与走势暂不可用", + }, + "theme": theme, + "series": series, + "members": normalized_members, + "summary": { + "member_count": len(normalized_members), + "up_count": sum(item["change"] > 0 for item in normalized_members if item["has_quote"]), + "down_count": sum(item["change"] < 0 for item in normalized_members if item["has_quote"]), + "quoted_count": sum(item["has_quote"] for item in normalized_members), + }, + } + if members or history: + self.database.save_data_snapshot("theme_detail_v1", detail_key, "market", result) + return result + + @staticmethod + def _parse_concepts(value: Any) -> list[str]: + if isinstance(value, list): + return [str(item) for item in value if str(item).strip()] + text = str(value or "").strip() + if not text: + return [] + try: + parsed = json.loads(text) + if isinstance(parsed, list): + return [str(item) for item in parsed if str(item).strip()] + except json.JSONDecodeError: + pass + return [part.strip() for part in text.split(",") if part.strip()] + + def popularity(self, requested_date: str, force: bool = False) -> dict[str, Any]: + trade_date, previous_date = self._trade_context(requested_date) + if not force: + cached = self.database.get_data_snapshot("popularity_v1", trade_date) + if cached: + result = copy.deepcopy(cached) + result["meta"] = {**result.get("meta", {}), "cached": True} + return result + + ths_rows, dc_rows, errors = self._hot_rows(trade_date) + actual_date = trade_date + carried_forward = False + if not ths_rows and not dc_rows and previous_date: + ths_rows, dc_rows, errors = self._hot_rows(previous_date) + actual_date = previous_date + carried_forward = bool(ths_rows or dc_rows) + if not ths_rows and not dc_rows: + fallback = self._latest_feature_snapshot("popularity_v1", trade_date) + if fallback: + result = copy.deepcopy(fallback) + result["meta"] = { + **result.get("meta", {}), + "requested_date": _display_date(requested_date), + "carried_forward": True, + "cached": True, + "notice": "当前榜单暂不可用,展示最近有效快照", + } + return result + return { + "meta": { + "requested_date": _display_date(requested_date), + "trade_date": _display_date(trade_date), + "previous_trade_date": _display_date(previous_date), + "carried_forward": False, + "cached": False, + "notice": "该交易日暂无可用人气榜", + "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), + }, + "summary": {"ths_count": 0, "dc_count": 0, "dual_count": 0}, + "combined": [], "ths": [], "dc": [], + } + + prior_request = (datetime.strptime(actual_date, "%Y%m%d") - timedelta(days=1)).strftime("%Y%m%d") + prior_date, _ = self._trade_context(prior_request) + previous_ths, previous_dc, _ = self._hot_rows(prior_date) + ths = self._normalize_hot(ths_rows, "热股", previous_ths) + dc = self._normalize_hot(dc_rows, "A股市场", previous_dc) + ths_map = {item["ts_code"]: item for item in ths} + dc_map = {item["ts_code"]: item for item in dc} + combined = [] + for ts_code in set(ths_map) | set(dc_map): + ths_item = ths_map.get(ts_code) + dc_item = dc_map.get(ts_code) + base = ths_item or dc_item or {} + ths_rank = int(ths_item["rank"]) if ths_item else None + dc_rank = int(dc_item["rank"]) if dc_item else None + score = ( + (101 - (ths_rank or 101)) * 0.5 + + (201 - (dc_rank or 201)) * 0.25 + ) + combined.append( + { + **base, + "ths_rank": ths_rank, + "dc_rank": dc_rank, + "score": round(score, 2), + "dual_source": bool(ths_item and dc_item), + "concepts": (ths_item or {}).get("concepts") or [], + } + ) + combined.sort(key=lambda item: (item["dual_source"], item["score"]), reverse=True) + for index, item in enumerate(combined, 1): + item["rank"] = index + result = { + "meta": { + "requested_date": _display_date(requested_date), + "trade_date": _display_date(actual_date), + "previous_trade_date": _display_date(prior_date), + "carried_forward": carried_forward, + "cached": False, + "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), + "notice": ";".join(errors), + }, + "summary": { + "ths_count": len(ths), + "dc_count": len(dc), + "dual_count": sum(item["dual_source"] for item in combined), + }, + "combined": combined[:200], + "ths": ths, + "dc": dc, + } + self.database.save_data_snapshot("popularity_v1", trade_date, "market", result) + return result + + def _hot_rows(self, trade_date: str) -> tuple[list[dict[str, Any]], list[dict[str, Any]], list[str]]: + errors = [] + try: + ths = self.client.query("ths_hot", {"trade_date": trade_date}) + except TushareError: + ths = [] + errors.append("同花顺榜单暂不可用") + try: + dc = self.client.query("dc_hot", {"trade_date": trade_date}) + except TushareError: + dc = [] + errors.append("东方财富榜单暂不可用") + return ths, dc, errors + + def _normalize_hot( + self, + rows: list[dict[str, Any]], + data_type: str, + previous_rows: list[dict[str, Any]], + ) -> list[dict[str, Any]]: + previous = { + str(row.get("ts_code") or ""): int(_number(row.get("rank"))) + for row in previous_rows + if str(row.get("data_type") or "") == data_type + } + items = [] + for row in rows: + if str(row.get("data_type") or "") != data_type: + continue + rank = int(_number(row.get("rank"))) + ts_code = str(row.get("ts_code") or "") + prior_rank = previous.get(ts_code) + items.append( + { + "rank": rank, + "ts_code": ts_code, + "code": ts_code.split(".")[0], + "name": str(row.get("ts_name") or "--"), + "change": round(_number(row.get("pct_change")), 2), + "price": round(_number(row.get("current_price")), 2), + "hot": round(_number(row.get("hot")), 1), + "rank_change": (prior_rank - rank) if prior_rank else None, + "concepts": self._parse_concepts(row.get("concept")), + "reason": str(row.get("rank_reason") or ""), + "rank_time": str(row.get("rank_time") or ""), + } + ) + items.sort(key=lambda item: item["rank"]) + return items diff --git a/app/backend/features/market/service.py b/app/backend/features/market/service.py index f4e29db..935037e 100644 --- a/app/backend/features/market/service.py +++ b/app/backend/features/market/service.py @@ -14,6 +14,7 @@ from backend.bootstrap.config import ( from backend.data.providers.ifind_client import IfindError from backend.data.providers.tushare_client import TushareClient, TushareError from backend.features.market.charts import ChartDataError +from backend.features.market.insights import MarketInsightsService from backend.features.sentiment.engine import SENTIMENT_ENGINE_VERSION @@ -36,6 +37,14 @@ THS_SEARCH_TYPES = { class MarketServiceMixin: + def _market_insights(self) -> MarketInsightsService: + if not self.configured: + raise ValueError("行情数据尚未配置。") + return MarketInsightsService( + self.database, + self._tushare_client(), + ifind=self.ifind, + ) def _tushare_client(self) -> TushareClient: gateway = getattr(self, "data_gateway", None) if gateway is not None: diff --git a/app/backend/features/popularity/__init__.py b/app/backend/features/popularity/__init__.py new file mode 100644 index 0000000..049ea59 --- /dev/null +++ b/app/backend/features/popularity/__init__.py @@ -0,0 +1,4 @@ +from .repository import PopularityRepositoryMixin +from .service import PopularityServiceMixin + +__all__ = ["PopularityRepositoryMixin", "PopularityServiceMixin"] diff --git a/app/backend/features/popularity/repository.py b/app/backend/features/popularity/repository.py new file mode 100644 index 0000000..52682e8 --- /dev/null +++ b/app/backend/features/popularity/repository.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from typing import Any + + +class PopularityRepositoryMixin: + def upsert_popularity_factors(self, rows: list[dict[str, Any]]) -> int: + values = [ + ( + str(row.get("trade_date") or ""), + str(row.get("ts_code") or ""), + int(row["ths_rank"]) if row.get("ths_rank") not in (None, "") else None, + int(row["dc_rank"]) if row.get("dc_rank") not in (None, "") else None, + float(row.get("combined_score") or 0), + int(row["rank_change"]) if row.get("rank_change") not in (None, "") else None, + int(bool(row.get("dual_source"))), + ) + for row in rows + if row.get("trade_date") and row.get("ts_code") + ] + with self.connect() as connection: + connection.executemany( + """ + INSERT INTO popularity_factors + (trade_date, ts_code, ths_rank, dc_rank, combined_score, + rank_change, dual_source) + VALUES (?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(trade_date, ts_code) DO UPDATE SET + ths_rank=excluded.ths_rank, + dc_rank=excluded.dc_rank, + combined_score=excluded.combined_score, + rank_change=excluded.rank_change, + dual_source=excluded.dual_source + """, + values, + ) + return len(values) diff --git a/app/backend/features/popularity/service.py b/app/backend/features/popularity/service.py new file mode 100644 index 0000000..7380237 --- /dev/null +++ b/app/backend/features/popularity/service.py @@ -0,0 +1,11 @@ +from __future__ import annotations + +from typing import Any + +from backend.bootstrap.config import normalize_date +from backend.features.market.insights import MarketInsightsService + + +class PopularityServiceMixin: + def popularity(self, trade_date: str, force: bool = False) -> dict[str, Any]: + return self._market_insights().popularity(normalize_date(trade_date), force) diff --git a/app/backend/features/themes/__init__.py b/app/backend/features/themes/__init__.py new file mode 100644 index 0000000..6609ed1 --- /dev/null +++ b/app/backend/features/themes/__init__.py @@ -0,0 +1,3 @@ +from .service import ThemeServiceMixin + +__all__ = ["ThemeServiceMixin"] diff --git a/app/backend/features/themes/service.py b/app/backend/features/themes/service.py new file mode 100644 index 0000000..2647c69 --- /dev/null +++ b/app/backend/features/themes/service.py @@ -0,0 +1,14 @@ +from __future__ import annotations + +from typing import Any + +from backend.bootstrap.config import normalize_date +from backend.features.market.insights import MarketInsightsService + + +class ThemeServiceMixin: + def theme_library(self, trade_date: str, force: bool = False) -> dict[str, Any]: + return self._market_insights().theme_library(normalize_date(trade_date), force) + + def theme_detail(self, code: str, trade_date: str) -> dict[str, Any]: + return self._market_insights().theme_detail(code, normalize_date(trade_date)) diff --git a/app/database.py b/app/database.py index 8fe4266..35896fc 100644 --- a/app/database.py +++ b/app/database.py @@ -8,8 +8,11 @@ from typing import Any from backend.database import MIGRATIONS, MigrationRunner, SQLiteConnectionFactory from backend.features.accounts.repository import AccountRepositoryMixin +from backend.features.auction.repository import AuctionRepositoryMixin +from backend.features.dragon_tiger.repository import DragonTigerRepositoryMixin from backend.features.market.repository import MarketRepositoryMixin from backend.features.pools.repository import PoolRepositoryMixin +from backend.features.popularity.repository import PopularityRepositoryMixin from backend.features.system.repository import SystemSettingsRepositoryMixin @@ -24,8 +27,11 @@ def _optional_float(value: Any) -> float | None: class ReviewDatabase( AccountRepositoryMixin, + AuctionRepositoryMixin, + DragonTigerRepositoryMixin, MarketRepositoryMixin, PoolRepositoryMixin, + PopularityRepositoryMixin, SystemSettingsRepositoryMixin, ): def __init__(self, path: Path) -> None: @@ -839,24 +845,6 @@ class ReviewDatabase( return cursor.rowcount > 0 - def list_seat_aliases(self) -> dict[str, str]: - with self.connect() as connection: - rows = connection.execute("SELECT seat_name, alias FROM seat_aliases").fetchall() - return {row["seat_name"]: row["alias"] for row in rows} - - def save_seat_alias(self, seat_name: str, alias: str) -> None: - now = datetime.now().astimezone().isoformat(timespec="seconds") - with self.connect() as connection: - connection.execute( - """ - INSERT INTO seat_aliases (seat_name, alias, updated_at) - VALUES (?, ?, ?) - ON CONFLICT(seat_name) DO UPDATE SET - alias = excluded.alias, - updated_at = excluded.updated_at - """, - (seat_name, alias, now), - ) def list_sector_phase_overrides(self) -> dict[str, str]: with self.connect() as connection: @@ -1056,44 +1044,6 @@ class ReviewDatabase( ) return len(values) - def upsert_auction_factors(self, rows: list[dict[str, Any]]) -> int: - values = [] - for row in rows: - trade_date = str(row.get("trade_date") or "") - ts_code = str(row.get("ts_code") or "") - price = float(row.get("price") or 0) - pre_close = float(row.get("pre_close") or 0) - if not trade_date or not ts_code or price <= 0 or pre_close <= 0: - continue - values.append( - ( - trade_date, - ts_code, - price, - pre_close, - (price / pre_close - 1) * 100, - float(row.get("vol") or 0), - float(row.get("amount") or 0), - float(row.get("turnover_rate") or 0), - float(row.get("volume_ratio") or 0), - ) - ) - with self.connect() as connection: - connection.executemany( - """ - INSERT INTO auction_factors - (trade_date, ts_code, price, pre_close, change, vol, amount, - turnover_rate, volume_ratio) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) - ON CONFLICT(trade_date, ts_code) DO UPDATE SET - price=excluded.price, pre_close=excluded.pre_close, - change=excluded.change, vol=excluded.vol, amount=excluded.amount, - turnover_rate=excluded.turnover_rate, - volume_ratio=excluded.volume_ratio - """, - values, - ) - return len(values) def upsert_earnings_events(self, rows: list[dict[str, Any]]) -> int: values = [ @@ -1130,84 +1080,7 @@ class ReviewDatabase( ) return len(values) - def upsert_popularity_factors(self, rows: list[dict[str, Any]]) -> int: - values = [ - ( - str(row.get("trade_date") or ""), - str(row.get("ts_code") or ""), - int(row["ths_rank"]) if row.get("ths_rank") not in (None, "") else None, - int(row["dc_rank"]) if row.get("dc_rank") not in (None, "") else None, - float(row.get("combined_score") or 0), - int(row["rank_change"]) if row.get("rank_change") not in (None, "") else None, - int(bool(row.get("dual_source"))), - ) - for row in rows - if row.get("trade_date") and row.get("ts_code") - ] - with self.connect() as connection: - connection.executemany( - """ - INSERT INTO popularity_factors - (trade_date, ts_code, ths_rank, dc_rank, combined_score, - rank_change, dual_source) - VALUES (?, ?, ?, ?, ?, ?, ?) - ON CONFLICT(trade_date, ts_code) DO UPDATE SET - ths_rank=excluded.ths_rank, - dc_rank=excluded.dc_rank, - combined_score=excluded.combined_score, - rank_change=excluded.rank_change, - dual_source=excluded.dual_source - """, - values, - ) - return len(values) - def upsert_lhb_institutions(self, rows: list[dict[str, Any]]) -> int: - grouped: dict[tuple[str, str], dict[str, float | int]] = {} - for row in rows: - trade_date = str(row.get("trade_date") or "") - ts_code = str(row.get("ts_code") or "") - seat_name = str(row.get("exalter") or row.get("seat_name") or "") - if not trade_date or not ts_code or "机构专用" not in seat_name: - continue - group = grouped.setdefault( - (trade_date, ts_code), - {"net": 0.0, "buy": 0.0, "sell": 0.0, "seats": 0}, - ) - group["net"] = float(group["net"]) + float(row.get("net_buy") or row.get("net_amount") or 0) - group["buy"] = float(group["buy"]) + float(row.get("buy") or row.get("buy_amount") or 0) - group["sell"] = float(group["sell"]) + float(row.get("sell") or row.get("sell_amount") or 0) - group["seats"] = int(group["seats"]) + 1 - values = [ - (trade_date, ts_code, item["net"], item["buy"], item["sell"], item["seats"]) - for (trade_date, ts_code), item in grouped.items() - ] - with self.connect() as connection: - connection.executemany( - """ - INSERT INTO lhb_institution_daily - (trade_date, ts_code, net_buy_amount, buy_amount, sell_amount, seat_count) - VALUES (?, ?, ?, ?, ?, ?) - ON CONFLICT(trade_date, ts_code) DO UPDATE SET - net_buy_amount=excluded.net_buy_amount, - buy_amount=excluded.buy_amount, - sell_amount=excluded.sell_amount, - seat_count=excluded.seat_count - """, - values, - ) - return len(values) - - def auction_factor_dates(self, end_date: str = "", limit: int = 80) -> list[str]: - where = "WHERE trade_date <= ?" if end_date else "" - parameters: tuple[Any, ...] = (end_date, limit) if end_date else (limit,) - with self.connect() as connection: - rows = connection.execute( - f"SELECT DISTINCT trade_date FROM auction_factors {where} " - "ORDER BY trade_date DESC LIMIT ?", - parameters, - ).fetchall() - return [row["trade_date"] for row in reversed(rows)] def daily_indicator_dates(self, end_date: str = "", limit: int = 400) -> list[str]: where = "WHERE trade_date <= ?" if end_date else "" @@ -1227,13 +1100,6 @@ class ReviewDatabase( ).fetchall() return [str(row["end_date"]) for row in rows] - def auction_factors_for_date(self, trade_date: str) -> list[dict[str, Any]]: - with self.connect() as connection: - rows = connection.execute( - "SELECT * FROM auction_factors WHERE trade_date = ? ORDER BY ts_code", - (trade_date,), - ).fetchall() - return [dict(row) for row in rows] def daily_bars_for_date(self, trade_date: str) -> list[dict[str, Any]]: with self.connect() as connection: diff --git a/app/market_insights.py b/app/market_insights.py index 8ee5dad..33ca0c0 100644 --- a/app/market_insights.py +++ b/app/market_insights.py @@ -1,1312 +1 @@ -from __future__ import annotations - -import copy -import json -from datetime import datetime, time as dt_time, timedelta, timezone -from statistics import median -from typing import Any, Callable - -from database import ReviewDatabase -from ifind_client import IfindError, IfindHttpClient -from tushare_client import TushareClient, TushareError - - -CHINA_TIMEZONE = timezone(timedelta(hours=8)) - - -def _number(value: Any, default: float = 0.0) -> float: - try: - number = float(value) - return number if number == number else default - except (TypeError, ValueError): - return default - - -def _display_date(value: str) -> str: - text = str(value or "").replace("-", "") - if len(text) != 8: - return str(value or "") - return f"{text[:4]}-{text[4:6]}-{text[6:]}" - - -class MarketInsightsService: - """Read-only market features backed by Tushare and shared SQLite caches.""" - - def __init__( - self, - database: ReviewDatabase, - client: TushareClient, - now_provider: Callable[[], datetime] | None = None, - ifind: IfindHttpClient | None = None, - ) -> None: - self.database = database - self.client = client - self._now_provider = now_provider or (lambda: datetime.now(CHINA_TIMEZONE)) - self.ifind = ifind - - def _trade_context(self, requested_date: str) -> tuple[str, str]: - """Resolve trading dates without making cached feature pages depend on Tushare uptime.""" - requested = str(requested_date or "").replace("-", "") - try: - return self.client.resolve_trade_context(requested) - except TushareError: - latest = self.database.get_latest_real_snapshot(requested) or {} - trade_date = str( - (latest.get("meta") or {}).get("trade_date") - or latest.get("_snapshot_date") - or requested - ).replace("-", "") - previous = self.database.get_latest_real_snapshot(trade_date, strictly_before=True) or {} - previous_date = str( - (previous.get("meta") or {}).get("trade_date") - or previous.get("_snapshot_date") - or "" - ).replace("-", "") - return trade_date, previous_date - - def _latest_feature_snapshot(self, kind: str, trade_date: str) -> dict[str, Any] | None: - return self.database.get_latest_data_snapshot(kind, "", trade_date) - - def _auction_session(self, requested_date: str, trade_date: str) -> dict[str, Any]: - now = self._now_provider() - if now.tzinfo is None: - now = now.replace(tzinfo=CHINA_TIMEZONE) - else: - now = now.astimezone(CHINA_TIMEZONE) - requested = str(requested_date or "").replace("-", "") - today = now.strftime("%Y%m%d") - if requested != today or trade_date != today: - return { - "phase": "archive", - "actionable": False, - "next_transition_at": "", - } - - local_time = now.time().replace(tzinfo=None) - transitions = ( - (dt_time(9, 15), "pending", dt_time(9, 15)), - (dt_time(9, 25), "observing", dt_time(9, 25)), - (dt_time(9, 30), "selection", dt_time(9, 30)), - ) - for boundary, phase, next_boundary in transitions: - if local_time < boundary: - transition = now.replace( - hour=next_boundary.hour, - minute=next_boundary.minute, - second=0, - microsecond=0, - ) - return { - "phase": phase, - "actionable": phase == "selection", - "next_transition_at": transition.isoformat(timespec="seconds"), - } - return { - "phase": "finalized", - "actionable": False, - "next_transition_at": "", - } - - def _stock_master(self) -> dict[str, dict[str, Any]]: - rows = self.database.list_stock_master() - if not rows: - rows = self.client.query( - "stock_basic", - {"list_status": "L"}, - "ts_code,name,industry,market,list_date", - ) - self.database.upsert_stock_master(rows) - rows = self.database.list_stock_master() - return {str(row.get("ts_code") or ""): row for row in rows} - - @staticmethod - def _expectation_label(actual_strength: float, expected_change: float) -> str: - difference = actual_strength - expected_change - if difference >= 1.5: - return "超预期" - if difference <= -1.5: - return "低于预期" - return "符合预期" - - @staticmethod - def _auction_confirmation(row: dict[str, Any]) -> float: - volume_ratio = _number(row.get("volume_ratio")) - turnover_rate = _number(row.get("turnover_rate")) - amount_million = _number(row.get("amount_million")) - return ( - (0.6 if volume_ratio >= 2 else 0.3 if volume_ratio >= 1.2 else -0.5 if volume_ratio < 0.6 else 0) - + (0.25 if turnover_rate >= 0.15 else -0.25 if turnover_rate < 0.03 else 0) - + (0.3 if amount_million >= 20 else 0.15 if amount_million >= 5 else -0.3 if amount_million < 1 else 0) - ) - - @staticmethod - def _attention_score( - row: dict[str, Any], - expected_change: float, - core_tags: list[str], - sources: list[str], - prior_streak: int, - strong_sector: bool, - ) -> float: - if core_tags: - identity_score = 35.0 - elif prior_streak >= 2: - identity_score = 27.0 - elif any(source in {"昨日涨停", "昨日炸板"} for source in sources): - identity_score = 21.0 - else: - identity_score = 14.0 - deviation_score = min(30.0, abs(_number(row.get("change")) - expected_change) * 5) - volume_score = min(10.0, max(0.0, _number(row.get("volume_ratio"))) / 2 * 10) - amount_score = min(6.0, max(0.0, _number(row.get("amount_million"))) / 10 * 6) - turnover_score = min(4.0, max(0.0, _number(row.get("turnover_rate"))) / 0.2 * 4) - theme_score = 15.0 if strong_sector else 7.0 if row.get("concepts") else 0.0 - return round(min(100.0, identity_score + deviation_score + volume_score + amount_score + turnover_score + theme_score), 1) - - def _auction_candidates( - self, - rows: list[dict[str, Any]], - baseline_date: str, - ) -> tuple[list[dict[str, Any]], dict[str, Any], list[dict[str, Any]]]: - """Build a narrow, explainable universe from prior limits, breaks and top-20 hot lists.""" - snapshot = self.database.get_snapshot(baseline_date) or {} - prior_limits = list(snapshot.get("limits") or []) - prior_broken = list(snapshot.get("broken") or []) - prior_sectors = list(snapshot.get("sectors") or []) - strong_sector_names = { - str(item.get("name") or "") for item in prior_sectors[:5] if item.get("name") - } - ths_rows, dc_rows, errors = self._hot_rows(baseline_date) - candidates: dict[str, dict[str, Any]] = {} - core_tags: dict[str, set[str]] = {} - - def ensure_candidate(item: dict[str, Any]) -> dict[str, Any] | None: - code = str(item.get("code") or str(item.get("ts_code") or "").split(".")[0]) - if not code: - return None - return candidates.setdefault( - code, - { - "sources": [], - "streak": 0, - "sector": str(item.get("sector") or "其他"), - "name": str(item.get("name") or item.get("ts_name") or "--"), - "concepts": [], - "ths_rank": None, - "dc_rank": None, - }, - ) - - for item in prior_limits: - candidate = ensure_candidate(item) - if candidate is None: - continue - candidate["sources"].append("昨日涨停") - candidate["streak"] = max(1, int(_number(item.get("streak"), 1))) - - for item in prior_broken: - candidate = ensure_candidate(item) - if candidate is not None and "昨日炸板" not in candidate["sources"]: - candidate["sources"].append("昨日炸板") - - limit_streaks = [max(1, int(_number(item.get("streak"), 1))) for item in prior_limits] - highest_streak = max(limit_streaks, default=0) - for item in prior_limits: - code = str(item.get("code") or "") - streak = max(1, int(_number(item.get("streak"), 1))) - if streak >= 3: - core_tags.setdefault(code, set()).add("三板以上") - if highest_streak and streak == highest_streak: - core_tags.setdefault(code, set()).add("市场最高板") - - for sector in prior_sectors[:5]: - name = str(sector.get("name") or "") - members = [item for item in prior_limits if str(item.get("sector") or "其他") == name] - if not members: - continue - leader = max( - members, - key=lambda item: ( - int(_number(item.get("streak"), 1)), - _number(item.get("amount_billion")), - -_number(item.get("open_times")), - ), - ) - core_tags.setdefault(str(leader.get("code") or ""), set()).add("题材核心") - - leadership = sorted( - prior_limits, - key=lambda item: ( - int(_number(item.get("streak"), 1)), - str(item.get("sector") or "") in strong_sector_names, - _number(item.get("amount_billion")), - ), - reverse=True, - ) - if leadership: - core_tags.setdefault(str(leadership[0].get("code") or ""), set()).add("市场领涨") - - hot_records: dict[str, dict[str, Any]] = {} - - for source, hot_rows, data_type in ( - ("同花顺热榜", ths_rows, "热股"), - ("东方财富热榜", dc_rows, "A股市场"), - ): - for item in hot_rows: - if str(item.get("data_type") or "") != data_type: - continue - ts_code = str(item.get("ts_code") or "") - code = ts_code.split(".")[0] - rank = max(1, int(_number(item.get("rank"), 9999))) - if not code or rank > 20: - continue - hot = hot_records.setdefault( - code, - { - "name": str(item.get("ts_name") or "--"), - "concepts": [], - "ths_rank": None, - "dc_rank": None, - }, - ) - hot["ths_rank" if source == "同花顺热榜" else "dc_rank"] = rank - if source == "同花顺热榜": - hot["concepts"] = self._parse_concepts(item.get("concept")) - - ranked_hot = sorted( - hot_records.items(), - key=lambda pair: ( - ((21 - (pair[1].get("ths_rank") or 21)) / 20) - + ((21 - (pair[1].get("dc_rank") or 21)) / 20) - + (0.35 if pair[1].get("ths_rank") and pair[1].get("dc_rank") else 0) - ), - reverse=True, - ) - for code, _ in ranked_hot[:5]: - core_tags.setdefault(code, set()).add("人气前5") - - for code, hot in hot_records.items(): - ranks = [rank for rank in (hot.get("ths_rank"), hot.get("dc_rank")) if isinstance(rank, int)] - dual = len(ranks) == 2 - if not ranks or (min(ranks) > 10 and not dual and code not in candidates and code not in core_tags): - continue - candidate = candidates.setdefault( - code, - { - "sources": [], - "streak": 0, - "sector": "其他", - "name": hot["name"], - "concepts": [], - "ths_rank": None, - "dc_rank": None, - }, - ) - candidate["ths_rank"] = hot.get("ths_rank") - candidate["dc_rank"] = hot.get("dc_rank") - candidate["concepts"] = hot.get("concepts") or [] - if hot.get("ths_rank") and "同花顺热榜" not in candidate["sources"]: - candidate["sources"].append("同花顺热榜") - if hot.get("dc_rank") and "东方财富热榜" not in candidate["sources"]: - candidate["sources"].append("东方财富热榜") - - normalized = [] - for row in rows: - candidate = candidates.get(str(row.get("code") or "")) - if not candidate: - continue - streak = int(candidate["streak"]) - expected_change = {1: 1.5, 2: 3.0, 3: 4.0}.get(streak, 5.0 if streak else 0.5) - ranks = [ - rank for rank in (candidate.get("ths_rank"), candidate.get("dc_rank")) - if isinstance(rank, int) - ] - if len(ranks) == 2: - expected_change += 0.8 - elif ranks: - best_rank = min(ranks) - expected_change += 0.7 if best_rank <= 10 else 0.4 if best_rank <= 30 else 0.2 - expected_change = min(expected_change, 6.5) - - volume_ratio = _number(row.get("volume_ratio")) - turnover_rate = _number(row.get("turnover_rate")) - amount_million = _number(row.get("amount_million")) - confirmation = self._auction_confirmation(row) - actual_strength = _number(row.get("change")) + confirmation - label = self._expectation_label(actual_strength, expected_change) - is_broken = "昨日炸板" in candidate["sources"] and "昨日涨停" not in candidate["sources"] - identity = f"昨日{streak}板" if streak > 1 else "昨日首板" if streak == 1 else "昨日炸板" if is_broken else "人气榜标的" - popularity = ",双榜共识" if len(ranks) == 2 else ",热榜靠前" if ranks and min(ranks) <= 10 else "" - difference = _number(row.get("change")) - expected_change - direction = "高于" if difference > 0 else "低于" if difference < 0 else "贴合" - reason = ( - f"{identity}{popularity};竞价涨幅{direction}预期中枢" - f"{abs(difference):.1f}个百分点,量比{volume_ratio:.2f}" - ) - tags = sorted(core_tags.get(str(row.get("code") or ""), set())) - scored_row = { - **row, - "concepts": candidate["concepts"], - } - attention_score = self._attention_score( - scored_row, - expected_change, - tags, - candidate["sources"], - streak, - str(candidate.get("sector") or row.get("sector") or "") in strong_sector_names, - ) - normalized.append( - { - **scored_row, - "sector": candidate["sector"] if candidate["sector"] != "其他" else row.get("sector", "其他"), - "candidate_sources": candidate["sources"], - "source_label": " · ".join(candidate["sources"]), - "prior_streak": streak, - "concepts": candidate["concepts"], - "expected_change": round(expected_change, 2), - "actual_strength": round(actual_strength, 2), - "expectation": label, - "attention_score": attention_score, - "core_tags": tags, - "is_market_core": bool(tags), - "expectation_reason": reason, - } - ) - normalized.sort(key=lambda item: (_number(item.get("attention_score")), _number(item.get("amount_million"))), reverse=True) - matched_top = { - str(item.get("code") or "") - for item in sorted( - (item for item in normalized if item.get("expectation") == "符合预期"), - key=lambda item: _number(item.get("attention_score")), - reverse=True, - )[:20] - } - focus_candidates = [ - item for item in normalized - if item.get("is_market_core") - or (_number(item.get("attention_score")) >= 55 and item.get("expectation") != "符合预期") - or str(item.get("code") or "") in matched_top - ] - mandatory = [item for item in focus_candidates if item.get("is_market_core")] - mandatory_codes = {str(item.get("code") or "") for item in mandatory} - optional = [item for item in focus_candidates if str(item.get("code") or "") not in mandatory_codes] - focus_rows = sorted(mandatory, key=lambda item: _number(item.get("attention_score")), reverse=True) - focus_rows.extend(optional[:max(0, 30 - len(focus_rows))]) - focus_rows.sort(key=lambda item: _number(item.get("attention_score")), reverse=True) - return normalized, { - "baseline_date": _display_date(baseline_date), - "prior_limit_count": len(prior_limits), - "prior_broken_count": len(prior_broken), - "hot_candidate_count": sum( - any(source in {"同花顺热榜", "东方财富热榜"} for source in item["sources"]) - for item in candidates.values() - ), - "core_count": sum(bool(item.get("is_market_core")) for item in normalized), - "notice": ";".join(errors), - }, focus_rows - - @staticmethod - def _auction_theme_evidence( - prior_snapshot: dict[str, Any], - candidate_rows: list[dict[str, Any]], - ) -> dict[str, list[dict[str, Any]]]: - prior_sectors = list(prior_snapshot.get("sectors") or []) - carry = [] - for sector in prior_sectors[:10]: - name = str(sector.get("name") or "其他") - matched = [row for row in candidate_rows if str(row.get("sector") or "其他") == name] - changes = [_number(row.get("change")) for row in matched] - middle = median(changes) if changes else -10.0 - positive_rate = sum(value > 0.2 for value in changes) / len(changes) * 100 if changes else 0.0 - if middle >= 2 and positive_rate >= 60: - status = "强承接" - elif middle >= 0 and positive_rate >= 50: - status = "有承接" - elif middle > -2: - status = "分歧" - else: - status = "承接弱" - carry.append( - { - "name": name, - "status": status, - "prior_limit_count": int(_number(sector.get("count"))), - "leader": str(sector.get("leader") or "--"), - "matched_count": len(matched), - "median_change": round(middle, 2) if matched else None, - "positive_rate": round(positive_rate, 1), - "amount_million": round(sum(_number(row.get("amount_million")) for row in matched), 2), - } - ) - - concept_groups: dict[str, list[dict[str, Any]]] = {} - prior_names = {str(item.get("name") or "") for item in prior_sectors} - for row in candidate_rows: - for concept in row.get("concepts") or []: - if concept and concept not in prior_names: - concept_groups.setdefault(str(concept), []).append(row) - new_themes = [] - for name, members in concept_groups.items(): - unique = {str(item.get("code") or ""): item for item in members} - values = list(unique.values()) - changes = [_number(item.get("change")) for item in values] - if len(values) < 2 or median(changes) < 2 or sum(value > 0.2 for value in changes) / len(values) < 0.67: - continue - new_themes.append( - { - "name": name, - "stock_count": len(values), - "median_change": round(median(changes), 2), - "amount_million": round(sum(_number(item.get("amount_million")) for item in values), 2), - "leaders": [str(item.get("name") or "--") for item in sorted(values, key=lambda value: _number(value.get("change")), reverse=True)[:3]], - } - ) - new_themes.sort(key=lambda item: (item["stock_count"], item["median_change"], item["amount_million"]), reverse=True) - return {"carry": carry, "new_themes": new_themes[:8]} - - def _auction_amount_history(self, trade_date: str) -> list[dict[str, Any]]: - dates = self.database.auction_factor_dates(trade_date, 10) - stock_list_dates = { - str(item.get("ts_code") or ""): str(item.get("list_date") or "") - for item in self.database.list_stock_master() - if item.get("ts_code") - } - history = [] - for current_date in dates: - rows = [ - row for row in self.database.auction_factors_for_date(current_date) - if ( - str(row.get("ts_code") or "") in stock_list_dates - and ( - not stock_list_dates[str(row.get("ts_code") or "")] - or stock_list_dates[str(row.get("ts_code") or "")] < current_date - ) - ) - ] - history.append( - { - "trade_date": _display_date(current_date), - "amount_billion": round(sum(_number(row.get("amount")) for row in rows) / 100_000_000, 2), - "stock_count": len(rows), - } - ) - return history - - def _ensure_auction_amount_history(self, trade_date: str, target_days: int = 10) -> None: - existing = set(self.database.auction_factor_dates(trade_date, target_days + 5)) - if len(existing) >= target_days: - return - end = datetime.strptime(trade_date, "%Y%m%d") - start = (end - timedelta(days=35)).strftime("%Y%m%d") - try: - calendar = self.client.query( - "trade_cal", - { - "exchange": "SSE", - "start_date": start, - "end_date": trade_date, - "is_open": 1, - }, - "cal_date,is_open", - ) - except TushareError: - return - dates = sorted( - str(item.get("cal_date") or "") - for item in calendar - if int(_number(item.get("is_open"))) == 1 and item.get("cal_date") - )[-target_days:] - for current_date in dates: - if current_date in existing: - continue - try: - rows = self.client.query( - "stk_auction", - {"trade_date": current_date}, - "ts_code,trade_date,vol,price,amount,pre_close,turnover_rate,volume_ratio,float_share", - ) - except TushareError: - break - if rows: - self.database.upsert_auction_factors(rows) - existing.add(current_date) - - def _with_auction_watchlist( - self, - result: dict[str, Any], - trade_date: str, - user_id: int, - ) -> dict[str, Any]: - personalized = copy.deepcopy(result) - if not user_id: - personalized["watchlist_rows"] = [] - personalized["watchlist_missing_count"] = 0 - return personalized - watched = self.database.list_watchlist(user_id) - if not watched: - personalized["watchlist_rows"] = [] - personalized["watchlist_missing_count"] = 0 - return personalized - - public_rows = { - str(item.get("code") or ""): item - for item in ( - list(personalized.get("rows") or []) - + list(personalized.get("one_price_rows") or []) - ) - } - factors = { - str(item.get("ts_code") or "").split(".")[0]: item - for item in self.database.auction_factors_for_date(trade_date) - } - master = { - str(item.get("ts_code") or "").split(".")[0]: item - for item in self.database.list_stock_master() - } - rows = [] - missing = 0 - for item in watched: - code = str(item.get("code") or "") - if code in public_rows: - rows.append({**public_rows[code], "is_watchlist": True}) - continue - factor = factors.get(code) - if not factor: - missing += 1 - rows.append( - { - "code": code, - "name": str(item.get("name") or "--"), - "sector": str(item.get("sector") or "其他"), - "available": False, - "is_watchlist": True, - } - ) - continue - stock = master.get(code, {}) - price = _number(factor.get("price")) - pre_close = _number(factor.get("pre_close")) - change = (price / pre_close - 1) * 100 if price > 0 and pre_close > 0 else 0 - row = { - "code": code, - "ts_code": str(factor.get("ts_code") or ""), - "name": str(item.get("name") or stock.get("name") or "--"), - "sector": str(item.get("sector") or stock.get("industry") or "其他"), - "price": round(price, 2), - "pre_close": round(pre_close, 2), - "change": round(change, 2), - "amount_million": round(_number(factor.get("amount")) / 1_000_000, 2), - "turnover_rate": round(_number(factor.get("turnover_rate")), 4), - "volume_ratio": round(_number(factor.get("volume_ratio")), 2), - "candidate_sources": ["我的自选"], - "source_label": "我的自选", - "prior_streak": 0, - "concepts": [], - "expected_change": 0.0, - "core_tags": [], - "is_market_core": False, - "is_watchlist": True, - "available": True, - } - actual_strength = change + self._auction_confirmation(row) - row["actual_strength"] = round(actual_strength, 2) - row["expectation"] = self._expectation_label(actual_strength, 0.0) - row["attention_score"] = self._attention_score(row, 0.0, [], ["我的自选"], 0, False) - direction = "高于" if change > 0 else "低于" if change < 0 else "贴合" - row["expectation_reason"] = f"自选观察;竞价涨幅{direction}个人观察基准{abs(change):.1f}个百分点,量比{row['volume_ratio']:.2f}" - rows.append(row) - rows.sort( - key=lambda row: (bool(row.get("available", True)), _number(row.get("attention_score"))), - reverse=True, - ) - personalized["watchlist_rows"] = rows - personalized["watchlist_missing_count"] = missing - return personalized - - def _dynamic_auction_rows( - self, - trade_date: str, - baseline_date: str, - user_id: int, - ) -> list[dict[str, Any]]: - if not self.ifind or not self.ifind.configured: - return [] - master = self._stock_master() - placeholders = [ - { - "code": str(item.get("code") or ts_code.split(".")[0]), - "ts_code": ts_code, - "name": str(item.get("name") or "--"), - "sector": str(item.get("industry") or "其他"), - } - for ts_code, item in master.items() - ] - candidates, _, _ = self._auction_candidates(placeholders, baseline_date) - selected_codes = { - str(item.get("ts_code") or "") - for item in candidates - if item.get("ts_code") - } - if user_id: - watched = {str(item.get("code") or "") for item in self.database.list_watchlist(user_id)} - selected_codes.update( - ts_code for ts_code in master if ts_code.split(".")[0] in watched - ) - selected_codes.discard("") - if not selected_codes: - return [] - - display_date = _display_date(trade_date) - now = self._now_provider() - if now.tzinfo is None: - now = now.replace(tzinfo=CHINA_TIMEZONE) - else: - now = now.astimezone(CHINA_TIMEZONE) - end_time = min(now.time().replace(tzinfo=None), dt_time(9, 25)) - end_stamp = f"{display_date} {end_time.strftime('%H:%M:%S')}" - start_stamp = f"{display_date} 09:15:00" - snapshot_rows: list[dict[str, Any]] = [] - ordered_codes = sorted(selected_codes) - for index in range(0, len(ordered_codes), 80): - try: - snapshot_rows.extend( - self.ifind.snapshots( - ordered_codes[index:index + 80], - [ - "latest", "volume", "amount", "preClose", - "bid1", "bidSize1", "ask1", "askSize1", - ], - start_stamp, - end_stamp, - cache_ttl=8, - ) - ) - except IfindError: - continue - - latest: dict[str, dict[str, Any]] = {} - for row in snapshot_rows: - ts_code = str(row.get("thscode") or "") - previous = latest.get(ts_code) or {} - if ( - ts_code - and _number(row.get("latest")) > 0 - and str(row.get("time") or "") >= str(previous.get("time") or "") - ): - latest[ts_code] = row - prior_factors = { - str(item.get("ts_code") or ""): item - for item in self.database.auction_factors_for_date(baseline_date) - } - normalized = [] - for ts_code, row in latest.items(): - price = _number(row.get("latest")) - pre_close = _number(row.get("preClose")) - volume = _number(row.get("volume")) - bid_size = _number(row.get("bidSize1")) - ask_size = _number(row.get("askSize1")) - if volume <= 0 and bid_size > 0 and ask_size > 0: - volume = min(bid_size, ask_size) - amount = _number(row.get("amount")) - if amount <= 0 and price > 0 and volume > 0: - amount = price * volume - prior_volume = _number((prior_factors.get(ts_code) or {}).get("vol")) - normalized.append( - { - "ts_code": ts_code, - "trade_date": trade_date, - "vol": volume, - "price": price, - "amount": amount, - "pre_close": pre_close, - "turnover_rate": 0, - "volume_ratio": volume / prior_volume if prior_volume > 0 else 0, - "float_share": 0, - "bid_size1": bid_size, - "ask_size1": ask_size, - "snapshot_time": str(row.get("time") or ""), - "dynamic": True, - } - ) - return normalized - - def auction_center( - self, - requested_date: str, - force: bool = False, - user_id: int = 0, - ) -> dict[str, Any]: - trade_date, previous_date = self._trade_context(requested_date) - session = self._auction_session(requested_date, trade_date) - phase = str(session["phase"]) - ifind_ready = bool(self.ifind and self.ifind.configured) - live_dynamic = phase == "observing" and ifind_ready - use_ifind_snapshot = phase in {"observing", "selection", "finalized"} and ifind_ready - data_date = previous_date if phase == "pending" or (phase == "observing" and not live_dynamic) else trade_date - carried_forward = data_date != trade_date - cache_key = data_date - if not force and not live_dynamic: - cached = self.database.get_data_snapshot("auction_center_v6", cache_key) - if cached: - result = copy.deepcopy(cached) - result["meta"] = { - **result.get("meta", {}), - **session, - "requested_date": _display_date(requested_date), - "trade_date": _display_date(data_date), - "carried_forward": carried_forward, - "available": bool((result.get("summary") or {}).get("stock_count")), - "cached": True, - } - return self._with_auction_watchlist(result, data_date, user_id) - - if use_ifind_snapshot: - rows = self._dynamic_auction_rows(data_date, previous_date, user_id) - else: - rows = [] - if not rows and not live_dynamic: - try: - rows = self.client.query("stk_auction", {"trade_date": data_date}) - except TushareError: - rows = self.database.auction_factors_for_date(data_date) - if not rows: - return { - "meta": { - **session, - "requested_date": _display_date(requested_date), - "trade_date": _display_date(data_date), - "carried_forward": carried_forward, - "available": False, - "cached": False, - "notice": "该交易日暂无可用竞价快照", - "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), - }, - "summary": { - "stock_count": 0, "up_count": 0, "down_count": 0, - "limit_open_count": 0, "strong_open_count": 0, - "median_change": 0, "amount_billion": 0, - "candidate_count": 0, "focus_count": 0, "one_price_count": 0, - }, - "expectations": {"超预期": 0, "符合预期": 0, "低于预期": 0}, - "candidate_meta": {"baseline_date": _display_date(previous_date)}, - "themes": {"carry": [], "new_themes": []}, - "amount_history": self._auction_amount_history(data_date), - "news_feedback": {"available": False, "message": "隔夜消息反馈暂不可用"}, - "focus_rows": [], "one_price_rows": [], "rows": [], - "watchlist_rows": [], "watchlist_missing_count": 0, - } - - master = self._stock_master() - try: - limit_rows = self.client.query( - "stk_limit", - {"trade_date": data_date}, - "trade_date,ts_code,up_limit,down_limit", - ) - except TushareError: - limit_rows = [] - limit_map = {str(item.get("ts_code") or ""): item for item in limit_rows} - normalized = [] - for row in rows: - ts_code = str(row.get("ts_code") or "") - stock = master.get(ts_code) - price = _number(row.get("price")) - pre_close = _number(row.get("pre_close")) - list_date = str((stock or {}).get("list_date") or "") - if ( - not stock - or price <= 0 - or pre_close <= 0 - or (list_date and list_date >= data_date) - ): - continue - change = (price / pre_close - 1) * 100 - amount_million = _number(row.get("amount")) / 1_000_000 - volume_ratio = _number(row.get("volume_ratio")) - turnover_rate = _number(row.get("turnover_rate")) - up_limit = _number((limit_map.get(ts_code) or {}).get("up_limit")) - is_one_price = bool( - up_limit > 0 and abs(price - up_limit) <= max(0.001, up_limit * 0.00005) - ) - normalized.append( - { - "code": str(stock.get("code") or ts_code.split(".")[0]), - "ts_code": ts_code, - "name": str(stock.get("name") or "--"), - "sector": str(stock.get("industry") or "其他"), - "price": round(price, 2), - "pre_close": round(pre_close, 2), - "change": round(change, 2), - "volume_ten_thousand": round(_number(row.get("vol")) / 10_000, 2), - "amount_million": round(amount_million, 2), - "turnover_rate": round(turnover_rate, 4), - "volume_ratio": round(volume_ratio, 2), - "up_limit": round(up_limit, 2) if up_limit else None, - "is_one_price": is_one_price, - "signal": ( - "竞价涨停" if change >= 9.5 else - "强势高开" if change >= 3 else - "高开" if change > 0.2 else - "深度低开" if change <= -3 else - "低开" if change < -0.2 else "平开" - ), - } - ) - normalized.sort(key=lambda item: (item["amount_million"], item["volume_ratio"]), reverse=True) - self.database.upsert_auction_factors(rows) - changes = [item["change"] for item in normalized] - total = len(normalized) - _, baseline_date = self._trade_context(data_date) - candidates, candidate_meta, focus_rows = self._auction_candidates(normalized, baseline_date) - candidate_map = {str(item.get("code") or ""): item for item in candidates} - one_price_rows = [] - for row in normalized: - if not row.get("is_one_price"): - continue - enriched = candidate_map.get(str(row.get("code") or ""), {}) - one_price_rows.append( - { - **row, - **enriched, - "attention_score": None, - "expectation": "", - "expected_change": None, - "expectation_reason": "竞价价格封于当日涨停价,已从普通异动评分中隔离", - } - ) - one_price_codes = {str(item.get("code") or "") for item in one_price_rows} - candidates = [item for item in candidates if str(item.get("code") or "") not in one_price_codes] - focus_rows = [item for item in focus_rows if str(item.get("code") or "") not in one_price_codes] - one_price_rows.sort( - key=lambda item: ( - bool(item.get("is_market_core")), - _number(item.get("prior_streak")), - _number(item.get("amount_million")), - ), - reverse=True, - ) - expectations = { - label: sum(item.get("expectation") == label for item in candidates) - for label in ("超预期", "符合预期", "低于预期") - } - prior_snapshot = self.database.get_snapshot(baseline_date) or {} - themes = self._auction_theme_evidence(prior_snapshot, candidates + one_price_rows) - self._ensure_auction_amount_history(data_date) - amount_history = self._auction_amount_history(data_date) - prior_amounts = [item["amount_billion"] for item in amount_history[:-1]] - current_amount = round(sum(item["amount_million"] for item in normalized) / 100, 2) - previous_amount = prior_amounts[-1] if prior_amounts else 0 - five_day_amounts = prior_amounts[-5:] - five_day_average = sum(five_day_amounts) / len(five_day_amounts) if five_day_amounts else 0 - result = { - "meta": { - "requested_date": _display_date(requested_date), - "trade_date": _display_date(data_date), - "carried_forward": carried_forward, - "available": bool(normalized), - **session, - "cached": False, - "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), - }, - "summary": { - "stock_count": total, - "up_count": sum(value > 0.2 for value in changes), - "down_count": sum(value < -0.2 for value in changes), - "limit_open_count": len(one_price_rows), - "strong_open_count": sum(value >= 3 for value in changes), - "median_change": round(median(changes), 2) if changes else 0, - "amount_billion": current_amount, - "amount_change_previous": round((current_amount / previous_amount - 1) * 100, 1) if previous_amount else None, - "amount_change_5d": round((current_amount / five_day_average - 1) * 100, 1) if five_day_average else None, - "candidate_count": len(candidates), - "focus_count": len(focus_rows), - "one_price_count": len(one_price_rows), - }, - "expectations": expectations, - "candidate_meta": candidate_meta, - "themes": themes, - "amount_history": amount_history, - "news_feedback": { - "available": False, - "message": "隔夜消息反馈暂不可用", - "detail": "待稳定的新闻与公告数据接入后开放", - }, - "focus_rows": focus_rows, - "one_price_rows": one_price_rows, - "rows": candidates, - } - if not live_dynamic: - self.database.save_data_snapshot("auction_center_v6", cache_key, "market", result) - return self._with_auction_watchlist(result, data_date, user_id) - - def _theme_directory(self) -> list[dict[str, Any]]: - cached = self.database.get_data_snapshot("theme_directory_v1", "ths") or {} - if cached.get("items"): - return list(cached["items"]) - rows = self.client.query( - "ths_index", {}, "ts_code,name,count,exchange,list_date,type" - ) - items = [ - { - "code": str(row.get("ts_code") or ""), - "name": str(row.get("name") or ""), - "member_count": int(_number(row.get("count"))), - "list_date": str(row.get("list_date") or ""), - } - for row in rows - if str(row.get("type") or "").upper() == "N" - and str(row.get("exchange") or "").upper() == "A" - and row.get("ts_code") - and row.get("name") - ] - self.database.save_data_snapshot( - "theme_directory_v1", "ths", "market", {"items": items} - ) - return items - - def theme_library(self, requested_date: str, force: bool = False) -> dict[str, Any]: - trade_date, previous_date = self._trade_context(requested_date) - if not force: - cached = self.database.get_data_snapshot("theme_library_v1", trade_date) - if cached: - result = copy.deepcopy(cached) - result["meta"] = {**result.get("meta", {}), "cached": True} - return result - - try: - daily = self.client.query( - "ths_daily", - {"trade_date": trade_date}, - "ts_code,trade_date,open,high,low,close,pre_close,pct_change,vol,turnover_rate", - ) - except TushareError: - fallback = self._latest_feature_snapshot("theme_library_v1", trade_date) - if fallback: - result = copy.deepcopy(fallback) - result["meta"] = { - **result.get("meta", {}), - "requested_date": _display_date(requested_date), - "carried_forward": True, - "cached": True, - "notice": "当前题材行情暂不可用,展示最近有效快照", - } - return result - daily = [] - actual_date = trade_date - carried_forward = False - if not daily and previous_date: - try: - daily = self.client.query( - "ths_daily", - {"trade_date": previous_date}, - "ts_code,trade_date,open,high,low,close,pre_close,pct_change,vol,turnover_rate", - ) - except TushareError: - daily = [] - actual_date = previous_date - carried_forward = bool(daily) - daily_map = {str(row.get("ts_code") or ""): row for row in daily} - try: - hot_rows = self.client.query("ths_hot", {"trade_date": actual_date}) - except TushareError: - hot_rows = [] - hot_map = { - str(row.get("ts_code") or ""): int(_number(row.get("rank"))) - for row in hot_rows - if str(row.get("data_type") or "") == "概念板块" - } - items = [] - for item in self._theme_directory(): - quote = daily_map.get(item["code"], {}) - items.append( - { - **item, - "change": round(_number(quote.get("pct_change")), 2), - "close": round(_number(quote.get("close")), 3), - "turnover_rate": round(_number(quote.get("turnover_rate")), 2), - "volume": round(_number(quote.get("vol")), 2), - "hot_rank": hot_map.get(item["code"]), - "has_quote": bool(quote), - } - ) - items.sort( - key=lambda item: ( - item["has_quote"], - item["hot_rank"] is not None, - -(item["hot_rank"] or 9999), - item["change"], - ), - reverse=True, - ) - quoted = [item for item in items if item["has_quote"]] - result = { - "meta": { - "requested_date": _display_date(requested_date), - "trade_date": _display_date(actual_date), - "carried_forward": carried_forward, - "cached": False, - "notice": "" if quoted else "该交易日暂无题材行情,已保留题材目录", - "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), - }, - "summary": { - "theme_count": len(items), - "quoted_count": len(quoted), - "up_count": sum(item["change"] > 0 for item in quoted), - "down_count": sum(item["change"] < 0 for item in quoted), - "hot_count": len(hot_map), - }, - "items": items, - } - self.database.save_data_snapshot("theme_library_v1", trade_date, "market", result) - return result - - def theme_detail(self, code: str, requested_date: str) -> dict[str, Any]: - code = str(code or "").strip().upper() - library = self.theme_library(requested_date) - theme = next((item for item in library["items"] if item["code"] == code), None) - if not theme: - raise ValueError("未找到对应题材。") - actual_date = str(library["meta"]["trade_date"]).replace("-", "") - detail_key = f"{actual_date}:{code}" - cached_detail = self.database.get_data_snapshot("theme_detail_v1", detail_key) - if cached_detail: - return cached_detail - try: - members = self.client.query( - "ths_member", {"ts_code": code, "is_new": "Y"}, "ts_code,con_code,con_name" - ) - except TushareError: - members = [] - bars = self.database.daily_bars_for_date(actual_date) - if not bars: - bars = self.client.query( - "daily", - {"trade_date": actual_date}, - "ts_code,trade_date,open,high,low,close,pct_chg,vol,amount", - ) - self.database.upsert_daily_bars(bars) - bar_map = {str(row.get("ts_code") or ""): row for row in bars} - normalized_members = [] - for member in members: - ts_code = str(member.get("con_code") or "") - quote = bar_map.get(ts_code, {}) - normalized_members.append( - { - "code": ts_code.split(".")[0], - "ts_code": ts_code, - "name": str(member.get("con_name") or "--"), - "price": round(_number(quote.get("close")), 2), - "change": round(_number(quote.get("pct_chg")), 2), - "amount_billion": round(_number(quote.get("amount")) / 100_000, 2), - "has_quote": bool(quote), - } - ) - normalized_members.sort( - key=lambda item: (item["has_quote"], item["change"], item["amount_billion"]), - reverse=True, - ) - end = datetime.strptime(actual_date, "%Y%m%d") - try: - history = self.client.query( - "ths_daily", - { - "ts_code": code, - "start_date": (end - timedelta(days=190)).strftime("%Y%m%d"), - "end_date": actual_date, - }, - "ts_code,trade_date,open,high,low,close,pct_change,vol,turnover_rate", - ) - except TushareError: - history = [] - history.sort(key=lambda row: str(row.get("trade_date") or "")) - series = [ - { - "trade_date": _display_date(str(row.get("trade_date") or "")), - "open": _number(row.get("open")), - "high": _number(row.get("high")), - "low": _number(row.get("low")), - "close": _number(row.get("close")), - "change": _number(row.get("pct_change")), - "volume": _number(row.get("vol")), - } - for row in history[-90:] - ] - result = { - "meta": { - "trade_date": _display_date(actual_date), - "notice": "" if members or history else "题材成分与走势暂不可用", - }, - "theme": theme, - "series": series, - "members": normalized_members, - "summary": { - "member_count": len(normalized_members), - "up_count": sum(item["change"] > 0 for item in normalized_members if item["has_quote"]), - "down_count": sum(item["change"] < 0 for item in normalized_members if item["has_quote"]), - "quoted_count": sum(item["has_quote"] for item in normalized_members), - }, - } - if members or history: - self.database.save_data_snapshot("theme_detail_v1", detail_key, "market", result) - return result - - @staticmethod - def _parse_concepts(value: Any) -> list[str]: - if isinstance(value, list): - return [str(item) for item in value if str(item).strip()] - text = str(value or "").strip() - if not text: - return [] - try: - parsed = json.loads(text) - if isinstance(parsed, list): - return [str(item) for item in parsed if str(item).strip()] - except json.JSONDecodeError: - pass - return [part.strip() for part in text.split(",") if part.strip()] - - def popularity(self, requested_date: str, force: bool = False) -> dict[str, Any]: - trade_date, previous_date = self._trade_context(requested_date) - if not force: - cached = self.database.get_data_snapshot("popularity_v1", trade_date) - if cached: - result = copy.deepcopy(cached) - result["meta"] = {**result.get("meta", {}), "cached": True} - return result - - ths_rows, dc_rows, errors = self._hot_rows(trade_date) - actual_date = trade_date - carried_forward = False - if not ths_rows and not dc_rows and previous_date: - ths_rows, dc_rows, errors = self._hot_rows(previous_date) - actual_date = previous_date - carried_forward = bool(ths_rows or dc_rows) - if not ths_rows and not dc_rows: - fallback = self._latest_feature_snapshot("popularity_v1", trade_date) - if fallback: - result = copy.deepcopy(fallback) - result["meta"] = { - **result.get("meta", {}), - "requested_date": _display_date(requested_date), - "carried_forward": True, - "cached": True, - "notice": "当前榜单暂不可用,展示最近有效快照", - } - return result - return { - "meta": { - "requested_date": _display_date(requested_date), - "trade_date": _display_date(trade_date), - "previous_trade_date": _display_date(previous_date), - "carried_forward": False, - "cached": False, - "notice": "该交易日暂无可用人气榜", - "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), - }, - "summary": {"ths_count": 0, "dc_count": 0, "dual_count": 0}, - "combined": [], "ths": [], "dc": [], - } - - prior_request = (datetime.strptime(actual_date, "%Y%m%d") - timedelta(days=1)).strftime("%Y%m%d") - prior_date, _ = self._trade_context(prior_request) - previous_ths, previous_dc, _ = self._hot_rows(prior_date) - ths = self._normalize_hot(ths_rows, "热股", previous_ths) - dc = self._normalize_hot(dc_rows, "A股市场", previous_dc) - ths_map = {item["ts_code"]: item for item in ths} - dc_map = {item["ts_code"]: item for item in dc} - combined = [] - for ts_code in set(ths_map) | set(dc_map): - ths_item = ths_map.get(ts_code) - dc_item = dc_map.get(ts_code) - base = ths_item or dc_item or {} - ths_rank = int(ths_item["rank"]) if ths_item else None - dc_rank = int(dc_item["rank"]) if dc_item else None - score = ( - (101 - (ths_rank or 101)) * 0.5 - + (201 - (dc_rank or 201)) * 0.25 - ) - combined.append( - { - **base, - "ths_rank": ths_rank, - "dc_rank": dc_rank, - "score": round(score, 2), - "dual_source": bool(ths_item and dc_item), - "concepts": (ths_item or {}).get("concepts") or [], - } - ) - combined.sort(key=lambda item: (item["dual_source"], item["score"]), reverse=True) - for index, item in enumerate(combined, 1): - item["rank"] = index - result = { - "meta": { - "requested_date": _display_date(requested_date), - "trade_date": _display_date(actual_date), - "previous_trade_date": _display_date(prior_date), - "carried_forward": carried_forward, - "cached": False, - "updated_at": datetime.now().astimezone().isoformat(timespec="seconds"), - "notice": ";".join(errors), - }, - "summary": { - "ths_count": len(ths), - "dc_count": len(dc), - "dual_count": sum(item["dual_source"] for item in combined), - }, - "combined": combined[:200], - "ths": ths, - "dc": dc, - } - self.database.save_data_snapshot("popularity_v1", trade_date, "market", result) - return result - - def _hot_rows(self, trade_date: str) -> tuple[list[dict[str, Any]], list[dict[str, Any]], list[str]]: - errors = [] - try: - ths = self.client.query("ths_hot", {"trade_date": trade_date}) - except TushareError: - ths = [] - errors.append("同花顺榜单暂不可用") - try: - dc = self.client.query("dc_hot", {"trade_date": trade_date}) - except TushareError: - dc = [] - errors.append("东方财富榜单暂不可用") - return ths, dc, errors - - def _normalize_hot( - self, - rows: list[dict[str, Any]], - data_type: str, - previous_rows: list[dict[str, Any]], - ) -> list[dict[str, Any]]: - previous = { - str(row.get("ts_code") or ""): int(_number(row.get("rank"))) - for row in previous_rows - if str(row.get("data_type") or "") == data_type - } - items = [] - for row in rows: - if str(row.get("data_type") or "") != data_type: - continue - rank = int(_number(row.get("rank"))) - ts_code = str(row.get("ts_code") or "") - prior_rank = previous.get(ts_code) - items.append( - { - "rank": rank, - "ts_code": ts_code, - "code": ts_code.split(".")[0], - "name": str(row.get("ts_name") or "--"), - "change": round(_number(row.get("pct_change")), 2), - "price": round(_number(row.get("current_price")), 2), - "hot": round(_number(row.get("hot")), 1), - "rank_change": (prior_rank - rank) if prior_rank else None, - "concepts": self._parse_concepts(row.get("concept")), - "reason": str(row.get("rank_reason") or ""), - "rank_time": str(row.get("rank_time") or ""), - } - ) - items.sort(key=lambda item: item["rank"]) - return items +from backend.features.market.insights import * diff --git a/app/tests/test_preservation_slice_market.py b/app/tests/test_preservation_slice_market.py index d15d042..a09b34e 100644 --- a/app/tests/test_preservation_slice_market.py +++ b/app/tests/test_preservation_slice_market.py @@ -20,6 +20,7 @@ ORIGINAL_ROOT = APP_ROOT.parent MARKET_METHODS = { "_tushare_client", + "_market_insights", "get_dashboard", "_dashboard_sentiment_ready", "_display_compact_date", diff --git a/app/tests/test_preservation_slice_market_insights.py b/app/tests/test_preservation_slice_market_insights.py new file mode 100644 index 0000000..0b15008 --- /dev/null +++ b/app/tests/test_preservation_slice_market_insights.py @@ -0,0 +1,195 @@ +from __future__ import annotations + +import ast +import hashlib +import unittest +from pathlib import Path + +import market_insights +from backend.features.market import insights as canonical_insights + + +APP_ROOT = Path(__file__).resolve().parents[1] +ORIGINAL_ROOT = APP_ROOT.parent + +MARKET_INSIGHT_METHODS = { + "__init__", + "_trade_context", + "_latest_feature_snapshot", + "_auction_session", + "_stock_master", + "_expectation_label", + "_auction_confirmation", + "_attention_score", + "_auction_candidates", + "_auction_theme_evidence", + "_auction_amount_history", + "_ensure_auction_amount_history", + "_with_auction_watchlist", + "_dynamic_auction_rows", + "auction_center", + "_theme_directory", + "theme_library", + "theme_detail", + "_parse_concepts", + "popularity", + "_hot_rows", + "_normalize_hot", +} +MARKET_SERVICE_METHODS = {"_market_insights"} +AUCTION_SERVICE_METHODS = {"auction_center"} +THEME_SERVICE_METHODS = {"theme_library", "theme_detail"} +POPULARITY_SERVICE_METHODS = {"popularity"} +DRAGON_TIGER_SERVICE_METHODS = { + "get_hot_money_profiles", + "get_dragon_tiger", + "_apply_seat_aliases", +} +AUCTION_REPOSITORY_METHODS = { + "upsert_auction_factors", + "auction_factor_dates", + "auction_factors_for_date", +} +POPULARITY_REPOSITORY_METHODS = {"upsert_popularity_factors"} +DRAGON_TIGER_REPOSITORY_METHODS = { + "list_seat_aliases", + "save_seat_alias", + "upsert_lhb_institutions", +} +TUSHARE_METHODS = {"hot_money_profiles", "dragon_tiger"} + + +def class_methods(path: Path, class_name: str) -> dict[str, str]: + tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path)) + owner = next( + node + for node in tree.body + if isinstance(node, ast.ClassDef) and node.name == class_name + ) + return { + node.name: ast.dump(node, include_attributes=False) + for node in owner.body + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) + } + + +def sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +class MarketInsightsSliceSourceEquivalenceTests(unittest.TestCase): + def assert_methods_equal( + self, + original_path: Path, + original_class: str, + migrated_path: Path, + migrated_class: str, + names: set[str], + ) -> None: + original = class_methods(original_path, original_class) + migrated = class_methods(migrated_path, migrated_class) + self.assertEqual(set(migrated), names) + for name in sorted(names): + self.assertEqual(migrated[name], original[name], name) + + def test_shared_market_insight_service_is_exact_original_ast(self) -> None: + self.assert_methods_equal( + ORIGINAL_ROOT / "market_insights.py", + "MarketInsightsService", + APP_ROOT / "backend" / "features" / "market" / "insights.py", + "MarketInsightsService", + MARKET_INSIGHT_METHODS, + ) + self.assertIs(market_insights.MarketInsightsService, canonical_insights.MarketInsightsService) + + def test_dashboard_service_methods_are_exact_original_ast(self) -> None: + original = ORIGINAL_ROOT / "server.py" + mappings = ( + ("auction/service.py", "AuctionServiceMixin", AUCTION_SERVICE_METHODS), + ("themes/service.py", "ThemeServiceMixin", THEME_SERVICE_METHODS), + ("popularity/service.py", "PopularityServiceMixin", POPULARITY_SERVICE_METHODS), + ("dragon_tiger/service.py", "DragonTigerServiceMixin", DRAGON_TIGER_SERVICE_METHODS), + ) + for relative, class_name, names in mappings: + with self.subTest(relative=relative): + self.assert_methods_equal( + original, + "DashboardService", + APP_ROOT / "backend" / "features" / relative, + class_name, + names, + ) + original_methods = class_methods(original, "DashboardService") + market_methods = class_methods( + APP_ROOT / "backend" / "features" / "market" / "service.py", + "MarketServiceMixin", + ) + for name in MARKET_SERVICE_METHODS: + self.assertEqual(market_methods[name], original_methods[name], name) + + def test_repository_methods_are_exact_original_ast(self) -> None: + original = ORIGINAL_ROOT / "database.py" + mappings = ( + ("auction/repository.py", "AuctionRepositoryMixin", AUCTION_REPOSITORY_METHODS), + ("popularity/repository.py", "PopularityRepositoryMixin", POPULARITY_REPOSITORY_METHODS), + ("dragon_tiger/repository.py", "DragonTigerRepositoryMixin", DRAGON_TIGER_REPOSITORY_METHODS), + ) + for relative, class_name, names in mappings: + with self.subTest(relative=relative): + self.assert_methods_equal( + original, + "ReviewDatabase", + APP_ROOT / "backend" / "features" / relative, + class_name, + names, + ) + + def test_original_classes_no_longer_duplicate_moved_methods(self) -> None: + remaining_service = class_methods( + APP_ROOT / "backend" / "application.py", "DashboardService" + ) + remaining_database = class_methods(APP_ROOT / "database.py", "ReviewDatabase") + moved_service = ( + MARKET_SERVICE_METHODS + | AUCTION_SERVICE_METHODS + | THEME_SERVICE_METHODS + | POPULARITY_SERVICE_METHODS + | DRAGON_TIGER_SERVICE_METHODS + ) + moved_repository = ( + AUCTION_REPOSITORY_METHODS + | POPULARITY_REPOSITORY_METHODS + | DRAGON_TIGER_REPOSITORY_METHODS + ) + self.assertTrue(moved_service.isdisjoint(remaining_service)) + self.assertTrue(moved_repository.isdisjoint(remaining_database)) + + def test_tushare_dragon_tiger_implementations_are_exact_original_ast(self) -> None: + original = class_methods(ORIGINAL_ROOT / "tushare_client.py", "TushareClient") + migrated = class_methods( + APP_ROOT / "backend" / "data" / "providers" / "tushare_client.py", + "TushareClient", + ) + for name in sorted(TUSHARE_METHODS): + self.assertEqual(migrated[name], original[name], name) + + def test_api_and_frontend_assets_are_unchanged(self) -> None: + for relative in ( + "config/api.config.json", + "static/index.html", + "static/app.js", + "static/styles.css", + "static/pages/auction/page.js", + "static/pages/themes/page.js", + "static/pages/popularity/page.js", + "static/pages/dragon-tiger/page.js", + ): + self.assertEqual( + sha256(APP_ROOT / relative), + sha256(ORIGINAL_ROOT / relative), + relative, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/app/tools/compare_preservation_apis.py b/app/tools/compare_preservation_apis.py new file mode 100644 index 0000000..9ac6f53 --- /dev/null +++ b/app/tools/compare_preservation_apis.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +import argparse +import hashlib +import http.cookiejar +import json +import urllib.error +import urllib.request +from pathlib import Path +from typing import Any + + +def request_json( + opener: urllib.request.OpenerDirector, + url: str, + payload: dict[str, Any] | None = None, +) -> tuple[int, Any]: + data = None + headers = {"Accept": "application/json"} + if payload is not None: + data = json.dumps(payload, ensure_ascii=False).encode("utf-8") + headers["Content-Type"] = "application/json" + request = urllib.request.Request(url, data=data, headers=headers) + try: + with opener.open(request, timeout=90) as response: + return response.status, json.loads(response.read().decode("utf-8")) + except urllib.error.HTTPError as exc: + return exc.code, json.loads(exc.read().decode("utf-8")) + + +def session(base_url: str, username: str, password: str) -> urllib.request.OpenerDirector: + opener = urllib.request.build_opener( + urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()) + ) + status, body = request_json( + opener, + f"{base_url.rstrip('/')}/api/auth/login", + {"username": username, "password": password}, + ) + if status != 200 or not body.get("ok"): + raise RuntimeError(f"Login failed for {base_url}: HTTP {status} {body}") + return opener + + +def digest(value: Any) -> str: + content = json.dumps( + value, ensure_ascii=False, sort_keys=True, separators=(",", ":") + ).encode("utf-8") + return hashlib.sha256(content).hexdigest() + + +def comparable(value: Any) -> Any: + if isinstance(value, dict): + return { + key: comparable(item) + for key, item in value.items() + if key != "request_id" + } + if isinstance(value, list): + return [comparable(item) for item in value] + return value + + +def main() -> None: + parser = argparse.ArgumentParser(description="Compare authenticated preservation APIs") + parser.add_argument("--original", required=True) + parser.add_argument("--migrated", required=True) + parser.add_argument("--username", required=True) + parser.add_argument("--password", required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("endpoints", nargs="+") + args = parser.parse_args() + + original = session(args.original, args.username, args.password) + migrated = session(args.migrated, args.username, args.password) + rows = [] + all_equal = True + for endpoint in args.endpoints: + original_status, original_body = request_json( + original, f"{args.original.rstrip('/')}{endpoint}" + ) + migrated_status, migrated_body = request_json( + migrated, f"{args.migrated.rstrip('/')}{endpoint}" + ) + original_comparable = comparable(original_body) + migrated_comparable = comparable(migrated_body) + equal = original_status == migrated_status and original_comparable == migrated_comparable + all_equal = all_equal and equal + rows.append( + { + "endpoint": endpoint, + "original_status": original_status, + "migrated_status": migrated_status, + "original_sha256": digest(original_comparable), + "migrated_sha256": digest(migrated_comparable), + "equal": equal, + } + ) + + result = {"all_equal": all_equal, "endpoints": rows} + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text( + json.dumps(result, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) + print(json.dumps(result, ensure_ascii=False, indent=2)) + if not all_equal: + raise SystemExit(1) + + +if __name__ == "__main__": + main() diff --git a/app/tools/compare_preservation_databases.py b/app/tools/compare_preservation_databases.py new file mode 100644 index 0000000..efb0d67 --- /dev/null +++ b/app/tools/compare_preservation_databases.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +import argparse +import hashlib +import json +import sqlite3 +from pathlib import Path +from typing import Any + + +def digest(value: Any) -> str: + content = json.dumps( + value, ensure_ascii=False, sort_keys=True, separators=(",", ":"), default=str + ).encode("utf-8") + return hashlib.sha256(content).hexdigest() + + +def schema(connection: sqlite3.Connection) -> list[dict[str, Any]]: + rows = connection.execute( + """ + SELECT type, name, tbl_name, sql + FROM sqlite_master + WHERE name NOT LIKE 'sqlite_%' + ORDER BY type, name + """ + ).fetchall() + return [dict(row) for row in rows] + + +def table_rows(connection: sqlite3.Connection, table: str) -> list[dict[str, Any]]: + quoted = '"' + table.replace('"', '""') + '"' + rows = [dict(row) for row in connection.execute(f"SELECT * FROM {quoted}").fetchall()] + return sorted(rows, key=lambda row: json.dumps(row, ensure_ascii=False, sort_keys=True, default=str)) + + +def main() -> None: + parser = argparse.ArgumentParser(description="Compare preservation SQLite databases") + parser.add_argument("--original", type=Path, required=True) + parser.add_argument("--migrated", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("tables", nargs="+") + args = parser.parse_args() + + original = sqlite3.connect(args.original) + migrated = sqlite3.connect(args.migrated) + original.row_factory = sqlite3.Row + migrated.row_factory = sqlite3.Row + try: + original_schema = schema(original) + migrated_schema = schema(migrated) + tables = [] + all_equal = original_schema == migrated_schema + for table in args.tables: + original_rows = table_rows(original, table) + migrated_rows = table_rows(migrated, table) + equal = original_rows == migrated_rows + all_equal = all_equal and equal + tables.append( + { + "table": table, + "original_count": len(original_rows), + "migrated_count": len(migrated_rows), + "original_sha256": digest(original_rows), + "migrated_sha256": digest(migrated_rows), + "equal": equal, + } + ) + result = { + "all_equal": all_equal, + "schema": { + "object_count": len(original_schema), + "original_sha256": digest(original_schema), + "migrated_sha256": digest(migrated_schema), + "equal": original_schema == migrated_schema, + }, + "tables": tables, + } + finally: + original.close() + migrated.close() + + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text( + json.dumps(result, ensure_ascii=False, indent=2) + "\n", encoding="utf-8" + ) + print(json.dumps(result, ensure_ascii=False, indent=2)) + if not all_equal: + raise SystemExit(1) + + +if __name__ == "__main__": + main() diff --git a/app/tools/run_preservation_runtime.py b/app/tools/run_preservation_runtime.py new file mode 100644 index 0000000..bd1cbf9 --- /dev/null +++ b/app/tools/run_preservation_runtime.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +import argparse +import sys +from http.server import ThreadingHTTPServer +from pathlib import Path + + +def main() -> None: + parser = argparse.ArgumentParser(description="Run an isolated preservation runtime") + parser.add_argument("--runtime-root", type=Path, required=True) + parser.add_argument("--data-dir", type=Path, required=True) + parser.add_argument("--port", type=int, required=True) + args = parser.parse_args() + + runtime_root = args.runtime_root.resolve() + data_dir = args.data_dir.resolve() + data_dir.mkdir(parents=True, exist_ok=True) + sys.path.insert(0, str(runtime_root)) + + if (runtime_root / "backend" / "bootstrap" / "config.py").is_file(): + from backend.bootstrap import config + + config.DATA_DIR = data_dir + config.PRIVATE_MENTOR_SKILLS_DIR = data_dir / "private-mentor-skills" + else: + import app_config as config + + config.DATA_DIR = data_dir + config.PRIVATE_MENTOR_SKILLS_DIR = data_dir / "private-mentor-skills" + + from server import RequestHandler, SERVICE + + server = ThreadingHTTPServer(("127.0.0.1", args.port), RequestHandler) + print(f"Preservation runtime is running at http://127.0.0.1:{args.port}", flush=True) + try: + server.serve_forever() + except KeyboardInterrupt: + pass + finally: + SERVICE._background_stop.set() + server.server_close() + + +if __name__ == "__main__": + main() diff --git a/docs/migration/evidence/slice-05/README.md b/docs/migration/evidence/slice-05/README.md new file mode 100644 index 0000000..40b135b --- /dev/null +++ b/docs/migration/evidence/slice-05/README.md @@ -0,0 +1,69 @@ +# 切片 05:集合竞价、题材库、人气热榜与龙虎榜 + +> 基线:`814e757`(切片 04) +> 回档标签:`xiaobai-preservation-slice-05-20260731` +> 结论:源码、API、数据库、真实页面和全量回归通过;最终视觉仍等待全站人工验收 + +## 1. 原实现归位 + +本切片没有从`next/`取用代码,也没有重写计算、页面或接口。集合竞价、题材库和人气热榜原本 +共享`MarketInsightsService`,其中竞价候选会直接调用人气榜热度数据,因此整体移动到公共行情 +领域,避免拆出互相复制的实现;各页面入口仍按功能目录归位。 + +| 原位置 | 新的唯一实现位置 | 兼容方式 | +|---|---|---| +| `app/market_insights.py` | `app/backend/features/market/insights.py` | 根级模块导出同一类对象 | +| `DashboardService`竞价入口 | `app/backend/features/auction/service.py` | `AuctionServiceMixin` | +| `DashboardService`题材入口 | `app/backend/features/themes/service.py` | `ThemeServiceMixin` | +| `DashboardService`人气入口 | `app/backend/features/popularity/service.py` | `PopularityServiceMixin` | +| `DashboardService`龙虎榜及游资档案 | `app/backend/features/dragon_tiger/service.py` | `DragonTigerServiceMixin` | +| 竞价、人气、龙虎榜持久化方法 | 对应功能目录的`repository.py` | `ReviewDatabase`继承原接口 | + +Tushare Provider 中`hot_money_profiles`与`dragon_tiger`继续保持切片02归位的唯一实现,没有为目录 +形式再制造一套数据构造逻辑。 + +## 2. 源码与接口等价 + +- `test_preservation_slice_market_insights.py`逐项比较22个市场洞察方法、8个页面服务方法、7个 + Repository方法和2个Tushare方法,全部与根目录原版无位置信息AST一致。 +- `DashboardService`与`ReviewDatabase`不再重复保留已移动方法;根级`market_insights`与新模块 + 暴露同一个`MarketInsightsService`类对象。 +- 原版`8784`和迁移版`8785`使用同一数据库的独立副本,集合竞价、题材库、题材详情、人气热榜、 + 龙虎榜、游资档案和席位别名共7个真实API状态码及JSON一致。 +- 题材详情在当前外部网络条件下两版均返回HTTP 400;差分只排除每次请求随机生成的 + `request_id`,错误码与错误内容仍完全一致。 +- 完整接口摘要见`api-diff.json`。 + +## 3. 数据库差分 + +- 两个副本均为62个schema对象,哈希均为 + `60a4e044f0ddb6502e44b45f65bedc1a0a31d4bd596f386d4ccfe153a6c8ddd1`。 +- `auction_factors` 511914行、`popularity_factors` 232行、`lhb_institution_daily` 47行、 + `seat_aliases` 0行、`stock_master` 5535行均逐行一致。 +- 完整表计数与哈希见`database-diff.json`;运行数据库副本已在验收后删除,未提交凭据或正式数据。 + +## 4. 真实浏览器检查 + +- 1920×1080日间模式检查集合竞价、题材库、人气热榜和龙虎榜四页;均无横向溢出,控制台无 + 错误或警告。 +- 集合竞价载入30行重点候选;题材库载入394个题材及选中题材成分股;人气热榜载入3个摘要 + 模块和200行综合榜;龙虎榜按当前缓存显示既有不可用空态。 +- 四页HTML、主JS、CSS及各自页面JS与根目录原版字节哈希一致。 +- 截图SHA-256: + - `app-light-auction-1920x1080.png`:`8065086c8f2b360aeb1004bd60429f3e2d7f1b8c872ec4a965e9a5d0c016b915` + - `app-light-themes-1920x1080.png`:`80e1e41101497ee7213e1dadfaa4c9572a1c47b3495edd09e36745ccdb639402` + - `app-light-popularity-1920x1080.png`:`614d6b7770f4e9ec72c059ab8a4129486df9eff5c4dd7e8279cc68ebcb80a36b` + - `app-light-dragon-tiger-1920x1080.png`:`2f1e2ad3a9bc3874c73bae884fc8744177cef354c7176559da1453fab1f85993` + +## 5. 自动验证与保留边界 + +| 验证 | 结果 | +|---|---:| +| `python -m unittest discover -s tests -q` | 258项通过 | +| `python -m unittest tests.test_preservation_slice_market_insights -q` | 6项通过 | +| `npx.cmd playwright test --reporter=dot` | 45项通过 | +| `git diff --check` | 通过 | + +- 竞价、人气和龙虎榜因子同时服务切片06智能选股,迁移后仍由`ReviewDatabase`原方法名暴露。 +- 前端资产保持原位置,切片10再按页面职责归档;本切片没有改DOM、CSS、动画或交互。 +- 没有删除待定代码、没有修改根目录正式数据库、没有切换Docker/NAS。 diff --git a/docs/migration/evidence/slice-05/api-diff.json b/docs/migration/evidence/slice-05/api-diff.json new file mode 100644 index 0000000..2f8827d --- /dev/null +++ b/docs/migration/evidence/slice-05/api-diff.json @@ -0,0 +1,61 @@ +{ + "all_equal": true, + "endpoints": [ + { + "endpoint": "/api/auction?trade_date=2026-07-29", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "523144cc14d876577b7d518cdf38fd2722b13a8f01ed5d2e20dcc38f6a2624ce", + "migrated_sha256": "523144cc14d876577b7d518cdf38fd2722b13a8f01ed5d2e20dcc38f6a2624ce", + "equal": true + }, + { + "endpoint": "/api/themes?trade_date=2026-07-29", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "95c2ad418f18d877d94ec2a71fe6fafd5e329b069d87a9300f7fcac92d4ba5d1", + "migrated_sha256": "95c2ad418f18d877d94ec2a71fe6fafd5e329b069d87a9300f7fcac92d4ba5d1", + "equal": true + }, + { + "endpoint": "/api/themes/detail?code=885001.TI&trade_date=2026-07-29", + "original_status": 400, + "migrated_status": 400, + "original_sha256": "b11a3314b172d3ad6ba28d969fcd6a9a2a4b49e7d29ed804496a4dfecd2a364a", + "migrated_sha256": "b11a3314b172d3ad6ba28d969fcd6a9a2a4b49e7d29ed804496a4dfecd2a364a", + "equal": true + }, + { + "endpoint": "/api/popularity?trade_date=2026-07-29", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "e62a93c41f7c3f95c3d47f8ccaedaa809563c8dd65c04dd54b164f73e6014e94", + "migrated_sha256": "e62a93c41f7c3f95c3d47f8ccaedaa809563c8dd65c04dd54b164f73e6014e94", + "equal": true + }, + { + "endpoint": "/api/dragon-tiger?trade_date=2026-07-29", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "a3998b935377d5fd0673ec5b9214d1b0a64680d155c61e6cff49d0d5fcf0e843", + "migrated_sha256": "a3998b935377d5fd0673ec5b9214d1b0a64680d155c61e6cff49d0d5fcf0e843", + "equal": true + }, + { + "endpoint": "/api/dragon-tiger/profiles", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "dfb1e534c018ec12fd8d8ee0e7fe0f234e73dc7715d7f0a948f74ef8d12d779a", + "migrated_sha256": "dfb1e534c018ec12fd8d8ee0e7fe0f234e73dc7715d7f0a948f74ef8d12d779a", + "equal": true + }, + { + "endpoint": "/api/seat-aliases", + "original_status": 200, + "migrated_status": 200, + "original_sha256": "2b0fb0a6b3e353c69158d61221c2200e4199d0d60dd0b9d99702a22eaa917a78", + "migrated_sha256": "2b0fb0a6b3e353c69158d61221c2200e4199d0d60dd0b9d99702a22eaa917a78", + "equal": true + } + ] +} diff --git a/docs/migration/evidence/slice-05/app-light-auction-1920x1080.png b/docs/migration/evidence/slice-05/app-light-auction-1920x1080.png new file mode 100644 index 0000000000000000000000000000000000000000..c98baa77e29f331f27b5387b57428c155e996eda GIT binary patch literal 165864 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

h#QLxY3W@4q3e#?Ek+ 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

G)P`CYvU`;4Egkj4Wrd(NJZhwgZf>LVLj zeAp`EIM))|oJqXh6TO*{h#ro;hCXhXkjAdd-^n%4N=@ zICp13&)oS*G*Ln1ys3~-okx^o)UX;sJ(|sU2$D#Dm-I%pJRG!tR_v-McYQ{=2a5BS zJoYnLiUcNvj?$y&pP3nH)qcHQk_nN_Bk4Xo*anM~JLLvUoy;}0e0r2^b~E^7Ft+80 z?^YPGL>giNUDuJ7qR^7mGg$K%Xt`_heceYaBH@z@39Yg>V>yy#7^Hrg7o%=Y#$~9- zE!VmSN@laD1kcYk;rB}r*jKZxPEg-z5AYuh*(gZ5Ae-DcSG`qvp|n%ua5*``RZ<k%wTgnp&wKA&OI>jH*mKZG&*_GR7PN9RLCV%BU%U_WM>7fg)LR1`Qh zC0xVg82n5;nwV=lKTmW-Tl^K6H#ic$E6Zdk?dyOBQ+S_ThAgpgkNj!(plHCf8b`y7f#P-X{=#wHjmR??eJ5I?3O#5q`nG)8`NXMz>IAmkRXsuJnpffo}EF5mXZ&4sP!`#iM z5*4QU{Cu)sR7r3e@DW^MI^|YsAibZaqp_E6u`9H`xYK>PquWST=$aUrM^m^PaKhhc zsu>nOXojkmI=+won@ZbswjlMWtoT&M#wFriz{(t|L;%7P7>&f-EjP zYAke=)x)MIRX8!0=hrxUf}*;wAlaf-I`LG6FoV9q+$WayuJ7;o+#fOa8h?)1jw=bR zB;;mDcO-}}*8f=SyE+h%1@cjtwVe5)Wf4FEZzwF8>ZY5_T6pA#p&C(R&qMvhRNo@q zF91i9Y&$L8FzU}Z+uzJ=*h0!;od>n!BQbjYob$_g#0eE{=*J%V-Vv>{--=MI{@CIk zj?%~elk2)WiW#F!58jykKuvL{8?%ij zSW*ET?6U(^br&#mh4-dhr5Q3kwzj%}DG;_s%ZtQweKYS)8ci;U8@Di~U=zvR*>yV6 zJTIG{XniYM4|MA<&Sn*#Pcl(u(cl3s6j!L~%np^!Ybi56h0gFk*X7k@kiwP?Xlfd$KffBen`%8IO~JVAvsWnq-e0S` zXli9ET~mL)%ZvT7Rms;L`-E0$a?T`6y!vbYXs+Nm^0G@)6EnRz#N>R!PFxE@jh9uB zqFK`vatV>(DM?7fpHyaQ%vab-nU@-gL|ckC4<3u0hNMhxtoY zmYPV_Vo&zAC5j4l(ih$^XZkL#IL176c5uUOa@a3f@otXgNw(jrfyzu&y87O%sL$BD zwntXw7WUeA63J+(?X2D#bgFDsRYdfJ1PN1%X$2m6F)2n&=nX33F-7Tj7&cz z-(P8f09IF&sWTNR9`bv9b2&(TmvX*ZqNYA@U@$8wvidZ5z#OD`(4k?9lmlA-mn@R; zkz+^E{h(Uyjk>wBQO0Dpb2QPnOmLK+ebmG;0_!Dv?U!jv)vdVFf?Te1Kvy|4&bxl@ zqe{tZwN}>&nafB`EqQrv;rkK8TKa>wQE9DheQZB2Qg{%k%82HMOjU0!gpW1N!yl8) zpF|-aRk+sdmjh`a-V84}^$_WNllHs^PMr7hN<6uEg4v78U>Ima)KcrMi}ELv(!yuD z6HeQn*dqdV=8EB)qG}$D{0jvh5V-#w!y7{VGlp21+I>Scxt>G~Hvy96qmv267(D~6 zK}9VYa|NT0!r~zl>NBqd{X_B`5~Vo|4p{}yA%mO zrj}ih=V&~GAVB0s8>{WpVtr1@`CGj&zd7m}W{oy^+q>NwHAyl(_LTU%lMqv{&bp96 zQ$j1c|6vbt(fWKb>a)tSR7pNcQ9&VKAQXC8ErPvDO=?x$F@D<8W(>Gnyw|I6e3Eb? z2ASRC5^#X}&F{HaLeY9S9NcCBMVJ+P6>CDHP?`IYT}TmzONFAc3ZJ^^QGw#4o0X^P zIqx*zv;U~{|M5vgo@ZsMUz7Hv=is%wM9u5wz@}jIYSv54`STf0;R9U9rjijX*>{|e z{B5cn2ubM6=$tqF4!i8F790y3V&^?EwvrZ#(&~(b(c8fAai4HwzJmDG&GJp4cubRw zfhxwz1p9uT6C`eoCGf4qLp#GvmoW|M&zb7RFWmN9*x^k#KO}rx15y{+YQA3{kdp5w zyk8Z%x<6uBbcg={cYiM~{$cQ@7Y%N4_ilytQ3kIp=A&~&1tC;mXBfggZJ24`EdTu# z?91M$PK<`>8ck)tCY@TI>cQFf99Tqj>u$u~4c?*xx@>TLS<>yKjf84b6e$lKq(A5J z0+oQ@@R%XR5i57VSa7aXej2T~`?bvQ2Q{CGu%rJu--#swchV6BQx!V}J@&!OOUfQ~ zyhp(fYs7A#Odu2eq@u6;A-%zNVYC2bUf~^S;^(pBou*qW^w6nU1WZ)pvY*zADth^- zS@U^K`%knx6(Tg?f(OTiDTOW{2wx}1Frg#jSH`T5jM)uY47Y^rkF+|iou6@hf_L5%Y6o-ge z_h~O*XhcjQ-w`8Y`QO~U5DmAY-bkIvndiFC7E_c4n0df;$#)Kk?lB${GM&!$%k`Xf zBt+8+mqxt+)M;?Q7ii~j1cY_Ul+i-K@pSi$4{&Mqnld#WMd&mXwqBPPvbsJB7SE^v zJG+`-Kt-2Vze{6@Vi7);rTyZW7+c!sNIi0Uu8THj_`T1NHpY2bx}p6AOiw`$sEMES zyjpvdy_6$AH#ny^r&gu&FxqULq`#gN8Be4kPcOhVzg0bGZyl#EGx?Aqp%RSl3BMm* ze(2BQ$nN#BRf-5u+F6PJP|8Bb3QfP4A*ltG6yH8T&d(8S`cWUk2* zaJ21a#il5WEgL?GfY|$QGz9CD zUcFI3U9G-tw3h(?^^2|pBbCVCD%XfmWosyxxL=wt6!QDOOsRkQ`1i=9y7Ze*U%!kd z`x8rA|Id3+>)2ll-l|#ValCbm+N?Wlr1RxEkv2_rJjH_?u zR9;>G2tZuIe`Z-{tfcrLZ&84Oj1hZa_7hNp=gbN(5~|$fhUlUnc#kD}3JBNJ5lTpD zTUKO_^I5@$$#~bw%$YHy{{Tf*P)Ob1nU4G1q|M@?0Rbroqq9cBpQo`0Z0U}U@t zrT)~$Q?guFcTgtJ!2;2R7%hBJ9~PG?tyizvGb#S{MS8MVfS!FiXuMh0n3`+ChA=ix zgh@}EMbT>dpB}B%Y-cwk!gchmbV9g4$33iG&?t9Eiws5Y{hODE-_@`>Oqj7XdW`sx z=V}XwF`K1^^Gf0CFG^ruWzF+v?7))tD-7Mavrm1Z8CBU{Fg}R zfBWOV3Z?w4+0f=q*Lk|=Tg}moQt;S}kYQasqZoL3_;8YzmWx`m7Vzz;o!iyi(MO-9 zUU$05mQ>c5BR2uz@ij(|E11Jq!8Ujk@)^83;==t5w49QB6gTfobD10$7D9*Q!)3qs zHus{9!)QCPsrdtrWDoyZP}2b#*7&jcqN%#n5-0>Wszr&n6i0?~j+PfAYhcS)95-Lm19b;QQ zapPOnmKTHp!hABy;T^?d71rvjDz*WU&2^fD5IldNL~X-E@~X~Dm~#@6!wuhyMv==W zJ&(D2pVADJ@(?U4G9lk7WA zK4LEl2(X#Loc|y8-a4+$W@{S_#oA)UA!va@ixvwGr9g2g?i7a*w85ptT?#Gk?he5< zxVt+A3I&RL;mf0YKYQ=jzVAD~^Pb;%|C-6nJ;`Kp=bl+>UF*8&XN|Z{>D3h#}DCaE1YL{omjeJ)@gii8i|!uuS)gobQ10Pw{;)QA8H`y z`l)9l!fjK2%Li!ZV+JaF^b>D4tmZ9NJMt20*ow$RT0W_CUH~wodL5R(IkF7Am#S=X zttYG%rZ;AVr|tpRS=~VTh(b`v<6Y28Y54}|(#wSG=&`67P~D7Z=D=LoM{tEm4Wp9s zBG+2g>Uw%*Y{jueBL|pC)S|Jke0QR(z=jdThT8*bV9DxcM^~C0l_Lujm4R}9dbfc0 z?g#%XDbOewQq1DlW}dmQ+dnV&xa?8;Dtt*A-_is;LR*L#=!6`eQ0n`NkNHS;ASQQV zPS?U_1(}$?0v#9;ZlIdkg7%MZ}u0O82 z|NJbDy|(WXPjR)W)E9Xn?q}-SCD($81oF!(!+hMt^9I*JN37TmIIRs5u(8h#)UQ}g zSQo*d5iur$mFW`v<%_Z`L7Ab2)6wQwv{0swA@stnG(ibF2AAlU+^T zRc6}FRL40oGov;5+9$_Jf#_PyP{-S3bs z?EI-Q0&tQQu3C>(j8LtCH;wcBx=1sQHm$&z;#^a5_D8!4Zz^*R!uK5a-!JC9 za{Ez+7gP+{LZW3}(3@17`j@bV*&@+@tvhrUdeiKzN#M>tw!5>*=JnOZJ(>3DJf0Qz zcM#p#{5*#CAyZkmNk9>vxngGCw_&6xSzKt!Ev(^UkbhAUwGqDMD38kZ1HiADc#IB^ zLNyo)RO7ph*ewY&RjERYuhO})HYd9WSdOH7O(?0fDHs!2oA&7We~Gc$xUjw@P&}Z! zRQy&LrWKAJ9>e)7B8Iu>Z%J?ePW0tpu{}{^FG}X$WEHg=7v~Fgeth`ziJCdoHtrzS z8Fckw7h&J047I##&{|yByeSaJ{rfJIUmJ6N?f)W5^vm@-zxL-m`G03n19hlCl1HmU zRekNig|gqQZu;N94x$;}T47saKCnLiIhpzJ*NbF-x!&=)&##T+zxK=g}_$ZR^M zJw6lt?@@Wx&xb?TzubE)o2p*`9hgF9a;NR%sI3%?{%xACe(94d*^8vB-`tH8Y<~Mo z-{)U0`t1v;V*b*Hh3xeRF&NR5{zn>6QL27naNnYI-f3zp%KtsI1F=Z08o}GW+lqBU zmlRqCsIf^MgwA2@q7JKf+^t@FQ6q45+#17PMzcaDyd*C(D_K@eb3WKCRCVa576Vx zTeO;!YOh5HiXz|EDl1txut3=5rZ8<*Vd(O8!+QJZ2znx?MgB6xS<58-FPrR@8CFpz zV}%DEtjq#O#+u@-Lqs=qSb3a8P8fr;N7ft<{XDMm$AUPXkiBefZW7%~HS0GxAPVyG zHj9lQZ}J3;q?kRZOGUG+<`7+1(~QNp^E?QM$(ZrQwY&*^EPr1(NQtTNeJEdNA4MXo zRKIOfL@4LpcqC=syr2xTjP5Iq38hCyIi;y`k!-A3bU!wU8gbM*PJgC!eDrfR{k9`=dz0qv=If3 zeJ?i7NWwCsBbfC+ekwQHBViMR&a#15*XV+#&NmFvwzc2KZhcjFL*EABm*cLQ83~*mzAgY`W)yo2 zLnGd=B3BPuEzG{BOWN8XL&E0tHmuWU2-Q&S5q)bG0Vc(D50K<87VcItIH1GNY)mge zcuQwv#~QN0j4vn@gH?xA9!5oT6q=8VVo0I3*IKI_PJvzz5ZIhU3dOE9$!WOz{uh2ZPL7Adi8&wxF?HeJ)YwSvQ=3Cf>= zCs#+di;f~`w%<;dP6YIWTg)M2uET@Yj(VzfzDHUw#0iEx{G&R~r8tr_(d}V=x3As> zku?bbzr@Pw4pzrNAMRumoj)4n5IM04EPIKe=@^wP4(B^fFyzGhuD!bElvJR3y5e$& z@zm`oWz3ej3jywy`pb>|m*f!^;mIK_S^oho>7a>GNx2?b&aE8IrSx~NC>IbeC{{4N zB}<*eriyjM*o2|W(@r}0x13JH*laafxf7D|rnj5eHwPO%Wv{HuOuhES36pSSt2HCE zEz;1Al_trtmC*&F40x0L3nt<>!yMWB!DE?UKa89QKIs|eu;({ZZip>%CZN_DLnZmQcAPW%3AtqxEgd2}m|wZijb`qZZl4?udQ1u+q*rHv_Bl1u#9 zf)j@I`$t0w({?pen}Nhlw(C{@+Hm~Mm=uq+vVwkvYIpnSZj%AfwX~%x0;Y`!2;wD7 zxx!N_n@_sMGcsSUm}t&lM74er980bWbFU4mAu)A0n?+_ciRNWQg3`Hb>W*q2&pcsk z+XQWXsL2nsV9d_VVM`?9(B3I%5Hn_FHAW8NW3yAxfm|-U4O4)ztL%P{f}Fcm>WZOc z7A14Za)}=FGhKdrB@;c`K?Tz~!cBjANKi#n;2AYp~5TpxWZNtk;=X!G3Uk!>~V0Xo?t zlUSBS@3=KVg^`P&OH-AK&1PEGL__$V)!3VbrApkG;d0h;L3FIgW#&i8GMQzlJ6kEE z>($srnBjgTlsx7vKlU-CAxDiKRs^xTe=0c=hFs@=13$}8y&_>V3yq@$AWch`BPWP@ z5{067GkieSdKdC$_G@mm-MM5*Vh@F&d>}ywyH*i3g5-t;>?iXgg=`IY3=OPaE^ebb zRS!5Lsx@a~WGWBZF2Q{q{x!@c`#IYeiVL~V* zxKmy(w%N94lPz-H$qrKA(08qMTJBzu(cFES=5g2sA4|qw*Dkcw&KzPaDAB&~FmNjWqT{W^i0q-&Gd3WuG-$7H?t_|G12r3^?5w<-XLBjiD3%5C`clP#cFRN#zjeK|{1#2@dzQdOjODz9x zGChBRCuJFlXc}QgEpK~%s!@O>pu4_BGH&1eTVPdPA^?puSj#D*Pt98ZuT1shRz2?uvG+Fiy zWX+=&kra4_-6iF!Xj|bWkkB_q7igiHsa4aZ0z@9~C%d@VOg?qYl{69AJ?ofR#i?{D zaXv(^Lh{6?LMY{BLj9s@87dFukG=HLzsu-iTQHQmlSv?3zLtexcp6W7PnKt^w{iw0ZgZ~z;IVgy|P;}@+k-hGd8xcS0*m)cR0>*hygfd|GxUpUHyUcCOF8cRPWzp`;3`R(^QNbQUveTFeJo;7}zK( zw*)nlY`|V@Cm`5;!GCZ_{28G7BXWgWIPXEklF@DsXEci?VPIJ%DJFkq=UB4~syNh9 zRj1Egqi1E*4s%COBFKwKO(Q6Rr(-(2=SZly2e9XM%s{2By+AA#lf_c!k~miO%DpCO zk3tfvhv2zYtLJ)l#}99onKC7uGrmlA?kOM0mzkQA z$*w^m+RQtwLlH_s@xl4obbZ6A{DQz!9;-dSrDyC$#8I%VDgy3|CctC$zpxVh<#*EL zzH})pKqyz5i>fFlv+o0zN|8CGgtWQtsF}Zt#|MYRR>omOMXLmHZwCmK*^G3LinH%SfHbA8m%!Xrtto}Cfl^etBMo?**ltCaS9p<48?z(VMZoO z!EEc{oiohlS-Q>FHB3KmDb3GZEpACe!}zZ@XtcyU)acSm#*pOK&irXEyLQv;jd{&E z^*^j-wYQO`3hMZ^mvOxY{0+l1vOB5Btsjh7F%Rq6>2Bj;oAY;n-L+99Y?iPB@4gh( zd8a5$t9l(@utFF0YKyxBbsx%&kQ&lo6``iq(R25o4tk|q+Zd!KPdb?@PVM(sc1n?+iGrZY(lgYI4@R< zK5RA^`G?czPNWY-6omblFRE*pQ>8akHP;A^>d#5F>=cm-K*YirCLy!kaEm!n*}Cvy zD6~bkF?{iOV|Oz;=s&AZAUp739+qWwj*t_Q#Ej4umATr5q*2;L#>EWlEa*J>h`K8q zccXL{D4NIr^x20!Wo_SA;H$p$S93}KGT{0yJ|O6X2zJZr7Kb4X z6ELq;<0kohK7%#q#?C6^=4x4s)D!N7%;{Cvn36N{mGiE%yf6&9_s-^UmwH=u_`CS@ z5!BBh;LfRbt0^W6CDg>y!ty!Oo9U2MlAmHaPl%XVT9=2`J`zsTuxci(oz~7fP3~`v z7^pJO?ebc#MLxEcaANr+RP2H-kSL8M$ccqR`FQ&dv+kU!n(RfWsLS0f+Bm@2(XXJywte$l+uUh?4U=RS{|cjq|~ z`#AFldG=;t!XUmzfplC?_*yE5-3KX*t1cqLnWc6%2V0O`dwx*TCjUIq zORN!BWm?#JVZa-kI-CoIg?JvsU0HI6Ogw*pp#u_p&Jz(4{#BAJdHo?N9WjqB2QeFB zskl)lJhRtlV{uSbb%c9O!}#?T?3fJ&F}#Rxqg%62JgI8jMa3#FQT5qEq)6oz2B%xf zoK(3Ossx2a1?n7xoeLhYlh&^`$+TP>H;ti+(X}kQ-q?O+v}=;&EN&u^c@VnuZBJtAls4= zCcE2JEg6%}_8wVR+6?Z2xU2E{q*nJ-aP!NcYdN+C05tQ*u?R4o# zk7+Z~d2vZ6^S)eo2?7$*BREASX;_Kzqm`;jn&cd!Yes9Xj0!yGyBA)v0Ff_xDQOcC zg4;X9Y10bV9;`udp@Od-DYz$U&GiXpUxl0nlRV!v*y&(JtDVOL3@yD)_cx(lvzBJEmmbH}rI%GL zQWOKLW=Ak9)xi8av3PggqFppY6W>X6sP3bv=@3inRddy-9wdwfZ3JXXjO(xEB=;

Cjt)UFi2E6F7@*A;KQmDsIJ-&%yyR@goDYi)j+*^gxE0U=C$F5Hc-B0;p)3k5b zN7#mJmgnacyp^=Kg?TqZ_-F{rj5{Nu=Zd*J54afe!_^Chmy}txOM$@^n1+Mtc?A$U z3!K>W^4cqA5b}##mttgr#l;6aMo}uHFY~t8rq=f(4w^5IsG}y8L!BSi5w(<(GvMZA zr)o%05IC>!#+IA8EBu&4@tNMafrR?027|_Vhwa{}F{5S{%A)l&vsBrxvb~q|(g52^ zNqC1C={?X^cVL`Pxj8n=4dsmtDB~H0^t6?7k*42B_PqGcE|WLb=SR9vw*V7!UYIMd zvO-_3xgMIMmk6m&T;s^r=;x6Fph?IfhAquaYq_?F{gxP4)8&fZvYLiZ0kUwcE- z5w&%-I=LH3if6iNXVFTkQ*bqD9p+rLAHv^f72bTp_5-|8wM(rf>EJAT2S0Ov%|@MW zRmDSLMj9q8hv)rC)z*^nD-inPyA*zV1tEhX>BTr;WT_GVUFQzc>#^?f0w_S=LLgV@X zuqd8dWE zY^K~`&f5yh!)xtYvjYE0GE*Mvw zQufXZXfP{qr(msM6v`NXSV*$m!;ugUr8KcF%L+e`46Z+6;(kIH{Cp=nR+=u?|5%!G z=KzYtYHpHRv09c%*L7he=07TiY#0y_%d36Fq&ce%q~ztrus>2$F+6q1HI|oFd=$T| zLT+ty`2C`od)?(k>v=GYwl9>3OpNepPDn_?m#(=mmf#G(MY2sq;)!5PyR5=|p4vki zLRK5G=LW+%{kPVuWi+g_r?|Mkk!q^`hM+0>z4ZOx#?GW);NH@nY8L&jlt!4DD@{rU zl{&A6+E-4CR%;6GWjgSNb1rCagOURyw_<(P(N}?rUo&C(1Q@jxWL z%V^GxUR2>^p_&k8H|@XWGkbFDmPrEU9X z2L=`vlS!~^un~^-4@fFaW`5LgxOYW;*SG+aL?E79V93>@F+=}4PZm!FS|x$O%E9G0 zIiquu>CQHBuUXTG1ACMJ3+@TcPFYT_>(^QPOlAd#O~Ngf1zMQQT_F_9G42>+k z`gpM8JW29!63rVO9uDm*((SAw9E0#%eY}PX+m$}jmw@+Cg=npdSB*iw<}Z1f#6712=zh0! zK^23LtaD7hT%6U~P;viI0A3d}3ne1eOGYR29WrHHln)B}iw^LAd7gjH{a+;GKi(8+ zrF!)9^fNY9R@9B-4I3VnX=Z^86@6XrEZc1Ug^n8Ou`~>3q&i@G1CPFoPfyLa- zz;C z9}8z7TfB4=gknZVw8X~dw7P*NJD(Z9GeQnkB-3*-L#?_I3NjK9sUnyqBm>1g%7<2X z?lC*K=ORM+3s>G(-J+cc67c2$3p*!c2byT@{#~h)!1_sOJi_~xT?a9$p72by8aTWJ z8^Cp>zCCi_RvmG0#H~BB`$FEC+W7fHV-dbMJo!dxP7wRC6&qPO z(5$*zb3wiKwbnFh08G0ia&AAh5RL#S*e!}+=Ctpkl)!h*{j+GD6-+910a~P!Xh-D? z*Kv-Zjy1Iyhm-XaBa$owV_+|nr5+t$B1>}5h3-aYG7qZLQjea2adp4ZDmSw9E`vl5dE!NT#Ki_ zlHui6nRbQ%)=s!*7-gAf! zM1Syb67y?>II1zm4R4#>Esz-`vX1S;mz_V@zheMRy)k2O*h0Q|^2*G`NJO$w$b{>Vgwoe6>4}9mad2Pp7)u&mmP@TPi3d$!|0g=$N~{lcn^8 zhUZLPmUe|>T39rDmDe|P4i&$wa0@mFL7VVR1t$@9m5$m-&nV=Sa-Z~(ABzckDOcn% zC61doIdcVqf5M1r37Zn1Z<$GJ&cIe@BP!a8^d2Yf2?YHNC)+!mz6X>R7(dWrazm(S zC^wgSusR4#*Zz3G4Sp~^b6vBR*;UZV_@1O7CwYkI!UaQ97vueG3QL@R8AOkN`g_L2 z()Rm-Ce0)WWaUh?!6#-c0O&Fxaat=Z>^D;j2zu z6yu!Tt~Tjk=*nV2Wf?wO%JfenO7uUr6CFJ~1i0l8b_x%c31Wr9C(|@b(lh~M9-tcfcOwd-(tQu)u zN>8RnMIPbMYsfcB6bLkp^6uF1uFxPYfV~e54vg7oWC^gkm>a?(h&QEB=Xtv|-f?A& zT_fHzZ#VIZ`|9=FK5W~pWr*peAa*eaEFzjSnnzm+H!4$_nVT53Gp)-F^K?{|WJsJ{ z#@NmsW1b=k?oGVvp~@edGSOfzikmRFRKMxVjyPiJW8?+T&mK0;^tF4YR7RvhoT8J= zmq^=4DLAv9G;+y*Dc|aM(GA7lfRu@;KmWFqZ@4(70#_vb5lxQTbZN41PqeFj+fK1TQkArfSNjR=IJ-PLKpi-5G{;rRbQsm?fQBB zb3hW(rIt=X+qd09hEzA_7Of3jDcO}GB=qOR<;1{+NbS!#cHN$6duFtVKW(yL08rb_ z10A31YhP?8)?!rUw7``pN;%FBL_QKD)RFNeZ)eOGe2y3IVl&eOOT+58hx0#0g1guE zS@`vTLS{w03_Hwv=ZUz7n5nslV0$gf+FYQPv^eULo+?cfMMzd=AGqNa7SwAQTvBG- zrfG*Ej9J%H1q}|a+c>jc|CQMl?!!ZhMD4{rWyU5ayhVXfov!%TcdS@2*0U^jWKnm$ z_X|3D%C~}J!m))UyCgqv$6jCg8Y8POdCd*4t+KklE0jc>u~rd=oZDEq9D|_cvjGFn zwal=f(1Tm+XMDzXGei!~+Y%glDo&7X~}-C{G79!3DkfkbbW9YU_MOB18b0$#0a zU0``nrNiJaZu~AIHqysUp#03F6ePhzOQA&ASi%ps6@Z0BFJ2TGE>5e!l@PasHT40Gy z=Q{O%i;zaJa3N!2AyC?ckZT-HPBj?+u-*MtIcnxTU~;e1(R-oYYxPjWVfJORF#llJ z&AG};>G&f)ujZkV#DTnLkSV(9L+?6`6^x@}A z@kn`Sjq}bLs)Hc^m}3o&kc67bTBcnTc|1W)3}WrCnmE*1*zo5sdsisQBxEJYhRs2# z^xcoPULmViCLs7q-CwTD1CE{d6yklvw^@7Lkhnz|cnLtGN>OgMF@gA?*@01%G)Jg(FPc z{H(nGdE-PrHfoz=v7FG*HbKu%j!gBr@NYX}65P)OpO&(c)g>&1Vo^dxyhe?Yme!8w2Es5DCMeQC?EPF!#>`pjqgNfALzMGNPb<1q- z)bUJ+k=o4N+YW_yku}G@I&D4Ua^bqP&we^6IK*Khim-k=B31B2kh_Uho$bhy^#-AS zu_DpUp0JO#D8@&GbEN%ClmCiD0@(sB@~l{*BMRLH`(jDt~7 z+g^U$^Y^K$Xg%R;UAqTV5X_sD>}1NmXg}cw!whKRn)p)X2j*&-dxGE*OK}s|tPj`5D}I3p1x~PCKe6 zw>b_Aq9_NEbR2vU2!8s(b6<>x$hF)SCPOtHEN%%d4)bMI!HQTg%_@GuDlZGPJRvI} z`uWx}j40^f1~fFj{bunSuP)Yu+3E4qgcnq4tn1eMB_7KINwzr6-)j86Tc<2t{+t`; zDvMaW8#FWK`musUJ{SKA@;2YeY>l*hzu1fVQxe%wRJ}N zDl^q+E(Wjt+<6kumk!^n^KtxScHW29`K`(ru0KztOuEnjiI>7%c(vD+rH8a;lQAU6 zpl@XS{BGb2Si(B(V8s7sR*PPelT)m+Ni+0}ir{zRyx$4*+%mRf8Glua9uk-MmntB? zBRKv&r3E=`vY@lOsB7xF5Ke4xJXA^fw^HGyuVEOJ!e6%$CN)HieNLl^5gzU5jit9oQ?>hr2+E0En_ zB%QT+s0^~JzVPe!sDELW%JVXMpFig8{|gEt|2=h0{#(!LKkMs;R9FJFXk!ayT$bK; zyK@lTyk2Bh?=oJ0x5_B|psI>|i}pFJRzWDIizAgtW`~RnC1QP*n~_u&#mb!&132?- z6`jzPxT+1oy=vupC7JfIbqL-yGOZ(&mXVW~n3<~Wk_Le4lWZ*_m%?-s%KJ&@@aePt z_x!Y9ZutNO1!G&yKAxssew?x;4%NsTUt)&|e{+Uw@HfU0hp2Sysk`ct$$4)L)4r`p zP{g2f2oLr?Kzuxt0Ny=-O6e#jtU3PM&XIu8&H2fhU5ea|Zb4R79$qCorV$_c=+=TH zWV&I)e>71^4*ZmBZO+dX?XBw^lUb+H`I zpe@I_Wtf?FB$xcm0U{Z(5BTyhuI3rLi4_kTFqRcCaS6Elgb}qfn@e5p-Yh16|;Llm+axkd_6}l zuJghDNd4sx#Tx}FQv(o6VlfJ?FMHYk$kKIDN|&V)IF<;Ffxr|(I;kFbNGTZ?1x0kLfK2sTqdR#Fc8d< zm5DaRJ1eKnX;(`Hm&np65a|*-sy)-&&Kmmx6Z$X<4fj---dTrRWO|H5#1gd_i2HHr zwH-A~8P|C}6DFTE$PM95d$!mOYfEDFwsiV^*|#S~$Cq$n!awxy0q(il2{W$m4|2T6 zKs>MEWR6%cZ`pzj_xNq`jx9~DsCGSxy$esa^Padbu1+^i$%4A~fF;&IFS02b0R;JBJGlmQc>Fiz@kij1{{F5dX}q{A1zu1*;t{MoxQN zkIxQ%02B5Pwov5-z$@~UR5J7CjqH)EekY7{1wJw^tI9_#r?nDI<)QYkQD(Aj>rgpi9QT-MMB#63L-T+m--ek!d%!~RgKk$w|4 z{v8~C4@f|qgm8X-D%Z%vPLs8I)4RVz>A6@rHN1VDBS+wHJfKMMsr%dfA+pq{W#c2e zYiaWc@QX}`v03)b%>7ynR{hVnsv=|`)#h0FuYnp=6I9N5wvBzwLUKP%L!Rfa6*y}8 z5Gi~(g#oULo{X=(g{i|SXvtnyd&5WrLu#r`LZrG*5#XHH^^@@I@qX5S^O!Oc_EOBrJ6 z;HJ58W;{{N%6~O@k=Fc~1(mLbIX^a)L1Dnu)w;J9gK$6*CO{Ur4&|FF=P1XUqoNR4 zl>UC6IR1Dqt{1ZH=(>@?&bvV@c<%Yb*jo_j!p$eHDd z#rHR^-S`3A3spO3%bnw+qa!+)$93BYkz+reboLsV*uUfeVQ`la0qA~HzWN<>5W3eX zZjaL=xA1>2a)LO(|LKMP=Ngk56zHavi`$|?hH+s9GuPDbI45T630x2yfm;;nc&qwy zgN-B0B_#nZtLQ7j2!gy>_jmq#;{9?Hb5X9t?B{9HXcz(NV=DF0Q?h)HLZy>t=wYc-Xh{gXBQrM4P8@8)jOvh#4e%k?McuapzM9m7$p(6a z_Pi8MdP{d7*Xbuhx!ll8}VZJIa(wz5-nQp zbxE1KvGF^)C*3o%{a45m39-XK-4)SJ1ZQwyHqH7ux()WMntF&XFGs)^w8Yt6lqg}b zpIGOjAYe3?UglueA71Q#!07*Pyv!2#MdiM>T5we6`S9}SiQN7^4j0Swzcp89KEQeK z_`ewD__u#J3`G9GAVTZ?mpp=B$|st(fKrv4qrW%EjBfXTWyWmJ{J>7MRv7>2ABun>zOJ7dvu3!|Y!NwSO3~x`P{emZtoG;gvR-Y< zAZ_y#V$-y9+M%o!`>QplI^9{kw?qjNvl>1L&@3LMYjAj^)o8!Uj~T z)7FeG?*XG_lxfp}9*umH;`%e_f1Bo?k9EyihAR`1qmT1U^kuiqE6A-9>jU3MhL#0* zI}sz${GxS8?BD7?&Kq|B;Y!L@t*qj7e;k9#=FI&#MBfnkmbjuiaWGf*X=Wz$EBB#i&RtsV z@rRLH7R1Bo9x!u4oc=TD<0fMLmZ+|4T#rwwDsXPAKHg;A1Juii-rRniZ4jXOn^ zO*Z#`2;a88y0iE{76SQ$qnMsse~%LPh(yxfWrX`cOoFJyAf!OF!xF)_{#006jarQNK`Kf@Ts6@t;5y5ki!h{hTWbe-W=sY2Ae$#Qa z)mrDmnotV9T~d&4jY3eIZ>mwj>1-w|wYt{SD4uszOEzcnGfmv`{NOW2agRkdcXg%I zT)rL{Iz%BC0azY_I+wMih@DK&7Re^LeND4;5dcG;nX*1*N-uO2ASL9Aww<5(>JSFi z*47p(ZMA`FFWXRm;_^L1x4 z67Ktelq+!M>%;d*dSdta(7!?3b|%)emr?urS0NfS;b$1TFL(2etQ4cAQoCW0uXH{D z$C_FJHk9mHa?cvxX?!d!?iZa51nZ>_sp_-6i~UF3DQNq6$_*@lpZ2Yog?;S-crK`h zQ*suFk(1HIavgFy1G^y2jfgq38G{J8WhOU)WAsGlD9Lo!vt+mtGWoGALjQ+3C3#Lx z^3gn2UMEF}HL93lfl2wBD;>)l70HX{sHAz+M4bcg$!2oZ@=!0UlxIyLwa>)1v_LpO z+|iCjHeiv1{aELi>Ow_T4?$;bP&J@AJ?W4YR#aL%C$qbh)Mkeu$w3Hw#gbBUjG%Jv zXzpFGL9-!0le@YyeA&?l7Wh>-wYzVv($(L{d)L>KODZ?!Fj6X(Cz0<`z_Oq_kUU?k z9FOT)mAojopD%)Ud;)t|g5r_Xn9Tbe`?oNpfos4i!s0{HM_Ie`y=TKql_m zc^S0fX)87Gw0~)c>oeJ909Vvi@ma<~eZ@m3l_w-z9791e?U*#w(qMZm)(L-a`n$&) z#9YHFN*tL&Rc$66TEQIk-O-AGKTS@H(1{M2-b$DMRDVV^YFKlo;1lAkDpWkY zElCy%*gY??wz4i$9{riCvYidjTb8}89}t(nDP=XTp)C#tU&dt3rEeKKoZc)tMx-V_ z4|c93*{bMV-Z=2`Onaj7XxNz1qeQ<5;r!%{;C1YQ9FD#8>j|=zg`zpUu#prnU9Gf) z#bIO@5S-!5%?*ehKL+bs=_D28lol$uitD86DYWnotKkoQt?{v0OfQquRSTCab_kvoLS9QcV zU(R34xDl&Nswv7x6NfJ>@{BiUYf|m7P?E}DGJ61H(V*I28@j^& z@#S-p8CBZ|qgPgMTQtb*$GnnUisK$=izz6-37DxI-H1^;RZ^Mgyh`2;6mZp`pv_t2 zLTV2~pXV9Bwy<^AjGr8^(lMuJcr(ad=be%pJ_Jdk6?HOLN47%Cj(!EOl-9fl^ptNX z%=uN;k;>74+MmYp60;0PVTXPO-Y|f`H0c z#t`%1r!g6WcHdF;v`bpSvimJJiPl+0~fb4(Vd8R-WrnF9o6B0Ec{RO{?>lnlUuzKIC z4cvFdtM9KXtYFE+&UB*Doy`kAD9UqSS2i>C4xZCVjzjzI{0%GA?d*nv!U=DO2ZclGeSP2y_(zQdV`ST zO{f>zK1vF9A|U~pMBt2(F^=CfM|r0i?udk-a2qwgb2&C0t1M=ENhtXFzPwILD1Jez zCS6d76s^0-ox^+Wt^;h_O7eY#d2iYfHDR?Rcx*({&7gyknV6g2j-k)I)lN7+(lcph7>f?CB5Bmq+xrz{Zw70gMb`2xcyiZFaD|0o6gUgMD?eQ?>b4L|x)HAa}eKNR(7vT>}rI zp7mW-3ubpC;;+xO(|Zlv^_s5liX$dR%Uyc?UBmx$-by%=(arf$Aw$gM@o)#5)7HpK zAZ+Ve(-8x^m{|lnF;-WZSth6D${Vfr5Vs#P7^^yZgehx{=mA` zkOio^LYVXG>f@#w0YL`bsUKL15-XJ9WfGhhN?($i65>DLkahQ@sEh;g<6xg z(BJC%Lhs60FP+|##9dxTh83HB4*nRKf7#!y-{dY9cA=k*IHKcpuS_|~hX1WPQnpON zHJ^fLz##6q^M@8?&MO{Pczpb(!QWu zZa2|$j{A>j&fnrX^4Q}IJ_~>NKi>Ws;MplSGfj4HAnf1xxCQ+PzXzDG7QC-pxk_F^ z7&vnn0fEyFlY8xdxS7<|b`_7_-dg|E$aUw1S8D$`LF?E&ut-PO(LEqTUr3|``^pKL zAJklm{kK_~Ab9rtlUAL-Rg^0p_kLWz2UM%ezq{0GLH`ii6*rTX)Z}CzgcySLcL68D z5vxBPHuAQ``+??6f9Ho$cjCD-=eZR*f8DO1EL_ZIy8Op9^`bYxzx&0a*Z#wmj5BX- zqYAqRWNyX%VI^?46yz;cy?a_#M%)Woy^;MXV*B-H+NI7tAnqPew#D{WpT*`k5hJQA zghTK`@~%XmHR+C3glGA@>^3#8U;q3M5u)GA58k(9AwePOK|!2Kf0YUT2ZlXVeD?%l zyb5*I7C#u1ECP@Vl0%SDoWl_jv%*GI)=CO#|;-_k@ zbJ~~X8%B;tOzck#CH&S#d*^7+;#AYDoV#S(d-Scz&;m{>mA<=9C(BR=1BrCtdF@rmsU5S*dHgk42Uz%+zQ% zIF6%TG1l5TrkN-mh(dB<^(Eyg4BJzrMgSvmt;rTQd5em%F!ni3Ntd7Jqd_ivu&f*{ zm~X{ETh~UxH{`&L?0vwZDLI-R!KtYG7V#}n?K8m@oDu8^Y0B%A^uaOKgv1NY*|2&E z@BRhN8(kZe!;AN`C8u7DQ;Rx2-Tfu4V z7jk<643ZxM6CIo{U5l$_Kw`gl-UDh(GnFby{#Scn8P?Xit&7tZY0==&;)PH&NGUDu z?gWYiEgFIqD^gqvDFg@{s*n!({x1Y=q0QBL&+ziM?u~rmJ1LKq%~%EE{{~6am~0>W+G6Uc4tOOf zbkxjNm^An5tFOlPdHt~ineOiMaI==im8FOTHw`*fKMc`1OF@4_oPQMPqe~j1O=}cx zDWmvW!+hCsK;?MJeos8mblHUWN!v&NEgWF{;Vt*mp|ilDJ1=gA!xg3Od`X0)F1bE1wWE!+W8mPJ zbNmy$VW#u8xNB$E&Z7o^_N;`g+6<|3^}2vZ`NZ5yeurS5eI-xH=n&m6c|llU9p|T( z;(+J)g>RxfCUd~a;EyhYZC)5FGnzVEHe_5|IdY|W4)SsL!+{3 zlWBv>;qM`n0SuLkNVM~4OkJ3`Ah=r5zr3yTa>D5 zlWO-lUdBHFCLZ!Xci5&seo z8<0`fZ+`dnOn$!B63MWcJ$cxNB&X4 zEY8Wjw$|~z^Q#?8Z-MRIxWrd#!QW6L zd_&1L9gLVsP>VNUCxNHX9_|`2t{DB851|U|7f}F&} z*in$U-=kYfUoW{{SLV{*Gt>~;{eZsdSgP)6OzLLe8i}*=#P=P3NeJAo<0>(A6`nuQ z{5;eGs|xhMg|^O+XNTie(&n1DP5f&(&h+Ns`_(|Uk9TAHON!BnV<<@-rDdSwTh>!U z1W-~_Bw1*1h+Gc3_soLm!x`HZeo{`^fT1RR<{W2KSP+0vk~sUAGlfde^VYz1gm|vM z%qKrnBKfA>dg#O?N;uvIWY>F@=XeGhM^BZnLnlQVmx$P_CdbF>t6k8%u`g+zW8qLv zk$pbTl@dXDeQ_rjif-`jT2iPTlPvO0^K!73IZv2mTA`%_EQa7HD^Yy zQiQNy8){389d>UN3Tobn5j$>Q;;uEcvWV6m<@p`ow~-1Z$XSN_2D7fSHDdEWt_t(v4COG^sWf-^b&lSRbo21cJkZ_AWPZ6VkntJ>x!5hfa!dUC zjopbFM2^I#fo49Ew6h2_(=6{GZSSYm)f|!x{aZt12<}{eE6i|SV@3uWs)6albPVXw&vQ<_XlsOohV?gzuD;f(;+J^p;C4bh z)*v{?cDp<!FhVU@0b}rtZk52 z93t9WqfWsvy@jbP5&Z60mqbnoBXDiMVX=l5yY*0{oU*o&T#zOP$?5T>Q?X9eSk`Cx z)7QGS3KWT&Fz|MDyQ0WDN6^LLj8_BS7swt`0MoF|0I#!uzf%PV#@FMfb6Gv`zN%D!FZa>6P!}xYT?xL}k zlUZOZmZBk5a+s{JOo8%SOwBeihx*Pzf`*A=0w@cPaupH&Y%fiJ8qWzGsE-}RWM@y> zNKe0KTy)y;-0gIN!a^G}51TOx`Z!_i*qbb& zj!m_nJugxi&W32qEcbWLh3f^DieJHwzdzesCq2z+Kp+W5v~}^cTIS5zg3Co$t@O<} zuywdUop?luip7WxgGU#gnw?8fCnoz$HL=<#Nf$2@gYgE*VOztSu73ORulIK)5S2IQ zGBg;xqLm$P+eaI5h&UzO>J`MMeU1YQ*t;~^b;;Ycq1BW14d6oZn2`Dr>TuMuNc5BalY+>7KopXZmJR0jNm+&o}ap^{QAW86EC zbnc|OrcGEtxDDH`5Ad7o{PVgFyYt?hs#>PvvH;vC=~yrVW8R(l=|%B!OIM<$ZoCDK zZNIzs=w5$Og*mu=HSm7|&sI0*_;M|>_X%tMvs#+L4-VtPL2F}`b*s+!ZOM7!+3|$> z99&V=RLB;Du0Z|>Z1EF;KrDcdv&gqhI%Wb&aw6m)mdA{;svT)mW-u zhrGf3Lhrp;AkNG(s*4zRi ziR8MGXvLTQ*|v^8bJNrFd|QyJ!9`Zw_!s1vNMoZ<);7H0rq}V`hn*PQ>x>*rW~^Gp zqcj`!Xr`H?K*&gi*;30v*x)n(f#qYAM)G!pH-!BliU^G;J)RqFkWC4?Qkp6P4f zef9uOGe;C^asi(axXQrw0HXDrpUqR>2Fw+Zu~fJ)nwhBxO*YRJq;;XLI6%#Dqq1#{ zWJxz$hdlK!ETi=sa^lS}Bw)W?+p=gQR$wNee}^a)g&eUYr(fQjkrZxlc~CXmAW}<1 z4G>WPXmZf%rb@hm*9cKS{Ag_>B5)6gVn3wqH4*|9=M+9D#~zT_5CCH*)dd{Esxp_X z$(_&i;*r!F$JG*^i?1F8JdK#EoGZ8Ob0%_R@8;g!S&-Q^x2zGFi<#e>d*@akyz2Va z*Edc7xH{144sX$axlYZ`5sv!Qk2anpeBVRhi2O4Aab$EZuF?B@ejA?Os4%6qE5O30 z#1HKSAL4iI=6B_WHn5%qH$)c;!tytjO}Q2v8KBs&9eGf_PQnEb| zr`#B8mBL{=B^HMG^C^Y#XNj{dZnlNJ zD(0A`UeP%iKBI(YYBV<>TU|>HTv$ui z*9$&B9}aggny`J)$5Y@ZbrGCL@bToFqPK^2-b7b`;q2Hq4<>@{TDdHZA-L!Jp~sG| z>NCwqWMrw#KjA6!n#!2;=ej;B2=`7$e^9fsr$*DQZ$}AfJLQ?cUQ9IF?wmx_)o{BI&m4X-Qp^O=^Fnn@y%J#yF zm&8jIteZUdf(U0>ye@;n-man|x3C=5!%~qil2qZe(1pess$b_CJb7bTH7p{rT~587 z=zgBA&#u8YXrR^0f++D7%Y5=Mtu3kodhf-(8dTEkVwOX}@_2vONvuY$y)BA|e_kvN z|Gq8U*SAlFW{aGzi&%X!Xuae z)Lm&TbzLXzvfB3OogeT zkQkWZ*LUe(Qro03-Y~ZIa(~K(50}YFrs#&3a)z)B zlY5JqQoELN)no$Tdc0HM!`L;SKpslUD&^V>TSiTzZ~MttO09(n%+?IqjZt`u3n3pp zl#twO=>gRX@^xZy8vMiDE7RJ2O1tK3hH!qgpE?OG1iJ#-%)YMnwoL`(Z3`O0>f^bq z0npSHS}Dfy$&X7&`{w-`aq25}>&{$5eE z+8mjh$t7FT!~nL-#dXoRoA2+-j9=d!>(j4vp%7w)gW3fL5%cb@UKxkbq0y`U>FFwo zV{o3T$&+Uh>RLNJmiB^+t`PVkNgE1R)rn9lz#9`&errqlF0!pg{3z*2b%>$&&8a=@ z8|m>q|0oCb2Ygh#RAqjTM<&=tnPC}?99mss;6BtD__;g~6F&JvW>os7xY3#fCIl_E zDaGV$D5Yp~4~suN_zKwlb9K9o>R65^`%l8N1x0mxoUZa%Ln}Wy+Xeblzh@8ws|qjuucda++w1 z#~{IgYjdoqAadbXs&(%@jZI^27CGCpT<8qb19_pf&$Mh>L$jt$m2g%*@@OFzdtT@& z>$BgtbxVtPBr>CQ7(T?p5t%SY>A&Ecd@rkY8?I9ArQ4XtK7S9kf*N_XFYc4KMo`lhQ0KP+{ zp^}nUi+Mxkr{7>%so8$iFmWg^@*X~IhvJ7R<8J}sAFuTNhlq*Dh zQMCq!UX{=DQ0O`cKy}tG8X@twr6}~n6eH5yF0(WSeYb~JJzSi_L$$z`HcwJ)8)9zE zX$P-d=CeZLV_=l0^<4_X=H3!(7xoS;q%3pZT=i?}x>8J{E_N2jCi_IBaCi%^NO=>? zT*>-g@;urwTMLE$@YhvD_oI*0mT$)lClz~AjDcX4q2Y|W1LY!h9xukVzgt_;+34S#yuA6~b? zB68%{3%(UlnEpg8-ej)pf~h823D&}`=BeFQla?VU*JnGHZIlAIuaUpY$e1bRFgCZ2 z#uO~uJoifOp0Smb`q&XYs;5X{jiORaS@rB2O-?6`Q? zJX_pVO_sGEH3=Qju0OS~pOEmBuA$zv6ud(D6@T1cQxB=1kMr9?$0NM}}ZZslzipG;url8u(SoRgu zQ|9bJRS30x6T#>7o#{IbN$d6(k82pbZlp-W<=ZhWlfNVx7|gncoWMO1TWE_sWVv_o~XeKViL@+ZKa3EFAs z2^+#BXz&hNkXlh;Wrbz}+1=a{;#>eW!k#u%i=Lfap|PHIsQfS`m7Ay6Vw*w`gM&3a zLbr1Xthw_KZ{tbdzxs22yzz6boZs21Kt3TeZB0Gauq*l`<`$B#(>vO1+Wpdrv7W6m zyQ=~eFua~V5`*jD2WsPj-nQ6{1fAdkh@sR|9`?l%?E`%fbv@h$%i6&+Vx;6lA3baP zL7emDCbbcYwD6|iJkw08XdRQwbx}5VDakqm_o(zprKo}|>at8?J|T@O6eGh39|lc< zqI48Lxy{HYXOYu*Jg>>q!@(sy9g0UT&ro-uYt6$alrTUBBO5e`uI~-vJDX<~c_?Y5 z$S}Fy29%KR+c&dE%X^@5FMu%mbwepKCyA(SvmCopl)X@OXD8dl%V3H@_QPa&Lx8js z0!WItbID}pSQ>G&AjF{k+9x@vlXZQ?_qS~yTH&cKEIlWN$wlp^54m@wSurHyHw)(}sgPoNbR$S>k%XKB)L zP3E=L_|?QZk;VtossO;~#J9Wya6v+>oE*`M(;i7L*YNTV#8HG339eTa>J^Pj?_ieesm^vry0gwnagt(9-)={!Lie7QVLF3zs0GfmsC#ws3_d%a8TEo2Id^a-03W+ zEkS@$Po`uitliPKtlRXo%l#m!Z|MpJO;Yq}V7D(pAf%$z1OdWt%o<7da8_bUMJSpt zDbR7_5vdi|s{#&I^QS$k75Q-#BCuQ}ZxpE5XQ?=xhIfHq@_1BjP_L#vaiG^GWu*ri z;jTR;DNcQm7u&F+-c-irSdyC^o}&_ZcEgT9_#wy+J2eHjQj5-Q2D#jLv(Tv-#h{@x zB)-`h>Ubh`14EuuzO!^q&Z$A?&IRA{K%-$uL(&AKUSzD@d9pI%ez!Ua%NKFw_FNhD zOHX4LH{<*w)NO=!O8?$s0-^B+j=`!&awTbT+&h*SjE0;3@B#_;~nHA=jl z_Fu4rB)^gOW#wGMNR&&y#AuYC>SBJC_vvSrxP|+etm8jjf@?zm>Cp{6qqB2Wroc#c z${&p%PWV@60vCpHVT~y{*>qILU`N|I@<4&Pd0Uf~!F0H%^5mHH+^~V3vgafgR8mQ~ zbi><^f74cH?H=sX^J(@DeJA_k454V`E;=+wr{rEkfuM-E=ADucJammPkzh4YE(tQOL{o8D`EeBM7k&FA! z7c-~QR@$y>u=Nd7Vd)qrwEUi>w}V@SQL`_pioACoJo~J0O5)M}!-?IpJ4D}DyqI@B zY9!phdH%WdTF6gWN{kVo19bC9QQxFWx_*59hwFY!n;%Q&f5vuk2Wnkvd56gef)Rjj5O`7uW*&>mVTRC6$MU@^>$rtR~uQ`x8?;A3tyfPSn_RW_0CoCQOW+wt2pGbUtVS2)HDAH>vq9~IszAm@Tn%KwZbY{AcvedEB zN@t(0sY%Jp)&L^F@tGy!p?QTT7E2NhW0if(#7G}wdTq7HIEo=0kC@V^Y_zxpX78XT zB&ZT4c+?Bw#$tS!7b3o0-(>#)e{%esAVq(O22p>e)Vp_ET(uvt`bl%WVc)T zo6GF>u%;u!qr|)q^9S@FbSnzej7H~TA9`6mpL}~A8n`RINOOHMVZ!YpyUPt|x@J2( zJgh81PZt#-@V>d6Q=nD)DdDSh*CnTIqLm(wxYmov+#)Bnm?KdoC%S7aPmMhVEt25v zgep5(%@*;a316HEF1#N+I@KRv6+WNR)}$}EU$jK&1UsA->87x}!oI{p=*DH|mwFLu zGJ30fj0PVcS%e1oEI9^&9ZAH<+@zaaGgQiHk7$-+6dkSBMa^@ElS?i>tK}~?6 zsmicPtujxxlCd@?8L3j06`L*9h zb{k{!-4f(KQ@MD_!hzmwdHhxXb@g`B&!VK9q}Xa;i2;LC)laP z^(JD*&!5}%z7dU(VkO#$6?q9tt!n5&MNv0XOPnzzZ;f^G`*J9&nHk=W-{@6+(J;Q> zJ8!Rkw3Y;RkOJa~+zhH8O-_s=lD3z~q)WIrUD9>JVa4m08?8XFb3mP0BN4SxPcur> zH#K?a@b;a?5JOs!m&MY<)f^C=I&N0-kZ)st$jA7dSj>(Z-JQ6%%?zD_=zt1d*X+HHx`JqgcKCGnX$?wWdgO)DyT$|Sllz=qMQX(MBA zB`IJ}g&q>qn4|bmA@zv46=Gttm)NJJv@4}@z{D}%7p$pyKdr!lREr)8oq@e(z!_iD zOH_X@tEn=VN0NAW500B^%XSQN?GFA4YfOVS>~MEy1DX8#AR~66O4!NY0}CvQSHvju z?@%gmxwRu_w4}Fq)m~ zwnmF#JH-3`aVVnwgL$=ybCQcdBUkb z#Ap%xJc22P1&Cz|CvtUVB2tgF(0*qIRF`MaZE;c{6zNHe-xi2tIR!W-Q(ZDdK=z7F z`+CaG1Q7sx7=T)M*3mJJAO)R_KLnGGmp5Qxyh#={zM#y_hTVwX1D_eN&$G;KVHCI9 zuUUJzB&gn+l&lT*kw|znpu%^h!VFwsp@7y7tuyxK(cuCeQU&qzq5A@_J~(R z5U@zp@WP536>AGm=R4$-RDEww>fJ;<153rK&vN`IwWKWH>RHlVJ+CHJem()9rB`QH z#(fEdUZ#KM-K7iFS0qMrc3azf9bB}!PC6ID(GAg&`s*$prv}$pb9@M{Ww=YWr8!$3 zq{l3PjTps>iGWieF5ALVzoM;Z6Np{+Cn13g**fv^&X37KppsWp)+nmj6tB& zTFUzPl7~(%Brq)e=>zP5N5?brBhCs`Q6o|6>_nsc?He?#oO3RxoreQ!@0XOP2MBDaLh0$ z6sjB8vWIGN+-9TH!=5RJg)VQ2&fcoRF@xj}?6n59w%lLqT2M~+}Pth?2=N=+9htd2*&_KKC&%{?S5?qj3JE56#?JGSHCM-@{mBp zB))NTG4G4}MoroDO^8LXMx5Ouq0dV^L%RMWYusUOj!uR<84173p*YbZD+?j{aLY00 zk=u!hZwA1Bb}gDX&bs!Cg5+|)+o1SajohO>Zd?q`OeO&*W4Y3U%6YGcBT$ z;&UDtJ&vES$cUJ63q6e3v_Z%H(ifpvEQ@=P?;u>=K!$^JxU>E9>#6ajLC&v_ zb%*5%K=X4Z{l)nJPMr$}2&BNV#Q25W7B%uo!rIC-aqfI`)!u}b!kcK++m-mV;T^RS zYm9swfvDV;=)C7;OenfOHIR%gd1P7VC#NKhr49&aCLKc)8n;H^Us>_#-J{iw>zv$hyAet5GKKX z$*Lx91hsB`UOT|biBO2NA%?-kH|Wuf8e7xZb3^)+{2&J+WSSmV?qjTvIK?7$2Sw4i>;*|? zWh@_pCF0BJd`^u#J>IT%k7?N4M0iH0h+NHJUh|YNIs<6XHCdK5Pc*zhejich$AYFJZ^*ZHpZ{p&s3%WJduzK6Ac zYu#(z_gd@TN3W0G0zSF!e$5^5&N~3WJIX)65gTv?aN_uTC*C`L;>3F=PM$pR{)eA@ z_~8d1e0W;*)W@HkIeqr*nbVq@+Ir^m?MougrZu9C=i zkG=B?z5nxg_xQ2*PP}vSedW_zpD3Tc^X|JRPaHpf?AZG!PJ9G-=iOt+)!zH`g!<{v zKsO&)e0jq+dD8Iq!zU*%Cw-$~^f%4+sWYEj-ij!FGR$ZaCj4N%#F4m{9}*H z!!8-+Q)<%~s4tQ=JHXWs8XogG0-O(3JpvG1q#@i5CtF00JI>*I#!r!NK3yy$)mj8b zsqOUM_-SK;f5xq=?0HX)$yushn}grw$N}IoPd#?nz6ltr=cR=QLrmDGId+0NTl(Ma zi2w0A${+U=B1?sjUeSL}&beIi=Li2=emi#74_JJ%RZBTjaj?X!(_3_(Q15#}<7;Abm6S?XC zO8t|jRD9@C8Y?m-K8ua|P#X6^erkXs)alnU-x+^q%QwnS(jfQ7FZUe?mN3}~fPdbL zAaDx}8Ip>*)pmJL=DQJkelF!cSK>Wq6Fy2;)(;<;A#CZ0E!uzY;nz}nx16T)<$UYo z!%5@gV4rMe+Wdmw#r`%OF;ATbsK~p8S!BHWOMB00o5Gd<2Q@Rk^8u~$2Ez+5PqE3~4L%`^04aE6>(m3Gi|gVm_*mLXUGvYv%zs}sKabN|};yjilFFMr~)A-XtLH=EEi z6&!D6z+;7%yAZf3atF`Nnzh5=Po)i_C^lCxi@dXr^jB##F{;)x4c?85NL)>D()~29X$Apio@~J#vwI% zhf6glS~@@E6xwk^wSt!fFSpcvHTg2kfSH{7x?7)<+~ zQ12Vm3ke0QH!hn0J+g8MJDX8*upHg*=W;GbpLY7MF#Z>i$6O3(giNEu!W3fUWu>B! zCs3_=&_Jq{Hrs`RXlbv@Zl2se;G&y+$>D_TR_Q2*7oPG3SQ8L5oGTfkg3SzYH z;&lZ0D0NR({;x>)rd!YfC@n4pDz04UZ&r6AGcXWBRQr4 zwMT$8^;12l6Q~30w?_a))e&Gel()U^+ww{nyR17-H~^rQim(4XX8i(tuF@8iYlc0kNX&= zUS1wm2d5TDH)&42)$S@M8f>oEe@X3v19Q&}+WS1`+h_XIKEElMP}&14rN}S2YRoC#73zN$~?|r`p8gYC~xez>*Aq_I9vK_(P6--O!?1+x> z`_K4+Eg{Hd=N$7;=UPJ`dbfHq3m#6h7?4=#uP;wh_8p+xm7R{L;2hNsx8WvZ$Mz!Q zIOfx@$F5@GXZp6lJ1LF~9TAB8gEz=i-TL6`k1c<*v41haD*n1N%Tue!=xA!WOJMB` z>4I-S70o~62=LW#I@ncqP~}$|IMhXI@V{$?L>E3DeE0^$MEKQdvwFch{fA6>so6&A zB)ey`&iP<-*HK`9=&rA>Jxaw-rlwerY7iXD@DU~>h7jvI#IV$x;lw7+8I-JwpV6Ae z2)L{$f?aW6`$M~E^NjV?wK3}jykWMXb*0qvyRo4iEEXyVea=`a4(wSEL7M2nJEO~t zjhP!Hrs5S-Xz$Q6^qkN@6s{qOQLL_}p2PUyaaXatuNxn(as+5l*9sk)X(}s*zO=ig z=r0qpKHxk4ZQg8b2ljt1^~hVat~wRUnSlo1#+kR1vzpqhE))Iz;q? zqsT9Mzwwz+v+0b=V4VHW+QqX>_c|-Vm4{@idLU`?el(WBbD2tKclV$%P|A=M*6hw0 z==pT8Z(J|UDOpJmXnwtdz?}>}EN=?buHS$lnp&nUs%|)_0ugCdK13z=LYPCJG z#0m6u-B9*}z``wm8g!j=OP2TPbi~S1gMYn1yYG!@m0q$tI3Ou%NG+y{X%_36;+4Km z^y!Uuqakx-W#uO>q~lHWn^ZHZviOx|P>lEo%5|A_nB9=s)1hWum7K+yB{}D=6s+fS z91d8>RLiZtCaqeri$Uk8aNl#dc~};&;@A7-bvlgcp50lra0D zZrvWJyHREu=g$bLe!N)8u>fzf*tFCLo9%i3hQo8CBUX0CR$Z4yVi#-7YY~;k5Hkn2 zp3w^Ya&HDc7dX)NP1;MNJm~OCk5Vk9L9GO6r>zR01O}6po5wN5+$i>*8?ZG(54g(=J2oe#w4uRJh;btg(~4ESBiH@i~xo`WLumqllr&k&i$Y$nVB>@DFsFMHkn zHnyD+syWT8n28uGgq>Y7wCTi^4s3CCce#T34RNjcduMm-1KQ46z7`Gy(6X4x;czm` z1m1rH&|~s+YOK~ueG0e7v|3_^N3ODABOE908TBc`Ls(Zhn8><-9nZG88|;JLdOr5u zXl?meTxl2~*_E0kg>w_Kd$Vnu^E5!W8=>gOh0M;9dP7G;ZS#lQ@pHMEH9i{52wr*N z2wd~LpfGBYbl`>SKo+cXq39Jw^YQNalgdfJuzghXq|Yae6-0m)lPB9)n7q^9X=fI& zbOdlfHX1`9W?_4^;dBO~sxTH2i1fqc`IXPYc2cQf${9f+1p{1iIqw(Y;&6*V`I49> zuxKfP5PIxpJ=96x+SxZx54)y_$0h`7j(zNel{bugcPO4eB$aqyXX^t$haxHjsLee* zy^OKPj!QZ;+pE^?auJwZl}#KM=o+1Re-^@E_@bu^BSxFrtfBperMYBEX*{yBq~16( z1L~5;9WF`hc$)1lk1X22dzZY0s{^0ZH84lzJ5VP`XjyB5VR*bger(gc*hO1qVXWK z3?WDcL-#85z3R>Oz+(Ok)x=s>uB9+SH0W(-Ao?Pm9NazE#7(uK+stZm;ahUrRzRy? zT3wOo@T^d?&0h{|(jRE@YUQgnjMg%;ZdM3@5fCU;$*Kf*+bwU^CFs;4k< z0ayRV7M&fqB^ZdyiDPxP-i+wzhrldiI1Z%R<@DU*#J1gV-$}WB#?Vme*&ibMO*5+C zIeSgm^h)KyNf#S`onLM+i7roy2M*a%JGJ`)5*mka6JVv;&*=GS=Yd7$ZhU-}D_rdi zTFA-Hh+-T8PRU-jp|_(|$>FvpH|&xHmDDgVJ{ik|U#r9hMHoU#9fqYogTbD!?r3%P26;l=KmSG1mhFe&GD9b8jcci8&WOY0vCZ$w|7q24Z>EGWT!wq`3=<)XudzZy9&P+b1LoG~(F(_() zA~7fFEfde_7~iv-cd8v9FK~JzYh$VXTQXd9PvrauA5L$h0*3`xo{!@Bwr#c>k)2H) zL5HDoV+VYH(}t8b5-I5TcfO;qe!2d@zT6_zZNHl_@(>=E-8aY3D6XQDN<`slTmwCf z>f0X9nH<-Zoh~uBde5-C9c3L%&%i?o>|wZrazf_xYO}^*`ZhB>|LyFo{JI1L9XPuh zokM0laG-6{P}a&}y!($X_l^QdO`7vRSGFrU5rt8B!?NNK;wXKrPby7MpTO+bJ1j++ z-%o<4QNm-_tO8RaM+=h$_$Gt5=n!Axrl58F2v9k2AXKkKl zLWvhKqvgrKh0NyG5r@TA)?;!H#4rNl0^|)Pavmgw`n)fAb2&-R9GvYE7;?6&to;7s zM99u!o29=B(7F;YvZ^eoSg*S$dX31tk1F19N>His&H<(d;0sf}t|*!^>46yM99RYE zm#iTi4Y4X0uUa8tg|KO^ez{K=;eopDg8UHXLJ!6aBqRXdCU-&sdg3&%C8z*0+hVOpP}veQ&$}&Melx zD!A?(sS-O3r<2px>;8dA@PCmMIhnX_Qm%Qoc_Oacm`KX*Y3(*Vj1z|iuqEjp>HH1W zXTBHzb$cHRp||p}B9GIf&xcwG1CwYnEgJ+vn_X@7Ei;7AgSd3F!Le%!?%LWbcvzdh zlXDB2x&It0VV0teDBrwuQrBW^~R{`@D5ta3fQqZ}jS=UK?W-k?9oH;F))$ z+&McX4#}S`3d_i7*kWhI{(w?Jo@lzi_I;9*6Y_pXU|jcQSf{NpZZi7;k=4)kj~CS& z#V>S*zROrx8BoOtZP860FE$t|Myk32-AV<~iJP>NhirkY3pgeTs(bT;Khdu2UwJ-@ z@VG(k!owbRU5;L$}1Vz$7p$)Oa zH`{eQwiD+}o;ar8gI$8j($#qV&mT?m7G}O4xPG%cHP9mAT9H4rqCX;w!q8jzw{@hx z^Jhi(pr#`!youq62eS)9-q*bjhJj44xM9 zpl`w|onY^=EU?}vA&F~txmK)~YE9D;FB3I-n9Q) zlFKmXVG^NmV=O7&An)D+kCi#RNNX9(T$+HACNY|mL~pL1lsnW*AtmWuSV>S5gqppQ z;4f-T@o+__j8%-=zO=7KjP{K$=C8qY58!GJ>1y1cJg<$o6ohzqj#w$phK-lw$@{C@ zJ;2nCu$k%9%6c2DYp!0ibt~8hgW7?2&R-Ddnl$yf+>?apn$J1pyJzu#ev@Ed;_R4O zm0B4Q86U`s?0peEk|rJ;rrc+=39vO@vSG%3SZ7d9JmrdZjM9KxpJf@7m*g5mDg@Tq z=YX?`ej9p{?`ZS1+P5GU`4SUaQ~>Gk)EFCTYFot_o89lue6!e?)mu+t^N`*FE_pRh zqf?^X?EZ#tZ@=<3i=sB*>J#v^s}=dA07XCn`mkXLd7sgEXvs(%z(g=Nz*ujSXEU*q z7|XfJ`qw=_ml9K0y&^TeE%6Sl=QFuY8-ULO`ZX1%iCk2t?z~#LlordcMz%pad&XQR z0-eT}6b7Z= z7B*e83N;YeVQnzS)4SDj~GS3hq!R#jhZkdJ6HImN5K z5`MMs_F9IStSOUex12$~FpHECyIt}us_N%_?k)4Tay&HoY6QN01!Hq0ffgLB2c^qk zpn$gG19>Qke19cXa^H#tv~FsyjSEdX&wZF{#c^obS9c9A6xM-dc^>iJrG89f<^f7w(4f^7Ww~$nitF#?_5-!83dU>)sm%vT zCorh=Uaol=!XtDl%m`N!u0`|y=;B*+&34NwIv=JpaU3$$gPNw9dJ7AkssFRzK844ZsGU4#&d# z#-+4HgCoGrRjiz)J5M%m@N8L)2EsI31w|%WcxweP6=FkW4?Dbq$}YIpAn3j^UWbRhnHT(guvGP(QPR_tp+yBhi?XYOj{3 zVucfTt&GbF2kAa9au|EhUd3ht!S-fRlS$@AMFoOZPETJ?F9#SSmLn<`uoDB;Xt7Ea z8nY&%+MYQz%c%+Nv^B*-H>&(hAa%DU2R>`%NqMZ=f3AwY>$mS-q+Va{%+(wfD`pDn zic)^uSS8L`sMdu}dxwB#sNZ`4;Q{Ndn@0d#8oS4#VeUGRMj|r|_9~75RVFh>fJbT~ z{5DMiaakJOK`p*d$im#2mgw8u{TAA3XW7-{1@~((HcRI06uH5!)@cvF+_KO+aGz&C z+xEpI60|03RLct_U}WcO!%M56)s!trF~gTYQFX!{U&( zWwoTnXdq;I49&3>5yd2ly1JeOBo-Gi7vA=H6t8XXA=l0I?w(NqRi^Fix zZY$jDU@yYqpjTn<@f9_E-^#fnDx&RByAFK0mEh?%w4Gzj4~e`*1*P>{16_rduQ$Oj z?fo9NIko8PGBSuMNU3X94Xl`n@HfBflV@;zS`sW+W;dhH*}~8r+`e2bF6E&0b5f2f z{b5fIN_FC)babdQeK2qo+PQpM6qjP*v?YV9Q790p$yVe(WwWg9+YJ?$4`x-Q2UXYx;b1HmBhTz%OI`R_x*5ayoM>j{u`MA?lOq7-am%nK~mt2-z3ok#}Jh z3-VeXILO+~ugsVIJU2mVW4P>DhF*TPwzD5^;H`D{1T2CXIf0~?w&WKk#IV?48oyBH zp>(l*`T-38BjVPO`gi>5NCS1bg_oa~J8UZqlD7O*@j)v+8p(1P&>2Ea50jzymjsRa|VfH@LcqTNC z|7@&&a-+FAaHq1TcQwPV!3S+--ML#UIv|xCkcmi{U2R!nyw!^?=Y|`T3cKgUHMb7j z!_Ku<(yoiRNObs6jHIA-*qx*Pma|R!du-RPlctl28vVOsE#SjlT9$_kk7XFqp);ZY z_2u4di&v*13EDAToLs%U`%D;<;h_c0af?V_tfXu*)5Ma>5<%LNbJGlDV?=ZYdm#La z8AM&NfPaRj8yw<_eNW$*DebhJBh{R)KV4T^|UyD)`PN1ihz7C z3+In?xw^C8k5Z-K$!fJdGGV|}8jRn$RMy{;HT+Vd7VNzv^`Lbp_kYTq_;}!hiAI{8 zl@o&3aDC8k+@8HyMWUH zCC+j!NRyOwgcNDFgV!XRmt{o8RRCkz#vh4COUu&piC6Xs1oc|0Q~%BbslyK~Go794 zyqbz{ypWB=ukvwP#ahyQtWOT*_(UE8u3U_zcSrludc5vhcU-IcCgwmDYzw_MmQl38 z0a2}6C+@j=AY@|h2D@^|R$ygf8I+Xb;pmrEiOJ1NnjHw51;gs;ER z?LR*ij+XQzggfm;;e{2#kf40(!;avaSz_Xz$vn4r2wmr^2BME=(5iFKENpuR`Rmbi zRz{p$-kV;Fb}}Q-unF0>hRQWfX%6W(lW(?LsIM2)2q<&w(N7#dO$j6MET-93iHwKI zemm$`gyky<97-mm*4Sucwk*18>#%B^ zJ6yC_T}HsZwzxy51bg8vX?@;11?x-eQn6|#D-?1=?cM|i(>t~X^Kp8=vhpy!HPQUN z?`9-Uer7S3?kFvu5H9wl{&vefm0e)1j`Trp}#2o>ePNCk4SK1CPOYJ>O7%ki1mNp&% z03|*b7{-U#E?lN~Xok8!p%Cwp*_1)1l|1?%w9`~{852hAE2UVMI`XS>eL;d#BUjcv zLx(I7XypA1AwF_dQ1Vt3q0ao;7>NT?*FpZg5)%FKipSSNbLVrqe|sYYchp|2GjPT+ zZ1)E|AzX?9r945e=00*X&d%t)HE>5@VbIJ{ejQ>wL5H^3_vt_Pa+?~pCnS1lx^u~_ zP<@?Y@A`|4i;aeCrB9JmNjzv)>qD|4bJxo;lA8FU!o+#=Jk5q1_xH0FL>h~IcPjG5 z6$Ko&e+J8FfcZ2%e#`5XqAfi5Wu~tNVh=idyUiFn_E09W&d*0~6%UEeO2huUZ z3IV(`xiIwX6`u*c8nWHOPTepQ$TYd z_G~v0=^Fay8@g;MTwNb7B96RbPMj6&Oa&hSuCFei_@KWxMA$NKi4F@Eh2reGyPHtk z!`V^n#FxjKdDWhtuXi4!b&5_n`cq@a7e+@t{cK1Fa9KS^|I%W|5#VD{IVq~dL#4z! zuKNe3bm~rLi%ma1RKy%sg0-K++37kTxPOJ#g)7%YV{^hk9cre3Hyx#%xfHRIr(8~K zoyLxAIVnV>4eo&6ae*T&bPBwmlS?sf@x-*YGBcYC$9+{AGH~a8Nm{(Z_H@ z;nof2WEU9Y>uO~E#n{N@3N$SEAuKBaq&LS-w>s2V8KHbD3H5HV?)9nCZ1{Yk-%Lwd zA`BAg?!gU&1)PZJ`JRv)V{NdmHbvv;_Uz%t>&`iU<*ajI-%KI98W@$-mF(+}xl$TT z;QRBj&zZ6$p=k7ML+)OFe&M(WrLJmTQgUGY5a~zpf$@3Of2**}0K&X3-(I^|7(I~L z%`t*Y*DGo$O(}`vt%#Hxb+=yd_giZqK}+<)1grcix67Od7HabYGkO2sRqkc0D82QZ z0hw7Ij2UCz!MD#=ojwBC0Mo^bimPnY2OT0^mur|S4OH9^-IAu00OdfkA&{Ici@vdc z^5+56;jV$+@Y4J!8r+L7xqdUkv@>EL{s^GL8i_C|OD-U26F#HK77}Y!%Jt(-Futv{ z@>=4gfNa&`Nr$+c8i1*9OPl15e0fSZt*xja*2<2!O?!Az%T!IH&)qJ+ZZNb-63jj9 zCD)d_xNh$g44w?NPA^T=d3+0s?8nD6S^CFkJPjVmS{}L8b@GaM&_<*pHp7fnX>6$+L2o8SmSq)EKQgYaC_G_1<+T> zpU(`I7OrNFeO+R{O$(a3G;-iumR{4ll)l8>+DMhv?+jfXiy64u>W0@?EU3#Ct%GqU z-AM)LT}s}BocrbBMa7=2uWFtW!did?xeOU^C4& zinv=F^1yML{36_-wHRkn?7$IykY62bzD!RIF>%Y&FU_CYA6wai;-8VidfH%CokF_0j_mQ`F2Tf$1rXfAL!~@sP_jX z&*5=YrDh*I{3nM4dE{Vv_!JP*RR3uDYnrXqo(1E*NUzMLqF`iI@_33zwkz$P$V~3p z03z@+Yi{k_YP1lnHt9lz7C{HQmE3{ofoQl~fAOtW^!*siiq5&xr=v`F=#Y9w1;@5mVnq%~2qnfa26R`A3@DNSUyJ)yX^L)c-W!HfgmXkC7j&-{4=Rk(`nOzk58gKf*4e*K4;E z2iJQkuGjAW3No`nhlD7zHHuC&sB9esP|JXwmwg6iut7G`5w>*w6@LZY;Zb^{$aly# z{puxnNTwreZp%|B@oNtfuphGFB>7CuQglwunJY-mrn@l-@g}V#asi~!-yFJ8IAz^v z7(Ec7{Lfl~L~}b*K;WU!kxZ}nQ;g!S)cr2%;P;6c%sZ`9CX$`GUNPxFG*3D(3g`QK zh=wkd~~aOGt{ zx3>8`ihm|Td2c!cy7aw_L*sMYE(t0s8u=vr5}OVS#cM8>NZHWPA-VU;F5Em$CVEc3 z6?bcO4Gqk4_e`FeRI`|;^zJqAIB&T1+K$Ypt6NJGYES4-`oMk!`e((R~-D_3(s~wSpy2=12q)=#J5_4Pb%Rh;;kT1f1qIBY2#|o>L$2EvuUD>fdq*O3>g_-bpm8NM zcq$tf!#VfZ_wD{3Kht?eJG<)=hcT1d-r44px+_r{YoA;;5(!+|wR5iY`j|sAVf>3S zb?($p{a>s|KV6Bwx-`r1BFa)yvDvdUI_6wNIzb^``?yqoMR?B6=o+5dKn+|fwud`A zBDmZ>x2z+;fOvXnJ4q-{88HfXzg!`qylC8V3bh^I%^3GsW64WfrX^wJ65Z3(C)BE2 zYGWFc!WK+bhJ<_pez>?F{oS1Qp}|U>3a=8bId)ffr&PT!MHxzlABuo0lFTbp9n9P4 zGF$kF9pMOYm*O?$j`pplk2fa~wDO7*$M^Ma?VR0MWMf&`Br1{>k%bQ|z?@1s=`K5U zYGwK3l9L}&VgPDV>Z-ZK5(hO7?v) zi#la{^3z$!v?LaWERGtr%PjHh0B-oDb9)VJ%(;(-8^2Q+AhPbSwp87R?gX88WksK; z3&vJNV~tJZUE~YMgL;SguR|JbO%-a0^AHF!3!4y~j0HM5@b~SM zhHUrLIUTpU6S$-i)6UNBO;@H-OaWdDn%CEx=PchmbM9Z?{o+@*?7Le1Xdj&K6`S_a z?a_&Za#X;NSLn$7@xLn6ui7r8OUI?-4YFnnVv7HWwdC%fJ5T(* z?w{}dFZldH$n#!g(f|O_~$WR@NOe@%k|OT2U*( zfzPERP(kWy>*AEU&0vPXe%%oubLa@5v;7xliu)T6+-8Klv(sM4ab@BOd17p`$Iff( z)Hv$TwX}`^=lYf2&gLV4wADpI@%~K|es4;+RsMY6_OMhEJ(KC2BF#2X`qdZ6IF}t4 z#ZI2WLgASic?9rP&XxmEg52uAuy${3CPz1SR94$ExmDNuR!;kCNBO=0yC6_&*5Ob)^J?+1J1SmcNJme_pm_7m=Fb!nfroW);oV*k6Vemt)$@A^( z<#m~h-G&eE%r&b_mT$q=wC@-Rx_dxuc}>5(J@A+8+Kz3PQ3)z7jw}B&ac`&nPo818 zM$)vsqRi&CQldyY<0w{sV}0~i38jI1XmJE+PZZ1HM}R#q@}Db;f_#+>#-Vo2^^O1~ z6s1f22*7YTIHP(57~v`dEbPAsOrV#KLKzfz-IcCT=4r^40Rv?!%+DbXO7TP~eBpn2 z$0#e8{pce=1dl6I2G2HYgHN8BW+p9^7^BNdn#^@cbR^~gWZCMfNTF=Q_x`MkJWa3I zoN7c=Bnp?3+~3cqIy=C1(&br?Ay$(4X(4`ZhgqT&_zOyT>8eupFHJifSb3>T-ca6D z=DeSM31{do8DdL1l@jD!rBHA;j4WrBWbP*%9H4%j6S@3SaE_I$42&i8){REe3CwJ4 zAgygr`_}@+yjgjP&EXE^ZGv^(V-$NG{%eJK=WB(#Q4clM&qm6Brm|ag;VHlQ#Fu zXcGOdg43J-{V#*-FBhu6*|fjh`|aXC(Y*hkl}4BP;8u&6+`lN5w-tGRmW{XNmf7Ah zvi^6L{|}upRt?P*)PB^1U)MOM%4~&&ow=<1NIqf^hjV;X;`Tka+^1|_a*f0uPM<&^ zFSwzs*xdblECxA_XxNj_$Kgh(p3lRW3t{DL9DSLk_YG{Y0SE#kp(TWNrJ@Z4cH7u_yfE@nis0!@ zrHeui$vQl6^%+t5Ay{~9vAYM=N&x%OpHHrUIMG(n=0O?$S|{JsVS&I1C`=$zCcEiV z-siHb&&%5KPB_Z8yHkQ>d*8ELM>|`BhbQ8QtWV`r#Nj1@$BB$PS87&yq zpxXoHE!MVu%9t=uQPYr+?b+-G0BAcuTI)!ZYtX@OE(zFWaNX*5XlH~?m8(b~AdavP zcK?}hQtw5kTQe3Gd4cO&>WO}1OdLXOMbCG3N3@6Xe{l*cGcE~DT7r~PpK^Uz)D+ch zq83ki#$yLmgV_@vl4c-Yg7xzv1-SrLWfSMk<+(dgwYtu)T7E;}hV4t}#OL-V!M3MMhKqWt% z?_wev!mIwVot3{voT0|;XIqb69dq!581<%G4E4ATTV-D?To`R3IK*sCJ*F$P%H9Bj zZ<;_E)NX!86I^a=gre(qFlir?CbGJ9xgYT}6(+9&_-f^zck}NsI5VSqGGPqI5aO`A zAx0lIA*Ig#Vbw`*1a|dvzSfRi--|THz)0akn|18X$$q@Es3GGUnm>N%I;gT>QTol5 zzX$v0epF9U8`ZK(qiT*KpH3M^E5?VxD6eu_n^so=;Pgp7s;up70Q;@t?bfR zx=1asrlHJQ0dEm2gJ zZ)lP$5^PG!O ziQCaPTVB@uIEiTTCk##sXA(v3x>_xk{dlW2LzputOvs5w=C5b7?<2_QH7on#%v__) z*knj?QjwD>6i>=ur>R*lN?%S&l9{WLsh>a}!+H?~H=|#{#HhAkB(=EbH)ae$oLI zI3IB#y`g|9SvR?xpE&OXLq{8b`{tr0@ujrZs}Dv}I3$1!iYW8_qBEM)cX-$upWtUj zv|F(wIFP85!U%YZvK*FqZw*k-^?XB340C!uF}x}KVYS&|H6yZWs63;jKEma^Y&@OK zv*P0UXLsxn8K&P&M>1j|My2N9&?p#JOps90myc7=|F~CH^z_h(ew~MFx`Jh`Uv#v& z(n5L&4Zzt4y-B7UZqa4!oKAGi#yoLwYT%sSJAx2zR$LGo_+oR_a+Y8p+%g)Mj@_b0 zK+=?+T-R~g@aeL3k1<(-x9$B7=MJ~V*%jG+C+looxxYt!zhqW3BoL@RL&ZTNWP3J6 z;M^~yJh{phao3mfc8f7Jfeex*fPO&^Qu=0&1y1RC zZTEc0)eLzpjw9043r+jzcn!>QK?%9sbP%~tu_n8PhLL^aG9+*NBaBWkY&z@Hm8n_t z0qf!trs355#=@q=99SNXwtSFX(O?~-4!Zw96DwAqw~NTaQA({l(6N_RkZD0t)UZkP zUc$qDaHVy=GC=GFbU@i;i$QZY;wzFJ)x)XqFe7_>+Jzb~c%QE)EH$mToG_`BK?@B< zc+gqjHa|Ae@@Sa(( zt}%yL*#Br7`HW(^$nwRf#KTnuf53Pq-bNil>r)d+&GhV3~$b{1+9{w##@o8^( zrQCM1{l-d@WY4mb1VN_rtAZfWhgM4o_UDFWb$TmjPVqHI8>!S(dnA#QG|tCM*}0+8 z3OQM^s42`dd*y6}=gW{}_ymr5dkO|@8pJaqs*yVyg??~QU=<38n^ETAR<;x}5adFM zv%$#zmpFbmGX5-I{mE3KyvMxPI4p?Kf;Y8prHZYI6FVili(imuN2;D|3m(0-&k%aU zox{v>L}ixSi#R8_nZRK@Yq48t3w2TYf}lf_Yak(Umu4S>hi9ffE}F;&Z!#k@*6X;v z{Sg<^j+IO$4V=?G=?o9c(MX9La7>~P*cFYtvO2g9ESr3mq2oDUH=6B0L!t0{Z}4M6 z$QvN#b9!b^RN**$TFeb(=jMvFDmJVednbQ_@Vm1TG;m(&pHQbE*hpNR8}p{w40C?B zI8Drn<}{AjPJBwOfBWY9RXg}|-t1UuT(H8a-N&XFE}yy)|2DZ_kKfZDt~ZLCc)kWb zJq>1T$|>qo2F$8EIl3_TJ>@dvf?r?91W3)oX=i5CN#X(t1h7mUBZ_Zy@+*g~L%Q=sW>oRSi-8Thy z2{Ha!Daq`do}b(zOr1DFGKJDzgh5bDl=i7LK$Z~xflRc&$CNoRzB2M{=F3x0Y3SFNW8u$++DL&kG;l1i(?lb!3M}=o>EWu% z=WT@gVZ|#+s}doC_1s(jdNX#vnq0w-<+okfDX%?jndb>OH{$=9w6CaSdr~)fZ7Q9z z_&Wc)SDI(Mg|m0m+&yN)k|+jW5$Bq zojZV_;g<*FQjSBt6Ng{M9vovo-4iq7`i^yK-LX`%Df<_(Rl8Qq~>zEUQ@20Csa~|oK8u_Q0#j(Qe_NEnFhcDsn_C)K_8f2HS zm7P|=N?XUKBZp};WEtFFYbvI5mI1@t#}ucORVIthZn~nZnX(b~c(wy4aOx+EYNJYw zNx;kVm*f5srqwFiw~vM8nQMnZpdsyJP{JXTJ>QouaymR*1B1OSZnoQu0}TI53EKZj zGWWZ+lziUg&D}Ar=(0YBhH}rIqFu+S*67obA>(o zLKDqg5=Z?s$67g$@S%sh7`)<5FDmn7;OI0W)22jW@FoWCraR|z0;mc6Y8KdB7D2>A z`*G1Zy_61))^JkNhe5BK%SzRP!FLGri~;WYqbG@i^A&9FzX`wIumZnKkh)l|KI# z+p*!D9TXJFj0Nq+!~Ej|s#uc_bes`NxePbwII+z(ULGs;c-D!p(`z3wyV-j)0>UgD z9v52>U2hs1F(FxO&MzG{GX;B(c7h-LwAy1*zh}T)S zQwkBuRwEnA7M_oA2eCo$|M;1}UOQ`Ae1D%?&xb_K%K(A6<{!823m| zQ%2rga*O!W>|43#@H4O!$l#lXbNolu2yWE|6{a>IQSX!Mtp8CF5^*q}I5XxWgFLeJ z`0!_~&cMypj@X@`%C^9&3x38C?aG*OyPBHLL@#F%nfK+z=X~Uj`m@1Iu45G4`YAKQ zP!f}0vXs#0O5@iwq_;+)%mwHJz6Z@I`8<=efGVT5^(A6>*7jYfMT+-mjSdib|)Nw_TLo_+oiB?z2CdYcM75b3V%P__QY8DYxN7 z*fm-JEl8y1kRZ?z%Wil63C~!`hGT$bH=-wwM8kDT76^9ecu&7c3y{lhcO+^eL)t%; zsApW4zcjNG5RElGD?D3oWN?9%j(M5Um(}-K#~)4I>ejI3empp0>(}t*^Qw^xGc5Qu z)=Y)+kn`>YkeNn^nRl3X0D7-ZMVj!3IL+v8GH9mr zPNFc(w~?<9StcJ%E)MJxe71fVr{lB6S+li)tx^`liD6Lo(#A)A`Ds$XK*J3*>%4%> zr>TQWv;5)wc3C8pH3?lJNp!|m=6_KezQ2kaNSXIp6OUff*U59P`|_@8o3DMVOsFvc zed?DC&f3Mi_vlxK{3h0E`OlsX|LOWGR(9V>pDI%LIgx#dzvZ1#UVn552o93 zePlXcI>I$TQRYePKZb?h0xZ*Guw`Vsf+$rgVsHkmEW<3=ZD~L)h6n~HaEY{@vsQDb zdGuF*_*CRs9TY~oXIZagcw^Yw&x7_Iztf+d#4(Co}= zQEn>l2pV>0xSYxQL+DzU8N%g9QIFEC@@_OY6$^@`O*+HwTYU!$e;Vka)xMwnLDIiv zJ?wie3Sik3pk*8dX{d6*?4mcF#D&FyjcIX@^cYc!m*PsCM~=H_32zCYy(3h?yLq19(Bo&J+pe=Xv_d zZ_xZ=cz#pZ4+v9n)R@5=qU*B>O0Ui$_ka}GVnfaJ+d?y2hrWUrzp!_S{nSHIN=#q_G4cyEsQOdK%d6^TcJ06l-!71Jns~SF&W9%S(jMkVOOT>Q+ zMd!JE2HM#Nbdwiz&hsK`<&5Aq7)37z74^uq7iI(NRDM zQ3MG5wv$OY=iFKMt@qA3ckZlVEwn#2+FD!R{_6k#E8NH>?(gccG4{cD^a$1|3(~jS zj%~ZrA~2z)CG6@IbW%y^{vbW?CKN*5JT>dtR9R#^YLskY(Y&AXq*0B}h3(k!GR#5m!>U|8OkBSL|)!@Z4g{=@j( z1Z?95;WH;2@gt&V7ZY!z2?X|!A(5*z^e9{20VqFuw{LI-Qv z^O%r@?!Bk|RWCvjB0Ke^_4Thl+f4361V9ptd@9N=8Ufh?LbZNM6`VXKPs}i6?NV%i z>*s#=l7Cd13?nHghYa3%5yQD(q>)f>q7vu4sBQ@Va?{zP$HJgJ1XH8TnL)EZTQy3#SzcU2rI|!0Q9MahYzl(Oh-#LZe51hf%42mKu4!2|#W22a&R~cm7N+{Z1Kj+VKJa zN`Y@#sU7jR{eFH$7fT+5gQM~hLv(ZfSQ)7DHTEQW0`9X=e;>gsfG zFje$y?|1XPZru{&gdka0a8}ButG8Tl8aYrB5e^RN87 zjt{{LY>wb~dXO~IS>t(zBAVT*+BRg(Fm=bW_-lyY=7I_3a{IT+LC2m)uMh@HKfXOU zdWp!~;ce#~@93g`;=vdLUz-RXAO>UzX|4X60Iphy8egg=uH% zSsiVJUA3#FcqN5?EI{kLd3MDCK14f_XI-xGTi-0w`bLm;d_t_|1P>Jun~x`|o9 zRiM~}bWgC}-w~Bh1FJ${Y4%g+D$;ec|F`(l>KIdg4qQY)hsCVFlt&lT&GlekPA=fM zDS@cmRTXFCS5dlRyRWyqBh#z1p+}ER4pf*WLxai+2PcLhNwE-0vshkFmFb*PnbQEHrUf#T{<3Q-QFpbVtZ#+_( z6;O!xT``q33`*;E>r(>PxwOO*3}Slv_nb*0}hpIA{?UoM*RZR>V-3g<$G(-3t zGn0rO^`R$(Hr5Qs4gJZ9K6g}f^ z=k%D#*AdHw3E}E zpyKR)L}Y%vvJ_v`1yWCeB$?A+Q5{!R`DkmITE_3H`n-iq?QKRD#^ZcK+o3{Ub_RNO zEFloxi46#ZF=eHPh5`ONJF72$eD>S0_wV|~HRbez^~W9s|85ce-S4lt^RG*O zT|)n>#(v$XKl=L(=Ek2O3{$TOw`zS>6GPdRO%hk6?UOTYGft2p+FeSvYEgbv5+g5p zRYB#@Zg)+5NLV62m|MJDNOg(Ib1!&{dtT3XW^um4r-hCHwy~n}>L*$~n4Br-p-%l^ zRkLppB{$|(DUy*WG4U45D2bXc++1^J`fW@yXLAim=DnA5a(W6PSB6pjNbGC5W$~>g zvRz~LZOpQcDp$iGHbDvhvdx$*@fPRSPUPJFebnh^4C-~ywl~q5hK5VOi{Si277f2d zACFR=U_ByZi(bo>EpooC4HY~1CYEM|@dBc|J#FpZYYKnNF0WwSVN+N6J{;R%*rCvo z9AqK#D;B0EVy=!+!6>lB$hYDOotkC!%A+TH3Z?ZmqbUQ{eUR=-K{hdVn3cA_17Nmy zTr?Tsc9)+8d>d1qahZUDHZmWL&l7p=;<^5U^#O}KKwgr3aKO?SPup#;14}b2t2(>= zTZNk}&IQl7TMQo@v^2dD)}1(?gC2OvGJ!gcJzjl4nRFi6lx3jBhB>#`w*e|jk&%4w zogzk_D#RFiUeBfrA_xfz2~FEB;ZApXRS8tnIk~AT7L^K&Ja^*=ldzoTOK5h8PMR4q zcVUdSB~1?*=X+~hST0f%?5RJv{S1a`RyAXmI-Y4|>N0(~`krI*mO(6fx{Oq@wkA^Q zeMr5C37y4xPpz1}Fx?}78uh*GJtl`)hF0vD4QEpa$GTnGXQipG$nSm$PX6!P$dP3e zd0y-3mnY55Lx~J#qU+eg!XhlM=u8YZ{8)gvPl zi+4-UFG=F!h>YPEMxRG&zxZ!%bMnOt)NASz=e~tJbRSGeNqr#-Z5iNwM__6w;Oz8l zE9ff8G(NiKuer zJ==7nQuoQDftUr>*2N$t5C18_F7e(6N|;^Z0|UX0C%YN(?>H)zUA4?R_T{ zr*hICMf~|Gyi*nks%$txKh3OL$?Vg||G#|0Ln|I7cR7rh?$IeZ(xR5!ILC#LTUG^c z?EL8+Il1@0)66vw8ajLy7YkmtUsl=g90`DQTXXLRg($Gjv>)w*M zu>jim{2@OR+Im#2C)tEB)7h+;#5@bDWkI4w3lkS{v8(cwti^pZE7~0)qL+BR-~TAA zr%_n17J0cW0T*DTmgtt^ivTqN$tY*!-6g@=gF3|?E29=bm5YP8z3vF_*YPjZ&5!Da z`!CDeka$UgHrui3V~R_r>r9Yps^N1oP$_R9^w?OHAcpFRI8_$w-HY&#QDGd4a{=Uu^`s<>|a>Stk5 zS$5T@R@2;|Bi0Z+Xe}ED9SGemkM?^YhyGiWe<$P(+2gwJPddpB^&iRES<9|18@V*r zvX&ah5KaXr0(9>xRbF?~!K671K!n~+Zd;4!{r&3no#&P6%Ym2S1AG3p6ELFkL5B05 zdHup5LjB!AglA_E+{M%G6fY#SH$$i*RNpMDgN&~ggePAQuzn&v(RQLzyWyp^*TadJ zCWS1!aHlbFOcEB_*N2=!mDkN)SlLUGIkDs6HD@etn^KKV+o8>ngDsOIpI{((>V2~& zk?klh-s9eqg@60vB@1?)Vml3!9UdFKhFus`>^8Xt5JiFqqWD7!^3%jl?1T79NX_9# zo0uGjSz62GUfm~~$tl4?9lOWu#ktyy$swjUr8lwh0cBWvT5VY^*%~ahU?>mfDe0HA zOu`dR5i~6c#wHda_w7WB6+4p|IS1Oaop!pI_z%8|`G*E53dD;&m zly>bOjKof#nVD9YrJ6Xh?r|>9C^MB1j^785KI%c2=nmQXIRJYi8f%*9AX5nx96jsUeKw`FQhD#3$r5pk6&^5IWEZS%ysW8zzCWfyBsO-8SsV@SgF zro6uLI(@SD)KI=Q99JN(5yO}?mR_d~A@n~YgZ`Vq~qdiWz zLSlW}6kO8Ja1mWJjnh5t{C8$3>=<>+F&W3t_RO=m8{^Pyu^L3{$|E%MG4w6=n2G(e zn3KX!K2(OqEO(xKVt_fmK2rU5f;l6CGB^b9^9|CLfVfFJLzYN=B*o9&EA8VOxCD>U zf_!*>2$kEn;~;eqQS$Qce(_}QN|6sjZ8gu`?`+HzPEx24#wg}`Ezcx~H9Ij9;5*+uNr-XOGf{^X=N#so zYE*U4g|FYD*`Cn1D*JXY44r_?0YDP#eMph92|wzD2%~LhUV*x`I9iYe+Zcc`4illC zU5M#fmHxUJedV?H3!r_H(DD=SJGMDpCRf3wLSM(A`xMjukRa`l4E*rKO!A8vUxfO5 zGb|^yYxAVobSq{OehZ+sA|3HIiHCtPKWvn1b)&GVmZp*-_f%upXx%*7lE~Aeg1PD5 zC7cw>v_a^ly|PW&nV1{R5yh*PlJNo*eyhT}M1nXdHePSmk~f=h2py!Uo?ubNGmT&d4GwbTN4&$PWAh3J;Z%kvlypM^hWK_iMrzZ15x zx0({Xh-~Al<@^2B18uegMPJlo&*915L#fHBMT1izD^-YY?N<3y*=wQ_k%jWK*X1p` z;Ou56Lfc|R!c`5JV5WyP4FEwwY%on{+Jw>#KY8i#tyh~9w-{inawp$cJ(rsycy@7i z$pRrXj8BggjV3^lPG-t0p{riJqCrbIy3N08dk9t{%G1%$fCVz1kWlUBx5+OI^1RSe zI8)=UV(d6Kis<}x=*wu6n}WU4@OpL_zB7V-&zry=53R85s7j=C6-}=fmU@hLUpKkU zK*xI)51OLc1}VW@+n7VEK9PwrLU68ie5pOtAW@I&ijLnLEwY7AA;+hrNF;#ly!={D zq8GBnYXsFnrWP4#Hlf`FzZg^8)z~dMlP0ldw@%BGH=-|i)%dh7ZSb$0qPc_%?-+p1 z8Qn>GNiwDK9ZrbWtaa*D24ibyawE~!^af9-w1r}>KVO!v+7(5Onmu@4eK&jqmY~SU z0=+ZX)SMhV*dT*?slgTCh@{GXpW@s@HSy!Z((2@<h3vD4xyuX8(<*V^k zwwDW=t?V)Ws&*k;6SJ%ZQq<+T3?tJ%W_4HvqFN$O>gzP_H;K=?(jPyaS5#s7SqL*f z_+tn6dwmFbYJW#!g;acVbWHtRUUhqWfO440$Z>FJZ=odIIaLDoEd{%0#3Q89VpcfpMv1nLc%FxA2JR#!tYd5T|$01V-xILvD2G+<^lwfPGiA?&>X!0 z2zjj}2Oto{$6*7r#1O+XuMPt0v{SCe1{3Ev+eC(7Jx3%(YTMFAd0lX$0?`4dSz%ej z6_s^t)&fA7Xjh((6Z9neZWGh>=H|<{oBEu)Xu-4mSCnVX_k}2SQ?F0F~CV6aC2u>-Iyp%;b7uD>>^eA#o_H`b8N9C z%A6QHon2C+)@O=c$S!|Xk|MljHYQdvKJ<121~EFjKk_!1IMn&Q$+x? zIdWGt9aZ&GOLp{2m_=0J)HbSEXla>5A&zEBD0zLX)kyRGRH}5p!0U1SiytK$iz38L z;a`*Yyfcp3SR%hP{p)}0?j|>5S@E#-aQCwEYq@c~gW!XW_t#9Mwc{09W0CLIF#!!V zNFwFRo5nL}g1v9v z=e%>E%yHJ+BI-lIDM9y#bs2p4GkhdB)eu%>bP12<3_@ z2$gu}f)j2mlg!LV7!!v#`liCL%O%8};V51!VaeU~!e$&gnrgN*>QO&fkArHf7E~5# zLwV-(%zfz0%PFO@rg(|8pk-<2vKiIHH7hfq-E@1<_x509CrdfCB&j2~6GpRW8eQlC z=<6ShMK>Fl<_H)OozP`i=ESqmp4AW*jAUfP^(2<$tmRZJFzNz(nNgQe_%@%rXeS#h zOiaB)X1a0mXL4EZz1V5mC0lh6X`WqrEtO;l>RthKw#?*mtsZy(Gh@_}D4wvwb@e|D>T#n@8@I052Q0XSCo}!vxh317FK;e;}+_AXO}dAxikaY*K!)e zuaf$$E;g~Ee@tfD<*9=$^^$~|lCUNT!W*D3oK!!k?hdUk0~FT~CTV6`kW-bCWfNfO z+=ozMWYC|aJypiu3t=y9qRcGyF87`;_3c0;@uo^R=6R#Lb@UD2CAu85XCrQ5bc(C3 zJarz=qMITP2Yv9Z6PYhb$s0E?_Gm#lM=4)Yh5Gyb$v|KvhA>Sbtd zO94pr%pUfjqiSqOg9Epg-GtYkv2s6TFO&QfUdwp~vAl@Ewb289l2ODml-IV#N#toF z#W~(nP;@-5n5Z;kg+1F_XJFJY)JU`J7D636J3R|2_xc<-iMbSRV)a)EEm<>%`Z2rx zVAglz^Vux!^`cWZ$QJivpkQ!dQ~AC?Yc~)!#kDoH!h|iKH8aMt&;{0xEtL4EHPMUp z<0scs?%f;&CgL6oEeJf&P{lKr!-9G>Hu(lw(of$T_L6+oqM)}PKmF0+`53Gkp2a_5 zr_oLF#qnaD-1dTo!rAu~b3{a^F>C357grrHZ1}*8nsP4)&})fKJ7Py^__5WGGKx#m zOl%q%lkcvkMF|Pp;1plnTpYewMMuOvko(JMgfjkI`F9nEi{Q|EIQn-LwxK{E3S^(bING2m)=Zr z;&0vqJP|V1d&@w~8u1`7q7J>c=dN1GwtxA3z9qI$ytiZ$7T;+bqMtm-UT&;ZT?MT~ zrTYL~!5SQ;e&X)MMwW21eap&bVzh2hg>_yhnPbjH6)~k)w8hlBGrn$x@xi&m_RKrF z?C@wWr56bQ4*F@EC|7V41=-az8IQaIa5h4(6DLsS!wugNgkq_rj;gB0!`_f z!vV_Qx7Bs0o-HTfcxpA3fN)=dm+O2s*~WXhARnOLsIB@Y|G1KD&Jc_3a%N_e>ls37JELaE|F^l(9*aciI@2>%f^hy&mL%93x`aVs$NZ~5cF(1P z)^_3#PS5zt4o*#lSzXSIo}XNpU`rb-F7zAU>h1_4OJhfo@fnxawLiiHvo>3@1HYP^ zwUjD;zwXTnybdnM8&pi7C7z+D4ab-o+xTD<@67sUFErrvcLLuLg}UauUiCcygKujL zrweW~!*JJ~zwQVMKAg&nGk<$#T6c!y5@tl0u_SgzC}7-i&tnrPoGyYAEhza z{48GQdgR%08!PUTXB0E0oSfX9wTiWQ z@HA+~+X4$vJ0=;f!Au~k*DZ`l3RZvlZBE55u;F<^L+4L_{?2#5tgQZ16iq8n&Dax; z{k9hHRPY3eN_e6BPe0e=JJ!-7JNF`#m^7ILs}0aouXPz#w%nU`GVIhwoSu6l_QKD= zj>#XKD?V~OAkVdl0B>U5obYVx4mQvfD~NM>3*#`!$XRAxe||K_2px5)qIqmuA@Hli z=;1$B1f1@bz`kFWgvEE5N<$3t6u)P~FXz46gdk?z{_7g{)h~Ao9FPB-wq^=jyQ?B1 zVl%XjF^C*u=2m2d=G~_S0B5XiQgb&X!J!Xd%+5s>m8#gD7}d~9r9OYLl!)3@nO_(f zz1YV1EB~Y8eI6hE?nD0@isxWBj={TM4svxhn67(#O8HjTo= ztO&+Dz53+&^rPp~<(ORK-KeGi&6_H~-3irU#Z9RJHuHJ^Hl!h!{P&KzT??9a)>5pC5t-(tq9n`lDNqW=~E?7GJM``ttMrHk*U&ogBY+82#oaye~ z1K;)EodyFmq7Y53f!lx9!R;EUpC*eBK-sV5{)+QV4bBkqzR|%`y$l*7*ARGmiljwmk=2V%Cw+zOizF ztDYLq#1+q)5v7QL)!pD;QwR4?=_nyrrdj;B;z;Dv^X zx%5OdE>fje98v}hoq9K$DN2Bu8+37qhBxxNtPw*t8y;~ff z>tTu9zs~=w9{$xH{?#x3?-~aJqSkiqK9iF>{kh{GS&BKOUBdGOlNisoFbwpGcIp>PSepk!muS}P&C2&Z zkvT~iLmTRWr%PZy%QcpxQ#dxOuzM%y6cZ~k20tM7cW7&ly&+Q_1dRB_6dFT>Y-Y$9 zWPd>`tb{wmSO4ytU&r8|9bUh^-tv^_~mTv}nl0)yS5+Ftg4dapj0md(b;Qe#pum7fBqr zFEu2nYxJP_g{Je-XHCj!N7}AG93>2yJzIJFiczF=FOGm?uPP#P|2<(?JOc~ zv-8In1cXzi%oS8+-xuQrkl#I%RxN~sHew%)+W}8r1xf4fwb0J{qS6ajEGz(3Ur7Vc zb!#Gg$Nv0e(SkWne7CrukEw_+8^ZX)vRQO2gXY6@MxG;WPQqe|`HuR^jL6QP@w=g123y z7pJ~m&uaKmuJdmKgulDlbEVJc_HJK?ztJLm+EDZ5pN3E_JdNPI<*!};R`?S9)?a>i z!9P;*gP%YXxS!+{zqm^KU~4}0+{$-y09LHN66$Z)rmnh)3m%#VcO9Ok6s9YzOCRC| zID}g>CpD2`o&lu2n<3PsQ2t|f^$A-im7r0VIYt=gjY6k;&ieA?a?B0Z9HZ`DTz81E z$P}QZt{Rhvo)`sp#|9I`90OM;F(6OU`^~bms-Voe#wyLQNc}S4VJVL(x}4ft$jYCN zfXsGM+l9j`?dg?|!@h^@?(Q`>T9UbG-TRj6_oMA}8ka-t&f&*zjMnt~DHYSIVmPcz zqYCo!YKI(~5Y0qRO7{7ps)KU^--E_cw-D&G@hiDMuwBZ_~-bT^(z1sM5PP z9Wfe+QTo&&Y&*Apa)jqEM9^`eiCsR=FrhQ-QH1(sL5GC@4FHd&Gja&x@DzmvVS7h*=JBAlT9}_9T4yO>fBCMyD-?q z7K-QDbK|otUK_b6i+@EC0Oc!{wRUT3BXhTRKvuM`mNu#HgG#f4Y5oq2xsFM@x(aDk zT^npYZ%(W6%swfp)1bfZdY)Y=ykT9sVvGy^0vR4J^sduVI1ZV-PD_n3? zrD1JqhR55&0gKqAoE_Vn-~G~Ff99n&5PpW+T>C~YDe7Hl?~gGDpVj|Tc=yX+Ksmo$ z^pA4`aR7_(aRW=>w0`$PO&*VRH#_0&uPZ7~*VP(SK2PGv|SfkvE-B(e^dBpH)u8waIEt}YQF%97VQokqW5Ix zW6Kt~7u>90O)v>qEfn1+a;eFgPUlVj*_;qb!LCm$(K>BC@y06#gVH1eW7TaOD=C{} zUR<2J_>z9d$nVVT$0AgdW8JJZlIAb_g5?!BUhbKtUFVgjgr}OQiC;0Ox0+UBMIgHV z20~5DS2={q-x_M4QPY3r=W8l{DCo2)i5rlvZ%qnyHs<+hKyo8N?bByBCs$0xSveuJ z_qURCj@$*g^pkVAI8t%tnYih<0T|$i0%gBbQ&Wy^It>IE_{_d-kP)J~bhmo?fETtU z-IRG?gXxzyZ7!swEk0sS#yQW_WeAEZwyLHB>}($n_L_3`xaJ`ffsKT^u2saXzuZ(^(9tVz&4)W-ba)C}3OCK%UG!8m~3XIr|uN0uH#_7tB~LmGz= zk!g|O8IJSp z>Kmo8_^&!-CNrtdU-XfzN?4vaHP27*V8A22t|B6l=&9$I6h)WZ;)Q5Ev7UQWOBws} z_UAvh{(sW`<7p#}SuuvHCwpmIiV4-I8?5zd?PIM4>INHLyNDDBp3X`tFZ=;8Ehw)} z+WFELMtmMWIjEd^jd9i}q7Xnavxy=T`?8^Q33v=a4xY*ki+f|E36L@M!qO3^H ztN-En3?s9c2r%FPZ5ZEiOQ_n}8Y-Madsr_5w2krm7-1$F0#Qk&!KZmRTrtn=K_)hW$uz2~) zn~mPvCv;kV!nCs$1_$UI0fQ~VV7PJ7-|%yGBoJ-_0u_SxgcSEq(f(O8er`}HF9 z&VXc=Pg!Vv7jb}4YJ!Al>pZzB9FA|c@+=lA)&>J?^r~~c86O~0eFQp6md(|tf|@Tg z3&I&TaRE{wISUa4jm=Q|qytMBuXww_XNOu16!oFnd&#R#xDp*ZJptLGIo;n*nYjuZ zq)x%vL0u@GcB&3SjRcw+hGqv(1^SeNszF^RiVPcqikhn?dMRE~5PGJVj{qp7E~~C- z-={8q(OB;M=PlFTyqpmBs|hZFZIU;-mLb_O9$sV1djQmd@K$kxHWg7fX zICmS$SA>~ui^Jk;zZBm30nq#Thy3|@z|wvArXSo=1m??tUv{w#sveF&>W!u3GEV6Q zG)?l(mUo0?)MYeORNuWl#IYZ#+wD&0il#@0D0O;?2DQh{6<$#Qd$7(jt4IBhMr(7= z8>FU+(Pb?2;@sIJvKY`}1Dk8=70;-hsyN+(uRi(#b-X005gX$b>DExZ&}L^s_qxoV z4Lo8Scrl*SEbo6Joq?OK2Emw>&VGgHTg-?8Uy*%gh7xy28r9aQG_PADI5;yyz4+yd zg{Q4yCFJgTqf^Z`SAb#M2OD{bqaB>Kf3Q-xRA*~y`B*3_$XN=}fi#ehWy~{-^jSrb zd!u=&BKlXo`1gIoNCzrCrTzukFq1&{z72<~35g{`5%B;xOATQ|6qk3AMHS1_cdNV4 zRQ#!F=!F?zF>r!*c}N*nCs@RJwt)aW49qTaU0foH|F_t`{PC9u{ZG0FG%It><{!c1 zBCcT6MDoT(wjHnoty%k`IQ2$QOD6lm!sN1KJQY@`rHBVKD^Y;Y$Cj@vV!+lepzDYY zwXn`M=p`i=Z@%N|I&NoM`W3$sk7+6eG&i9u(X%z&8Is7SyoHjZtp?l2mL>Q=hI{RGACsse8U z0z|6n>T@t~fwn5&v*H<--nlU`_0_BXz6(hHj^=gXDn!F?3F{4`NZr+79 zv0t_PX=XB48`T4(0sy(m1(>TyV{T{lbY52KW!K1>IMs_a+r5mfGM&r#(Mpdj=c(~l z{GiPgfWRmXYcWD%53L9GcWjm@E`)(Cz)rb6z1q>%kE?pSDP5NlhWF;_9GF)Go{S&7 z9Qoa^8{_|&jyPKQxA@n4zZCv~17Sah08D?*3QNxFD_Jc zwj(ZKz_a(->lmGz;ymH;$oH>aa9G~Ajg9Sd4&vKg&U=cOz9g$ZG%Wy4wrAYP05Z1G%K^RRwOrjiy(I)kNU#~<*j|Ud(AjH z8?~h|-^QrD2iPx~A7A2CnVwl6DE)flcE!qVnyY7JCfr!vM_gEhjtC9(v-H^057@B(ptm=Tk37 z{9rXFmKhz)u+%04PKDvT5H@gYhXC=v``EM1^hvhRLOUz_#zY_2KToN!L&rTIVWQOU zPr*4r3jx)b$)-LO?HfZurS0<3Kju1L-r`W7Z|&7jEG@e@9g89M@q!yF!sh3>v?O}V zT;4kW&PuyyLqXaR8`bF+;#_m7x|JlcWJL&daKwXhDx};cc};nXi9)j!zr_aac=Tm$y1Nx&NC(HlC@U8P2kELTj^D2jmO*h);+ zvv-~rNk?#`l2JdYre=r^NVf*sHEkl26=wd``Gm`SKls5Rlx?6f?wz1KZC7fiYPr#W z;Wh@M8I)Mu6czbe?j4TZC;G=DG1zrxdh*R@LgSSvR7p;6w{Tizhhts6KV%bQ@bQwU z@!ptK@*G*0>X|}-GPOb6jD?&pp^EL9bl2YRoe+u1H~K*Y&8c!qNpW_bPY_+{nFq9H z9C|&E7%pJSEiB-BLUa?3UIl4i-cF1CO)9C0iY0Nr3L40_|n@zDVO; z*;wzB_241DB3i_DjmWL*W1gPd{yS;99)J?6#s_n&?Rus828tN)Dscy#o^sz5 zY?tw@Np|t5Vt)@w28Bj+8ko*c%nn*KVv9q*T_FSEr?7=$@oTxYh0p=j!^RV;-HN1m zUx@vs$ADW`XtT2L0%QZs^+-WvCTX`ZUE(-F{7RaJckd6V0M+8h!DF+{en_&*oM^EW z+Q|Zm$p>5!ZQuEcQrD4EGRtdXis+$n-4%KGo@hpXMuW=;lL7!m}lPhP+c)@pr z0jka7)N+h~@c1e`Y%qDe)if7RCL$4(8BU@obM)&QLgL=Af8GgwrQW+9r9K5|HZVPC z;0rcfsl~|1EaRAy1XNPKzb{-*dz*+`H415hZM~eXRttfjUdScbvVe}pjmksQ<(C%U z7g#1U11ffiv-dpF3xh7a`?N_CJPhNUD(#aFw%3{WNoC8O&IK1s?~TXDSbWA+3)X-# z3(^)+bqci_dBMGv8SmU!3b=a&gIO|xMHLdKoaILqg`(uSxAVfWn z^})KPpTUTBM|dj89c*CDwDKUMz2f~_qXq6Yj7tkNTenNpkwe8AuqXYR$Yh4ntwqoG zJvqa;oIrIlzBv`XXcNo=?&IZ)3y_QhwUE%L5ic{DdmcQ&q*Of%y}oxdn^vS`V>);i zVLV$ZMj@!N&Z#I7jqChy`n}0@Rhfw$0zxv!pUHIyyk3xsoZ}>Au#$)O@tVPmr1c=i zGwO6(PRK-bBo?l7rHNV5k#Mc_7LFq^Rghow^fULWM-zkMW=JQQ!g1KF^ zkdSj7OKUA&ceBIW?OF^Y&%LPY@;BumaqO2RHd>_s8k-T%Sp2Z3U#d>`={GCUjZnDj z1AvZVc_BeTq`~|b+FDU*2qF^5-x(e-jy;-ms|EC(rZT-- z{~9QMiCz3(9mF8mpAq;H3>(_xiM{rB$izARffw3|o8eWag~0GX?p-VOI^P(U*HAEh zpwfJn=3iR8tm6s@d}sRWFKvXD`Fc7mIcxM~q`1FSlp7R(p-VJ5x|q7IT`UWit;L zC{elnDP0SeI;b7}=#ir6>Bz|Q&=3X|XX|hSBLQ#SAB4uCkVsB2u%tbz_Cre@_5m#R z#>BFykaMpMO_>NTYm>%75Xqj2^CirT`SSh7X}%5F;`9mj63JGp*&x7$4|)tEOpXNj zc~{r>!siH~G$WfS^eV6n2Kex1#_vXAPC`t5tZV}e@|3`v| ztR18~k@Yppi(wPtF^sp^;Gn@X0$4rEHzX-2Wwt4|j^0b3K2Ywq!?lf__(RpRrPW70 zHXho3sF*%Pg!jh6kO~B^1w*s7k~m2Zt7iP{bJo`$1dmUB$^Y2P)sleSL+F^{1mNuhZc_X`;Hn z)IG~?I$bphw7%Hn#;bQyjq&v~9@lf*W9TC^#yX0xj<2103AnS9Hd|{s+V)CR+M~oi_|(Ym0iBjM&5Vt?F`E3 zs$4qXf~mHOR4FaQt*KlZTf|R~g*!Mv_k2Ob^s5W2WB&1>%zVz}(Mp3w?TBp>awthm zp1y@pU&@PjaPEK^Y=S#&jJp8H-O%urpu~Q)K zxh|^dFaQ_v-sAQjZmSSYsSx46$ug%#$&*5o7U_}x3+Ee1abXry9|%f};ktL73!JeD zzG;!E?b_{+Gb)u9De04glvHrK%E=;9w7`~+2GFnGJ-UGe5**wAjc(~7NeYigeF%v0t z5K&P+ho^4iA!$ZcGT)SC!YDk55ZXC5m@XVm+bM;ja(Ee9QE$^~{>f)ma35;quT9F` zW@fhTHXN&_`-PyL;mmTtCE6Cne7H%s|uR7A*kg@NUl|fwVmnzZ(~L zJh2BY0jRi05vm0TfS`~Z8xRjkfAiKd;F?FDgwA-!#zd$(tApFkOtG#bmK+lgdN@y~ zGe{emBL>V>XvpU_3oSTXxA5KS31zjTPBCHP*?#}X$I|+Wj;eyN?D-l5IBiTLvyCVV z38sa1+mx%-E}NC7Q(my|+lHovbZBoE@;PSy%q;GFXS z(b2C4EhH;aC7b)R&^anN16I_icC7Ykf~MLBnJSRht85$--)dsEUb(z$i7gXXobN>? zhRy69ci^zF4<^T@9YJiWS5YB*0k91`nGA!uHOFMyZgec33GVd&i@?f$+)bx>`Pgi^ zdeY2Z3H546)E%SD=c|KhRTSPtPTp4|ujS6f9h_UbEtT51-U ziE2DhqTHF4-Z9RL#m9Q9J2KVSm1u_A_+I;NdO(RdIbO%G%Phvr1CkKWW`gdeIGbq) z7Xr>Vpd2Z3w8Pnph5g3;G->lW!79AJBZlQ{scVWscn_8N|f z;m;LJ&YWyH<{MESS*Zl*Klp3%R8WkbZzUnR%W{8e<9*eaL>dz`4KOGtF7Cm%y5GE-E^GJtDaQQl(Xj!mWw`p@>c8 z;k}``o|>7n#=}nRiQp3IPRhbLs`{g;r+Uxltztg8*)*l77uMvfCvP11&S7Oi(Xvz4 zy%;y0I((7)-S3z1ow$S-Nx@feI_vC2UJyyV4yeva5`tjiBZW|brQiBJL9L`BH@d?5 ziJ2#LeFPB#-i>-R2?bg9r+SzZgZouqPUaB%cKVRRYxR*?VmG6n`dWd7sIEB=k`lxi zy(}bo5qSs^r)y+--*rW6N~i|m3N&?u+xuz6*^LNz#4u~oveUA0Y7?qnYJUWuzi0E@ zppM1fl*M&hy(~lzvooeB^bmUXrWOd1K=QRandLflyIDUuJg6rXCH4$XnOn>$UsZs~ z)DFfz-249KvVos(T+<$N07oZYX%6&lg_2SbvZwwViSvx0qbMM)_DDf5w z*B>k2=7|Gs*2g|}5_(#? z>QW2g@64ZA7<78NDxmS^v-in#F-?z2O z5Ze+aW4VTaevI{NIdf#@8f$#k!VR@n{90~QBXYsoXPOLOl~sNo!h*u)D^uR{UW8BW zQ58;~bTE_?JpT`Sfd9{b{+&l3|CX2WxSAW~q%v!u2;?$5$AkI0aijPLslmOyQA~_d zTcC}JfBp*-$0}pM7S^ON#0Uhbc1H813#2tZ9md~?zo}g8WF7hr z-7ekK%>GH-VDu<5m|G*MQ=121s`#xLR>WK9M z`AVF%^#b&$tKJpf<#-ltOf+BlrTL${>Xwfln-Dfu_dY6_@ZDzkj_CD48Wmv85|t=< zg=u=nT^$#T0R6L)Tcc(S^b{8EG={2egmT&dCo+P($*#+@>0CeYn#v2k#%8=xZCNWi z?rK}OXXulVAW-&tuFQHu3r~FyMO}X}72I59RG=#1=y{X0?;BG`2lkyAh5SF(P@GKn zc=y*2G)~o>oPb{O+aU&HoZcU?gEevV%(LfnINFKRBImt}-_1@AMrv5)*1Oz#EobeX z3T5waa4f6LbLK0gE-KN#)cgN%+(7SkuUWZ}f6Vo-Ts6e(2QNbxhMyF-O?XJ$+Lr_0 z@n646v+;=BUHke`b~eZ64>_gYXu1C~eAVA41x&S=C`ir+(z-7e-C|3B@W zd0bjqn)fr^RY|9kXxqjZ7j#A|SjH^|_XWEqE=d%vloj`-N)r?jiE+W5?xe~EB1~e% z4VRP)#JI(X;(}O4k+u{Kq8LFTLNubKh$||Z_f{{{-8ED5nYTal_GjMy`&Han63N&}tBQg7%7~LG{7(cY&dhi&C&bL_`GG zXz<(}KFs-Pxau{6W%zErMsD6_z}IBVNH4DR0}+00WH)gy;~_&%KoT|zD(*vcl^yE| zpV}UVg=>jYRx>ZQ;dmxGD{54<c5qC%T=?jtVf*a-S)bBab@j;!viv?;S_GWjVaD8=| z)#psYnz%qNfSL2mPBTlqcbIeMR+D~Rx%=JhMQZ0l>lMaHjT$yQB6*dlvY1|QXKjYT zy+rQa_05q-<|)-3*;w*&r}6LPFmFoECN{WXB0e+@z{~p*rta-t2#Nv%p1~&S0eQ_? z9Fc6co`-0i6DNxKnHU{b|E&e~-S&ym*v%)pR1QT(3xvcrJ00ah`h)E|B0h z*yy00mCWwlZVL0|lAY0s3I8G&)$!NORsv)spcPDSb(xBjEso)HqMt7GlT-?Ph~~PP z-i};d*YSz~!E;CY2{A6{pZ=6={P#;7uvSLp-x@teA!k`ObE9twXC5-DKm61TMdO1r z55`aZX4edhFNWMYv?qDizp|ZJ?8sk}K85oJ^|<6FE<3PXQkpI{>T2rE0e~LW{Lx&W zD`w5CoSaBp(gtKK_6&W%&Em8OiH=@X@@maN0ScDZp?&mb&pCGOTu`j8XSTnO=aiKI ze8T+-2^}abprh1QiOXh;UPWjBEg)bnVH4NRo#U~eA=VHmz`xwev&F%x+T{6^SxNhH zyJybCF_uCkFQpQ6K>Blmc3)Y$ENths8RN~*yYGt2rtog{B7L0WcI8=F>{c%`-&`eo zanB=8zu-#k1k&>JdujAGya3c*(i2et2+jhIGsh|{U2v{nT0IwHqF51hn42B|a_%89 zR>c=36z7Gsp^{;1md@y8F5htho;f?(U!%{AJ4RlF_7ZP3dW9)gGPGl2p59<;0WE#a zj{s*LKIp#Dk$E~J{hAWN$}+Cw-fBE{d=l}Lt5JQuPGUXo9@t~R9S$Ck0vKxY9j8fP zjl6Yw5!y|NcvTukJIY8&{FHvR(~`Z=VoeV(w3no=5fi;uQ3Z+60jNcPZ$544dE#Dq z_%RM_eZHx}4387zwhCpijN=nq*TpX>MY`TIyo%83 z-Y#1?dOb0x=4FRd%(Fz>5100&HB!XDT9$4)ng?64)N>Z3JUrJmxAA?swG`@Pe_QY< zt->pjBt$Z)h5QzskrmB<6%B;m#O7%21p<4C7bGQp4x!M{n=Wro52t-<0bp5;HWXgy z8Po%jtG;=q*yxI+#9@_+f>lDTgeVYHHeVoqdHgS z5y6jL3D00PT`f}>e08U0#QO2-)IbJH9z{kw1bWEK)ew0GXObQCK-JtuUs6( z%&zPw5PfsL8249cjt#;uEtdl7Dy9o<;DQHe2%T?`PMNh-Ked{TSYs5e?Y>B?%wJA{ z>sbsa!ivm6M_c`y*%{QP=;G!LUuQ6fadnUz$j40cu)kD*yT1fNxH>9-HWxH&(`sgI z-v*$Ma0d5rHf0>|(1pmFpT>weSICm&aoXDN~|@9iazAG1eW|DU|40iuY=3VkW$=IXeY#U zN4+XO)VW!F4exJDzB9dLxAuy4)xV;}d6PERpoD{iV;wTOT;`0_C3e)}gy?5-fKt&f zXKof(MK~}#CAsaJcpexD3E&&0X0{%D^-2!xhB+eRmpbwhUZqcB&{{3y-Cn++9pOWv zEgyPu!|2x?Dq+Ov4!sa<{4KV*=Z$;Lln;~IsUw1h;&K_C50A)P?%*p_-+%RTEz$GZ zAT{-=)PxgTe0y&AZfGn&>|A}b=_m&Xmq978s`o@98WzQL%(6JlpQuoEFbgyDCfa0X z#g>5W9fpH;?F|eWoOD=ndHeKc3|6Jf7>|=GvQfZw5=t8R*Aa4-3+t;DdU01uTSeib9id(EaE-zjyk-<3UT%6-GHPt0f zmuf;>JRgfQg7L_z4y3l1opFxEHT)^G?Sd>fkHHy+uI{9seG1^9zS6}80+R{){pU%k z7Dccp`8H1F@bj)P+a^apLwU*yWJb2-@_ZE+(`_1KmnkE{>{q-pGnaMddz}}6=~)z3 z<#2H||VcoZod#~U@TSZxjuSScFs>QRnmAQ1|9r@?(?tK*8LJP#v!<>0bS zId~+pi2J@A9~b?4X?K@yBNuI;3T|`fX7yfyDr-6wMW+^%Db;jnnW}G&^|L{{d!0sw z5!h3d*%UAq?D3uTD{$SWqCFjeia9kZeAgRUJo*Yb6zAVUq%C3iFXQv!s4$w(gQV2NS;BP7n<2uizY{RfqI9x8$`b;v6YD0z8dRSH zxNmZ9<-1&~t!<2M02qC3l+=lY z9B{_;1u_3?!E^Bb$jFFm%JTrj-~yZa>p3b;e#0S2HE?PW*n~|#)T*?yX$imse%#V@ za+cYRHPRQXw?{7WV&a1;Mhkmw?385aiRjM$E%o{ruO?urQRfV}p*w<<+o2zcwVujn zT?g&QUdAIJh?c=HN=8X*xJGBQM#+4!08s0MIrHgLrzQm?U9olr(3{KX9n{ zIeAhZ8do125>yVYhv8wFHX-pbhbM%B(L?8*HNlKZ@R#${&AU0{{Mb@6cNN2;E0rMY z-K4YY9yi-Bm#+Zw!NnluDfI>n0+A zh=$1;x5&mu#4IpsQEOb$bJshr`aI&Xuf{v;RmF#c3$A%(!tHt@lrQ673nQke1BcG^ z%+d0uS2ISMA2dCQpC2ZHDHfrHyKpc(6&a8#cy7?v;F<-)d46)_H-Eb2|L?sr|Kt%k zuqH)6C~CUWW2BiZw0t1HTwIyOmApOj{rhuGV}n*N6Q^5+U3o0xhvK{@9Z@MqLiGbD zi&8}WDW7o@i##iBDheo5lBSr!siB%74gAQ;>5_Q?cC3FRNT=^n?^Pgxs{tU)$94s= zpZVF8td`^w^|kmmhfl{UYXBUdv)SHsTata_9TE@eG?`bj3h4XlU<1#4#vQZmPYWhb zy%`rXDMJi07||ZGY|%MtcOCkK`!2QStys_v(0K_r*oIr(v`M=gRjd*CQQCl zYc_cbo@HIz_YLbwZ(v$jLE4txN~t3~vh=>?el=ObcXq$S?;0d`NO2eWW)!-YE2}$2 z>3d*%)o%iU8aLHw_inw!G{!x|Clyo;Q5CXPQ8#*)bd8m07r&A4x`%Qy3dhx0fduB2 z%BUDLRnd6r5l8CahQHo_5qV3Rr2BOv+AzFMiDnR|UJ_fiF* z35832CMGg1)%BNUtHo>QJrg6ZRMrGsh)J@0CT+VGq66gUdU*|?EhTI7l|W>_O{vo~ zMEqu$JWMX%#@zq_d~zkka=-TEtMM^CDy%BSM@?v3LR_a2-yT^!^}q=?3P#Ue{j0hIq7mAn3^>s8#?@H_VQ@D|hpN^RCAclD#VL5eLP z;5@l(#T!;Hf?efL=H-!K4&ysvipX((Z~R!Qk!vG5pp8Ga9iQecI0Ua-!1T!av973G0FF!o7~& z)W}{2wuyP_cMG!d6;q_66(V6{#YTw6qpFfcT^qFd-ZyIxSFn2Hi}iOKSam(mn5cGL z%^|hG9hn*p(?3vW)~-FOGk6QRWq-lK$jaEj_@w*FeX=^V?7 zf3h`Ov6Tvushwuk4#lCdNmbnddQh@zNQ{>CZv~B5K4zFf?T6xGHCc4`LtVKVWY*+T zj8#z9eSa_wMj3uIF<0)k*CpiD4EUG|dXZiVKYwc{PjhED3|g79WDOy-wKaN58i2XD zK8~~YQLI~-W@Ga&IsVtYFidsiI3kkng(Kb=JJn;)I;|GkaV zrCfgc#qdBggH(~+Y)$#<#snHFU1%7{a0UgmSV7a{^q)+umBUZkS?DS~Pqi?q+kIgH zwYC+WZteNvOs=djOzoS=FPM+;k|Ae!hHntlZ1(h6DUW)17B@K6urq*O!&I$a&Db}; zvzt`*uea9@Twe_#-JKLq*=VF&y;W`rU&N-5@a@y9845{wpT|QP zil^f8W&kbFL66BABGHIY2pMG=;7#! z)s^=A{r1n%*MET_P%F8K3_8+pYIl01M#se~RJ$ZAe>P|h{a?Y7YkuiOR1 zeog#6!dgw?Jq9frhnH)DY^h_I42%b>OXXPq`mIB)vs;!8x#gxo)@tcD=ku%6yd7cH zrAGZRqjD9hr}2g|L#H(yfb)12*A;+0{Q!kV+u_Uko%U573lUKatc9w^tUJhU%SsFg zKO!dw3kw_JNJoEp5d9(Ftk=oEKe}9L04fgjHpz})Q(oy_%8{Scrl&^S_s+V~lPo9# zA%PT%$woNbR#x))To9}+c_Kc<>C%<-7{p_i_mf={%OIX%x_=5mQ6c4rz6$gqEp>oV z0KlZATVt=G)$2N;szS5<>IQnaw=fF8apupDuU+NdU2OJBGjWBB?cB4BZTz$y z6m{L<+>~!&Y0S6n^4uW85DgG_-CL`5UHqRLU3xrpXJ^P;A31tHQYI?w z_Dg1k?G_6V)Ukb$tLAOrH{o+HHytv=DsAp;Pas;xJ1Ckbnu2c7e6N&{*1h+Et><)Z zn3jN=lGbDP#>V;Nct>4LPyLxv(~Ei{?h!CPam=TTn|5m2)l1O+b0C=19FV{d*tw_z%5vLdEu!xpm4AYPmC#3?3u1AY}a0gmb{x$?e9f=w5W~F7^ zRv%i$Q3Ie_W+<^^=fSwl^;wzfFPH>nq$eQwbM35n1F?Kz$wECfzY42iV1U`FZI}z1 z(SqFME}~*-3~x$CB0g-p*BQ=hq^u3F?yb!3?l|^gPS16GW$5Cu8H`A}R@Yx)7E;Ka z$BUj%N3Hq6Nqo4AGvgPV={}m0kX@^36K6MRHsp)37~X~m(j!$15MZ(C-M{)SBPWo< zb~lSsukb2J8FFeR<_M9|K>k0ytvFXnJ8WcK?(n176n*TFX=@rW*B#VCJV>xsTIv?c zgh2k&vT8NZUCjEa_9*7Y+?c(%jagwU=;(Zqf^f^lDy-WjiSnA3&$lgFwV#uLo?!uvRj+M1C8q5T5NPRvpB zjuyhr5arv1m7N*S_ksya%>^GblQhaw#I*6K_VYUlX!Z81GH6qoDFxEkW}o8kejz9^ zs6M!feR!Ql;u(QGJ*;*{Mg<4;A(()=3=SPh|<;q7d^m^<~7#A z=mtoXq<7C)3OIlyn{7#jugR6MevQTfB}4jb#}TyJ++6FmE9OL9VLb1)pGhiVZ$PHz zGD#NGle^5%X{X!^DMosAbuSE^UB-hJCL6_EN369?vBC%Q9CJ2)N<}+@tfb~PpdCj! zyB&wl&#j&OiSk%GgW^5*8C?8pHUWi05wAVi2o#`{hAAT9zg?B7O3hJz-5=u;l`deC zf1x50N(`T3qC%1xT(!%@50sgUNX69U#L^YLN~LN}c-wrtX)+*CN=3DqWiB{WtS%j9 zZk!5NnMGD8M=}Ae)bLCJQvncNIFV#v0{OBH%hxR zQps&HWqUAU&n)zul_r_^mB$BdXiF08Y^1K+cK!m`5Xs8s5%s4#Za(_+UH<#TFq}*t zRzozJAo)%a44KTrL7=?HXxqR05tAo+eRHdMW*NPHac^q%WVL26_I?qsH=(ijcf-r! z9T)F~q7L1|gAPUkjEbQ}W7ezhER$%vTA9e5zu_F+amr%ZRb>={$iJcWF5_`>MN zycmvaf~c<~_4|S@)4|{BlK%X>{7pwcy}9YsXad_c(GdP2^?LJ1XaD8>nEDtg zZ)rwac|rR*q#lEQH5 z8u9uN_DmHJ4bZY1)8-`Jz4i@PZiZFiE?KoR&axgeHHIw%nmE0tdvU$mjr9LFS7G!(SfO1Xf}EY4_tRF>dh#pnjthcZ(t?sR1YJrRFDIaG=!nFo|8 z)fk*f1)A!rz&KQHOMsZj&l2yxJ+f7jH8Ki05!aAWU#oq9IV}Z~ay)b-8Ae|s$t?xu zFdNgea$)=i_l)BxG%mGRh-n9q>#~_5j}DpI&~v-(I5SpKiKT>lv)sHMYHF7_jkGD{ znqBk?SH2F^qb{puXE=c>tji>QVaq1 zX4g?NtHYpidyON`FvygS!}GOhIbPv0y|MrNl$D#|o z%BUVl)qxz&ZDbm|tg(8<;@?ih>zR3KUKfGr2jZ?4G)jY^8l9aRcrI=ow}`KB`_9~Y>2##l@(IpD;#vY}9M%bD^X zE-fehrc#r$*mm&Gyf3DrTb9UOh#~K1CeckiKnLU$fIvu*32kHw`tDY`)y1h{ElD32 z1mfSPs0()&4^AjAzsi94aG>YvnBM^8q^F#)Fc$Z#OaRG{Txzlc)8B7fJ_3rN?Gc zR6RPdzm$TTN)?LV#G7iS8t_JS6Bf7Z|O>e5YFk7yzt zg@u`+eXsO1hLYhsc<(Lh4f15J(6Ls;+e?=m&tpJ$T<+hbB{580+!GUivu3J1;aS($ zr+_~zEd%XV`=litew5!{Ol5t!BkRqY1|Q zI0EQ>g5--+o>H&0as=ld9Bi=)1GLwl-dhOCb`=Q%bAZ@H+veQ=k9K5V!Jcx;XVM&ORV$##VyylnsG^5$oU+n-GTMw!0y zBTM*yTl{HM)6w3%rFC)B)z2I2hr%*SRzjBvy+x&>qIw(rwbG4PhXxyRnnz}p%li^Z z;M*hLrGIzkD?R;&6^F(wXmoLZp>dcDV~T!zMDA9-Z}Hcy`upTMMT}!Pw+=LbvDZY! zBn8)W;mmstfe4lrLj2M4qJ zD=(Jo77hqMd|Mae>7bf*KOVQd9`E>hS;}6+b(SY@qG1K19&@8yti23^^y@$)y<9h3J*?R2+vQb8 z-M!t<{=J2>_dj`)X2e0Sol5S$#;+?aX_55hXjsAw&zuiFSFa91!YIliVLIIjbRP7l zW_-Agv9GwF=skOG;&ngEj^H(;f(rJ}7PHQZxjN}y_nmk$8Q(rrXr#LMaFgzM?fGqa zsCWIH@E;PJOWT%jVFqV9BN2cih!7mv-P_4cn%KxscRb|e*8iLY&f#ov&>s3lGI1u9-&+cD+@kDGn0~sGQn{m*cq79!aP2xqZ623 zWkF_lo8vFA~D!@APvngI2;F?gy$_ibR(WqTMTlk;_ne{nr80q1ka)WNj@ z?Ap}6!wO}R}-3nfK3yjKlOyyu#?UH;-nWk+uw zm=hA}DAyn>O0F|3RxT*Qbk=9}Ez$t_Dm&oj-tB*Tq)(L%(pfaplVo_Fsj$nUz_L*w zc!q-fur_l;)V{HMX$y?^A$nBzk^AWY4zNSo``j=Zuv{B&k5GZe#%EVR5;QHU7kivq zX1`{g{MO~8y;py2Q~z&EfAFdL{(e>W*T~fXYlV?-)!3a@wb-vqUB|jp((B2w#qiRM z797_Rwu>nyW{F4_K5&@>aJa!9S@qzL=7o`@if)-DnuyH;gvwUwf8CgWP?SX-GUY3) zY5C`kM&{M#8zD(;5y?bsM!#N|u^m#44)bX=!T?VkLov;olkdJoz$?S|WYIjTj?lc|F9t z%SF_>cqpK44Nv=g3izaB8IYU1noCT06FyK5%}`=~ zI|cIwAmnfd=F>N1Q=Rpj0sxcTOU&ZV+}HfDJJd*PZm;Jv>C+fQta94qbaCkj+svB& zLrttK(bo#Eb56l-XA|bjz`&tOH@3o16XPYc@Z7yH?85t&S9d(DY0FjIS!Hk8O7&t~c1pH0;1+SKyQgd7*}x$BR91A=GiANO zvpP3+Rz!-b?(YDSA|)4TrF6Me8Q3s%mip4z{$f}}RN)UnT%dKHSnBh$;i1#wJuT7- zHEB|aQI=uUUPL$d?Onfv%!Hmt8ap^ylUU|~;}LC<54uOjtVRF?&dv(mzUiNu#7>v+ zw~phGR-DS~L@@U;!#l=LAZ%5`8KM(MMmaLWUx~uSN@UKhwDB2Ff8sG`RE*#3Hr*dk zOOln-h^qI1phUxJu~pBeLs<}RJQZcP(rdcH7~f^dj~dJxv9;{Ty{D%A{JzS+JhyW4fS%;ffRdidhJwRp?$f=z)@8#G>Im9W7XC|Q{kMvn z)nu47rjOqH;|>2qJjOp9+WOB(+dp3C-^Y>o z$IAYv-~O<4`A=Yie@x~4bA5lesLMZB`9F8`)2qTC*YWr9y#2V=|Dp0vPlA5^qZ;0I z&i|iDpYJ-SJ+$QdJ5h)qb?W~e#h=_DeK&IcAl>s1gTDXq)AnxU{Qp_8tM$RAo-v9NQ^H>Yzf3slapO)79ItLejFOFsSN4d&JKf22QAk6vmnLsmq zcU(-?+S<{$NguNVl^~ z7!*D6{{6W;{Wcq=mN9(WJmT>?JlqP~@&`8S{tJ6U33}4#!wl43O=EquuvK0E?1REa zNm`JZ&Inq)Hz!y3hb9#~fZ7~LX)+I7m*} z5N+@O;#5Sz6zOHE1NpSGiU*fn_~1Z9j%0z48BdI)&<(%l`0O8VaU0-qHLwFNQjiD-qw-(4S zckeKUJ;ijubq7n1h?LCm)?QZhqin+Z0^6I-?S>l}v0pc5U8xA951{9itq19|V+vK( zMsV?3QewM3Gi{u!_Mp}A(85aAo3XPqHh8^}L(rcbHHFmmWut7DTHa7U1*b1Ww9-Ac zgYT3@UD^A-6m$ylz*;-Q$)T`6h8IGvCR;2t zCxfb5EG_j&4rOKPR|*woh11OwL22ZgwkY-dn2dEL(pUFsOJNr3Cusp-l z#@mZa_%2kB&0JH8&ZF_Am2Wo{TeI!cjdv7jGiM!EHVPByxM!eoR|h$41a)sLqlW!& z#lLv;$LZo<`eKSt!6}633vZUvy>-G1H(VBY2H@^2Enzwtb5Prw5E9u2Z%4VCnTG-q zw~jCjj(OXy5z)MXf~ZklQ{0!2n+>X%R1ep%9^cz+avZbBtnLz^X_%hyOM`1M>*Eh= z>ooI9`8)vB*88RRq1u}7aN$&cZAHCrX~)H|86GRTJ@9q$njl3u#W$Q&U;TV8&6Muq zACiiMkP01|npIyl0AaQO&%`k+K^Ampsx^`5LDWEN3}qpMy8Y3cBLic^=V0H-_yhCG zGo*8M50H=ZrD{N05tms-J3cfK(TFO&?YC=DI33TdF1#3wqBV?eIC^t-m4R((Uahrr za@e_zn@z?;G2R~)*NkrH?6{)nfWVK}%85^k%(h8*X~GS*cWQ0Rh8Mdkxs;boa#f(Z zz6Ll6F@BpYq#r_4Hbh`pG6b;dWOJQ6iTs|ht6X3F`%-6b&rea-d`vGUV`oIBqo7)i zFG*CiM?s&t8G8<}Z;y=dS`^6*gR}bsK7<$de;NGv?Ge2`{+e{Je&Z%9PkzFlTY;{-^cxF$-ZHieT#k*u95zQ8}GyPbc(&}CBIVm1fn{Xp@cp@aKeO9pI zXtw4RL_)MBQk4AJnD>94H&m}new}@LYM>Vuh|6}Dam9sA;Ll-KLqV7-yV6d zH6B`T-7-qNjsSR$_5k06BK~arRtKx-dWhz5_U3S~WY}@cifzKS*>D}*FT0d|W4K}X zF%?m*33V#lz@ZBby1fRxQc{e5HXz3(+fBHWoLuLZkioZkaKY~%;><-v$7BMWb%lGg zCfsxm50g3u*^0W%AgdKyVZ)i>DxA48-{H*A_27zfPC(C!x}}SrOdrQ6$Qe8ZCl$Tt zewp{0vBh0q@nMPBYO{Kv;ZGd0X#kqY&RQ*-Uj`{aq7QFI0wh>UZ&&);BR3B{lV%QX zcG@Su=G%y{AZ3uAr9;{7#W(%r;TUnVKLOq&*x;cML@i>!nvVMhwdPmTQbiNdhR{_! zc2z>U?Y&J{&T#DcUK?slnT#>PQQIQ6OZ|9l$tC%KaGHqL=Xvgpd8JP<*SAQ|%p)+P zfWSc>YL)Q2(Lgf3+DRvfM}b=t3l(Z+j~dQMV&c2!fihXr zBw|c8$PRkD5uC2@Gu79ErR$Q$9fo~RaxTS2ez1T-k45JX5%ddB#+8sdeT0^AuUfRL|@#@ z@ga1b0B|s&@be1|EYsV5+{^hpmHCo>Y}%NL_@(u3Gf_9FfCjZ^h~D^Sb}q|-OsZWU zhAuI30+~3Y)5y8W)DAr@8RAJwO4q|dC`E)3DUB&Mj8l|P?^$Mdq_AvYwif=lse3)y zid0!N0ksn2>MjUJ9ZU&kuEoth5r<#^)EtHjCwX6$K8t}H&cSHJWyix|KFD>6nvyVT zA}#}{Fc?9aY_+_*M|bKn^;*3oxjm!wcYQ>+l)OG1cPO>TKAG>LE7MsKwR4<>#wW~p zB%C)2+O*Ai!z_Y1hHI>NBb1hL(gnfu%=K?T=edI5P;09o0e=fWKG|r~hRI#XT@az( zptfavxGiCul7oQws7llasMGT04TPAwa=Pq*6DD2AEq{ANS2he(Gt;blK2o_#$@A8U zi4VJYlclc7=Zqo!3@dE&sIEYgeO%k|+oJfehX}jmdh-*n#tL6H2JzzuynvAsyZsH? zZBV{!rDYvpwYw6MjN{)|vk|b>dNVxcMKcRs*PeG&#GNC7vo|K$JH=&Z7qF+&*i~tr zmD0H_;8WhQup?Vg?V7#gLtpVQZ!`v3}9(NZ#IYTbD~>= zYqutYtm7$VU(4RxxUudVyz3&R5jFAJ2h;(4g1~~HLmRT zij{@TeHnve@=1}oBpVqoKXoq24w)vQj(AuN$fzr;B}5G}{+pBpX~!w6y#{CRkigrn zQ>m3Y>>jzkezJU**5G;Tzhx-?voHOuS1qsnXqB-hFfwoma5KiNAodhgbj+CW*S?Mc%{X=g&~HHwRK`GOJu=<;n*DiKtc7@ed>Q;uCHnz|(yFSO5c zdwQuWvx~FwP6-9!1cwH0|1Ls{j6e>Icm)|2F#sAx6q?vmm+Og=FE86w?Y0Qc?3xfv zY#J%)-W+A?d4)n)$g2r&s0sU;>hmGrwte5f8;I#w4fup3MHYN)M?Kpjp78gb@)DhD z8Q@)H*Xyhg9tdT(n^n2e?f`|!M%bU z_^G>f=?D~}1joW;bJZbe5Rd{*qm088XU_YATKJ{8_oz);lwkD-hN*xfuNnLH$kWGW zbXGRWzxf@fR2Y^E`P$Z$OTE->Y=wAjeZ^7ZiLA-kR0I*EGw!G@mW>c%rf6yb|| z4$;m2#1DlWLWBX=YF@Tha)?%CQzq8Jx;o?$eM3Pv#}pKO+c~_4X-1Z#+Akg0=Ft z5<3L+5v{^_tOpx}vW^u5$$fv2qx1F%IrFSSigwf zXc5%w>#?G9ktzYT^=#ybx016;V+rp@6|I#DxOlMOcF==!a1Rc_Ex1F1ySoHC9NdHZ!2-bvZXfsF z|NAHR&CFZheDl`Knzg>oTD#Y#s;jH3e^uSRclCLkdt3uxy_1ra0>Hrm0B}!#fX79E zH~<+D2^k3y85s!~1qJ!p3#=C}o?d!1HOdKQO(Zp7Ft>Y7LA*&dJa%fK;7XWAoPZhBdumPfgdzH}8XH8lUGi$n{w4mOT zm&IE&Fd>1XhGw1TK;Ijcxug5)M?m+;Bf$TI{l0guD*2q{7RO$g_WySt5e2&1`d@H0s$-w9IqW!!z9q2W7+qEsa?z$ib81u@ zUDl8ZBs-XXVu+*a6LOJ1m^KOhUt*90lJ^JX8!^JqVz?okBOzNbrMD* zw+=4h?X-D>q%?`eu^=im)*(da>G3JwHaLr=vHVranRwa^EU`RQ5RFJ%jP;B+S(g58 zCqbOk<3ibLF0srt;OF)BNjQj@4$D0$UGJ@h_tJ^yDaxn+5TNkQ=O7cyECT({68Eo4 z|E?^3I6r}GQS~I`OW}K#0xs8+9SGF`;pRd8Ldkt$Z(&xBhcJUvQ@{m?bgM_#iFuU$ z+pcc`*U+2ck8O`=pM`EsRSSuKM%jIj|C=2}!?5Y!84_+fnad z1~s7H|F4blr&0bf1pi?{1S0qozgZ96fQeAGmTdI29D)!TVpkMLy3>yC@2oVi-e4&4 zhgABaloPKQ510@91;QGE?^Ln({Pps=M%=P9FlP7L*ZsT0o5G)a2ChDC-YO9;6ON*V zDz~*~t$W%3;(W(CE7|{$DR($FdQ{R4=H(okl4TX{iJ$|GA)F9aQ^F_c*1e1DawJvf z(L<-i#;e6VB=9ZhSr~e7XAMrm64@2SIrUt&AJYVX6EENg>gJ~~7&e&!MLpuZ3B36- ze3xyxk8hNQHQC#4(hf7hU0g^|?voEn!x{|Feu{Fa9_i;Fw%e{4=HYj}?)!2b9=hd1 zFQEilG4@;}ode3iz|T5p9dU$!dh)pWTkLNmv;`t`9oZrCihrV>9TdT>^%ua?|MZ04 zJi>J}luI&rPt@P3)&))D?r7s6)mQKjPHg}KDb5HRuH1Oo>D_!LX<3#*Kq)9ck zetoZzflbl*4<9OPZN3E6ZSz~^b4tvUt>Ti|M#g$oVA}KPndxM4sF`oy!fx@=L~#md{>)pCEiklCtQwIB5|{PgD7$F0WI z%TsE1bT#QDgP|6=^ms0i*5q2erp8Rx=!At1bHXS6mbEe)XO4`fpt$#pXqngnrYPO) zmwi0`74D)~*hR=UQWkZQmM_ZIEIlHan?kgR+Iwo>{1I^8fcbRmcm#0Gh8!#vYF6!9 z?T`)kK^gR8YGE7)#2e%S_xdxijToNpdGEYH%JAlc(5W=5>mmgGWBKTqRLY{}#xDEn zloE&4dNPW52QK?z3`Wfnt~7D_thd^vVrPR~tpO)k@6{Bl)5Ri;%A8JEa4q+$NnH6d z{9}mc9|0agJvn!g;`@u=Z*3Y=2>PeK`Kng<*Y6iPpC~t98}L*b@>7^-Tg@xgDWorm ziz!KmtB@&HP(1<==bhRs22w}1AbyyV8`ak*&mU$}MbJeEW$Bs_?L?<@U20Op>irRg zl10NqT8Tt0ThZ_J8v#XT50z9sMB7c2sEjMk!uUmbjRw|VXREx^78(s}rWCYjLf%Mx ztF(?(!R_XplqLmc3G>_Qp-0}zcVDy;921#QhE=Zz9VKa{#`=8-b*R5aI(`H+=yKkbfDeFvd9dO<-B4@9maasscm?f0XZBPmfV*n zeZ}9)BENVL8d^2}C+z+H!v6CPWTgcS>%R*N)Wm4@F*(&>clZ2k523X0Ijl$&_PdK>2* zlp|9Q!0O@F6LNefj6uvzAL>pgq6GSwIx5xM1=q-=v0SHzf&~&zR9j-F#Hm`BfMg`7 zA#k>gAug+GdcjbK24j!ab{m00wDqLkuGxEcR#RLaCAK834bR-380%qm&|DVDo!&V< zcfGxG!%Lm*PEflMNCwp3!rG3=hij zl_f$8@HyYl!9hmZSNQ4}#m~zRjo(XsyZ2XK#D}VrNhraD^-|NW`CNyR zS!<5#lZpFOyN>!aYnAfJZUs*$DuuEaG#iY+f|cO&N{g|>@=#uzGlyUg^&i88V=(Ez zsa1Ii3bXmwRkfc2cHWG6Tx9L=H$xUfaNf1Ff;^3HzWS7H2&O8Mvxg)sTpGLEP)6oL zemwV9Qx12Pgu5`HvP2(VaTR7$_Y%h`iZEwl`d%I0oM$r8AV&ATmxYR-u#RUKfy3sC zpOTqfGJ5?8QfwH`S05~xVotwe6vqScO=r5*43vvDipmSlPgq^HUb>Xd_CxU_By%qp z7EJS4QH>l^5~Up3+`UM~F=GtwQrCM6O=@&!O#E`{3nt`0gc_W~+34onFr6OEr}liw zhDyV}2kXH12hv9RmU2l8FGaPL+X^ccku~M&Ws{w>A901j&J#RU#ihx{zh>pU?~}MO z=c09tci<2J{)k40zh^7if0!JIRO^=nV}+%^$}i-O!x2{qZ2TD9cHC_3qW7T<6>9u? zOw&M>RTwusv{=Rvq>qANzXU;zH&(Z@NeWMMU&VLPibg*QikPbxh`WyPPR}x%ue7dk zNo*P=xjhs#7@9q}7LO;GfZ26dH&e3|r^OyO5We7po>E8|f0t#eLW~`}5M-CFP3-Q# zSbZ_~L&h^@rv^nlA?9Zif84XHl4C>8KlYlTuQc}m$dj5?Cy-7pH{Bm!YPNw~dz88} z;8Wl#aS^lB4hdIeX`42fw=azW0Gs@P6sYFV2YxH4a%-Vz*=)?%!uLv!x~m{{^7qjs z&6aM>y0}?$A0=lTV3!C+`=6vmG|u!h9jbve@A{_OD?@lBzyYVcw@tkRjgVvtf0vN* zkw6Ou8+vc)MlMTG;>bsd{Zk=<`hlk%212oLG7i`mKUj*FBnFQr677M80i~&qP%pm# zLK@9D@WJBsyP|m@x$1L#WjSn%NI$k60@9@u;$?4l%Rc@pYI22_wo zo(R?+KU{3F=L$AU{C2O5)_MxLe$lJq9-wrG3qD^~fR<6K2F zWprCP;Yle`9o$m&SBO&496Vw4lBw58^vw8 z>;rZ5;nqE|JAF#T*oDLz9s%EY2Ma=Bct5${YYJgT6Ti&!EHSZ`vO5BDe2f#40473U5!ZF1S}5kPd44@S@eBh4YzkZ_64U)N3Nwn zu`#gqc!ZchP6#w{nau_4hDJV@(Q@X95dfKHpi=EoUHINeF2o?x_)1-Yc@38{iTG?3 zfGaGGOTyW_-mLTEgEWq2>8;G|o3ceTUyOv7aAuyEJly1g^w&)eL&<*InAu3a zh;s|W%;YiTwlwn&R(;qJgxrTaMifIJoBNC;xDI%`5i3}Hx|baBt<*y3sx&Jbhmf#D zOr^KL&!I2+}_vKT2e_(%?q7jk8|$n6u;a!H^Sz~$amwipwKF~JX6LH z`kk%Y*J#oKc%P9$H{)da_+as`CFJ_{p|i$w4aAXxITbGr!7dQ7!NYxZk6Chpjn( z!z?_s^F!$A3*y>ytQk@4fcB1WS@mYt^F*CWm(r&L|sQL zHk|gOg{Q&=TuOuFineV~VbMi(p{vYtDYG6paELKM-N$pb6UO!YQg7%|qF7?r&!YlZ z-X)_axsEQC50j#j0p;{zlVY^~7Z37(v3r26|W7C4+Bo^BGe5Fk%92d_NK%Zn@IGX36R~ zr%%MW^hr@;Ik|~0hQ8BwL9?%VQlk+&zXYId zaCQA5cKyj$ED57BbhJS@H+cSSrejB#Z{PXBoK;KHMqx>x&P{*P z4X>kcsKZZ)^uyBHflM0odhg~#nxJ4yxRw=tmitg{q=5gJfD>j^g(j0yEfBsCy&@2| z(3VL@68$y8o? zW?%^a!9o+8GJHH18jODTsg@S??lej`ajS10$lHk4V-kZ`aWWmRL@yBs(1Gr_^bkF# z<3g`TVtk7ari8d*~-kilGVT z!rNik5c z4!}g4i*$I?JG#P;+a?^eKQX+p<#Lg3Ty>`lXGR{vOGbbEtxs2pl^Y#B+Lg4vH=t_) zds}!aLf>-x%c4SF$^4yJeypKdVhXz2&#U+na^^2iTH|ZqPfuW&H0>foHh8t*0?bew zV2TfMsAiS0czge<#d10E$WTqvl2ucUcSdT1E^fDZ@6a9x_^qZf4^8&V^hN7TQtkA4 zOLX*Yuj@)1-Qe-rP)Qej9>vY=2ya}2PkW2eC_iO$SYZug;1l%hMKV%!KO-Kz^Rr%* zkDP59Sf^s2Fk47icScw7KfEcebX#zr537QzPNWe|*L;}_5wU(#jtJLP4)Zu!-`Yu< z0Y|w`!nnIDiK9|j@RilWc_*R{-LL!@Mmh;mv(4^g+7ovh%snprmFia57Bk*_qabw~ zJsQjAc?9&9Kd1&K=SWB<5+*`lo$T$qYOE8LIlrHRjB9-lJR=0gL%dKP0blfsowmQE zLx+^*G@Ci=zl?B%crPyAk2~?|rPQ<0hN^(@_si`~oT?AZfXxy9l!aA`21q97 zs^5qU5+h>{k^M-3(wMis`fq`|%%=Ihv;leCT`D#R3;gw+!1|s${d-MG_2_WkSy>I( zE`$BxzHfHBe+Nb(@3@>}= zC2FvsEJ-I!xO2q!xF!1b;1R&ANGpv@EB=OFm#d2lm11$xfBc#7_E zQY*uT-3C~1=k63jY4dTDRm8X_gqaOGHrtBVS#@(+>$;ah%wZNZf;<$XUh5uYMsX)t zXkoSd_QG~lD`kFZnVd2E%7RgSzH_~#pohA!Vu{#@wCX#uMsseUqQTE}UB5NqIAyR8 zSBJ$TAWix*?|$|4nJDpUo$m;GMC9WD&JObxkN2=H3}X9^QpIg3^r8KONLAw@X|-B8^^l0Sd^gCb35XI zKw2|9PSPyBTRnUt01tMZHdC{~Au%O1cX~yptFuK%4q8-@<%Yw4`pF}JsavkFdP-*D z!=0c9#r5mG#?C3)h%94XXOnoyEgSrUtKPiGPv6!DNylR#eD?Fw;*#i`hJu_gWuVRC zlzzvC3(7};gP!c)Jam{Fd>7f*Y`n8Dd^~h(DE*TYEWc_2e>cZ%g7*|eNv|Cu-vLCSIMN!<* z-4;DpA{8k8mvtVSAV0#ZIO(1NH~SVM`(eSf@C0lmVPjt4(j104EKc0Z_k+^%BY>(v zv`RQ~AW$Rc5!570!twcQjB)3o=_tt_qV z$t`!KaT|+@!pkB)5!j0MOuG!Q1z1NdZt|>E@R^h<5?!JFtWITegA$l?)VDTBAcG+D zkcT#iZCXW?9Qq^bjYarZ1}SLodz#q%3M1GprP%3)%X*(u9Yo&AiNaxr zvi|xFZc<{OIO%-o?y*kVln|*NS?^I;)exQ(mn|A6$LCL8{(NL!$<0Ez0mNCeMvRWT z>8PB#o&;m>T(-zvBq1TW*$daPs@mxxvllqDyiK_MM7E;QJZ$6hmd$MZfQ!R@Z{bxV zyhi8T!jyey=jmaE2emai+tdnVWR^l?$eiV8gS>-RTlc+DmBGWBVaIKR=xyoghkrcw zJv;?b42sqH)&0s-)BO*Un-{ycZ+qnK0cu+;aSz1RxL+^ajBdy7DOcK?PW7vuPBK`G zW2O2uG*veFMq~v-Ti0Z^2{))O=|_7Q7Pvws2^jCuB$K(z3zNiI%ZK4vM~B8MiG#t? zehXSB)S-f|oT~g@Cp*Os9EYcZ)+aGztj+VD&mqylVh9TZax$QdrA|s3$=<&1b$aU4 zo6MrJhg?0hxs76rb$8^?BFW4|k zCZj>%xzfVkYb}!u*vH$C-fA*nTXmjJvTJd00LSFSAD`s2SxHSehkPdecQa$*t`09av5uq7&T~!#%TM}1@YB_T-HC`%LbXQ1Qr)0SjB$MYYV;g5iAZBc9A zCARP#;{omBM?HhniKuYhEStMgO_3%Z$Lqn=O!NZy`}r4K3lnly#H zs4R4X^>84INz-P)2B=p=XxuaBn+V#kuxxJZb%RYo=1hzw-93AGEAQqDLfh)#*9P=E zWysjgf=*fFY&dS-m6TYP?D%)-q@ztkqu=vey~?j2)loRlqRr@2%Ky zRN|C9qgzVc+fPAf2v-Tu33ovXIuIJW zvv2-cyPx?+gHjybRDNnq8W7IcJc>3<3f}TxQoJ zdNwvMjDeKvpsmc>bP4NN7s?8U{xe72XjB?yrFCS!JuuaJpYgaVU1{tP0`!(48>MZWaLH zRfFHFNa}r>lx@Q$67!&0FU+if+ZOv8Q3lN)V{;3^P=vzH&)w@{H3iEg>F6hT?a`NJ zwITc*Z52pOmAY!~l23MmJp%5cfRRGxP;zYrZl3r7GL9AwvQELS83u^XEENUcVM{&3 zZR{i9Rz2FJcB$V_m9kcmsV^|oa*!-akX$et;KBV~|HQbDB-`p}Y@BmUZI~`hO@!Cn7Ru1msa^B8U|6<*G-gvdHJlmD% zrhWg*NQUYm25@VuIVc+3Fy!PlvtEhhYvC#qLJnbKDy7d5w4#L9=>}M=JV)rmY$HSI z37Al>R#sD;dR|Sutf?UKz~qm}I_OA1kc4bX6=3JEbMvbEbYrX$y>bDKXnjgu(tkjf z6?~2s%=rw|1Ds6;)|b}?)``2mWWr4^9H<-ttKhX4bY;COo17Z7H(V6 zmlIbSJ{NXpL}6EzRE8C;7cDDbocrH4rzakC#D~PHIYioKqog5(1|s2o4%C7nIM8#FrXz=U{FRa^Zs4JmV@@GqsE<=DdS$`Wvj(Ahff; z$T+PC?Mt2WNDR*ypDDp3fZiu{4orM2TH|g@%p8~>z|}^zWabo+X?F^1Eow8c@GgB* zi{@P2W6Lq(axHXWJ3u0!=)}jFA7%7ugUIA3k5W-Iu}$i?(-y`EEO&uC?4bdR`8E{H z`Qg{^jg$rXxmu(N`*$fWo0dnNGGyuYG?fVlJSpsm<}wgS`hr;_*2ibn!X4yE-;ZDL zeCeG98pmF9oRa6*|2c=ftzRJIi=cD&X7?1;!RA6xm&BR z^7&JC5m)PSN72pyCjW1<{BJn?Pr3mH3!^_P!<}%v`!eMz-sq9*L+)Pc^5N&3%`Yz~is{G-l-JVEs=E}jn^fba>GXA3e!xPc}67m0^24JWB zSmSnmBmd|G&an(qTOU^LlO;O3DAoR9sb7pP|A`_8hnTFhBSBRUsRL3NN&OwT{;uo) zx6yvpeF|xRQ~czzSV(kzOcG-)SckT(S)6_kYk(bpfmjE=?{~O~9oy93()FfBC@I%g_o+*B4J{I!RDWeYX{>uo z<>8?3^bq0N_Xq$zEfL>80yYc^fA50&WnITNy-KBL&>U;1vE8}X-Pe(cLAw;6C-$7> z>PNub)B00Q^lIwA6f$+2T<_aRIp_m^1jtRCWrqx0$NaN`(hch(<^9vHpjZ465apBc zJ3LhXqqh0ac1nROuk4hk6s$(D?}g|i03Y*#`=6T3?hgO%Q=-kDnzs&jh1(m6n4zUebOpXd0s}0FAVr2FLfE*W6=bzO{xwq_R>Br&}|X5O@H^W&zrnx`YF#g@Dd~K;8-SG2xG7PK>niG zb`weu+D~~ORYwm`iNcS7S1z@`xtn_FJ4fHsv4{K+-;3Etz_sinAj$WfMd&H*?Kne@)SW@*pe|nqR*_tHsB(fNE zn7z1HxXht{17ye4_x;JedhgV6%=**at0FUQn!pqJAS#*WCeGuho;9WO!>T&f)BY{j z&90>BLY^aCb~-g&QMI!%Wp+gIDV+Q(Vy^xRH|>i52$FwKMgN+9kbjRp|6LS;EEe4a zkL7;>hOOz4KND7Qf62ypui&L!fv84W&iPot-jt`={%*Nez zUGW!*X@7p9W@prkF~)|015#uAyWW2{NXpW5Kx3=#gt=q9gJ_+Hw(a&YN&g(Xsok_u z&7!!|2|C}cd}?0t;HI#cZIC&b|G@T)TqRl6CUX0S$Q#{#b22-BVMu zq1K4Bz?LQ@OvZnH!_bJA=5AnP#}MNS?|@w%%{6$@S8JZed0NdGyDc?sFy&3*>*lrB zD^hcH$oebZgl0B*kZcCLt86svF>;n#fs^f^#Q~P>`n7DUo{-)Vm~DdYQqJijcI1rl z3S*zl(nvJ1HY#jcfyn*oTO#|3|Xb?WqqIVv})uRzX0WkHXCWf2Y6_v4F!ARoTdMhYj64Df&wi<6+v zd+1JvAk_+W{$^m`ygVaj_=atkRwd8{mmy{d7~1gjCHlzAU7lmHrcP z`{k_}-UUnk_5_SCqbqK7i1#3)B9#$KIUC?ns=e=wxEj5x%DA1L+VWRuZiLm=BV(P{ zm6;$R)hLw>he?Gnf~0r*HPvO&IB!J;ocx-|I^GxP#763VjWHV26|M@~e$&A?8*9(Y zRMFCb!oweVkTO8c!7m*@S9Jw&UkzQ8O!l^7fUW2$2uzLIXTxFR8%pS_T2!u&tlTELGE(+5qKQd}IuUys9s0eg*WbxIHu9Q78eT?!(t=b{OI(z~YK6m4cO zItdA7Z1;TweCYGcpI{TLskX0wY$rD%#~UT+9%+B|-CG}u3a#E(cE3|4fmr5r%K--{ zm9=Bnzn!YKQc(n^#1`KZ93(=SI9{#uuon+sWjJDEnRZ$-^gPWyx-!k1Dsd~t_$)@# zXu0eKC53rt7kO!}=GIzp9jGxOoNf7L6UMRoi3~64f|-&V{-8a!^JJ(EwT`HT!v&6$ zyE%>=1D$3f+3qVAK5!MQ?mz)wrpo)`{xYnT=eCq%pXufl| zM_w&%sU~={$BwHTV{C6sWFw?Y%=unWI*C8MZL^Vg;qJf@rM_?QvZ&fB?Db$;=D}O{ zWr3VLX=|Z-Ry0cY!2YF`rx^A=qSvtLTQo$u?{E>jv1J2sOhi4Q#K$2+NCTGhPC<@!`FF;Cda8Z61q-3D_w= zp-OoBBG*%g3qw;+hPM)j6d}skwjey0pnI#Rz!L;&bQI)E+CfK5*BPb4@$gGXx_tT7 zAou`Et^LLnpVga!nwZb(k0%h-Et96ezul zsI%oEPe@*w)(}?jQqLCczUKKBODnm#b7iExiQ68=RwkL>e#*|sMjs((K$M3WN6lS@ zLv4t`+9Ztj`Iz;Jbvk8Bf}7vDEQ#UjDaCHnn=VcZtz#Dy_4N|hk)NL6XMbDtbA#~a zrm&KVaD^c~`$0`1*LB)OLxc*LxX;m32F2@PaeNSU=Jc@;L^$M+g+DI;AaQKk!to$A z8_(v>S!pN0J#xcw_e$R{WboV?u_bIwoDJzdSu%TfkozSYE2r3u9L)~@XC1qfal-Z( zcIcblLjZzV`t2XMxf3y*ZS2Qz!<+zY4o@$J^P7{MOsa*I$mdu@v78gCjqADBd$&1_ zt&gm?+WW5z?(+Y%N=4U(dQ%&JV^mgJ4avKw^m<(d>}bK@VD6^ixT6->cHDEsdiN5W z@?HmFQPPDMU=1KIb|?vnyoe6#&$umXJ{u5fn)nJ3=Bw;!`i}MdC(tIwjDHw8<3Rq~ zDXg+JA8&uK|7f6Xr2mY$CMWdictxAfn<&jm8#?E2hmljr^g?Fxw9coU7rfo$D5~$hw{DlShIi2SyT?e0#rAztU6F$FZwJSkEml=+?gzVR~mZ zIB$}{G0y4RLb6mS0Kjo?3}HUi(^)RaMqhaLvRd$&<@XX&E?BY6d(TtImxKba%8&%v7^FLnv6QgxLp}oTo4)=txM-?NzIp3(H=#KXz!oBg*B@&6?P=_U1j~JF z?0632tIy)Gh;*$RS0;*BMr>9LntjcAtyc$^H0xA~B_!TT?p%DWXh==*e0`l4cBZIv zMk?lD5p`JAO1X`~kk~m7cEW`?w7lFbF5^D>s6@*UiM8EaiB5>c3Bf`?(>jH*=ekRNAb*wu-C&|G9> z1geP(PpzGmn__VsGB^K;fPOa#Sej;H81=iYcZ{$xgL!4+;9VR~b#ksG>@^rfm~BBS z{r(E=b@Q0_$60&tenJla{kesU_C5+S4;P{fQ4x5P!f*>KhAjJ`5nMU%+I_M++eKZ! z%|`M-6~{#fa$&Ed&G-e5(!$9JhYOXOf>soh^VG)tLz|%udtTl(?Vc1`-GD}Q5O;$5 zSV4tD0X!EoeNwjo;C99}XO>oxdFW|6bo%JTvH63zS4uICsmatlCf8KXD2YHg4m!x$ z)Nn^`#~jTo?0%w=#K1^gtd+ivD53mhVF?Mu{||0zKTe1&QZC=o3+Sc77XDuLBw= z9hYO2FmV~%OG@G^gDXt(c%rP?U)NMLj}O{9zW;R$Rx|0kKY z|JvaERV1wR9T87Io$>vv-0~W%ByZk>BW&Br8ePaVDRFDqVsrvGL!shX^T;+~{;$5sCAu%LhQ%>i!ipe> zhd$IBx^&fgBk&B+iT$L83p>t9{?jv^<2S)R_)!xxeVPQYtcn5$1jHz~8aoyQr^7DN zu7SX(O|{6PCuN(t+Fx?nRI&w&Z+YTs>g##5(gV|3Vl09trOlcvEo>Inhj@-|q9vX8 z8eW|>K7Rz1*GK1@$j4sG(n-_mvv{;@>MpXuU)Imo{H9^tmz@T2GpVsL;0ZIud=C+{ zzM)oUr^%kcqWRM;D_m~B1M?)yU&E)c?{ku=rt!}a%{TbtCRL((^yx&Imrbh^K+n2m z#jJaEvsCv_8y5UIB1QalLV|-FRM91WP?Ex`Ep98|XTL?b2^L3~zanMj$}{2QByuw? zz`pO(LW8WX55Zc6{$00ZDVOF=90~@(`exhhg+5cVx+qS0NqL%u@ax$1NRFE8_D?hZ zo_@B@dIx`Mr~0Rz)Keq&egs$O_(Vx zDyXYsN+26WJXmikGvqj&P-WoOJK-D+?4Mmk1ziE!M}NU7{-eBFi{(YTo^T*(WtYD_7w|gg&C&Q`5TxXrCM={e;#p0F_IqMr$iN37F1k=k)v>@>c`|LECG$w3hEQG4X^EcClr>qboa|EfqS0@ZDu!%?kZ+{X) z^b!M9mk+{rrg~uBl>G80BA?QpMdbof$%JYV?=?{$<7J z34FY#pEme+kBZ7>DS*gXc0|_{8_Mb_vW(1ibI6Oa007Fhh^dR)zqNkv#6gDfBE{H- z1FuHnZa+2>G0<4}5zzGrKt*GRi$O0tc|Cf%K@>E?N-Rgh(ka|qe|C1-sQXJr-Pn-@ zVdAD`I<=$XBxGr3Qvs4$l%!J(3`A@nUfOZT4)Y{_Wg6&3EXh9_01)9EMEi7RfB^-gV0Z`PsCS=|vmS?9FW(xuQ?5~2o zv%e-)DsIVT>%YxVDsbT~d>UC39c8q@!+nzB zkX6>(NysN+`kSdrYoE@;|AOM@RMIp)ZY>}-1n8{qL!KP{LU4|{$O7MuZA6JYO}4!g zKtTZn6Z-x#fpULEr}q0BO>vH(ap_MPemfVrw0w^MHI(lf!=ebmQSp84Nm@HT=j%|& z!1j-Zr7QbQ;bf&>_1UBa;}P=@PG!3GRcxgNEk_e8ABIa8nXP&xvpIRt`*0n! zrxW7qTw5L{w$8OO`%q&!pJTo%ijk=DPTkgD5Go&34GRXZeJOyP8S^CKUxl@ukM+;< z^D&EyzqJ;ZX2vi{3?dj*o&d2{6vS!4K#=kRg8tc13F_JUhc)=w`m2hIUr|7(Rxx@HJb+;Q=MG6{J5Mf8IpcPr|=NuhAoIALQD<6 zL)FHz%dc*$<1GjE?1yGtEw;sJnmQmhUp6COlF2faD~?SK_k+N3H7}`_Bswx3v`J zszKJzzJ&&_@?$ik zd^*+d_zg@dS^DH3yBWOI=6>4rF_oBrW71lPmcixd7S`h8IsghWje@xs?^qM!&8r4) z(ny|LE~B*uOU=scV0)m}tnw-+%TWN6tACkHE-qs^qdULryChxWsXAncm+HH5sKhvH z!n1`5(~Z<>qF!DBURH5~kcKZ!QF=fQweD-s5Esb84TU?Tj-&g|UAXeg(XW-lfTGB- z(Of1rgb`Z0QCd=#A(uoT5c|hCw2H@nl<{65rnlF1=2sjmVg3hnMjWcikP@3pnU|I6 z9HAs6GyVx%e8m1cpuPc@U!nNDqvf%<0^)d&+J3wYeY_AtnD^l&hQ>(G8b1Gp3WJ)o zXedTvyddj;w-%lH?c6vjeAS9NbS&HsX zYi677GEwD4e-0DoVYWonJf+szu>s#5{sMV^|JJ%Y?MtRFsWlW*bh(z0?A#>ka0O@yBl+hdaAi19Y9wNv~;3NVH` zY~MzaR++1?S8I;>O8}V^fy$gxivtzZ=@DSN_DQhCkIth-imM1d8b9t|7GzLm#wt6+9 zmNjuZ?3uma8dgm`v)&W%^Y-6Syx6glnipaY$=ZggpmFMye3;)gATS@`W;L{2F$h#V z_!yZNhl%a7w2(o0bAi3)b{likD|~%wcK0fkwcKHhzH-a+Wb?P_zSuE_D;k`8lKJ^d zMR7@iDJ!{zi*g@15$=xR8ruBVU16v`kgXJyPOAR&g_ZflAGg#J9m(C4{rQ(s*iy1@ z)iK3-`U05;yTNZ!fnM0_=_Dq9EuD?!Lp%lby@nv`Y~4a+vo9{+Qb&C<>(P!a>U`O+ zK&JeUg^pO?f*00?{o&I08s6t=(EgzXO>Um2Z&QHQlCAN5U;o~hrR&@@G9%kz3D-pK zrWi)eRQ{WaD(-U>%rn10S1Cnas)@!6682i!kwYtV?qlP=Vwon=U`IS>_1359tLrB= zt0LI4fWNGwq@au6t^jG-o%5>jK}67d#m$GiAamG;UX?yphrhC_^na2KQN z_xQaKLCu0is0OWt;uYA|mhlRS@h+MJWeFA1LA-zc7ehlUxAtIl{q?(yd18&-qk3`% zJcND87XgzNlS$&z@p2Zv0ybGT+-R3DeJ|1J*X$xX0{2D|@Cjkyz6ie!toe@x&SgZM zttNf1^n4bK5Aa6BrT*h9)BL|Rxc|x)e}}*c{l)72Jx}UC?)tm;uK&5|k4gGFnd&ct z_dmV&Z$|!q*%2WDkx{B*UuNZXTO-s&%ba*K@7YM2?}ew;w52EkMvKn%LMO{lIFHXj z!jC1*VN2>msdD`+s>;53d6&K6?1#I&N-RA$-2ZYlmjAnOBlWj#L z5|PAGI$_BlDK?2K!0{W>lO1VNO-eDMDNR=0%@q@uOozVwobDjV3#JhCFP zYZTH*8;jNNV8k0b?LY}4^CoC#P*c7RSwnumdG|)hf`5l!!CsQwUl$(mV|3dm4hK=+&SS=D_~*voX&y+k4XNrBG{TsE(=q zj4Ea>o26ylbWkIb1+L(hcNu~Mwc88;gqY22#pkr=G|PV|wk?vdS~(dqud2%j1#lq= zJsiJ9U^2XB|90yAQ?o8f%{k%u?=?=3=T_fo{pS~GM#KbFCdTzd6H)NusB_K9{xcaI_-1RU(HwRRwQ{^VKU&P- z{B`YxT)dJv5fK>IXn>oxLot))7YJ=L63QTruCn_h=ZA@8hChxRVf68PPVno}TmL_g z`#Jx90o&45t6>x_HHw?3bxCAP!H}J302l4%c7XivkOHj2keu+yjlAEGLU_#?;vT0y zvhNxse(!Tv)k#I`?LQqlgtB;UvJFvEDq?U~jWPV-yt$G;&IuSWY2nomnln}5eX6UV zsCR#!X2mvQ!alOK=xlpMQn%nnXy$+s>R;jA)fSVyq;q=K9``EUz+mS3&E}8~CGje= z3bDU^n~x|CKRD{ z;V~6z!-i+Z`adJ>5tWplC`#BBB*k|`B6*ea+VjJ<0_^V=@PF_WVa3)HNA_H)lb5(u zhgk3U{IGl89?Wg8)%T>eiOt*h;>NG;jF%L(3`_kJgK{dca=X?R1!El>5(pa& zo)1w??k{n0_8OeC&S;D7X*6g2SXfarysQXqilTgH4}@bpMy@oy z3QT?AYydje;FfmL23tdhEhY4ouVyDAg{d2!xaObB$VImkL=Dn5P6qdE^e$-L*8tNZhRb;&i%Nt`#b$tR_>E z;tY&RE&kv_x0^lHRxwH)kAzn(p)_`bqa7cI*Im_ETyl^S3fDQ|44Md&0^vP>x=H(f zQ^L`AW7zo&F2<72Sp81!%Er&EV?HZ<(j$2r+uM`kyJcZyIei020wr0TG4dyKH|w$c zJVJ6Fg`FJ4#%y!oEV=Yd)|ilWfJAbL4LbtiY|OTWISs?=KbMqQzu5;+m zVl|b3xM6SRleqX38&NMn+Cx`y7N@%IVR}9Zu+%J+u1?}PvZ$BuhMkC%lKUH9{iwye zJOppImt4^j;`T@wyyTYC=c^W(8DTX{*!eWZBh=i>M}3~6$>!z-w9L0v6rG-NyzV=z zYUxyvwyJA*fnR)~=77sGxC=2S&jDv{9GHpiH=+JeYO-z<;8vkmdLBix>-&pw>1tz< zVrzl8tM|(7$X{Kye~fjRm4X~VCVhTy0QdOxan6$2;v;b%YvExvPiDwWJ>#e$y+Z0y zR<+y(jnVP>l{APPG6nmNq=bEzZjngIrP|_pvi619xV_PfOYnOw@-wxb z6_ZM&Hx(>(pd-nkFN;^C&O?faDx<%jsmjPbcw0rvxf(!hVWFq)(+I60zB%v5hp1i!KZGuD*J643a(CD z>`8vmCa^baG;<0P(R0Eh{H*L!AT}FyS4K5~;z;Lf(wuCF?cv6h|7o0yFJswo-~~eM zllLDFV2P8izS>SmdamqN7mZg{D!0|z`^k#mM?|-y{N=O%#*4A{9b416Ow+$ zAXbL|mio6oz^W2CA@FP`CFQeK$msIg2G#4Fp<3ej8^vUwS0>h8qYkNDR$%cY$iSU(_9QqYw7qnPgBy%gPH)JaAdX!_}3~ z1XKV2JD z3sW&Oe?y{J(rV_R_=dgt^-dCcw{>p}n?j$N8wyWW;(Hr2IFGTNy7_fM?5;&8%iPm| zN&sFu@o9tu4-NaQ+Ef8##$$j$nn}aV;UV#b5GLEjW%p!1~ z{D$Pk4f24%KaPAlBw~Ko`fK&&jMBww`EuxKy0g59FjItL0(sFG)lL!+5>6&PDUiF+ytCm@mlgjhD+UCY>?lY08en z-frK3ad}eOQ+?ATV6drFm=~5k2e{V65dJn|CCF;ebB5%(@WlJ5T~WEiGk)w_z~QL7 z=S)9MMfk(KfS0Z9nMnTtQ;6tU(tz@?Zr}j$>#$D@PSZl*ThaCse*S3@|KzC|%0(}_ zl%r9hrse)_ap0Ttojtd??#lGHnRStAxVaAaUoEgYOI<=Dzn;|}8KfPMQj;%`YBUhK z0ZhPqacuaX0J=a=ishBcmQNUdv_GH5ANF$#{rq*I2(B4-A(x>xQcmQrOSmzj8{EnM zdOF1&R0PlKl{CI~bcWPr?DXoK>Y*>qAt2jxI^mUjPfftU@4N#oEuHL}nfK}I(ZpWX z?(Q`N{b?cM8(VIy(wosX??c`vCk4NF`s5qU^$m;T!mq6TpEur71sQR#`=rl2j)h6s z+2L3i+<8Iay6^Au^X;-KDptAg+E*NDZrVGHjq*f%ntLq=az8bCn+5)`Hs#2uzrCfjlOIVU045~g6=ByB}6EgdMh)ks4eZqSb5jP5t*EU8^Z-dn}G8)ucTD!nli_l zMWa>4Lt379ZuT-Wk7V(^mEH8}ag^P7dj6n|++xa&S0DsdW?+>fG<8tga;e^B^h}B& z?WplOHT<|g(^unc>go}&8PgAr%5`1t7sGK>9db5ZWC^KU5~8ih56cOIs;aPQc1M-Zr_>m3iu@Vdg!>ZadiBq^x-#q zK^oIedf(IGdkQ93;VY+mCS?lMIB~@M=(Sh(}q5$oW;T- z7A|$*3EzSNXB1QV8i$u3`B29zFrq^@167IzRmT1Y&WXVpI1|Y+n8p#-&{xF4W3yEz^`aETUi#| zSgoy@i*&BrDy0{CG9BSab;H%9EpP9QDD_TVplomDbw5L;hk*L-wMmxHtxhD|^!wKN zq^%b-Lv-ws-8_?fq!3b&k{?5-XW2pqQGyfW0y_>)1fhKt-RgQ-nbUcp#>O1M^cc27 zez?bmVF%nu>v!P7!1mqy$1#q#O1Q&NB3x$(PlAnG~k>13wyZ zsf=uUg%nbBh8wEWN2dWMIN?6pAQ$6kr?6~}2}M*haxw{p;Q9?AOB?F%AbUKGjh(5& zz6_KXE}I{(^#%;9S{Ir+_5CI@!+Mj`pJd9VIMYJx0+zruS3i-r9c%l7hi{m_l&m(B z>4?V2jo;~qPBQz$^5SQn0NP^5HZ0#GQDCei0Z!HZzVv}hQeyck+xit2R{{*)Z0_aOgNt+3{{yII@4+TQO zWaDN{8~Ou>lT-^Aqzsh3SbCVleKt z-T02>W5d2Qy(59_M)eH~sOj@|hyum2EKsRw(R<=Cg8Lbmh>xt1uhF%v z*BbC{>ZOkj%B!rN#fX@#gm!1b?oL)>xKf=%(ozt!|JKbovE1is`Ba@vuDTOE4h{m+ zSFBj+QmNA%Xnw+F?(4wU$I5NXyehgOn@3?)Kd01pqL^{dX(sQF?fl?pCSATx*3HYc z)E0Z>ecZZvUwg{JpMllYStF`D#pB1C>06)TMn;0zFgUQJFcyPoNhT!3$-jJs_9}rp z8tY2ou;DMmo0(VT|T@CZKS%)`Gdj;%#Kj z<#AvNW9w&FkzH15bMg5Uv!;c9u}RhhFM;c0)czzADuwc5x=BgaaR%kf|H>bpyrtTO zI8|e!eer}my-_yS>OTC^dwRoaqcBP+$m>#B)w7}Z=EeQ9D$dQkyC-&U z7`H6qJ3jx0G+D}*zurvx3Q(3B#iS$@&AYat(AS9^1-+ok(3a|OWg+XQevpdk-Lft} zdx;UHEqw*Kxl@qcG1WO%axlk6PnFHQ07RHTgn^sAqH7sMugLo(^hM(;_>OE5>y#Xz zX()!fBO?iXLmNk05nc;`Zr8#WaI_dvqYGi|cgutZ{V)pWR^jfe&0P#MC#%X(NW-wX zs}q6ra$+3h=m(S<|2Px$S`r@YfKQ?UifpP7R*0Hc(WFJ=e_={r6`*e4*Wta+$r=M{ zqOzM3xmDITTH$EjyBDD^1{XvjlyZ)5Z&Lu`<45(wEA^EPDWIE@CnvmN3c-_4BUJe( zhWp#j{rcNh&?az6FZ7Df8n7AknpKtWqa#z&m=YRXmS(P1V%+8eBtX+sVHLRh%xTH| zkuSs)NTPrNZ$OP_uW|VqyKPylS>awULx09qU4h4PaIldA92pnd8u92hDPAtIB=KUS z2mWx=IEj9Rg(7R?bA)w*SB*#Ytew7AXN=uGmiKAsR4?2>a$~jCUO6~c+on?POL4AG zu8Ud9c)QCH@3Me(1CPPet({Y>lyLhx>6c*&>g=MxW1b`wc8MkUXgyA)OVfXOCa20jP zNAcf~_|vJc@*f92wrHW8;qAZPtqFLXU0?WdZHpB?JTnr0O!Sji)eN`0veDA}c{7tP z9m1Kw?iK3cqPNo3iDj^K4NNLV5UtZ}D?b!3LiI$_<%4wd_$E~aGSU)LaBBE==rYka z$J=iFJijDlWL7M_KepTF)#(J?>v#giJb!(C- zMYSl2oF~`~T(4pS?JmK)LCAp^xYp$V+1N7P41JaQ5^1kx$pMbFfGOrU?ETK3X zPmypf?}f8$mwEN;lIc0fC0gthPZH(m+yWd3&+nC1^hg@p)w_0>+NaNoind+j;}?yT zcU|zKZp|a3(Nb1-&pAKR=K}6D`%XvS6Bjse0O*J&Vk08QL8siuag!00E>Wf(~_8Sl~d z4}L>Bs_`B8SiNEI2v7|gi@pg_RGl?bQ^I)eBCXSjhc|g)_^acNZM|y!s7b{L5EZun zJ8u6Ek36A?{O%@MR@6A1N$B=dT8Eov9wBN3!4MZl1K(QMs*L50)-00Wi+rQYE5kt6GyI# z2^mvLvJ(mj2FY#!H>9;Kfgu7wsT;lchAOGbL10Q{&_&olrfaKa_L{Hj@4(tU7Jg}^|3s*RYw?JW&c&fij3u^H~k zU)yME7X6Oo(9~2zWXJ0C_e-x-)s;C6)kp;nHJwyTk_`dqBd3P@+Xb;F8{p$4adqYsE`Jc;P>nyW2D845tWLxn>3Jh8!>}&y(&ZpYY|>L$bT0;v z%H+hI9(0zRYO&b`n05lN7A@#;=xWCbV2KzrwZWJfWbCMb07nBnV$n?R)il*CT&w(L}~dFTlaN0IAgZa3nrt^M9|1@Ha7|r{+?OWSJ#| z+*2e9%u<;@sOi_4s&(ZV-$%!`tD0BGEB~OT_0AcxV9Hn%lfIRL4XeIt^^QCbr;pEh z?{N#*LEI&Ia&|5_%$BGYy1KRP6t62!GYclWluOCXp<(g=+m8H~(QN+(etc{rA(ZUq zah6yBiosKq*k?o}0owsi5z*6+p>?fW`LZ&IyoQPb>VLoxDT&5|W$mjA*!+eUlk_7+Nm(SPevN#kNgm~PA`^Tyr z5Hc$te9XqGZT|xn;;>vicCT$coc8|1uDEUO~^Md5(Pl zu%Jac$Mj*V{!HS-ljEi`F9idXRH+c!PkPMOHZ}%(>gs)j8KYHx1Z8<_oOt!Kmp_Ff zriW?r9MD)<=t{hh#~*g!;n5gab>Dyw*>(o&D>RbR?V8o^cpvFt@{4xh#2jrIkbSD9 zG=m$6!wG8#n2$uIjWWpLa%xiqk!7)AF$s&J2y51}bvQJ0Q3+34wBZJ|@Tc_zuU?$r z@vt^AZ+t&3j-W=*%kE9VaZ|hr2N6kx_{F81jL%n|KGBXd9ba*5RLt*z+~jkODM;?? z>k~`8GHX3w`zl(7v+1nYi7dD)MEo;efjL5%GZX<=!}6mq-xWhM52^mYfA$fX@e0%m zk7|ixN%wik1Ow9u&2(NgBJjcdMzZR%V}}|1{p0XEd^R7>TX~&d#^>?>bNT;)oz+m;Xz924{dv=78<@ zP34dN{-1gO|LKbGCoR7DcYP+D;wcmf*Sr{^V&n=+n(Y_AOrO6=bEYQjLhIG(p=Ah# zNxN`w2p7E5Na7PN<3JwYe!A?Fzn!*)EB3{zDf94@^QBrOdZT@X_f4bkMC^%FP0#Q7iarbwv4qp zmXxUf4(2K@&WYlDx6kYoUwu)8vYGwiJN+5{o47Gb!3q@ z{W6!WdF8SCumqo6!v{jMGZJk&C2t0^0ni`EchOIXNpMohz?Qf_5HOEFbgZ`@Jr@^1 zn7d+9A8f{ah$*o3qB>p&CBI@Mgvekmyt)+F@SX;0MS(HR#~8HRA|LdIIxnJXw+BK%Yl~ZhKm59Z)Q==D5aJaM~H@9M;wb zC&?Sfv+OT~qI5&gZ`dVsj_Gjn^1?8O*dnw2GTpKIk3)NLMP-PHkG}HwFM+lZpjK+A zuL;3^*S=6%g=15l2S2@oYXW~6@2=mQg*BfbK>@QjvoXtA!)#w=PrZoIMA0lXv42)4 zPR=QyIuC^pQq5Q8tS_{y?|LABkDjgEb3gLRQ>{dDvVO(Sq5O(aN(g!}lhH4*E!-mu z?ZADbANK2t++TH4MVpt_K2AeJ?CapwliehJKY^Vt7t6(GHY~REXLY57?b@Od5bN5& zykqolq=QosN2Cp@`38DnGFO}|%haoxjj`MS{Kpx1;Ox|3=f>E!ML86FVbn{Qj68fe z(eP{J;QLNtZ(dN|ID`M3Qkx|gk1YM1Sg%bgS_UL6r znGu!FX|c_LE!-vFC4<(Ms-H(_WpA|?U^H6UK@|p3{qXdVhCfHx@6~WvQls!nr)^VV#HkyL1pf%z%!*2uzvV~b9U-8f@dee9gGfCSOY*m0~+^u0Ue z?43~fX3s>}<(5_DhD9w0@_i~D1REq&YrF`;!2hD3*Ug-_Zn?G_-`KV|Hg1A(Q~6{` zm#rYR*Y<$rRL>(&N|AR!mDL<3-B$jxG`4#)upq{XGnilBjQmxVb#EOH(je+`0r^Aq zq5o#8w!k;g;MO(<|6$f=_2* zRsD*v(W31P$foF0Fln~aT+r`bNsOZOJS;rCtGG{aT#z9h)rSVYK|MLU-%R)th^D%T zpxymrMCCP{$2O`_h868ee z4KIFwky0_fNNd+qy)%m0cD!8+WC@(A=T*Qr89Un9Z~-*`TI;^vE%!r0!a{=O&@lbo z#QT5#=ig6NXZL_p(}%tf{Cfib)&QPeo?i>484^o2+5r@Q1(C|mgL+tLUzQ7i4DGUB zaE=B}EWVfHZE#E?2pzMJw6n-$M5K+gVK6l{)+aU^!SWL+;sALLtK{@i7p64dsHwxI zlmgY&yHFkQT(UXYV#kHMd`2Q4>EdSIl%4Kh#5Gq_th_DhH&Yjvc_=%wOot4A6Vj;( zMg0vaidHl66<0W5o5Zf0dIfWN?R~3haHT&xe!AQ85VP`Fl z(l9n@yZSB7@x`{IPgL+2dE#hqh^v7SjiY#)A^OHx|+*AnU z4PTDR)-~Q@@!>wpU>MrCbc>l&n-LR+`<|7ri>^2)o}tDL=5?uX19c)2;;N#{Tvd8| zE@XtfQv11^LeLT`>2NXbAzKY(6~(39TumUw%ZvI%Z6zqJ%is(^sn^k=E$4(WSPW}E zf+Xho8`ws$u`pa>|&;e#fNN}Lx#VH^E_OWB(D8B+dI|zm_Mb*#hg=XnjJaPiJsOF+$pQbb z*rWgChKyz#jX;z)zuv7YOQ1$*W?Vmx*=YjX5`IIfHGAFEak8_oow;ayCrx{o_IP3x z=y8X41780%Qr}Q;>l=-ws-O!mvB=F!PDO0Eo-vPvxlkwvMz{{#;G;5-! z8W+0wNpX}dPH*jaA^ydh+ZFsC=3O}|g%z4B{YVf87ItNQL$9OG?#!+iwXz{VVyp)^ z-@NT7B$!2P1SH9aB?eVp3W3RnjLwxQ-}eKR!aIGAIE0}<&cTXonwBt6MP*??cr#|2 z*3(S#Y)^D)j63n3B@kM`p=vpDANotUU{RSWW=&;>9m{%AQ z_Ahc#{f%~;LfxQzhx7fGgLub|m_4+h^B?G3t0VZ-)@2}*6 zsje55;gy5Xp6AX1)-{Hf(q$i#GSBUho3;y^Txpx;YH*F~Np1xS;=4hl1HBKuk zQY#*x}0gqC@GPLEYO)t8OChR|L<;WC?P{7aq>aWrRvq|mm zxTHhuz|TtDE0BE&1sJK=W$014f0(BVqx9$|HwfYij81c&vR>pf8p<#(@bhWJ^ijRI zWkAmqL66)?ouO;+5SGw2GZ=xsfHc=M=zQhb;D0@T$Ry23LQT&Bw^P^dVt?F9qpsmo zMkP5#@pHBpd@ZLCqShCxzIm=VKd%DV38NhwGqr|N=Ue`i_kNq0UtbP;n))mCZ5Iff z?ipmc{u8L(C(sw`Ah;An{6G>+QtBg3&AP^7%aBtrEJ=s&^@<7A%1&yC=3cx3@8}MX zWBGvRh!J~zZZ?jePV*;68qVn!>&mH8^Vn@M`FK1#n{d)%-3ds8Hp>s9MysMU?b~ukk2H3u(6~y%5%& z$VJ1X!X>4ooKB{L+yG*K12qJfT)kxUD80meU$Lo5M9)+uLV>$X)JX(%4 zUQq<}E;{|Y;N%M?PL~ii=#?Y#1(s@rVhzs&fNIW!z>MpiRHW(j{5X7YBPzSxD+D#x z#1+jx$+|K`$s_K00lJ^iY{WNi3u~8hF(iM7;Y0Ykg+sp$G(rp(d!xiJz$o^TE!vS1 z1{t)pGnm|XB;^zUI`1?PUp!?#pvyQL(GB5A9|}nv$=FW9+~K5)O<24(5m__NK@6qQ zEZD=4pS-xRm)W!c2fRuL3ks^+MvwE=rqesjGOkbK4W1iPFpS=e|H+*u#>}Gkjc@5* zoOS!7)n!>}=UKs~n?An;Ay?zlm6~dbsZXfO>Z_G5FF!p!po6pLqW9kO7!4(MO*H;f zt64}G3dftP`jpbj(SaD?1~RCeBQ~_@*Eh_*%6rSWK2!eqpYe;~f|VfA24G)zbF20u zRx!q6IU&1_YXXOP^{XXZgeI`@zSU`9u^}_OBXDjc`sn1Bt)c`bEHBzL%#O#yBXM^_ zDH;(-#NvI{q#rWw72LWxMa5=%0nP#QwDx7azY5O1b0c$-LQUv32DEs+*>s^w#z|2H+KRi;Z$W zOLfRzVl#m&n&eLC837fjoFEugF-_wbpKzZ2&VIY|s)i zcKWvj6XZPa;Vvz}SM0o5Ge;8rYJgt|?_il69As_~`s!jjJ7a%mUCdhSSM*%&rPme& zj)`Y(&IhUM+%fYRUzJhNuF~h#ttCP?c>l}V`fCtOZC?85>&al4bhUWG7pqPCr4`-Y zl{*1It&SM|)5LIsyaaz4sqQzpmW{RHRG{vL5Hr4H7ZW!(NyyV(dwkL~tJrn7T)6h0 zVYFqh)-3#}4;^YHB1gTE9l8UeV4)pbP(Os7_F;a5|SWhNx}22IaR~cA>k=WUSPP zc9l`@jHBF_TSzY;#DFf=djpWc17#=EIX05vHxPy^RO8sKDUayK7&Bo3TYpZxFr|0D z8YPVgWMrN{UTUv3K1Vx2k=x#a4*9w-Q#>0K2rIZ_V3w@o#u934nJ3w`j_tIfBb1+6@ zA;~?E%44gAeOPLiwI%x%ro|(d{Ce`6zuw1j^(kNH?lWQ9Wrw27#9}foy<~7;W1uuO zQeF(@J~-d*4UHfOgc0TL@B`A^LKwEuuyi0TQY^b3tcpVQlx>dOU_c(Yunl~Jc3jz5 zBL_^?TuRG=3SE(LF`Z?RQ(rbw3{>YvseOA+;RcsIXtp~qfl#DeVOjPmQ_9FFg>(;Y z^;QA3oaagW&fIIaBP(zq)}VG&zxKT=k(E1A9G#xro@H&;9dqayTlNvcPA7i~8Aa=y z3}mFBaX6lG=87=NCFo`>^(EGq;B$;E%P+CETThB5Vf=J%{PK=&v6aw)%eubB=AfW_ zNn8g(*Pj#3#2Jg(jx0q*!o(4H@o>nj;8gdDAlH#)g=>7uXkY0~aO9}T4#xv$7c(~t z%W!kEo_r%i;n$aS`2DAQlCq7sD6t#b{a4-W6}`UG4EY6lxj}h1pvaKvZ|#E3$U=g6 zgU+oBSk@}UAHl^|PK&FqC!G*I(M%uUwEUn|qG!Yx-LaHB1iv3uor^)j7`-4>+9UIaoB~&+m<8Px4=M`e?iFNhHWmV& zhS_g~BulHAU57XftdXXdZZ9y%3NlI|7_n6><7lBHVG?S$l?THp*grlC6lLeXS^rtz zdxxmb9=w$%!+TZme83v@l20dqF0@+9lv|T~Hxib#?S7B%jS!p3o~zN!TU;&qzkWpt3IT*3iroh7sAlnE>$&o zG6CvuIZ&`vNS~v~wtrExx44@iV zD3Tr988$DH^A1tWFmOJd)TR>T?D?|m%$DLi*ztXJre$kgL){<-?AB?ioKsZP2aATk zj@XMI%eMHi6;%^oNC}XVGRni#y93>H%QdUADfFFOH4LrKFRF8Xg&dZHEx@897!lK$ zNhp-n{Nu8y!T;8$3!g;qKXobo7hnAEyyQgj8_k*Ux$&sa!7txUkPqLiGocl{B^i~l zKD8Iok}(dQRv)~2O0h_fLtha4KswGn3{tRQg_b&ZpmkS)IPxn#T+6#C0I;g-zmWj@ zOXeMdUVffAayk3X#LVDTv}Dt8%HMxN)#DNM_PU|7RK{i;%sxj5yda!OD)tf}jap95 z6iPlEz>^9zyYXckq7KsP(pnhA<7$1yEV8J!r1UkflTvy(nPm@FG;XgtBh?CJCk1il zWM5f*iommA*1K9NF7!wlD|LAl+0j|4DKip3@iZL+=R$fQMy6iHpyCEr-jrd61# zuv!&_SsK$t;*su|akM+t-ARO-2@y4#rwOz3C8uHYoxrLA!o9}9RIK|R_Kv~0c~RmC zN1>6BNk5MKpmN&;Fcuay3I(KaD5y($RI4!vVlsLe4 zgqoy3M*@B%b9n*KIhCbvu(%2)s3U?4N|4j25yC)$C)iJWYToGxqmd5CXB|`|K&*CR>t^|NR{i^ zD=c1jhwm+hPOVDcL~6_^#em;eWnT7~7Zo}otI$e179||HG<=#TH}(>YrlJkTfuxti z^;JVvkLVg(qXK^d5QSCER?GpT0gEnKY22jL7$_D-IMuM~`gUPE^Sr2xV}ZP$^>+Yr zq+oKX1#v;r2H5`GkrE{b8ovM~V5g8bENE}A)7WHr$J$OR6?13Rd3VuXXHG_xpATPv zC543{`~wBc!gsyhZuYM1>pVHQd~Uy zr;NIYhUNv!zsH)&{wnIUZ*gMj!{kmHy+j!p4p?&E;^^nrBfYVlZf0SY6hFe_sB)`u z5tAA6Ld%yg1aso~g!2SLK)e9l!*qdjw>xBU=Kel33qw@0Uc9j4RGM#ZjSh|84Lm^^ zY!s;b;cM5QRmny+Er;A+1*&e9y_3SImG=6$f8$I0>mIGWk9Ls|cnh58&e<6kKsK>8 zc|v0u;`9;s2i5xbVrjJmJp5pvG}U+Z474@)^J8@U4hdz2FtQ#vfj$?x-jto+2i!Lt zkF!T}0%_uxkk;3Gjl}bm~He1bJ_F9bqvnj?<5li1InN5Z2pF1#phwk zOvM@mZ!8t+$;7b$?-DfEHIUkuLD=g8gWj=kx79jV%MAC6oJ1}f@d;o&gy=E$+Axpw z&Qt|P4NBBi3f!E&|tRivSbhW3B?=*@gJk?>u)&1gAb=T10uI(Q(>s zy=UZGAx_O8zObdPmZx~Sl^Sk+mHHI?skYRM^$mMy{-)o~-IrVTx-1J1H(#!U6&d{U zvM6cc>H*b+@t9=n7fF6N0S0i4LRfo9*hze$rvahacSu-dR$^w38dsRycRvW~sD%rn z*L|c$8Gk~JEY`t|`s+{Kz^U^*g`!jH(nIv#casL+*^_td>z`a*z5V4+KlJXD+b5%4 zQLH|Ra0#Sbt1&$w;XDY(F0iX1L9hDa_4b$pWUoT}&Ie`+jj=gA$mL9_R&lQkrC?m& zwr;38#_Su2Lo$|=T&0&tsac>GK#>#W$I4q#P^Etpd4ei!bktY2+0{U|4A)#*_?j8z z@g-ySye+UaB@z|EVA{Y#arD;ORyBHsc_-QpDQ>1X@U$IgMvaDj*c(dK8$GT`Kp2*Bi0m=$TeEy;-9~)JdZv59z-ekUbO;5fm-Qb2Z>V9=moj-5L8ZtF^;?@r=4^ zl(}{{jku4SO+Iup-`0kT*1W<_f^5$MxtBXTyR0p+yyfD^!F)l9gyf;Pe^~~_U`T-y zV42a-B9VtP$|hu>lf{38&mkWi7I(CTna6j2w4I=XWHV;edGBp2~bi!JIa!61r|1Kn^l^ggEgmtEz9bC;zVRB>xhEp*>_Q4puyXU2fJ$Vu%yr%m* zB^Fw&y6Pb#l=#`9HTB#?N-oZA2-+78E@ZDK3Ax9=AmAa@WI>dJfNRnA`(YtH&&@9A zsnw{oyIl7;xD;ITkt6$<7>b{_5FqR#2noFOx0Dhzh*v3e~ujQcrn=-sxO z{T#iRXb4;Yyj5CIP{7yE9qUhUJ}vg~%%pax2G@}>T6@ZjXIjIoQoR#6n0(xSD1?^X z834H$<$QCSYtCTRmh*y_bUm<6&$J>hRTZdSH33S+BS?=1a4wcpYX@%LNHd0*5qsd^ zfFQiMocIGTP43P~koKsgzg5!0F1VD!Sx8Y-O>z8Lb_LB$vCy+X7jpTLV{N*t!e-%x`YK zd%v{6&Y`&?-4%4J=v__>)vR=7C?HDpFE9UW<~reDjJZOIT@I@dN-;+M*gfik7WoU}-Va0^!oGEfwQc|=MhEZleA}G2SsA&zcKoaJ5;p9%{k(;jx+EYUb6;v|2 zt_ zYx+REb@X~O`r{$T(puKeFOWNPWsF&!+N&m=15@+q(s3tdS zYl-n-&-6U?UziIZ1^J^W4X_fgOMN@}<;HFJp<<1ngW;DeY2rX7%Ze9uzJ(VY@LD0! zp+{*|m1�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
c_Z{$2cpVr8^9QBNOVWuYDg-oDByYJq`ef5e$9 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 RZ~sA2@c*fIdG&MY{{YCr^hE#w literal 0 HcmV?d00001 diff --git a/docs/migration/evidence/slice-05/database-diff.json b/docs/migration/evidence/slice-05/database-diff.json new file mode 100644 index 0000000..f1aefd5 --- /dev/null +++ b/docs/migration/evidence/slice-05/database-diff.json @@ -0,0 +1,51 @@ +{ + "all_equal": true, + "schema": { + "object_count": 62, + "original_sha256": "60a4e044f0ddb6502e44b45f65bedc1a0a31d4bd596f386d4ccfe153a6c8ddd1", + "migrated_sha256": "60a4e044f0ddb6502e44b45f65bedc1a0a31d4bd596f386d4ccfe153a6c8ddd1", + "equal": true + }, + "tables": [ + { + "table": "auction_factors", + "original_count": 511914, + "migrated_count": 511914, + "original_sha256": "3d0470787adaf7c4cf5f15f5ad9fa1d67c8fcd4807285ac264eeacdcf5054cd1", + "migrated_sha256": "3d0470787adaf7c4cf5f15f5ad9fa1d67c8fcd4807285ac264eeacdcf5054cd1", + "equal": true + }, + { + "table": "popularity_factors", + "original_count": 232, + "migrated_count": 232, + "original_sha256": "3f4c61a13ceaa1ed9ecb28f86241a8a478a6757d6a44b46f432f73c0226bba7f", + "migrated_sha256": "3f4c61a13ceaa1ed9ecb28f86241a8a478a6757d6a44b46f432f73c0226bba7f", + "equal": true + }, + { + "table": "lhb_institution_daily", + "original_count": 47, + "migrated_count": 47, + "original_sha256": "1f847eac34d2ba576b429da208667f3b67b591d36ee66800803605bbc447970c", + "migrated_sha256": "1f847eac34d2ba576b429da208667f3b67b591d36ee66800803605bbc447970c", + "equal": true + }, + { + "table": "seat_aliases", + "original_count": 0, + "migrated_count": 0, + "original_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "migrated_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945", + "equal": true + }, + { + "table": "stock_master", + "original_count": 5535, + "migrated_count": 5535, + "original_sha256": "8656e2d189d3520433fb3552e17998e4bf17bcf6838403cddc6719282b23e792", + "migrated_sha256": "8656e2d189d3520433fb3552e17998e4bf17bcf6838403cddc6719282b23e792", + "equal": true + } + ] +} diff --git a/docs/migration/保真迁移状态.json b/docs/migration/保真迁移状态.json index e8f0f1e..144e800 100644 --- a/docs/migration/保真迁移状态.json +++ b/docs/migration/保真迁移状态.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "updated_at": "2026-07-31T01:57:00+08:00", + "updated_at": "2026-07-31T02:42:00+08:00", "status": "active", "migration_mode": "behavior_preserving_source_migration", "source_of_truth": "current_original_webapp_runtime_and_source", @@ -9,10 +9,10 @@ "failed_roots": [ "next" ], - "current_slice": "slice-05-auction-themes-popularity-dragon-tiger", - "last_completed_slice": "slice-04-ladder-rotation", - "last_checkpoint": "xiaobai-preservation-slice-04-20260731", - "next_action": "capture_slice-05_auction_theme_popularity_dragon_tiger_contracts_then_move_original_implementations", + "current_slice": "slice-06-screener-custom-tracking", + "last_completed_slice": "slice-05-auction-themes-popularity-dragon-tiger", + "last_checkpoint": "xiaobai-preservation-slice-05-20260731", + "next_action": "capture_slice-06_screener_custom_selection_and_tracking_contracts_then_move_original_implementations", "authoritative_documents": [ "AGENTS.md", "docs/migration/原版保真迁移总纲.md", diff --git a/docs/migration/保真迁移账本.md b/docs/migration/保真迁移账本.md index 3128a10..862fedd 100644 --- a/docs/migration/保真迁移账本.md +++ b/docs/migration/保真迁移账本.md @@ -1,6 +1,6 @@ # 小白复盘保真迁移账本 -> 当前状态:正式迁移,切片04“市场天梯与板块轮动”已完成 +> 当前状态:正式迁移,切片05“集合竞价、题材库、人气热榜与龙虎榜”已完成 本账本是上下文恢复和人工审计的连续记录。任何迁移提交必须在同一提交中更新本文件及 `保真迁移状态.json`。 @@ -24,6 +24,7 @@ | 2026-07-31 | `xiaobai-preservation-slice-02-20260731` | 公共行情、搜索、详情、图表与数据适配原实现归位 | 自动与浏览器差分通过,进入切片03 | | 2026-07-31 | `xiaobai-preservation-slice-03-20260731` | 情绪周期、五类股池与涨停表现原实现归位 | 自动、API与浏览器差分通过,进入切片04 | | 2026-07-31 | `xiaobai-preservation-slice-04-20260731` | 市场天梯与板块轮动原实现归位 | 自动、API与浏览器差分通过,进入切片05 | +| 2026-07-31 | `xiaobai-preservation-slice-05-20260731` | 集合竞价、题材库、人气热榜与龙虎榜原实现归位 | 自动、API、数据库与浏览器差分通过,进入切片06 | ## 资产处置登记 @@ -43,6 +44,10 @@ | `ReviewDatabase`原因覆盖方法 | 持久化 | 股池原因人工覆盖 | 按职责机械移动 | `app/backend/features/pools/repository.py` | 2个方法AST与原版一致;数据库schema哈希一致 | 已移动 | | `DashboardService`板块轮动方法 | 业务服务 | 板块轮动页 | 按职责机械移动 | `app/backend/features/rotation/service.py` | 2个方法AST、真实API与原版一致 | 已移动 | | Tushare天梯与轮动构造函数 | 公共数据计算 | 市场天梯、板块轮动 | 原位置保持唯一实现 | `app/backend/data/providers/tushare_client.py` | 2个构造函数AST与原版一致 | 已归位 | +| `MarketInsightsService` | 共享市场洞察服务 | 集合竞价、题材库、人气热榜 | 整体机械移动,保留唯一共享实现 | `app/backend/features/market/insights.py` | 22个方法AST与原版一致;根级模块为同一类对象别名 | 已移动 | +| `DashboardService`竞价、题材、人气与龙虎榜方法 | 业务服务 | 切片05四类页面与API | 按职责机械移动 | `app/backend/features/auction/`、`themes/`、`popularity/`、`dragon_tiger/` | 8个方法AST、7个真实API与原版一致 | 已移动 | +| `ReviewDatabase`竞价、人气与龙虎榜方法 | 持久化 | 市场洞察及后续智能选股 | 按职责机械移动并保持Mixin原接口 | `app/backend/features/auction/repository.py`、`popularity/repository.py`、`dragon_tiger/repository.py` | 7个方法AST一致;62个schema对象及5张关键表逐行一致 | 已移动 | +| Tushare游资名录与龙虎榜实现 | 公共数据计算 | 龙虎榜与游资档案 | 原位置保持唯一实现 | `app/backend/data/providers/tushare_client.py` | 2个方法AST与原版一致 | 已归位 | 处置只允许:`原样保留`、`移动`、`合并重复`、`待定`、`确认废弃`。 @@ -100,6 +105,16 @@ - 回档:标签`xiaobai-preservation-slice-04-20260731`。 - 完整证据:`docs/migration/evidence/slice-04/README.md`。 +已完成切片:`slice-05-auction-themes-popularity-dragon-tiger`。 + +- 原版基线:提交`814e757`,即切片04回档点。 +- 迁移范围:共享市场洞察服务、竞价/题材/人气入口、龙虎榜与游资档案服务、7个相关持久化方法。 +- 兼容边界:根级`market_insights.py`保留同一类对象别名;竞价与人气共用候选热度逻辑,不复制第二套实现。 +- API与数据库:7个真实API逐字段一致,仅排除每次请求必然变化的`request_id`;62个schema对象与5张关键表完全一致。 +- 验收:258项Python测试、6项切片源码等价测试、45项Playwright测试及四个真实页面流程通过。 +- 回档:标签`xiaobai-preservation-slice-05-20260731`。 +- 完整证据:`docs/migration/evidence/slice-05/README.md`。 + ## 决策记录 | 日期 | 决策 | 原因 |