From fc2b0944d24fc98795921391ec67543015c84b3e Mon Sep 17 00:00:00 2001 From: fish Date: Wed, 1 Jul 2026 22:07:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 28 + .env.example | 30 + .gitignore | 379 +- Dockerfile | 76 + README.md | 297 +- VERSION | 1 + backend/app/__init__.py | 15 + backend/app/api/__init__.py | 1 + backend/app/api/alerts.py | 144 + backend/app/api/analysis.py | 204 ++ backend/app/api/auth.py | 80 + backend/app/api/backtest.py | 474 +++ backend/app/api/data.py | 747 ++++ backend/app/api/ext_data.py | 826 +++++ backend/app/api/financials.py | 127 + backend/app/api/indices.py | 149 + backend/app/api/intraday.py | 201 ++ backend/app/api/kline.py | 813 +++++ backend/app/api/monitor_rules.py | 235 ++ backend/app/api/overview.py | 570 +++ backend/app/api/pipeline.py | 107 + backend/app/api/routes.py | 40 + backend/app/api/screener.py | 706 ++++ backend/app/api/settings.py | 854 +++++ backend/app/api/signals.py | 100 + backend/app/api/strategy.py | 440 +++ backend/app/api/watchlist.py | 202 ++ backend/app/auth.py | 189 + backend/app/backtest/__init__.py | 4 + backend/app/backtest/engine.py | 1507 ++++++++ backend/app/backtest/factor.py | 480 +++ backend/app/backtest/strategy.py | 714 ++++ backend/app/config.py | 50 + backend/app/indicators/__init__.py | 1 + backend/app/indicators/pipeline.py | 1494 ++++++++ backend/app/jobs/__init__.py | 1 + backend/app/jobs/daily_pipeline.py | 532 +++ backend/app/main.py | 265 ++ backend/app/secrets_store.py | 96 + backend/app/services/__init__.py | 1 + backend/app/services/alert_store.py | 209 ++ backend/app/services/backtest.py | 392 +++ backend/app/services/depth_service.py | 575 ++++ backend/app/services/ext_data.py | 514 +++ backend/app/services/ext_pull.py | 216 ++ backend/app/services/extend_history.py | 224 ++ backend/app/services/financial_sync.py | 314 ++ backend/app/services/index_sync.py | 146 + backend/app/services/instrument_sync.py | 122 + backend/app/services/kline_sync.py | 617 ++++ backend/app/services/notify_adapter.py | 112 + backend/app/services/pipeline_jobs.py | 250 ++ backend/app/services/preferences.py | 313 ++ backend/app/services/quote_service.py | 779 +++++ backend/app/services/screener.py | 593 ++++ backend/app/services/strategy_cache.py | 150 + backend/app/services/watchlist.py | 130 + backend/app/strategy/__init__.py | 0 backend/app/strategy/ai_generator.py | 154 + backend/app/strategy/builtin/__init__.py | 0 backend/app/strategy/builtin/boll_breakout.py | 31 + .../strategy/builtin/broken_board_recovery.py | 35 + .../app/strategy/builtin/bullish_alignment.py | 29 + .../strategy/builtin/consecutive_limit_ups.py | 31 + .../strategy/builtin/high_turnover_surge.py | 34 + .../app/strategy/builtin/limit_up_momentum.py | 34 + .../strategy/builtin/low_volatility_leader.py | 32 + .../app/strategy/builtin/ma_golden_cross.py | 32 + backend/app/strategy/builtin/macd_golden.py | 31 + .../strategy/builtin/n_day_low_reversal.py | 32 + backend/app/strategy/builtin/near_limit_up.py | 55 + .../app/strategy/builtin/oversold_bounce.py | 37 + .../app/strategy/builtin/oversold_reversal.py | 37 + .../strategy/builtin/pullback_ma20_bounce.py | 34 + .../strategy/builtin/pullback_to_support.py | 37 + backend/app/strategy/builtin/strong_open.py | 35 + .../app/strategy/builtin/trend_breakout.py | 42 + .../strategy/builtin/volume_price_surge.py | 32 + backend/app/strategy/config.py | 71 + backend/app/strategy/custom_signals.py | 207 ++ backend/app/strategy/engine.py | 453 +++ backend/app/strategy/monitor.py | 613 ++++ backend/app/strategy/monitor_rules.py | 241 ++ backend/app/strategy/prompt_builder.py | 65 + backend/app/tickflow/__init__.py | 1 + backend/app/tickflow/capabilities.py | 76 + backend/app/tickflow/client.py | 109 + backend/app/tickflow/policy.py | 550 +++ backend/app/tickflow/pools.py | 158 + backend/app/tickflow/repository.py | 988 ++++++ backend/app/tickflow/scheduler.py | 66 + backend/app/uuid_store.py | 98 + backend/pyproject.toml | 65 + backend/scripts/__init__.py | 0 backend/scripts/cleanup_halt_days.py | 96 + .../tests/backtest/test_engine_portfolio.py | 422 +++ .../backtest/test_full_simulation_tail.py | 59 + .../test_strategy_backtest_correctness.py | 163 + backend/uv.lock | 2638 ++++++++++++++ docker-compose.yml | 36 + docs/screenshots/backtest.png | Bin 0 -> 668676 bytes docs/screenshots/concept-analysis.png | Bin 0 -> 504304 bytes docs/screenshots/dashboard.png | Bin 0 -> 376763 bytes docs/screenshots/limit-ladder.png | Bin 0 -> 429414 bytes docs/screenshots/monitor.png | Bin 0 -> 227274 bytes docs/screenshots/screener.png | Bin 0 -> 273701 bytes docs/strategy-builder-step1.md | 205 ++ docs/strategy-builder-step2.md | 34 + docs/strategy-example.md | 153 + docs/strategy-guide.md | 347 ++ frontend/.gitignore | 5 + frontend/index.html | 19 + frontend/package-lock.json | 3041 +++++++++++++++++ frontend/package.json | 42 + frontend/pnpm-lock.yaml | 1917 +++++++++++ frontend/postcss.config.js | 6 + frontend/public/favicon.svg | 12 + frontend/src/components/AccessGuard.tsx | 46 + frontend/src/components/AdminGuard.tsx | 33 + frontend/src/components/AlertToast.tsx | 176 + frontend/src/components/CandlestickChart.tsx | 154 + frontend/src/components/ColumnCustomizer.tsx | 24 + frontend/src/components/DatePicker.tsx | 235 ++ .../src/components/EChartsCandlestick.tsx | 1114 ++++++ frontend/src/components/EChartsIntraday.tsx | 613 ++++ frontend/src/components/EmptyState.tsx | 20 + .../src/components/EndpointTestDialog.tsx | 263 ++ .../src/components/ExtDimensionAnalysis.tsx | 436 +++ frontend/src/components/Layout.tsx | 539 +++ .../src/components/ListColumnCustomizer.tsx | 757 ++++ frontend/src/components/Logo.tsx | 59 + frontend/src/components/PageHeader.tsx | 28 + frontend/src/components/SealedBadge.tsx | 143 + frontend/src/components/StockDailyKChart.tsx | 236 ++ frontend/src/components/StockInfoBar.tsx | 278 ++ .../src/components/StockIntradayChart.tsx | 120 + frontend/src/components/StockPanel.tsx | 166 + .../src/components/StockPreviewDialog.tsx | 279 ++ frontend/src/components/ThemeProvider.tsx | 78 + frontend/src/components/Toast.tsx | 49 + frontend/src/components/analysis-shared.tsx | 451 +++ .../src/components/data/ActiveJobCard.tsx | 135 + .../src/components/data/DepthConfigCard.tsx | 143 + .../components/data/EnrichedRebuildPanel.tsx | 111 + .../components/data/ExtendHistoryPanel.tsx | 98 + .../src/components/data/MinuteSyncConfig.tsx | 219 ++ .../src/components/data/QuoteConfigCard.tsx | 165 + .../src/components/data/ScheduleEditor.tsx | 43 + frontend/src/components/data/SchemaModal.tsx | 102 + frontend/src/components/data/SectionTitle.tsx | 61 + .../src/components/data/SettingsModal.tsx | 27 + frontend/src/components/data/Skeleton.tsx | 7 + frontend/src/components/data/StatCard.tsx | 316 ++ .../components/ext-data/CreateExtDialog.tsx | 383 +++ .../src/components/ext-data/EditExtDialog.tsx | 252 ++ .../components/ext-data/ExtDataApiPanel.tsx | 79 + .../components/ext-data/ExtDataPullPanel.tsx | 212 ++ .../components/ext-data/ExtDataStatCard.tsx | 315 ++ .../financials/StockFinancialDetail.tsx | 252 ++ .../financials/StockFinancialSearch.tsx | 128 + .../src/components/monitor/RuleEditor.tsx | 365 ++ .../components/screener/ScreenerFilter.tsx | 162 + .../src/components/screener/ScreenerTable.tsx | 320 ++ .../src/components/screener/SignalPicker.tsx | 86 + .../screener/StrategyBuilderDialog.tsx | 513 +++ .../src/components/screener/StrategyCard.tsx | 223 ++ .../screener/StrategyPoolDialog.tsx | 240 ++ .../screener/StrategySettingsDialog.tsx | 609 ++++ .../screener/StrategyStoreDialog.tsx | 87 + .../components/signals/CustomSignalDialog.tsx | 190 + .../signals/SignalTriggerActions.tsx | 56 + .../stock-table/MiniCandlestick.tsx | 81 + .../components/stock-table/StockDataTable.tsx | 120 + .../src/components/stock-table/primitives.tsx | 163 + .../components/stock-table/useTableSort.ts | 50 + frontend/src/index.css | 79 + frontend/src/lib/analysis-adapter.ts | 341 ++ frontend/src/lib/api.ts | 1527 +++++++++ frontend/src/lib/backtestTask.ts | 227 ++ frontend/src/lib/board.ts | 25 + frontend/src/lib/capability-labels.tsx | 106 + frontend/src/lib/chartTheme.ts | 68 + frontend/src/lib/cn.ts | 6 + frontend/src/lib/colors.ts | 31 + frontend/src/lib/format.ts | 81 + frontend/src/lib/list-columns.ts | 199 ++ frontend/src/lib/monitorBadge.ts | 116 + frontend/src/lib/notificationSound.ts | 154 + frontend/src/lib/queryKeys.ts | 84 + frontend/src/lib/screener-columns.ts | 128 + frontend/src/lib/signals.ts | 170 + frontend/src/lib/stock-info-fields.ts | 82 + frontend/src/lib/stock-table.ts | 108 + frontend/src/lib/storage.ts | 113 + frontend/src/lib/useFinancials.ts | 72 + frontend/src/lib/useQueryConfig.ts | 40 + frontend/src/lib/useQuoteStream.ts | 131 + frontend/src/lib/useSharedMutations.ts | 42 + frontend/src/lib/useSharedQueries.ts | 71 + frontend/src/lib/useStrategyPool.ts | 36 + frontend/src/lib/watchlist-columns.ts | 166 + frontend/src/main.tsx | 26 + frontend/src/pages/AdminUuids.tsx | 228 ++ frontend/src/pages/Analysis.tsx | 291 ++ frontend/src/pages/AnalysisDetail.tsx | 7 + frontend/src/pages/Backtest.tsx | 63 + frontend/src/pages/Branding.tsx | 203 ++ frontend/src/pages/ConceptAnalysis.tsx | 761 +++++ frontend/src/pages/Dashboard.tsx | 714 ++++ frontend/src/pages/Data.tsx | 977 ++++++ frontend/src/pages/Dev.tsx | 357 ++ frontend/src/pages/Financials.tsx | 273 ++ frontend/src/pages/Indices.tsx | 350 ++ frontend/src/pages/IndustryAnalysis.tsx | 822 +++++ frontend/src/pages/LimitUpLadder.tsx | 1380 ++++++++ frontend/src/pages/Monitor.tsx | 698 ++++ frontend/src/pages/Onboarding.tsx | 545 +++ frontend/src/pages/Screener.tsx | 869 +++++ frontend/src/pages/Settings.tsx | 84 + frontend/src/pages/StockAnalysis.tsx | 10 + frontend/src/pages/Trading.tsx | 82 + frontend/src/pages/Verify.tsx | 165 + frontend/src/pages/Watchlist.tsx | 1100 ++++++ .../src/pages/backtest/FactorBacktest.tsx | 447 +++ .../src/pages/backtest/StrategyBacktest.tsx | 2188 ++++++++++++ .../backtest/charts/FactorGroupNavChart.tsx | 126 + .../pages/backtest/charts/FactorICChart.tsx | 90 + .../charts/ReturnDistributionChart.tsx | 65 + .../backtest/charts/StrategyNavChart.tsx | 211 ++ .../src/pages/backtest/charts/useECharts.ts | 37 + .../backtest/components/TradeKlineModal.tsx | 170 + frontend/src/pages/settings/AI.tsx | 197 ++ frontend/src/pages/settings/CustomSignals.tsx | 276 ++ frontend/src/pages/settings/ExtPages.tsx | 291 ++ frontend/src/pages/settings/Keys.tsx | 435 +++ frontend/src/pages/settings/MenuSettings.tsx | 310 ++ frontend/src/pages/settings/Monitoring.tsx | 383 +++ frontend/src/pages/settings/System.tsx | 309 ++ frontend/src/router.tsx | 72 + frontend/src/vite-env.d.ts | 6 + frontend/tailwind.config.ts | 44 + frontend/tsconfig.json | 30 + frontend/tsconfig.node.json | 14 + frontend/vite.config.d.ts | 2 + frontend/vite.config.js | 36 + frontend/vite.config.ts | 37 + scripts/bump_version.py | 94 + tiers.yaml | 72 + 248 files changed, 65020 insertions(+), 316 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 Dockerfile create mode 100644 VERSION create mode 100644 backend/app/__init__.py create mode 100644 backend/app/api/__init__.py create mode 100644 backend/app/api/alerts.py create mode 100644 backend/app/api/analysis.py create mode 100644 backend/app/api/auth.py create mode 100644 backend/app/api/backtest.py create mode 100644 backend/app/api/data.py create mode 100644 backend/app/api/ext_data.py create mode 100644 backend/app/api/financials.py create mode 100644 backend/app/api/indices.py create mode 100644 backend/app/api/intraday.py create mode 100644 backend/app/api/kline.py create mode 100644 backend/app/api/monitor_rules.py create mode 100644 backend/app/api/overview.py create mode 100644 backend/app/api/pipeline.py create mode 100644 backend/app/api/routes.py create mode 100644 backend/app/api/screener.py create mode 100644 backend/app/api/settings.py create mode 100644 backend/app/api/signals.py create mode 100644 backend/app/api/strategy.py create mode 100644 backend/app/api/watchlist.py create mode 100644 backend/app/auth.py create mode 100644 backend/app/backtest/__init__.py create mode 100644 backend/app/backtest/engine.py create mode 100644 backend/app/backtest/factor.py create mode 100644 backend/app/backtest/strategy.py create mode 100644 backend/app/config.py create mode 100644 backend/app/indicators/__init__.py create mode 100644 backend/app/indicators/pipeline.py create mode 100644 backend/app/jobs/__init__.py create mode 100644 backend/app/jobs/daily_pipeline.py create mode 100644 backend/app/main.py create mode 100644 backend/app/secrets_store.py create mode 100644 backend/app/services/__init__.py create mode 100644 backend/app/services/alert_store.py create mode 100644 backend/app/services/backtest.py create mode 100644 backend/app/services/depth_service.py create mode 100644 backend/app/services/ext_data.py create mode 100644 backend/app/services/ext_pull.py create mode 100644 backend/app/services/extend_history.py create mode 100644 backend/app/services/financial_sync.py create mode 100644 backend/app/services/index_sync.py create mode 100644 backend/app/services/instrument_sync.py create mode 100644 backend/app/services/kline_sync.py create mode 100644 backend/app/services/notify_adapter.py create mode 100644 backend/app/services/pipeline_jobs.py create mode 100644 backend/app/services/preferences.py create mode 100644 backend/app/services/quote_service.py create mode 100644 backend/app/services/screener.py create mode 100644 backend/app/services/strategy_cache.py create mode 100644 backend/app/services/watchlist.py create mode 100644 backend/app/strategy/__init__.py create mode 100644 backend/app/strategy/ai_generator.py create mode 100644 backend/app/strategy/builtin/__init__.py create mode 100644 backend/app/strategy/builtin/boll_breakout.py create mode 100644 backend/app/strategy/builtin/broken_board_recovery.py create mode 100644 backend/app/strategy/builtin/bullish_alignment.py create mode 100644 backend/app/strategy/builtin/consecutive_limit_ups.py create mode 100644 backend/app/strategy/builtin/high_turnover_surge.py create mode 100644 backend/app/strategy/builtin/limit_up_momentum.py create mode 100644 backend/app/strategy/builtin/low_volatility_leader.py create mode 100644 backend/app/strategy/builtin/ma_golden_cross.py create mode 100644 backend/app/strategy/builtin/macd_golden.py create mode 100644 backend/app/strategy/builtin/n_day_low_reversal.py create mode 100644 backend/app/strategy/builtin/near_limit_up.py create mode 100644 backend/app/strategy/builtin/oversold_bounce.py create mode 100644 backend/app/strategy/builtin/oversold_reversal.py create mode 100644 backend/app/strategy/builtin/pullback_ma20_bounce.py create mode 100644 backend/app/strategy/builtin/pullback_to_support.py create mode 100644 backend/app/strategy/builtin/strong_open.py create mode 100644 backend/app/strategy/builtin/trend_breakout.py create mode 100644 backend/app/strategy/builtin/volume_price_surge.py create mode 100644 backend/app/strategy/config.py create mode 100644 backend/app/strategy/custom_signals.py create mode 100644 backend/app/strategy/engine.py create mode 100644 backend/app/strategy/monitor.py create mode 100644 backend/app/strategy/monitor_rules.py create mode 100644 backend/app/strategy/prompt_builder.py create mode 100644 backend/app/tickflow/__init__.py create mode 100644 backend/app/tickflow/capabilities.py create mode 100644 backend/app/tickflow/client.py create mode 100644 backend/app/tickflow/policy.py create mode 100644 backend/app/tickflow/pools.py create mode 100644 backend/app/tickflow/repository.py create mode 100644 backend/app/tickflow/scheduler.py create mode 100644 backend/app/uuid_store.py create mode 100644 backend/pyproject.toml create mode 100644 backend/scripts/__init__.py create mode 100644 backend/scripts/cleanup_halt_days.py create mode 100644 backend/tests/backtest/test_engine_portfolio.py create mode 100644 backend/tests/backtest/test_full_simulation_tail.py create mode 100644 backend/tests/backtest/test_strategy_backtest_correctness.py create mode 100644 backend/uv.lock create mode 100644 docker-compose.yml create mode 100644 docs/screenshots/backtest.png create mode 100644 docs/screenshots/concept-analysis.png create mode 100644 docs/screenshots/dashboard.png create mode 100644 docs/screenshots/limit-ladder.png create mode 100644 docs/screenshots/monitor.png create mode 100644 docs/screenshots/screener.png create mode 100644 docs/strategy-builder-step1.md create mode 100644 docs/strategy-builder-step2.md create mode 100644 docs/strategy-example.md create mode 100644 docs/strategy-guide.md create mode 100644 frontend/.gitignore create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/pnpm-lock.yaml create mode 100644 frontend/postcss.config.js create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/src/components/AccessGuard.tsx create mode 100644 frontend/src/components/AdminGuard.tsx create mode 100644 frontend/src/components/AlertToast.tsx create mode 100644 frontend/src/components/CandlestickChart.tsx create mode 100644 frontend/src/components/ColumnCustomizer.tsx create mode 100644 frontend/src/components/DatePicker.tsx create mode 100644 frontend/src/components/EChartsCandlestick.tsx create mode 100644 frontend/src/components/EChartsIntraday.tsx create mode 100644 frontend/src/components/EmptyState.tsx create mode 100644 frontend/src/components/EndpointTestDialog.tsx create mode 100644 frontend/src/components/ExtDimensionAnalysis.tsx create mode 100644 frontend/src/components/Layout.tsx create mode 100644 frontend/src/components/ListColumnCustomizer.tsx create mode 100644 frontend/src/components/Logo.tsx create mode 100644 frontend/src/components/PageHeader.tsx create mode 100644 frontend/src/components/SealedBadge.tsx create mode 100644 frontend/src/components/StockDailyKChart.tsx create mode 100644 frontend/src/components/StockInfoBar.tsx create mode 100644 frontend/src/components/StockIntradayChart.tsx create mode 100644 frontend/src/components/StockPanel.tsx create mode 100644 frontend/src/components/StockPreviewDialog.tsx create mode 100644 frontend/src/components/ThemeProvider.tsx create mode 100644 frontend/src/components/Toast.tsx create mode 100644 frontend/src/components/analysis-shared.tsx create mode 100644 frontend/src/components/data/ActiveJobCard.tsx create mode 100644 frontend/src/components/data/DepthConfigCard.tsx create mode 100644 frontend/src/components/data/EnrichedRebuildPanel.tsx create mode 100644 frontend/src/components/data/ExtendHistoryPanel.tsx create mode 100644 frontend/src/components/data/MinuteSyncConfig.tsx create mode 100644 frontend/src/components/data/QuoteConfigCard.tsx create mode 100644 frontend/src/components/data/ScheduleEditor.tsx create mode 100644 frontend/src/components/data/SchemaModal.tsx create mode 100644 frontend/src/components/data/SectionTitle.tsx create mode 100644 frontend/src/components/data/SettingsModal.tsx create mode 100644 frontend/src/components/data/Skeleton.tsx create mode 100644 frontend/src/components/data/StatCard.tsx create mode 100644 frontend/src/components/ext-data/CreateExtDialog.tsx create mode 100644 frontend/src/components/ext-data/EditExtDialog.tsx create mode 100644 frontend/src/components/ext-data/ExtDataApiPanel.tsx create mode 100644 frontend/src/components/ext-data/ExtDataPullPanel.tsx create mode 100644 frontend/src/components/ext-data/ExtDataStatCard.tsx create mode 100644 frontend/src/components/financials/StockFinancialDetail.tsx create mode 100644 frontend/src/components/financials/StockFinancialSearch.tsx create mode 100644 frontend/src/components/monitor/RuleEditor.tsx create mode 100644 frontend/src/components/screener/ScreenerFilter.tsx create mode 100644 frontend/src/components/screener/ScreenerTable.tsx create mode 100644 frontend/src/components/screener/SignalPicker.tsx create mode 100644 frontend/src/components/screener/StrategyBuilderDialog.tsx create mode 100644 frontend/src/components/screener/StrategyCard.tsx create mode 100644 frontend/src/components/screener/StrategyPoolDialog.tsx create mode 100644 frontend/src/components/screener/StrategySettingsDialog.tsx create mode 100644 frontend/src/components/screener/StrategyStoreDialog.tsx create mode 100644 frontend/src/components/signals/CustomSignalDialog.tsx create mode 100644 frontend/src/components/signals/SignalTriggerActions.tsx create mode 100644 frontend/src/components/stock-table/MiniCandlestick.tsx create mode 100644 frontend/src/components/stock-table/StockDataTable.tsx create mode 100644 frontend/src/components/stock-table/primitives.tsx create mode 100644 frontend/src/components/stock-table/useTableSort.ts create mode 100644 frontend/src/index.css create mode 100644 frontend/src/lib/analysis-adapter.ts create mode 100644 frontend/src/lib/api.ts create mode 100644 frontend/src/lib/backtestTask.ts create mode 100644 frontend/src/lib/board.ts create mode 100644 frontend/src/lib/capability-labels.tsx create mode 100644 frontend/src/lib/chartTheme.ts create mode 100644 frontend/src/lib/cn.ts create mode 100644 frontend/src/lib/colors.ts create mode 100644 frontend/src/lib/format.ts create mode 100644 frontend/src/lib/list-columns.ts create mode 100644 frontend/src/lib/monitorBadge.ts create mode 100644 frontend/src/lib/notificationSound.ts create mode 100644 frontend/src/lib/queryKeys.ts create mode 100644 frontend/src/lib/screener-columns.ts create mode 100644 frontend/src/lib/signals.ts create mode 100644 frontend/src/lib/stock-info-fields.ts create mode 100644 frontend/src/lib/stock-table.ts create mode 100644 frontend/src/lib/storage.ts create mode 100644 frontend/src/lib/useFinancials.ts create mode 100644 frontend/src/lib/useQueryConfig.ts create mode 100644 frontend/src/lib/useQuoteStream.ts create mode 100644 frontend/src/lib/useSharedMutations.ts create mode 100644 frontend/src/lib/useSharedQueries.ts create mode 100644 frontend/src/lib/useStrategyPool.ts create mode 100644 frontend/src/lib/watchlist-columns.ts create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/pages/AdminUuids.tsx create mode 100644 frontend/src/pages/Analysis.tsx create mode 100644 frontend/src/pages/AnalysisDetail.tsx create mode 100644 frontend/src/pages/Backtest.tsx create mode 100644 frontend/src/pages/Branding.tsx create mode 100644 frontend/src/pages/ConceptAnalysis.tsx create mode 100644 frontend/src/pages/Dashboard.tsx create mode 100644 frontend/src/pages/Data.tsx create mode 100644 frontend/src/pages/Dev.tsx create mode 100644 frontend/src/pages/Financials.tsx create mode 100644 frontend/src/pages/Indices.tsx create mode 100644 frontend/src/pages/IndustryAnalysis.tsx create mode 100644 frontend/src/pages/LimitUpLadder.tsx create mode 100644 frontend/src/pages/Monitor.tsx create mode 100644 frontend/src/pages/Onboarding.tsx create mode 100644 frontend/src/pages/Screener.tsx create mode 100644 frontend/src/pages/Settings.tsx create mode 100644 frontend/src/pages/StockAnalysis.tsx create mode 100644 frontend/src/pages/Trading.tsx create mode 100644 frontend/src/pages/Verify.tsx create mode 100644 frontend/src/pages/Watchlist.tsx create mode 100644 frontend/src/pages/backtest/FactorBacktest.tsx create mode 100644 frontend/src/pages/backtest/StrategyBacktest.tsx create mode 100644 frontend/src/pages/backtest/charts/FactorGroupNavChart.tsx create mode 100644 frontend/src/pages/backtest/charts/FactorICChart.tsx create mode 100644 frontend/src/pages/backtest/charts/ReturnDistributionChart.tsx create mode 100644 frontend/src/pages/backtest/charts/StrategyNavChart.tsx create mode 100644 frontend/src/pages/backtest/charts/useECharts.ts create mode 100644 frontend/src/pages/backtest/components/TradeKlineModal.tsx create mode 100644 frontend/src/pages/settings/AI.tsx create mode 100644 frontend/src/pages/settings/CustomSignals.tsx create mode 100644 frontend/src/pages/settings/ExtPages.tsx create mode 100644 frontend/src/pages/settings/Keys.tsx create mode 100644 frontend/src/pages/settings/MenuSettings.tsx create mode 100644 frontend/src/pages/settings/Monitoring.tsx create mode 100644 frontend/src/pages/settings/System.tsx create mode 100644 frontend/src/router.tsx create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tailwind.config.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.d.ts create mode 100644 frontend/vite.config.js create mode 100644 frontend/vite.config.ts create mode 100644 scripts/bump_version.py create mode 100644 tiers.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..53a9d46 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,28 @@ +# Dependencies +frontend/node_modules +backend/.venv +**/__pycache__ + +# Build outputs +frontend/dist +dist +build + +# Git +.git +.gitignore + +# IDE +.vscode +.idea + +# OS +.DS_Store + +# Logs +*.log + +# Local env files +.env +.env.* +!.env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..05f0773 --- /dev/null +++ b/.env.example @@ -0,0 +1,30 @@ +# 注意:当前项目已改为硬编码配置(backend/app/config.py),Docker 启动不再需要 .env。 +# 此文件仅保留作为本地开发/调试时的备用参考。 + +# ===== 数据源 API Key ===== +# 留空或不填则启用 Free 试用模式,仅能拿历史日 K 单股数据 +TICKFLOW_API_KEY= + +# ===== AI(可选,留空跳过 AI 功能) ===== +AI_PROVIDER=openai_compat # openai_compat | ollama +AI_BASE_URL=https://api.deepseek.com/v1 +AI_API_KEY= +AI_MODEL=deepseek-chat +AI_DAILY_TOKEN_BUDGET=500000 + +# ===== Server ===== +HOST=0.0.0.0 +PORT=3018 +LOG_LEVEL=INFO + +# ===== Data ===== +DATA_DIR=./data + +# ===== Docker 基础镜像源(可选) ===== +# 国内网络拉取 Docker Hub 超时时,可取消注释并替换为可用镜像站。 +# 常见镜像站:阿里云 registry.cn-hangzhou.aliyuncs.com +# DaoCloud m.daocloud.io/docker.io +# 中科大 docker.mirrors.ustc.edu.cn +# 网易 hub-mirror.c.163.com +# PYTHON_IMAGE=registry.cn-hangzhou.aliyuncs.com/library/python:3.11-slim +# NODE_IMAGE=registry.cn-hangzhou.aliyuncs.com/library/node:20-alpine diff --git a/.gitignore b/.gitignore index 76c2f46..2eac81b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,342 +1,91 @@ -# ---> Python -# Byte-compiled / optimized / DLL files +# ===== Python ===== __pycache__/ *.py[cod] *$py.class - -# C extensions *.so - -# Distribution / packaging .Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# UV -# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -#uv.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/latest/usage/project/#working-with-version-control -.pdm.toml -.pdm-python -.pdm-build/ - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ +.venv/ venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy +env/ +.python-version +.pytest_cache/ .mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ - -# Ruff stuff: .ruff_cache/ +.coverage +htmlcov/ +dist/ +build/ +*.egg-info/ -# PyPI configuration file -.pypirc +# ===== uv ===== +.uv/ -# ---> macOS -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -# ---> Node -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories +# ===== Node / pnpm ===== node_modules/ -jspm_packages/ +.pnpm-store/ +.pnpm-debug.log* +.npm/ +*.log -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ +# ===== Vite ===== +frontend/dist/ +frontend/.vite/ +backend/static/ +backend/app/static/ -# TypeScript cache -*.tsbuildinfo +# ===== IDE ===== +.idea/ +.vscode/ +*.swp +*.swo +.DS_Store -# Optional npm cache directory -.npm +# ===== Project data (Parquet/DuckDB) ===== +backend/data/** +!backend/data/.gitkeep +data/** +!data/.gitkeep +# 扩展数据: 全部纳入版本控制(含 config.json 表结构 + part.parquet 数据文件) +# 注意 gitignore 否定规则特性: 需先放行目录才能放行内部文件 +!data/ext_data/ +!data/ext_data/** -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files +# ===== Secrets ===== .env -.env.development.local -.env.test.local -.env.production.local .env.local +.env.*.local +backend/.env -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache +# ===== User-derived prompts ===== +backend/user_prompts/ -# Next.js build output -.next -out +# ===== Browser automation ===== +.playwright-mcp/ -# Nuxt.js build / generate output -.nuxt -dist +# ===== AI IDE ===== +.trae/ -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public +# ===== TypeScript build cache ===== +frontend/tsconfig*.tsbuildinfo -# vuepress build output -.vuepress/dist +# ===== Data files ===== +*.xlsx -# vuepress v2.x temp and cache directory -.temp -.cache +# ===== Private deploy / 服务器私有信息(不开源) ===== +DEPLOY.md +deploy.sh -# vitepress build output -**/.vitepress/dist +# ===== 内部设计文档(不开源) ===== +DESIGN.md +DESIGN-proposal.md +CLAUDE.md -# vitepress cache directory -**/.vitepress/cache +# ===== 私人脚本(不开源) ===== +docs/zhihu/ -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* +# ===== 用户自定义策略(私有,不开源) ===== +data/strategies/custom/ +# ===== 临时 / 调试产物 ===== +backend._recheck*.py +backend/_verify*.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3927899 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,76 @@ +# 两阶段构建:前端 dist 拷进后端镜像,单容器运行 +# 可选:构建网络无法直连官方源时: +# 1. 传入 --build-arg USE_CN_MIRROR=1 启用国内 npm/pypi 镜像 +# 2. 传入 --build-arg PYTHON_IMAGE/NODE_IMAGE 使用 Docker Hub 国内镜像站 +ARG USE_CN_MIRROR=1 +ARG NPM_REGISTRY=https://registry.npmmirror.com +ARG PYPI_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple +ARG PYTHON_IMAGE=python:3.11-slim +ARG NODE_IMAGE=node:20-alpine + +# === Stage 1: 前端构建 === +FROM ${NODE_IMAGE} AS frontend-builder +ARG USE_CN_MIRROR=1 +ARG NPM_REGISTRY=https://registry.npmmirror.com +WORKDIR /build +# 关键:corepack 不读 npm 的 registry 配置,且跨 RUN 不保留环境变量, +# 因此国内网络下最稳的做法是直接用 npm 安装 pnpm(npm 会读取 .npmrc 镜像源), +# 彻底绕开 corepack 再次联网下载 pnpm 的问题。 +RUN if [ "$USE_CN_MIRROR" = "1" ]; then npm config set registry "$NPM_REGISTRY"; fi && \ + npm install -g pnpm@9 +# 让 pnpm 走镜像源安装依赖 +RUN if [ "$USE_CN_MIRROR" = "1" ]; then pnpm config set registry "$NPM_REGISTRY"; fi +COPY frontend/package.json frontend/pnpm-lock.yaml* ./ +RUN pnpm install --frozen-lockfile || pnpm install +COPY frontend/ ./ +RUN pnpm build + +# === Stage 2: Python 运行时 === +FROM ${PYTHON_IMAGE} AS runtime +ARG USE_CN_MIRROR=1 +ARG PYPI_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple +WORKDIR /app + +# 安装 uv(快) +RUN if [ "$USE_CN_MIRROR" = "1" ]; then \ + pip install --no-cache-dir uv -i "$PYPI_INDEX"; \ + else \ + pip install --no-cache-dir uv; \ + fi + +# Backend deps +COPY README.md /README.md +COPY backend/pyproject.toml backend/uv.lock* ./ +RUN if [ "$USE_CN_MIRROR" = "1" ]; then export UV_DEFAULT_INDEX="$PYPI_INDEX"; fi; \ + uv sync --frozen --no-dev || uv sync --no-dev + +# Backend code +# 注意:Docker 里 WORKDIR=/app, 而 config.py 的 _PROJECT_ROOT 是按开发布局 +# (/backend/app/) 推导的, 容器内会错算到 /。这里用环境变量显式指定 +# 三个关键路径, 确保 static / tiers / data 都指向容器内正确位置。 +COPY backend/app ./app +COPY tiers.yaml /app/tiers.yaml +ENV STATIC_DIR=/app/static \ + TIERS_YAML=/app/tiers.yaml \ + DATA_DIR=/app/data + +# Frontend 静态产物 +COPY --from=frontend-builder /build/dist ./static + +ENV PYTHONPATH=/app +EXPOSE 3018 +CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "3018"] + +# === Stage 3: 测试镜像 === +# 基于 runtime 追加 dev + backtest 依赖,用于运行 pytest。 +# 生产镜像保持 --no-dev,此 stage 仅用于 CI/本地测试。 +FROM runtime AS test +ARG USE_CN_MIRROR=1 +ARG PYPI_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple + +RUN if [ "$USE_CN_MIRROR" = "1" ]; then export UV_DEFAULT_INDEX="$PYPI_INDEX"; fi; \ + uv sync --frozen --extra backtest --extra dev || uv sync --extra backtest --extra dev + +COPY backend/tests ./tests + +CMD ["uv", "run", "pytest", "tests"] diff --git a/README.md b/README.md index 3834520..cc565ec 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,297 @@ -# stock +
+# 📈 A股智能量化工作台 + +**自托管、零运维的 A 股「选股 + 监控 + 回测」量化工作台** + +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) +[![Python](https://img.shields.io/badge/Python-≥3.11-blue.svg)](https://www.python.org/) +[![React](https://img.shields.io/badge/React-18-61dafb.svg)](https://react.dev/) +[![Deploy: Docker](https://img.shields.io/badge/Deploy-Docker-2496ed.svg)](./Dockerfile) + +🚀 **开箱即用**(单容器 / Free 模式无需 Key) +能力驱动,适配 Free → Expert 全档位订阅 · 🔌 **自由接入第三方扩展数据**(例如 Tushare、自有量化项目数据) + +**[核心功能](#-核心功能)** · **[快速开始](#-快速开始)** · **[配置](#️-配置)** · **[路线图](#-路线图)** + +
+ +> **⚠️说明**:目前项目默认接入内置数据源。自有数据源需二次开发修改字段映射即可;后续需求人多的话可能会实现切换数据源功能。 + +--- + +## 🎯 项目定位 + +让任何**个人散户 / 量化爱好者**,**零运维**地拥有一套**与自己订阅档位严格匹配**的 A 股分析、选股、监控工作台。 +**任意接入第三方数据**(Tushare 等),页面可视化自定义配置扩展数据表。 + +**项目所需配置**: + +| 配置项 | 说明 | 是否必填 | +| :--- | :--- | :--- | +| **数据源 API Key** | 数据源凭证,留空启用 Free 模式(无需注册即可体验) | 可选 | +| **AI 大模型 API Key** | 用于 AI 生成策略、个股分析(开发中)、行情分析(开发中),任意 OpenAI 兼容接口,留空关闭 | 可选 | + + + + + + + + + + + + + + + + + + + + + + + + + + + +
看板 Dashboard策略 Screener
看板页面策略页
回测 Backtest监控中心 Monitor
回测页监控中心
连板梯队 Limit Ladder概念分析 Concept
连板梯队页概念分析
+ +> ### ⚠️ 🚧 项目持续优化,功能陆续开放,敬请期待。 + +> **明确不做**:不对标同花顺/通达信的全功能股票软件;不内置任何「AI 荐股 / 涨停预测」。 + +--- + +## ✨ 核心功能 + +### 🔍 选股引擎(Screener) + +**20 个内置策略** —— 每个策略是一个独立 Python 文件(`backend/app/strategy/builtin/`),基于 Polars 表达式实现: + +| 类型 | 代表策略 | +| :--- | :--- | +| 趋势 | 趋势突破 · 均线多头 · 缩量回踩 | +| 形态 | MA 金叉 · MACD 金叉放量 · 布林突破 | +| 量价 | 量价齐升 · 高换手强势 · 强势高开 | +| 涨停 | 连板股 · 断板反包 · 逼近涨停 · 涨停动量 | +| 反转 | 超跌反弹 · 超卖反转 · 新低反转 | +| 波动 | 低波动龙头 · 回踩 MA20 反弹 | + +- **自定义信号系统** —— 在 UI 上用 `字段 + 操作符 + 阈值` 组合(entry / exit / both),编译成 Polars 表达式热加载,**无需写代码**即可定义自己的买卖信号。 +- **策略商店** —— 内置策略 + 用户自定义策略统一管理,支持参数覆盖(`params` 暴露阈值)。 + +#### ➕ 添加自己的策略 + +除 20 个内置策略外,你可以用两种方式扩展: + +| 方式 | 说明 | 前提 | +| :--- | :--- | :--- | +| **🤖 AI 生成** | 用自然语言描述策略思路,LLM 读取 [strategy-guide.md](./docs/strategy-guide.md) 自动生成完整 Polars 策略文件(经 `ast` 安全校验,限定 `import polars as pl`)。生成后落入 `data/strategies/ai/`,即刻可用 | 需先在 [配置](#️-配置) 中填入 AI Key | +| **📝 代码自定义 / 策略迁移** | 参照 [策略开发指南](./docs/strategy-guide.md) 的文件结构模板,把你**已有的自有策略**改写为 Polars 文件放入 `data/strategies/custom/`(文件名/ID 建议 `custom_时间戳`),引擎自动发现加载——**轻松迁移你现成的量化项目策略**,无需从头重写 | 无 | +| **🎛️ 自定义信号配置** | 不写代码,在 UI 上用 `字段 + 操作符 + 阈值` 组合(entry / exit / both),编译成 Polars 表达式热加载,即可定义自己的买卖信号 | 无 | + +> 引擎按 `source` 标记来源:`builtin`(内置)/ `custom`(手写或迁移)/ `ai`(生成),三者统一进入策略商店管理。 + +### 📊 指标流水线(Indicators) + +原生 Polars 向量化计算,全 A 股一次扫表落盘为 enriched Parquet: + +| 分类 | 指标 | +| :--- | :--- | +| 均线系 | MA(5/10/20/30/60)· EMA(5/10/12/20/26/30/60) | +| 趋势系 | MACD(DIF/DEA/HIST)· 动量(5/10/20/30/60d)· 布林带(上/下轨) | +| 震荡系 | RSI(可配周期)· KDJ(K/D/J) | +| 波动系 | ATR(14)· 年化波动率(20d)· 振幅 | +| 量能系 | 量比(5d/10d)· 量均线 | +| 涨跌停 | 涨停信号 · 连板数 · 涨跌幅 · 涨跌额 | +| 原子信号 | MA 金叉/死叉 · MA20 突破/跌破 · MACD 金叉/死叉 · N 日新高/新低 · 布林突破 | +| 复权 | 基于除权因子自动计算前复权(`ex_factor` / `cum_factor`),回测与指标一致 | + +### 🧪 回测引擎(Backtest) + +基于 vectorbt(全项目**唯一**一处 pandas 出现地): + +- **三种回测模式**:个股 · 策略组合 · 自由信号组合 +- **真实约束**:T+1 · 手续费 · 滑点(基点) · 止损 · 最大持仓天数 +- **组合管理**:最大持仓数 · 最大敞口 · 等权 / 自定义仓位 +- **SSE 流式进度**:长任务实时推送进度,支持刷新 / 切页后**重连恢复**(相同参数任务只启动一次) +- **统计输出**:净值曲线 · 夏普 · 最大回撤 · 胜率 · 每笔交易明细 + +### 📡 监控中心(Monitor) + +**统一监控规则引擎** —— 一个页面管理所有类型的监控,实时推送 + 持久化触发记录: + +- **四类监控**:策略监控 · 个股信号监控(选信号即加) · 个股价格/涨跌监控 · 全市场异动监控 +- **灵活条件**:多条件 AND/OR 组合 + 冷却期去重(防刷屏) + 严重级别(info/warn/critical) +- **多入口配置**:监控中心页面新建规则 · 个股详情页「加监控」· 策略卡片一键开启 +- **实时 SSE 推送**:命中规则后右下角弹窗通知(可配声效) + 持久化到 `alerts.jsonl` +- **触发记录**:时间倒序展示,支持按来源过滤 · 单条删除 · 清空 · 点击查看个股日K +- **菜单未读徽标**:离开监控中心后有新触发,菜单显示未读数;进入页面后清零 + +### 🤖 AI 策略生成(可选) + +- **自然语言 → 策略代码**:用一句话描述策略思路,LLM 读取 `docs/strategy-guide.md` 生成完整 Polars 策略文件 +- **沙箱约束**:生成代码经 `ast` 校验、限定 `import polars as pl`,避免逐行循环,优先向量化表达 +- **可插拔**:留空 AI 配置即跳过整个模块,不影响核心功能 + +### 🧰 数据与扩展 + +- **多源数据**:日 K / 分钟 K / 指数 / 财务(利润 / 资产负债 / 现金流)/ 自选行情 +- **🔌 第三方数据接入(重点)** —— 内置数据源之外的数据也能用: + - 支持 **Tushare** 等第三方数据源,通过 **HTTP 定时拉取**自动入库 + - 支持 **CSV / Excel 上传** · **JSON 写入**,自动 schema 发现与符号归一 + - **页面可视化配置**扩展数据表,无需改代码 + - 可接入**你自己的量化项目数据**,统一并入 DuckDB 查询面,与内置数据同台分析 +- **盘后定时管道**:APScheduler 15:30 CST 自动拉日 K + 重算 enriched 表 + 跑监控 +- **令牌桶限流**:适配各档位 rpm / batch 上限,批量合并 + 增量拉取,同一份数据多面板复用 + +--- + +## 🚀 快速开始 + +本项目**仅通过 Docker 部署**,无论是本地体验还是服务器部署都使用同一套镜像。 + +### 前置依赖 + +- [Docker](https://docs.docker.com/get-docker/) +- Docker Compose(已随 Docker Desktop 自带,Linux 需单独安装) + +### 启动 + +```bash +cp .env.example .env # 按需填写 Key(留空即 Free 模式,可直接体验) +docker compose up --build +# 打开 http://localhost:3018 +``` + +### 运行测试 + +```bash +# 运行后端全部测试(含回测引擎) +docker compose run --rm test +``` + +> 测试镜像已包含回测依赖,可直接运行 `backend/tests` 下的全部 pytest 用例。 + +--- + +## 🧭 第一次使用 + +1. 打开面板 → **设置 → 凭据与能力** → 点 **重新检测**,确认 Tier Label +2. 点 **立即跑盘后管道** —— 拉日 K + 计算 enriched 表 + - **Free 用户**:只同步内置 DEMO_SYMBOLS(浦发 / 招商 / 茅台等 10 只) + - **Starter+**:同步全 A 或可获取的 instruments 列表 +3. **自选**页:添加跟踪标的;点代码进 **K 线**页看蜡烛图 + 买卖点 +4. **选股**页:点任一内置策略卡片即时扫描;或用自定义信号组合条件 +5. **回测**页:选策略 / 信号 + 时间区间 → 跑回测 → 看净值 / 夏普 / 交易明细(SSE 实时进度) +6. **监控中心**页:配置监控规则(策略/个股信号/价格/市场异动),盘中 SSE 实时弹窗通知 + 持久化触发记录;或在个股详情页点「加监控」快速添加 + +--- + +## ⚙️ 配置 + +所有配置通过项目根目录的 `.env` 文件读取(复制 `.env.example` 开始)。配置也可在面板 **设置** 页面内修改。 + +### 数据源 + +当前默认接入内置数据源提供的订阅制 A 股数据。**留空 `TICKFLOW_API_KEY` 即启用 Free 模式,无需注册即可体验**。 + +```ini +TICKFLOW_API_KEY= # 留空 = Free 模式;填入 Key = 按订阅档位解锁 +``` + +> 系统启动时会自动探测你的真实能力集,UI 显示「≈ Pro」等友好标签。 + +### AI(可选):策略生成 + +AI 模块用于「自然语言生成策略代码」。**所有配置留空即跳过 AI 功能,不影响核心使用**。支持任何 **OpenAI 兼容接口**: + +```ini +AI_PROVIDER=openai_compat # openai_compat | ollama +AI_BASE_URL=https://api.deepseek.com/v1 +AI_API_KEY= # 留空 = 关闭 AI +AI_MODEL=deepseek-chat +AI_DAILY_TOKEN_BUDGET=500000 # 每日 token 预算上限 +``` + +> 切换 `AI_PROVIDER=ollama` 时无需 `AI_API_KEY`,适合本地部署大模型。 + +### 服务与数据 + +```ini +HOST=0.0.0.0 # 监听地址 +PORT=3018 # 服务端口 +LOG_LEVEL=INFO # DEBUG | INFO | WARNING | ERROR +DATA_DIR=./data # Parquet / DuckDB 数据存储目录 +``` + +--- + +## 🏗️ 技术栈 + +| 层 | 选型 | +| :--- | :--- | +| **后端** | FastAPI · Pydantic v2 · APScheduler · sse-starlette | +| **数据** | Polars(计算)· DuckDB(查询)· Parquet(存储)· PyArrow | +| **回测** | vectorbt(全项目唯一 pandas 边界) | +| **数据源** | A 股数据源 SDK(`tickflow[all]`) | +| **AI**(可选) | OpenAI 兼容接口(DeepSeek / 通义 / Ollama 等) | +| **前端** | React 18 · Vite · TypeScript · Tailwind CSS · Framer Motion · Tanstack Query · Lightweight Charts · ECharts · dnd-kit | +| **部署** | Docker 两阶段构建,前端 dist 拷进后端镜像,**单容器** | + +--- + +## 🗺️ 路线图 + +| Phase | 内容 | 状态 | +| :--- | :--- | :--- | +| **0** | 仓库骨架 / FastAPI 壳 / Vite + React SPA / Docker 一键起 | ✅ | +| **1** | 能力探测 + Kline 同步 + K 线分析页 | ✅ | +| **2** | Polars enriched 流水线 + Screener + 信号扫描 | ✅ | +| **3** | vectorbt 回测 + T+1 + 手续费 + 止损 + max-hold | ✅ | +| **4** | 监控引擎 + 告警规则 + Webhook + APScheduler 盘后定时 | ✅ | +| **5** | 统一监控中心 + 四类监控规则 + 实时推送 + 持久化触发记录 + 声效通知 | ✅ | +| **v2** | Webhook 推送(QMT/掘金下单) · 板块异动 · 早晚报 · 更多扩展 | 🚧 | + +--- + +## 📚 文档 + +- [docs/strategy-guide.md](./docs/strategy-guide.md) —— 策略开发指南(AI 生成器与手写策略的规范) +- [docs/](./docs) —— 策略构建步骤、示例 + +--- + +## 🤝 贡献 + +欢迎 Issue 和 PR。请通过 Docker 进行本地验证: + +```bash +# 启动应用 +docker compose up --build -d + +# 运行测试 +docker compose run --rm test +``` + +新增内置策略:在 `backend/app/strategy/builtin/` 参照现有策略文件,实现 `StrategyDef` 即可被引擎自动发现。 + +--- + +## ⚠️ 免责声明 + +本项目仅供**学习与量化研究**,**不构成任何投资建议**。回测结果不代表未来收益。A 股有风险,入市需谨慎。数据准确性以数据源官方为准。 + +--- + +## 📄 License + +[MIT](./LICENSE) © stock-panel contributors + +## 社区 + +本开源项目已链接并认可 [LINUX DO 社区](https://linux.do)。 diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..0ec25f7 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +v1.0.0 diff --git a/backend/app/__init__.py b/backend/app/__init__.py new file mode 100644 index 0000000..65a8c44 --- /dev/null +++ b/backend/app/__init__.py @@ -0,0 +1,15 @@ +"""Stock Panel backend.""" + +import sys + +__version__ = "0.1.44" + +# Windows 默认 stdout/stderr 编码为 GBK(cp936),数据源 SDK 内部输出含 emoji 的 +# 指数/标的名称(如 \U0001f193)时会抛 UnicodeEncodeError,导致请求失败。 +# 进程加载最早阶段强制 UTF-8,根治此类编码崩溃。 +for _stream in (sys.stdout, sys.stderr): + if hasattr(_stream, "reconfigure"): + try: + _stream.reconfigure(encoding="utf-8", errors="replace") + except Exception: # noqa: BLE001 + pass diff --git a/backend/app/api/__init__.py b/backend/app/api/__init__.py new file mode 100644 index 0000000..8a5a42a --- /dev/null +++ b/backend/app/api/__init__.py @@ -0,0 +1 @@ +"""FastAPI 路由汇总。""" diff --git a/backend/app/api/alerts.py b/backend/app/api/alerts.py new file mode 100644 index 0000000..fe0e4d4 --- /dev/null +++ b/backend/app/api/alerts.py @@ -0,0 +1,144 @@ +"""告警触发记录 API — 查询/清空/生成演示数据 alerts.jsonl。""" +from __future__ import annotations + +import random +import time +from pathlib import Path + +from fastapi import APIRouter, HTTPException, Request + +from app.services import alert_store + +router = APIRouter(prefix="/api/alerts", tags=["alerts"]) + + +def _data_dir(request: Request) -> Path: + return request.app.state.repo.store.data_dir + + +@router.get("") +def list_alerts( + request: Request, + days: int = 7, + limit: int = 5000, + source: str | None = None, + type: str | None = None, +): + """查询触发记录 (时间倒序)。""" + events = alert_store.list_recent( + _data_dir(request), days=days, limit=limit, source=source, type=type, + ) + total = alert_store.count(_data_dir(request)) + return {"alerts": events, "total": total} + + +@router.delete("") +def clear_alerts(request: Request): + """清空全部触发记录。""" + n = alert_store.clear(_data_dir(request)) + return {"ok": True, "cleared": n} + + +@router.delete("/{ts}") +def delete_alert(ts: int, request: Request): + """删除单条触发记录 (按 ts 毫秒时间戳)。""" + deleted = alert_store.delete_one(_data_dir(request), ts) + if not deleted: + raise HTTPException(status_code=404, detail="记录不存在") + return {"ok": True} + + +# ── 演示数据生成 (仅 Dev 页用) ───────────────────────── + +_DEMO_STOCKS = [ + ("600519.SH", "贵州茅台"), ("000001.SZ", "平安银行"), ("300750.SZ", "宁德时代"), + ("002594.SZ", "比亚迪"), ("000858.SZ", "五粮液"), ("601318.SH", "中国平安"), + ("002475.SZ", "立讯精密"), ("600036.SH", "招商银行"), ("000725.SZ", "京东方A"), + ("300059.SZ", "东方财富"), +] +_DEMO_TEMPLATES = [ + ("signal", "MA金叉触发", ["signal_ma_golden_5_20"], "info"), + ("signal", "放量突破新高", ["signal_volume_surge", "signal_n_day_high"], "warn"), + ("signal", "MACD金叉", ["signal_macd_golden"], "info"), + ("signal", "跌破MA20", ["signal_ma20_breakdown"], "info"), + ("price", "涨幅超 5%", [], "warn"), + ("price", "RSI 极度超卖", [], "warn"), + ("price", "跌幅超 3%", [], "info"), + ("market", "涨停封板", ["signal_limit_up"], "critical"), + ("market", "连板异动", ["signal_limit_up"], "warn"), + ("market", "炸板", ["signal_broken_limit_up"], "warn"), + # 新策略变更格式 + ("strategy", "策略「趋势突破」进入 贵州茅台 +2.3%", ["signal_n_day_high", "signal_volume_surge"], "info"), + ("strategy", "策略「趋势突破」移出 五粮液 -1.5%", ["signal_ma20_breakdown"], "info"), + ("strategy", "策略「新低反转」进入 平安银行 +1.1%", ["signal_n_day_low"], "warn"), + ("strategy", "策略「MACD金叉」移出 比亚迪 -0.8%", ["signal_macd_golden"], "info"), + # 批量变更 + ("strategy", "策略「趋势突破」进入 6 只:平安银行、宁德时代、比亚迪、东方财富、招商银行、立讯精密", [], "info"), + ("strategy", "策略「MACD金叉」移出 7 只:京东方A、平安银行、五粮液、立讯精密、招商银行、东方财富、比亚迪", [], "warn"), +] + + +@router.post("/seed") +def seed_demo_alerts(request: Request, count: int = 12, recent: bool = True): + """生成演示触发记录 (Dev 页用)。 + + Args: + count: 生成条数 (1-50) + recent: True=时间戳设为"刚刚"(用于测试闪烁效果); False=分散在近3天 + """ + count = max(1, min(50, count)) + now_ms = int(time.time() * 1000) + events = [] + for i in range(count): + source, message, signals, severity = _DEMO_TEMPLATES[i % len(_DEMO_TEMPLATES)] + sym, name = _DEMO_STOCKS[i % len(_DEMO_STOCKS)] + # 策略类型按消息推导 type: new_entry / dropped, 否则沿用 source + if source == "strategy": + if "进入" in message: + ev_type = "new_entry" + elif "移出" in message: + ev_type = "dropped" + else: + ev_type = "strategy" + else: + ev_type = source + # recent 模式: 时间戳从现在往前每条错开 30 秒 (最新在前) + ts = now_ms - (i * 30000) if recent else now_ms - random.randint(60, 4320) * 60 * 1000 + events.append({ + "ts": ts, + "rule_id": f"demo_rule_{i}", + "rule_name": message, + "source": source, + "type": ev_type, + "symbol": "" if source == "strategy" and ("只:" in message) else sym, + "name": name, + "message": message, + "price": round(random.uniform(8, 1800), 2) if not (source == "strategy" and "只:" in message) else None, + "change_pct": round(random.uniform(-0.06, 0.098), 4) if not (source == "strategy" and "只:" in message) else None, + "signals": signals, + "severity": severity, + }) + alert_store.append_many(_data_dir(request), events) + + # 同步推入 SSE 队列, 让所有连着 SSE 的客户端实时收到 (不依赖轮询) + qs = getattr(request.app.state, "quote_service", None) + if qs: + # 转成 SSE 推送格式 (和 _evaluate_monitors 一致) + sse_alerts = [{ + "source": ev["source"], + "type": ev["type"], + "rule_id": ev.get("rule_id"), + "symbol": ev["symbol"], + "name": ev["name"], + "message": ev["message"], + "price": ev["price"], + "change_pct": ev["change_pct"], + "signals": ev["signals"], + "severity": ev.get("severity", "info"), + } for ev in events] + with qs._lock: + qs._pending_alerts.extend(sse_alerts) + qs._alert_event.set() + + return {"ok": True, "generated": len(events)} + diff --git a/backend/app/api/analysis.py b/backend/app/api/analysis.py new file mode 100644 index 0000000..18b572e --- /dev/null +++ b/backend/app/api/analysis.py @@ -0,0 +1,204 @@ +"""自定义分析菜单 API。""" +from __future__ import annotations + +import json +from datetime import datetime +from pathlib import Path +from typing import Literal + +from fastapi import APIRouter, HTTPException, Request +from pydantic import BaseModel, Field + +from app.services.ext_data import ExtConfigStore + +router = APIRouter(prefix="/api/analysis-menus", tags=["analysis-menus"]) + + +class AnalysisColumn(BaseModel): + field: str + label: str = "" + type: Literal["string", "number", "percent", "amount", "date"] = "string" + width: int | None = None + sortable: bool = False + precision: int | None = None + format: str | None = None + aggregate: Literal["count", "avg", "sum", "min", "max"] | None = None + visible: bool = True + + +class DefaultSort(BaseModel): + field: str + order: Literal["asc", "desc"] = "desc" + + +class AnalysisMenu(BaseModel): + id: str = Field(..., min_length=1, max_length=64, pattern=r"^[a-zA-Z0-9_]+$") + label: str = Field(..., min_length=1, max_length=64) + icon: str = "chart" + data_source: str = Field(..., min_length=1) + template: Literal["dimension_rank", "ranking", "table"] = "dimension_rank" + dimension_field: str | None = None + rank_field: str | None = None + group_columns: list[AnalysisColumn] = Field(default_factory=list) + detail_columns: list[AnalysisColumn] = Field(default_factory=list) + default_sort: DefaultSort | None = None + visible: bool = True + order: int = 0 + created_at: str | None = None + updated_at: str | None = None + builtin: bool = False + + +class UpsertAnalysisMenu(BaseModel): + label: str = Field(..., min_length=1, max_length=64) + icon: str = "chart" + data_source: str = Field(..., min_length=1) + template: Literal["dimension_rank", "ranking", "table"] = "dimension_rank" + dimension_field: str | None = None + rank_field: str | None = None + group_columns: list[AnalysisColumn] = Field(default_factory=list) + detail_columns: list[AnalysisColumn] = Field(default_factory=list) + default_sort: DefaultSort | None = None + visible: bool = True + order: int = 0 + + +class ReorderMenusReq(BaseModel): + ids: list[str] = Field(..., min_length=1) + + +def _data_dir(request: Request) -> Path: + return request.app.state.repo.store.data_dir + + +def _base_dir(request: Request) -> Path: + return _data_dir(request) / "analysis_menus" + + +def _path(request: Request, menu_id: str) -> Path: + return _base_dir(request) / f"{menu_id}.json" + + +def _load_saved(request: Request) -> list[AnalysisMenu]: + base = _base_dir(request) + if not base.exists(): + return [] + items: list[AnalysisMenu] = [] + for p in sorted(base.glob("*.json")): + try: + raw = json.loads(p.read_text(encoding="utf-8")) + items.append(AnalysisMenu(**raw)) + except Exception: + continue + return items + + +def _ordered(items: list[AnalysisMenu]) -> list[AnalysisMenu]: + return sorted(items, key=lambda m: (m.order, m.label, m.id)) + + +def _save(request: Request, menu: AnalysisMenu) -> AnalysisMenu: + now = datetime.now().isoformat() + if not menu.created_at: + menu.created_at = now + menu.updated_at = now + menu.builtin = False + base = _base_dir(request) + base.mkdir(parents=True, exist_ok=True) + _path(request, menu.id).write_text( + json.dumps(menu.model_dump(), ensure_ascii=False, indent=2), + encoding="utf-8", + ) + return menu + + +def _default_menus(request: Request) -> list[AnalysisMenu]: + ext_store = ExtConfigStore(_data_dir(request)) + menus: list[AnalysisMenu] = [] + for cfg in ext_store.load_all(): + fields = cfg.fields + concept = next((f for f in fields if "概念" in f.name or "概念" in f.label or "concept" in f.name.lower()), None) + if concept: + detail_names = ["股票简称", "股票代码", concept.name, "人气排名", "资金流向", "PE", "PB"] + detail_columns = [] + for name in detail_names: + f = next((x for x in fields if x.name == name), None) + if not f: + continue + is_num = f.dtype in ("int", "float") + detail_columns.append(AnalysisColumn( + field=f.name, + label=f.label or f.name, + type="number" if is_num else "string", + sortable=is_num, + precision=2 if f.dtype == "float" else None, + )) + menus.append(AnalysisMenu( + id="concept_analysis", + label="概念分析", + icon="tags", + data_source=cfg.id, + template="dimension_rank", + dimension_field=concept.name, + group_columns=[ + AnalysisColumn(field="__dimension", label="概念"), + AnalysisColumn(field="__count", label="股票数", type="number", sortable=True), + ], + detail_columns=detail_columns, + default_sort=DefaultSort(field="人气排名", order="asc") if any(c.field == "人气排名" for c in detail_columns) else None, + order=100, + builtin=True, + )) + break + return menus + + +@router.get("") +def list_menus(request: Request): + saved = _load_saved(request) + saved_ids = {m.id for m in saved} + defaults = [m for m in _default_menus(request) if m.id not in saved_ids] + return {"items": _ordered(saved + defaults)} + + +@router.get("/{menu_id}") +def get_menu(request: Request, menu_id: str): + for menu in _ordered(_load_saved(request) + _default_menus(request)): + if menu.id == menu_id: + return menu + raise HTTPException(404, f"分析菜单 '{menu_id}' 不存在") + + +@router.post("/reorder") +def reorder_menus(request: Request, body: ReorderMenusReq): + saved = {m.id: m for m in _load_saved(request)} + defaults = {m.id: m for m in _default_menus(request)} + for idx, menu_id in enumerate(body.ids): + menu = saved.get(menu_id) or defaults.get(menu_id) + if not menu: + continue + menu.order = idx + _save(request, menu) + return {"items": _ordered(_load_saved(request))} + + +@router.post("/{menu_id}") +def upsert_menu(request: Request, menu_id: str, body: UpsertAnalysisMenu): + if not menu_id.replace("_", "").isalnum(): + raise HTTPException(400, "菜单标识只能包含字母、数字和下划线") + existing = next((m for m in _load_saved(request) if m.id == menu_id), None) + menu = AnalysisMenu( + id=menu_id, + created_at=existing.created_at if existing else None, + **body.model_dump(), + ) + return _save(request, menu) + + +@router.delete("/{menu_id}") +def delete_menu(request: Request, menu_id: str): + p = _path(request, menu_id) + if not p.exists(): + raise HTTPException(404, f"分析菜单 '{menu_id}' 不存在或为默认菜单") + p.unlink() + return {"status": "deleted"} diff --git a/backend/app/api/auth.py b/backend/app/api/auth.py new file mode 100644 index 0000000..5060e15 --- /dev/null +++ b/backend/app/api/auth.py @@ -0,0 +1,80 @@ +"""访问门控 API 与管理接口。""" +from __future__ import annotations + +from fastapi import APIRouter, Request + +from app import auth +from app import uuid_store + +router = APIRouter(prefix="/api/auth", tags=["auth"]) +admin_router = APIRouter(prefix="/api/admin", tags=["admin"]) + + +@router.post("/verify") +def verify_credential(req: auth.VerifyIn) -> auth.VerifyOut: + """校验管理员令牌或普通 UUID,成功后返回访问令牌及角色。""" + role = auth.verify_credential(req.credential) + if role: + token = auth.create_access_token(role) + return auth.VerifyOut(valid=True, role=role.value, token=token) + return auth.VerifyOut(valid=False, role=None, token=None) + + +@router.get("/status") +def auth_status(request: Request) -> auth.AuthStatusOut: + """返回当前门控状态、当前请求是否通过校验及角色。""" + enabled = auth.access_control_enabled() + token = auth.get_access_token_from_request(request) + role = auth.validate_access_token(token) + return auth.AuthStatusOut( + enabled=enabled, + verified=role is not None, + role=role.value if role else None, + ) + + +# ===== 管理员 UUID 管理 ===== + +@admin_router.get("/uuids") +def list_uuids(request: Request) -> list[auth.UuidRecordOut]: + """列出所有动态 UUID(仅管理员)。""" + auth.require_admin(request) + records = uuid_store.list_uuids() + return [ + auth.UuidRecordOut( + uuid=r["uuid"], + label=r.get("label", ""), + enabled=r.get("enabled", True), + created_at=r.get("created_at", 0), + ) + for r in records + ] + + +@admin_router.post("/uuids") +def create_uuid(req: auth.UuidCreateIn, request: Request) -> auth.UuidRecordOut: + """创建新的访问 UUID(仅管理员)。""" + auth.require_admin(request) + record = uuid_store.create(req.label) + return auth.UuidRecordOut( + uuid=record["uuid"], + label=record["label"], + enabled=record["enabled"], + created_at=record["created_at"], + ) + + +@admin_router.delete("/uuids/{uuid}") +def delete_uuid(uuid: str, request: Request) -> dict: + """删除访问 UUID(仅管理员)。""" + auth.require_admin(request) + ok = uuid_store.delete(uuid) + return {"ok": ok} + + +@admin_router.put("/uuids/{uuid}/toggle") +def toggle_uuid(uuid: str, request: Request, enabled: bool) -> dict: + """启用/禁用访问 UUID(仅管理员)。""" + auth.require_admin(request) + ok = uuid_store.toggle(uuid, enabled) + return {"ok": ok} diff --git a/backend/app/api/backtest.py b/backend/app/api/backtest.py new file mode 100644 index 0000000..0fe0736 --- /dev/null +++ b/backend/app/api/backtest.py @@ -0,0 +1,474 @@ +"""回测 API — 信号回测 + 因子回测 + 策略回测。""" +from __future__ import annotations + +import asyncio +import json +import queue +import threading +from dataclasses import asdict +from datetime import date, timedelta +from typing import Literal + +from fastapi import APIRouter, HTTPException, Request +from fastapi.responses import StreamingResponse +from pydantic import BaseModel, Field + +from app.config import settings +from app.services.backtest import ( + BacktestConfig, + BacktestService, + VectorbtUnavailable, + is_available, +) + +router = APIRouter(prefix="/api/backtest", tags=["backtest"]) + +FACTOR_DEFAULT_DAYS = 180 +STRATEGY_DEFAULT_DAYS = 365 * 3 +BACKTEST_MAX_SERVER_DAYS = 186 +FACTOR_MAX_SYMBOLS = 1000 +BACKTEST_SERVER_GUARD_MESSAGE = ( + "当前服务器内存约 1.8GB,回测区间最多支持 6 个月;" + "更长周期容易触发 OOM,建议在 8GB 以上内存环境或本机运行。" +) + + +def _get_engine(request: Request): + """获取或创建 BacktestEngine (单例,PanelCache 跨请求生效)。""" + from app.backtest.engine import BacktestEngine + engine = getattr(request.app.state, "backtest_engine", None) + if engine is None: + engine = BacktestEngine(request.app.state.repo) + request.app.state.backtest_engine = engine + return engine + + +def _resolve_start(req: BaseModel, end: date, default_days: int) -> date: + """未传 start 使用默认区间;显式传 null/空值表示全部历史。""" + start = getattr(req, "start") + if start is not None: + return start + if "start" in req.model_fields_set: + return date(1900, 1, 1) + return end - timedelta(days=default_days) + + +def _guard_server_backtest_range(start: date, end: date): + if not settings.backtest_range_guard: + return + days = (end - start).days + 1 + if days > BACKTEST_MAX_SERVER_DAYS: + raise HTTPException(status_code=400, detail=BACKTEST_SERVER_GUARD_MESSAGE) + + +# ================================================================ +# 状态 +# ================================================================ + +@router.get("/status") +def status(): + """前端可用此接口判断回测页是否要灰显。""" + return {"available": True} + + +# ================================================================ +# 信号回测 (现有接口,保持不变) +# ================================================================ + +class BacktestRequest(BaseModel): + symbols: list[str] = Field(..., min_length=1) + start: date | None = None + end: date | None = None + entries: list[str] = [] + exits: list[str] = [] + stop_loss_pct: float | None = None + max_hold_days: int | None = None + fees_pct: float = 0.0002 + slippage_bps: float = 5 + matching: Literal["close_t", "open_t+1"] = "close_t" + + +@router.post("/run") +def run(req: BacktestRequest, request: Request): + """信号回测 — 现有接口,向后兼容。""" + repo = request.app.state.repo + svc = BacktestService(repo) + end = req.end or date.today() + start = req.start or (end - timedelta(days=365 * 3)) + + cfg = BacktestConfig( + symbols=req.symbols, + start=start, + end=end, + entries=req.entries, + exits=req.exits, + stop_loss_pct=req.stop_loss_pct, + max_hold_days=req.max_hold_days, + fees_pct=req.fees_pct, + slippage_bps=req.slippage_bps, + matching=req.matching, + ) + try: + result = svc.run(cfg) + except VectorbtUnavailable as e: + raise HTTPException(status_code=503, detail=str(e)) from e + return asdict(result) + + +# ================================================================ +# 因子回测 +# ================================================================ + +class FactorColumnsResponse(BaseModel): + columns: list[dict] + + +@router.get("/factor/columns") +def factor_columns(): + """返回可用的因子列列表。""" + from app.backtest.factor import FACTOR_COLUMNS + return {"columns": FACTOR_COLUMNS} + + +class FactorBacktestRequest(BaseModel): + factor_name: str + symbols: list[str] | None = None + start: date | None = None + end: date | None = None + n_groups: int = 5 + rebalance: Literal["daily", "weekly", "monthly"] = "monthly" + weight: Literal["equal", "factor_weight"] = "equal" + fees_pct: float = 0.0002 + slippage_bps: float = 5.0 + + +@router.post("/factor/run") +def factor_run(req: FactorBacktestRequest, request: Request): + """因子回测 — IC/IR 分析 + 分层回测。""" + from app.backtest.factor import FactorBacktestService, FactorConfig + + engine = _get_engine(request) + svc = FactorBacktestService(engine) + + end = req.end or date.today() + start = _resolve_start(req, end, STRATEGY_DEFAULT_DAYS) + _guard_server_backtest_range(start, end) + symbols = req.symbols if req.symbols else None + if symbols is not None and len(symbols) > FACTOR_MAX_SYMBOLS: + raise HTTPException( + status_code=400, + detail=f"指定标的最多支持 {FACTOR_MAX_SYMBOLS} 只,请缩小标的范围。", + ) + + cfg = FactorConfig( + factor_name=req.factor_name, + symbols=symbols, + start=start, + end=end, + n_groups=req.n_groups, + rebalance=req.rebalance, + weight=req.weight, + fees_pct=req.fees_pct, + slippage_bps=req.slippage_bps, + ) + result = svc.run(cfg) + return asdict(result) + + +# ================================================================ +# 策略回测 +# ================================================================ + +class StrategyBacktestRequest(BaseModel): + strategy_id: str + symbols: list[str] | None = None + start: date | None = None + end: date | None = None + params: dict | None = None + overrides: dict | None = None + # matching 向后兼容; 显式传 entry_fill/exit_fill 时以二者为准。 + matching: Literal["close_t", "open_t+1"] = "open_t+1" + entry_fill: Literal["close_t", "open_t+1"] | None = None + exit_fill: Literal["close_t", "open_t+1"] | None = None + fees_pct: float = 0.0002 + slippage_bps: float = 5.0 + max_positions: int = 10 + max_exposure_pct: float = 1.0 + initial_capital: float = 1_000_000.0 + position_sizing: Literal["equal", "score_weight"] = "equal" + mode: Literal["position", "full"] = "position" + holding_days: int = 5 + + +@router.post("/strategy/run") +def strategy_run(req: StrategyBacktestRequest, request: Request): + """策略回测 — 复用 StrategyDef 体系做全周期回测。""" + from app.backtest.strategy import StrategyBacktestService, StrategyBacktestConfig + + engine = _get_engine(request) + strategy_engine = request.app.state.strategy_engine + svc = StrategyBacktestService(engine, strategy_engine) + + end = req.end or date.today() + start = _resolve_start(req, end, FACTOR_DEFAULT_DAYS) + _guard_server_backtest_range(start, end) + + cfg = StrategyBacktestConfig( + strategy_id=req.strategy_id, + symbols=req.symbols if req.symbols else None, + start=start, + end=end, + params=req.params, + overrides=req.overrides, + matching=req.matching, + entry_fill=req.entry_fill, + exit_fill=req.exit_fill, + fees_pct=req.fees_pct, + slippage_bps=req.slippage_bps, + max_positions=req.max_positions, + max_exposure_pct=req.max_exposure_pct, + initial_capital=req.initial_capital, + position_sizing=req.position_sizing, + mode=req.mode, + holding_days=req.holding_days, + ) + result = svc.run(cfg) + return asdict(result) + + +# ── SSE 流式回测 (实时进度 + 可取消 + 支持重连) ─────────────────── + +import time +import hashlib + + +class _BacktestJob: + """单个回测任务的状态, 存模块级供重连使用。""" + __slots__ = ("key", "cancel_event", "progress", "result", "error", "done", "finish_ts") + + def __init__(self, key: str): + self.key = key + self.cancel_event = threading.Event() + self.progress: list[dict] = [] # 进度历史 (新连接可回放) + self.result = None # 完成后的结果 + self.error: str | None = None + self.done = False + self.finish_ts: float = 0.0 + + +# 模块级任务表: key -> _BacktestJob +_running_jobs: dict[str, _BacktestJob] = {} +_jobs_lock = threading.Lock() +_JOB_TTL = 300 # 完成后保留 5 分钟 + + +def _cleanup_stale_jobs(): + """清理过期任务 (完成超过 TTL 的)。""" + now = time.time() + stale = [k for k, j in _running_jobs.items() if j.done and now - j.finish_ts > _JOB_TTL] + for k in stale: + _running_jobs.pop(k, None) + + +def _make_job_key( + strategy_id: str, symbols: str | None, start: str | None, end: str | None, + matching: str, entry_fill: str | None, exit_fill: str | None, + fees_pct: float, slippage_bps: float, + max_positions: int, max_exposure_pct: float, initial_capital: float, position_sizing: str, + params: str | None, overrides: str | None, + mode: str = "position", holding_days: int = 5, +) -> str: + raw = f"{strategy_id}|{symbols}|{start}|{end}|{matching}|{entry_fill}|{exit_fill}|{fees_pct}|{slippage_bps}|{max_positions}|{max_exposure_pct}|{initial_capital}|{position_sizing}|{params}|{overrides}|{mode}|{holding_days}" + return hashlib.md5(raw.encode()).hexdigest()[:12] + + +@router.get("/strategy/stream") +async def strategy_stream( + request: Request, + strategy_id: str, + symbols: str | None = None, + start: str | None = None, + end: str | None = None, + matching: str = "open_t+1", + entry_fill: str | None = None, + exit_fill: str | None = None, + fees_pct: float = 0.0002, + slippage_bps: float = 5.0, + max_positions: int = 10, + max_exposure_pct: float = 1.0, + initial_capital: float = 1_000_000.0, + position_sizing: str = "equal", + params: str | None = None, + overrides: str | None = None, + mode: str = "position", + holding_days: int = 5, +): + """SSE 流式策略回测: 实时推送进度, 完成后推送结果, 支持重连 (刷新/切页后恢复)。 + + - 相同参数的任务只启动一次, 多次连接订阅同一个任务 + - 断开连接不会取消任务 (除非显式调用 cancel) + - 结果保留 5 分钟供重连 + + 事件类型: + - progress: {day, total, date, equity} + - done: {result} (完整回测结果) + - error: {message} + """ + from app.backtest.strategy import StrategyBacktestService, StrategyBacktestConfig + + engine = _get_engine(request) + strategy_engine = request.app.state.strategy_engine + svc = StrategyBacktestService(engine, strategy_engine) + + end_date = date.fromisoformat(end) if end else date.today() + if start: + start_date = date.fromisoformat(start) + else: + # 空 start = 全部历史: 用本地最早日K日期, 查不到再回退到默认窗口 + earliest = request.app.state.repo.earliest_daily_date() + start_date = earliest or (end_date - timedelta(days=FACTOR_DEFAULT_DAYS)) + + # 服务端范围保护 + guard_violated = False + if settings.backtest_range_guard: + days = (end_date - start_date).days + 1 + if days > BACKTEST_MAX_SERVER_DAYS: + guard_violated = True + + job_key = _make_job_key( + strategy_id, symbols, start, end, + matching, entry_fill, exit_fill, + fees_pct, slippage_bps, max_positions, max_exposure_pct, initial_capital, position_sizing, + params, overrides, + mode, holding_days, + ) + + _cleanup_stale_jobs() + + # 获取或创建任务 + with _jobs_lock: + job = _running_jobs.get(job_key) + if job is None: + job = _BacktestJob(job_key) + _running_jobs[job_key] = job + is_new = True + else: + is_new = False + + async def event_generator(): + # 范围保护: 直接报错 + if guard_violated: + yield f"event: error\ndata: {json.dumps({'message': BACKTEST_SERVER_GUARD_MESSAGE}, ensure_ascii=False)}\n\n" + return + + # 如果是新任务, 启动回测线程 + if is_new and not job.done: + cfg = StrategyBacktestConfig( + strategy_id=strategy_id, + symbols=[s.strip() for s in symbols.split(",") if s.strip()] if symbols else None, + start=start_date, + end=end_date, + params=json.loads(params) if params else None, + overrides=json.loads(overrides) if overrides else None, + matching=matching, + entry_fill=entry_fill, + exit_fill=exit_fill, + fees_pct=fees_pct, + slippage_bps=slippage_bps, + max_positions=int(max_positions), + max_exposure_pct=float(max_exposure_pct), + initial_capital=float(initial_capital), + position_sizing=position_sizing, + mode=mode, + holding_days=int(holding_days), + ) + + def _run_backtest(): + try: + result = svc.run(cfg, lambda d: job.progress.append(d), job.cancel_event) + job.result = result + job.done = True + job.finish_ts = time.time() + except Exception as e: + job.error = str(e) + job.done = True + job.finish_ts = time.time() + + # 启动后台线程 (不阻塞事件循环) + threading.Thread(target=_run_backtest, daemon=True).start() + + # 订阅进度: 用读指针读 job.progress 列表 (多连接互不干扰) + cursor = 0 + tick = 0 + + try: + while True: + # 已完成: 推送最终结果/错误并退出 + if job.done: + if job.error: + yield f"event: error\ndata: {json.dumps({'message': job.error}, ensure_ascii=False)}\n\n" + elif job.result is not None: + r = job.result + if hasattr(r, "error") and r.error == "cancelled": + yield f"event: error\ndata: {json.dumps({'message': '回测已取消'}, ensure_ascii=False)}\n\n" + elif hasattr(r, "error") and r.error: + yield f"event: error\ndata: {json.dumps({'message': r.error}, ensure_ascii=False)}\n\n" + else: + yield f"event: done\ndata: {json.dumps(asdict(r), ensure_ascii=False, default=str)}\n\n" + return + + # 断开检测: 每 4 轮检查一次 (降低 GIL 抢占频率) + tick += 1 + if tick % 4 == 0 and await request.is_disconnected(): + break + + # 推送新进度 (从 cursor 开始读) + prog_list = job.progress + while cursor < len(prog_list): + msg = prog_list[cursor] + cursor += 1 + yield f"event: progress\ndata: {json.dumps(msg, ensure_ascii=False, default=str)}\n\n" + + await asyncio.sleep(0.5) + + except asyncio.CancelledError: + raise + + return StreamingResponse(event_generator(), media_type="text/event-stream") + + +@router.post("/strategy/cancel") +async def strategy_cancel(request: Request): + """取消正在运行的回测任务 (前端传 query string, 后端算 job_key)。""" + body = await request.json() + qs = body.get("qs", "") + # 解析 qs 得到参数 + from urllib.parse import parse_qs + p = parse_qs(qs) + def _get(key: str, default: str = "") -> str: + return p.get(key, [default])[0] + job_key = _make_job_key( + _get("strategy_id"), + _get("symbols") or None, + _get("start") or None, + _get("end") or None, + _get("matching", "open_t+1"), + _get("entry_fill") or None, + _get("exit_fill") or None, + float(_get("fees_pct", "0.0002")), + float(_get("slippage_bps", "5")), + int(_get("max_positions", "10")), + float(_get("max_exposure_pct", "1")), + float(_get("initial_capital", "1000000")), + _get("position_sizing", "equal"), + _get("params") or None, + _get("overrides") or None, + _get("mode", "position"), + int(_get("holding_days", "5")), + ) + job = _running_jobs.get(job_key) + if job and not job.done: + job.cancel_event.set() + return {"ok": True} + return {"ok": False, "message": "任务不存在或已完成"} + diff --git a/backend/app/api/data.py b/backend/app/api/data.py new file mode 100644 index 0000000..716f9f5 --- /dev/null +++ b/backend/app/api/data.py @@ -0,0 +1,747 @@ +"""数据画像 API —— 让前端知道"我们本地有什么数据"。""" +from __future__ import annotations + +import logging +import os +import threading +import time +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Callable + +from fastapi import APIRouter, Request + +from app.indicators.pipeline import ENRICHED_COLUMNS + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/api/data", tags=["data"]) + +# ===== 缓存:storage(文件扫描) + 每张表 aggregate 各自缓存 ===== +# 同步期间前端 2s 轮一次 status,每张表 aggregate 全表 count + min/max + distinct +# 太重,加 TTL + 事件失效。stage 写完只清对应那张表的缓存。 + +_TABLE_TTL = 30.0 # 兜底 TTL,即使没人调 invalidate 也会过期 +_TABLE_TTL_LARGE = 120.0 # 大表(分钟K等)单独 TTL,避免多分区聚合反复重算 +_STORAGE_TTL = 60.0 # storage 文件扫描独立 TTL,stage 写完不触发重算 + +# 聚合慢的大表(分区数多、行数多),使用更长的 TTL +_LARGE_TABLES = {"minute"} + +_storage_cache: dict[str, Any] | None = None +_storage_cache_ts: float = 0.0 +_storage_lock = threading.Lock() + +_table_cache: dict[str, dict | None] = { + "daily": None, + "enriched": None, + "index_daily": None, + "index_enriched": None, + "index_instruments": None, + "minute": None, + "adj_factor": None, + "instruments": None, + "financials": None, +} +_table_cache_ts: dict[str, float] = {k: 0.0 for k in _table_cache} +_table_cache_lock = threading.Lock() + +_last_finished_cache: dict[str, str | None] | None = None +_last_finished_lock = threading.Lock() + + +def invalidate_data_cache(table: str | None = None) -> None: + """数据写入/清除后调用。 + + table=None 时清所有表 cache + storage(粗粒度,用于 pipeline 完成/clear); + 指定 table 时只清那张表,不影响 storage(细粒度,用于单 stage 写完)。 + """ + with _table_cache_lock: + if table is None: + global _storage_cache, _storage_cache_ts, _last_finished_cache + _storage_cache = None + _storage_cache_ts = 0.0 + _last_finished_cache = None + for k in _table_cache: + _table_cache[k] = None + _table_cache_ts[k] = 0.0 + elif table in _table_cache: + _table_cache[table] = None + _table_cache_ts[table] = 0.0 + + +def invalidate_storage_cache() -> None: + """向后兼容入口 — 清全部缓存。新代码请用 invalidate_data_cache(table)。""" + invalidate_data_cache(None) + + +def _get_table_stats(name: str, fetch: Callable[[], dict | None]) -> dict | None: + """走 TTL+事件 双重缓存。fetch 在锁外执行避免阻塞别的请求。""" + ttl = _TABLE_TTL_LARGE if name in _LARGE_TABLES else _TABLE_TTL + now = time.time() + with _table_cache_lock: + cached = _table_cache.get(name) + cached_ts = _table_cache_ts.get(name, 0.0) + if cached is not None and (now - cached_ts) < ttl: + return cached + + fresh = fetch() + + with _table_cache_lock: + _table_cache[name] = fresh + _table_cache_ts[name] = now + return fresh + + +def _safe_aggregate(repo, view: str) -> dict | None: + """聚合视图基础统计;视图不存在或为空时返 None。""" + try: + row = repo.execute_one( + f"""SELECT count(*) AS rows, + min(date) AS earliest, + max(date) AS latest, + count(DISTINCT symbol) AS symbols, + count(DISTINCT date) AS trading_days + FROM {view}""" + ) + except Exception as e: # noqa: BLE001 + logger.debug("aggregate %s failed: %s", view, e) + return None + if not row or not row[0]: + return None + return { + "rows": int(row[0]), + "earliest_date": str(row[1]) if row[1] else None, + "latest_date": str(row[2]) if row[2] else None, + "symbols_covered": int(row[3] or 0), + "trading_days": int(row[4] or 0), + } + + +def _safe_aggregate_daily(repo, view: str = "kline_daily") -> dict | None: + """日K轻量统计 — 零数据扫描。 + + 从分区目录名获取日期范围和交易日数,不读任何 parquet。 + 标的数从 instruments 小表获取(~5000行,毫秒级)。 + """ + daily_dir = repo.store.data_dir / "kline_daily" + if not daily_dir.exists(): + return None + dates: list[str] = [] + for d in daily_dir.iterdir(): + if d.is_dir() and d.name.startswith("date="): + dates.append(d.name[5:]) + if not dates: + return None + dates.sort() + + symbols = _count_instruments_symbols(repo) + + return { + "rows": 0, + "earliest_date": dates[0], + "latest_date": dates[-1], + "symbols_covered": symbols, + "trading_days": len(dates), + } + + +def _safe_aggregate_enriched(repo) -> dict | None: + """Enriched 轻量统计 — 零数据扫描。 + + 字段数从 DESCRIBE 读 schema(不碰数据),毫秒级。 + 日期范围从分区目录名获取(同 minute 策略),不读任何 parquet。 + 标的数从 instruments 小表取。 + """ + # 字段数:读 schema,不碰数据 + fields = 0 + try: + cols = repo.execute_all("DESCRIBE kline_enriched") + fields = len(cols) + except Exception: # noqa: BLE001 + pass + + # 日期范围:从分区目录名获取,不扫数据 + enriched_dir = repo.store.data_dir / "kline_daily_enriched" + if not enriched_dir.exists(): + return None + dates: list[str] = [] + for d in enriched_dir.iterdir(): + if d.is_dir() and d.name.startswith("date="): + dates.append(d.name[5:]) + if not dates: + return None + dates.sort() + + symbols = _count_instruments_symbols(repo) + + return { + "rows": 0, + "fields": fields, + "earliest_date": dates[0], + "latest_date": dates[-1], + "symbols_covered": symbols, + "trading_days": len(dates), + } + + +def _count_instruments_symbols(repo) -> int: + """从 instruments 小表取标的数(~5000行,毫秒级)。""" + try: + sym_row = repo.execute_one( + "SELECT count(DISTINCT symbol) FROM instruments" + ) + if sym_row and sym_row[0]: + return int(sym_row[0]) + except Exception: # noqa: BLE001 + pass + return 0 + + +def _safe_aggregate_instruments(repo) -> dict | None: + """instruments 视图统计(无 date 列,用 as_of)。""" + try: + row = repo.execute_one( + """SELECT count(*) AS rows, + count(DISTINCT symbol) AS symbols, + max(as_of) AS latest_as_of, + count_if(name IS NOT NULL AND name != '') AS named + FROM instruments""" + ) + except Exception as e: # noqa: BLE001 + logger.debug("aggregate instruments failed: %s", e) + return None + if not row or not row[0]: + return None + return { + "rows": int(row[0]), + "symbols_covered": int(row[1] or 0), + "latest_as_of": str(row[2]) if row[2] else None, + "named": int(row[3] or 0), + } + + +def _safe_aggregate_index_daily(repo) -> dict | None: + """指数日K统计。指数数据量较小,直接读取 parquet 元数据统计真实行数。""" + return _safe_aggregate(repo, "kline_index_daily") + + +def _safe_aggregate_index_enriched(repo) -> dict | None: + """指数 enriched 统计。指数数据量较小,直接读取 parquet 元数据统计真实行数。""" + fields = 0 + try: + cols = repo.execute_all("DESCRIBE kline_index_enriched") + fields = len(cols) + except Exception: # noqa: BLE001 + pass + stats = _safe_aggregate(repo, "kline_index_enriched") + if not stats: + return None + return {**stats, "fields": fields} + + +def _safe_aggregate_index_instruments(repo) -> dict | None: + """指数 instruments 视图统计。""" + try: + row = repo.execute_one( + """SELECT count(*) AS rows, + count(DISTINCT symbol) AS symbols, + count_if(name IS NOT NULL AND name != '') AS named + FROM instruments_index""" + ) + except Exception as e: # noqa: BLE001 + logger.debug("aggregate instruments_index failed: %s", e) + return None + if not row or not row[0]: + return None + return { + "rows": int(row[0]), + "symbols_covered": int(row[1] or 0), + "latest_as_of": None, + "named": int(row[2] or 0), + } + + +def _safe_aggregate_adj_factor(repo) -> dict | None: + """adj_factor 视图统计,日期范围对齐日 K 覆盖区间。""" + try: + # 取日 K 的日期范围作为过滤条件 + dr = repo.execute_one( + "SELECT min(date), max(date) FROM kline_daily" + ) + if not dr or not dr[0]: + return None + d_min, d_max = dr[0], dr[1] + row = repo.execute_one( + """SELECT count(*) AS rows, + count(DISTINCT symbol) AS symbols, + count(DISTINCT trade_date) AS trading_days + FROM adj_factor + WHERE trade_date BETWEEN ? AND ?""", + [str(d_min), str(d_max)], + ) + if not row or not row[0]: + return None + return { + "rows": int(row[0]), + "symbols_covered": int(row[1]) if isinstance(row[1], (int, float)) else 0, + "earliest_date": str(d_min), + "latest_date": str(d_max), + "trading_days": int(row[2] or 0), + } + except Exception as e: # noqa: BLE001 + logger.debug("aggregate adj_factor failed: %s", e) + return None + + +def _safe_aggregate_minute(repo) -> dict | None: + """kline_minute 统计 — 从分区目录名获取交易日数,跳过全表扫描。 + + 分钟 K 按 date=YYYY-MM-DD 分区存储,直接数目录即可, + 无需 count(*) / count(DISTINCT ...) 等昂贵查询。 + """ + minute_dir = repo.store.data_dir / "kline_minute" + if not minute_dir.exists(): + return None + + # 从 date=YYYY-MM-DD 目录名提取交易日 + dates: list[str] = [] + for d in minute_dir.iterdir(): + if d.is_dir() and d.name.startswith("date="): + dates.append(d.name[5:]) + + if not dates: + return None + + dates.sort() + return { + "rows": 0, # 不再查询行数 + "earliest_date": dates[0], + "latest_date": dates[-1], + "symbols_covered": 0, # 不再查询标的数 + "trading_days": len(dates), + } + + +def _safe_aggregate_financials(repo) -> dict | None: + """财务数据统计 — 检查各表文件是否存在及行数。""" + data_dir = repo.store.data_dir + tables_info: dict[str, dict] = {} + total_rows = 0 + + for table in ("metrics", "income", "balance_sheet", "cash_flow"): + path = data_dir / "financials" / table / "part.parquet" + if path.exists(): + try: + import polars as pl + df = pl.read_parquet(path, columns=["symbol"]) + rows = len(df) + symbols = df["symbol"].n_unique() if not df.is_empty() else 0 + tables_info[table] = {"rows": rows, "symbols": symbols} + total_rows += rows + except Exception: + tables_info[table] = {"rows": 0, "symbols": 0} + else: + tables_info[table] = {"rows": 0, "symbols": 0} + + if total_rows == 0: + return None + + return { + "rows": total_rows, + "tables": tables_info, + } + + +def _scan_dir_stats(dirpath: Path) -> tuple[int, float]: + """单次遍历统计目录下文件数和总大小(MB)。比 rglob+stat 快很多。""" + if not dirpath.exists(): + return 0, 0.0 + count = 0 + total = 0 + for entry in os.scandir(dirpath): + if entry.is_dir(follow_symlinks=False): + c, s = _scan_dir_recursive(entry) + count += c + total += s + elif entry.is_file(follow_symlinks=False): + try: + total += entry.stat().st_size + except OSError: + pass + count += 1 + return count, round(total / 1048576, 2) + + +def _scan_dir_recursive(entry: os.DirEntry) -> tuple[int, int]: + """递归统计一个 DirEntry 下的文件数和总字节数。""" + count = 0 + total = 0 + try: + for sub in os.scandir(entry.path): + if sub.is_dir(follow_symlinks=False): + c, s = _scan_dir_recursive(sub) + count += c + total += s + elif sub.is_file(follow_symlinks=False): + try: + total += sub.stat().st_size + except OSError: + pass + count += 1 + except PermissionError: + pass + return count, total + + +def _compute_storage(data_dir: Path) -> dict: + """单次遍历计算 storage 统计,避免多次 rglob。""" + import os + + # 只统计关心的子目录 + subdirs = { + "daily": data_dir / "kline_daily", + "enriched": data_dir / "kline_daily_enriched", + "index_daily": data_dir / "kline_index_daily", + "index_enriched": data_dir / "kline_index_enriched", + "index_instruments": data_dir / "instruments_index", + "minute": data_dir / "kline_minute", + "adj_factor": data_dir / "adj_factor", + "instruments": data_dir / "instruments", + "ext_data": data_dir / "ext_data", + } + stats = {} + total_size = 0 + for key, d in subdirs.items(): + fc, sz = _scan_dir_stats(d) + total_size += sz + stats[f"{key}_files"] = fc + stats[f"{key}_size_mb"] = sz + + # total: 再加上其他零散文件(pools, financials, capabilities.json 等) + other_dirs = ["pools", "financials", "backtest_results", "screener_results", "ai_cache"] + for name in other_dirs: + d = data_dir / name + if d.exists(): + _, s = _scan_dir_stats(d) + total_size += s + + # financials 单独统计 + fin_dir = data_dir / "financials" + if fin_dir.exists(): + fc, sz = _scan_dir_stats(fin_dir) + stats["financials_files"] = fc + stats["financials_size_mb"] = sz + total_size += sz + for name in other_dirs: + d = data_dir / name + if d.exists(): + _, s = _scan_dir_stats(d) + total_size += s + # 根目录散文件 + for entry in os.scandir(data_dir): + if entry.is_file(follow_symlinks=False): + try: + total_size += entry.stat().st_size / 1048576 + except OSError: + pass + stats["total_size_mb"] = round(total_size, 2) + return stats + + +def _next_cron_run(scheduler, job_id: str) -> str | None: + """读 APScheduler 下次执行时间。""" + if not scheduler: + return None + try: + job = scheduler.get_job(job_id) + if job and job.next_run_time: + return job.next_run_time.isoformat(timespec="seconds") + except Exception: # noqa: BLE001 + pass + return None + + +def _get_storage(data_dir: Path) -> dict: + """返回缓存的 storage 统计;走独立 TTL,stage 写完不触发重算。""" + global _storage_cache, _storage_cache_ts + now = time.time() + with _storage_lock: + if _storage_cache is not None and (now - _storage_cache_ts) < _STORAGE_TTL: + return _storage_cache + fresh = _compute_storage(data_dir) + with _storage_lock: + _storage_cache = fresh + _storage_cache_ts = now + return fresh + + +def _last_finished(job_label: str) -> str | None: + """从 JobStore 读最近一次该类型任务的完成时间(缓存到 pipeline 终态失效)。""" + global _last_finished_cache + with _last_finished_lock: + if _last_finished_cache is not None: + return _last_finished_cache.get(job_label) + + from app.services.pipeline_jobs import job_store + jobs = job_store.list_recent(limit=50) + cache: dict[str, str | None] = {} + for j in jobs: + if j["status"] not in ("succeeded", "failed"): + continue + if "instruments_rows" in (j.get("result") or {}) and "instruments" not in cache: + cache["instruments"] = j["finished_at"] + if "daily_days" in (j.get("result") or {}) and "pipeline" not in cache: + cache["pipeline"] = j["finished_at"] + with _last_finished_lock: + _last_finished_cache = cache + return cache.get(job_label) + + +@router.get("/status") +def status(request: Request) -> dict: + repo = request.app.state.repo + scheduler = getattr(request.app.state, "scheduler", None) + data_dir = repo.store.data_dir + + return { + "daily": _get_table_stats("daily", lambda: _safe_aggregate_daily(repo)), + "enriched": _get_table_stats("enriched", lambda: _safe_aggregate_enriched(repo)), + "index_daily": _get_table_stats("index_daily", lambda: _safe_aggregate_index_daily(repo)), + "index_enriched": _get_table_stats("index_enriched", lambda: _safe_aggregate_index_enriched(repo)), + "index_instruments": _get_table_stats("index_instruments", lambda: _safe_aggregate_index_instruments(repo)), + "minute": _get_table_stats("minute", lambda: _safe_aggregate_minute(repo)), + "adj_factor": _get_table_stats("adj_factor", lambda: _safe_aggregate_adj_factor(repo)), + "instruments": _get_table_stats("instruments", lambda: _safe_aggregate_instruments(repo)), + "financials": _get_table_stats("financials", lambda: _safe_aggregate_financials(repo)), + + # 文件层面信息(缓存) + "storage": _get_storage(data_dir), + + # 调度 + "next_instruments_run": _next_cron_run(scheduler, "pre_market_instruments"), + "next_pipeline_run": _next_cron_run(scheduler, "daily_pipeline"), + "last_instruments_run": _last_finished("instruments"), + "last_pipeline_run": _last_finished("pipeline"), + "checked_at": datetime.now(timezone.utc).isoformat(timespec="seconds").replace("+00:00", "Z"), + } + + +@router.post("/clear") +def clear_data(request: Request): + """清除所有本地 Parquet 数据(保留 capabilities.json 和目录结构)。""" + import shutil + + repo = request.app.state.repo + data_dir = repo.store.data_dir + deleted = 0 + + for sub in ( + "kline_daily", "kline_daily_enriched", "kline_index_daily", "kline_index_enriched", "kline_minute", + "adj_factor", "instruments", "instruments_index", "pools", "financials", + "backtest_results", "screener_results", "ai_cache", + ): + d = data_dir / sub + if d.exists(): + # 先删所有 parquet 文件 + for f in d.rglob("*.parquet"): + f.unlink() + deleted += 1 + # 再删除空的日期分区子目录(date=YYYY-MM-DD 等) + for child in list(d.iterdir()): + if child.is_dir(): + shutil.rmtree(child, ignore_errors=True) + + # 清除同步历史(内存 + 磁盘 job_store/ 文件夹) + from app.services.pipeline_jobs import job_store + job_store.clear() + + # 清除财务数据 + fin_dir = data_dir / "financials" + for sub in ("metrics", "income", "balance_sheet", "cash_flow"): + fp = fin_dir / sub / "part.parquet" + if fp.exists(): + fp.unlink() + deleted += 1 + + # 清除监控运行数据 (user_data 下仅清运行产物, 不动 monitor_rules/preferences/secrets 等用户配置) + # - 触发记录 alerts.jsonl + from app.services import alert_store + alert_store.clear(data_dir) + # - 待推送的实时通知队列 (进程内存) + qs = getattr(request.app.state, "quote_service", None) + if qs is not None: + with qs._lock: + qs._pending_alerts.clear() + + # 清除 Polars 缓存 + # 先 clear_cache 无条件清空内存 (refresh_cache 在磁盘无数据时会提前 return, + # 导致 _enriched_cache 等旧数据残留 —— 清数据后看板仍显示旧数据的根因), + # 再 refresh_cache 尝试重载 (磁盘有数据则重建缓存)。 + repo.clear_cache() + repo.refresh_cache() + + # 清除 Screener 进程级 _history_cache (TTL 缓存) + from app.services.screener import ScreenerService + ScreenerService.clear_history_cache() + + # 清除 Overview 总览聚合结果缓存 (5s TTL) + from app.api.overview import invalidate_overview_cache + invalidate_overview_cache() + + # 刷新 DuckDB 视图(空 parquet 目录也需要重新挂载) + d = data_dir.as_posix() + for name, path in { + "kline_daily": f"{d}/kline_daily/**/*.parquet", + "kline_enriched": f"{d}/kline_daily_enriched/**/*.parquet", + "kline_index_daily": f"{d}/kline_index_daily/**/*.parquet", + "kline_index_enriched": f"{d}/kline_index_enriched/**/*.parquet", + "kline_minute": f"{d}/kline_minute/**/*.parquet", + "adj_factor": f"{d}/adj_factor/**/*.parquet", + "instruments": f"{d}/instruments/**/*.parquet", + "instruments_index": f"{d}/instruments_index/**/*.parquet", + }.items(): + try: + repo.db.execute( + f"CREATE OR REPLACE VIEW {name} AS " + f"SELECT * FROM read_parquet('{path}', union_by_name=true)" + ) + except Exception: + pass + + logger.info("数据已清除: 删除 %d 个 parquet 文件", deleted) + invalidate_data_cache(None) + return {"deleted_files": deleted} + + +# 各表字段说明 +_TABLE_FIELD_DESC: dict[str, dict[str, str]] = { + "kline_daily": { + "symbol": "股票代码", + "date": "交易日期", + "open": "开盘价", + "high": "最高价", + "low": "最低价", + "close": "收盘价", + "volume": "成交量", + "amount": "成交额", + }, + "kline_enriched": ENRICHED_COLUMNS, + "kline_index_daily": { + "symbol": "指数代码", + "date": "交易日期", + "open": "开盘点位", + "high": "最高点位", + "low": "最低点位", + "close": "收盘点位", + "volume": "成交量", + "amount": "成交额", + }, + "kline_index_enriched": ENRICHED_COLUMNS, + "kline_minute": { + "symbol": "股票代码", + "datetime": "分钟时间戳", + "open": "开盘价", + "high": "最高价", + "low": "最低价", + "close": "收盘价", + "volume": "成交量", + "amount": "成交额", + }, + "adj_factor": { + "symbol": "股票代码", + "timestamp": "除权除息时间戳(ms)", + "trade_date": "除权除息日", + "ex_factor": "复权因子", + }, + "instruments": { + "symbol": "股票代码", + "name": "股票名称", + "code": "股票编码(纯数字)", + "exchange": "交易所(SH/SZ/BJ)", + "region": "地区", + "type": "证券类型", + "listing_date": "上市日期", + "total_shares": "总股本", + "float_shares": "流通股本", + "tick_size": "最小价格变动单位", + "limit_up": "涨停限制(%)", + "limit_down": "跌停限制(%)", + "as_of": "快照日期", + }, + "instruments_index": { + "symbol": "指数代码", + "name": "指数名称", + "code": "指数编码(纯数字)", + "asset_type": "资产类型(index)", + }, +} + +# view 名 → DuckDB 视图名 +_SCHEMA_VIEWS: dict[str, str] = { + "daily": "kline_daily", + "enriched": "kline_enriched", + "index_daily": "kline_index_daily", + "index_enriched": "kline_index_enriched", + "index_instruments": "instruments_index", + "minute": "kline_minute", + "adj_factor": "adj_factor", + "instruments": "instruments", +} + + +@router.get("/schema/{table}") +def table_schema(request: Request, table: str) -> list[dict]: + """返回指定表的字段名、类型和中文说明。 + + 优先从 DuckDB DESCRIBE 读取(有数据时含精确类型); + 视图不存在(无数据)时回退到 _TABLE_FIELD_DESC 静态定义。 + """ + view = _SCHEMA_VIEWS.get(table) + if not view: + return [] + desc_map = _TABLE_FIELD_DESC.get(view, {}) + repo = request.app.state.repo + fields: list[dict] = [] + try: + cols = repo.execute_all(f"DESCRIBE {view}") + for col in cols: + name = col[0] + dtype = col[1] + fields.append({ + "name": name, + "type": dtype, + "desc": desc_map.get(name, ""), + }) + except Exception: # noqa: BLE001 + # 视图不存在(本地无数据),用静态字段定义兜底 + if desc_map: + for name, desc in desc_map.items(): + fields.append({"name": name, "type": "—", "desc": desc}) + return fields + + +@router.get("/version") +def get_version(request: Request) -> dict: + """返回当前项目版本号。 + + 优先读 app.__version__ (与 /health 接口同源, 唯一权威版本), + 回退到项目根 VERSION 文件, 最后兜底 v0.0.0。 + """ + from app import __version__ + + # 1. 优先用 app.__version__ (开发期 bump_version.py 写入) + if __version__: + v = __version__.strip() + return {"version": v if v.startswith("v") else f"v{v}"} + + # 2. 回退到项目根 VERSION 文件 + from app.config import settings + project_root = Path(settings.data_dir).parent + version_file = project_root / "VERSION" + if version_file.exists(): + v = version_file.read_text(encoding="utf-8").strip() + if v: + return {"version": v} + + return {"version": "v0.0.0"} diff --git a/backend/app/api/ext_data.py b/backend/app/api/ext_data.py new file mode 100644 index 0000000..3e2f172 --- /dev/null +++ b/backend/app/api/ext_data.py @@ -0,0 +1,826 @@ +"""扩展数据 API — CRUD + 文件上传 + JSON 写入 + 定时拉取 + schema 发现。""" +from __future__ import annotations + +import json +import logging +import math +import shutil +import tempfile +from datetime import date, datetime +from pathlib import Path +from typing import Literal + +import polars as pl +from fastapi import APIRouter, File, HTTPException, Query, Request, UploadFile +from pydantic import BaseModel, Field + +from app.services.ext_data import ( + ExtConfig, + ExtConfigStore, + ExtField, + PullConfig, + ensure_utf8_csv, + fix_symbol_format, + normalize_symbol, + parse_upload_file, + write_ext_parquet, + rows_to_parquet, +) +from app.services.ext_pull import fetch_and_ingest, pull_scheduler + +logger = logging.getLogger(__name__) +router = APIRouter(prefix="/api/ext-data", tags=["ext-data"]) + + +# --------------------------------------------------------------------------- +# Pydantic 模型 +# --------------------------------------------------------------------------- + +class FieldDef(BaseModel): + name: str + dtype: str = "string" # string | int | float | bool + label: str = "" + + +class CreateExtReq(BaseModel): + id: str = Field(..., min_length=1, max_length=64, pattern=r"^[a-zA-Z0-9_]+$") + label: str = Field(..., min_length=1, max_length=64) + mode: Literal["snapshot", "timeseries"] + fields: list[FieldDef] = Field(..., min_length=1) + description: str = "" + symbol_map: dict = {} # {"type": "mapped", "col": "..."} 或 {"type": "computed", "from": "code", "method": "append_exchange"} + code_map: dict = {} # {"type": "mapped", "col": "..."} 或 {"type": "computed", "from": "symbol", "method": "strip_exchange"} + + +class UpdateExtReq(BaseModel): + label: str | None = None + fields: list[FieldDef] | None = None + description: str | None = None + symbol_map: dict | None = None + code_map: dict | None = None + + +class IngestReq(BaseModel): + """JSON 批量写入请求。""" + date: str | None = None # YYYY-MM-DD,不传默认今天 + rows: list[dict] = Field(..., min_length=1) + + +class PullConfigReq(BaseModel): + """定时拉取配置请求。""" + url: str = Field(..., min_length=1) + method: str = "GET" + headers: dict[str, str] | None = None + body: str | None = None + response_path: str = "" # dot-path to rows array + field_map: dict[str, str] | None = None # external → internal field name + schedule_minutes: int = Field(1440, ge=1) + enabled: bool = False + + +# --------------------------------------------------------------------------- +# 辅助 +# --------------------------------------------------------------------------- + +def _store(request: Request) -> ExtConfigStore: + return ExtConfigStore(request.app.state.repo.store.data_dir) + + +def _data_dir(request: Request) -> Path: + return request.app.state.repo.store.data_dir + + +# --------------------------------------------------------------------------- +# CRUD +# --------------------------------------------------------------------------- + +def _apply_mapping(df: pl.DataFrame, config: ExtConfig, data_dir: Path) -> pl.DataFrame: + """根据 config 的 symbol_map / code_map 自动生成 symbol 和 code 列。 + + 执行顺序:先 mapped(从文件列复制),再 computed(从已生成的列计算)。 + """ + sm = config.symbol_map or {} + cm = config.code_map or {} + + # --- 第一步:mapped 类型,直接从文件列映射 --- + if sm.get("type") == "mapped" and sm["col"] in df.columns: + df = df.with_columns(df[sm["col"]].cast(pl.Utf8).alias("symbol")) + + if cm.get("type") == "mapped" and cm["col"] in df.columns: + df = df.with_columns(df[cm["col"]].cast(pl.Utf8).alias("code")) + + # --- 第二步:computed 类型,从已生成的列计算 --- + if "symbol" not in df.columns and sm.get("type") == "computed": + if sm.get("from") == "code" and "code" in df.columns: + # code → symbol: 000001 → 000001.SZ + from app.services.ext_data import build_code_lookup + lookup = build_code_lookup(data_dir) + df = df.with_columns(normalize_symbol(df["code"].cast(pl.Utf8), lookup).alias("symbol")) + + if "code" not in df.columns and cm.get("type") == "computed": + if cm.get("from") == "symbol" and "symbol" in df.columns: + # symbol → code: 000001.SZ → 000001 + df = df.with_columns( + df["symbol"].cast(pl.Utf8).str.split(".").list.first().alias("code") + ) + + # --- 兜底:如果只有一个,自动生成另一个 --- + if "symbol" in df.columns and "code" not in df.columns: + df = df.with_columns( + df["symbol"].cast(pl.Utf8).str.split(".").list.first().alias("code") + ) + elif "code" in df.columns and "symbol" not in df.columns: + from app.services.ext_data import build_code_lookup + lookup = build_code_lookup(data_dir) + df = df.with_columns(normalize_symbol(df["code"].cast(pl.Utf8), lookup).alias("symbol")) + + # 标准化 symbol 列 + if "symbol" in df.columns: + from app.services.ext_data import build_code_lookup + lookup = build_code_lookup(data_dir) + df = df.with_columns(normalize_symbol(df["symbol"].cast(pl.Utf8), lookup)) + + return df + + +def _clean_col_names(df: pl.DataFrame) -> pl.DataFrame: + """清洗列名:去掉所有 (...) 及其内容,避免时间戳导致列名不稳定。""" + import re + renames = {col: re.sub(r"\([^)]*\)", "", col).strip() for col in df.columns} + # 去重:如果清洗后重名,加序号后缀 + seen: dict[str, int] = {} + final = {} + for old, new in renames.items(): + if new in seen: + seen[new] += 1 + final[old] = f"{new}_{seen[new]}" + else: + seen[new] = 0 + final[old] = new + return df.rename(final) + + +def _ext_data_dir(config: ExtConfig, data_dir: Path) -> Path: + """返回扩展数据的数据目录。 + + - snapshot: data/ext_data/{id}/(part.parquet 与 config.json 同级) + - timeseries: data/ext_data/{id}/timeseries/ + """ + cfg_dir = data_dir / "ext_data" / config.id + if config.mode == "timeseries": + return cfg_dir / "timeseries" + return cfg_dir + + +def _parquet_glob(config: ExtConfig, data_dir: Path) -> str: + """返回该扩展配置下所有 parquet 文件的 glob 模式。 + + snapshot: 'data/ext_data/{id}/*.parquet'(只有 part.parquet) + timeseries: 'data/ext_data/{id}/timeseries/**/*.parquet' + """ + cfg_dir = data_dir / "ext_data" / config.id + if config.mode == "snapshot": + return str(cfg_dir / "*.parquet") + return str(cfg_dir / "timeseries" / "**" / "*.parquet") + + +def _safe_json_value(value): + if isinstance(value, float) and not math.isfinite(value): + return None + if isinstance(value, (date, datetime)): + return value.isoformat() + return value + + +def _read_ext_dataframe( + config: ExtConfig, + data_dir: Path, + snapshot_date: str | None = None, +) -> tuple[pl.DataFrame, str | None]: + cfg_dir = data_dir / "ext_data" / config.id + + if config.mode == "snapshot": + path = cfg_dir / "part.parquet" + if not path.exists(): + return pl.DataFrame(), None + return pl.read_parquet(path), _latest_sync_date(config, data_dir) + + base = cfg_dir / "timeseries" + if not base.exists(): + return pl.DataFrame(), None + + if snapshot_date: + path = base / f"date={snapshot_date}" / "part.parquet" + if not path.exists(): + return pl.DataFrame(), snapshot_date + return pl.read_parquet(path), snapshot_date + + partitions = sorted( + d for d in base.iterdir() + if d.is_dir() and d.name.startswith("date=") and (d / "part.parquet").exists() + ) + if not partitions: + return pl.DataFrame(), None + + latest = partitions[-1] + latest_date = latest.name[5:] + return pl.read_parquet(latest / "part.parquet"), latest_date + + +def _with_instrument_name(df: pl.DataFrame, data_dir: Path) -> pl.DataFrame: + if df.is_empty() or "symbol" not in df.columns or "name" in df.columns: + return df + path = data_dir / "instruments" / "instruments.parquet" + if not path.exists(): + return df + try: + inst = pl.read_parquet(path) + if "symbol" in inst.columns and "name" in inst.columns: + inst = inst.select(["symbol", "name"]).unique(subset=["symbol"], keep="last") + return df.join(inst, on="symbol", how="left") + except Exception: + return df + return df + + +def _latest_sync_date(config: ExtConfig, data_dir: Path) -> str | None: + """扫描数据文件,返回该扩展配置的最新同步时间(含时分秒)。 + + - snapshot: 直接取 ext_data/{id}/part.parquet 的 mtime + - timeseries: 扫描 ext_data/{id}/timeseries/date=xxx 分区目录 + """ + from datetime import datetime + + if config.mode == "snapshot": + # 快照: part.parquet 与 config.json 同级 + p = data_dir / "ext_data" / config.id / "part.parquet" + if p.exists(): + ts = datetime.fromtimestamp(p.stat().st_mtime).strftime("%Y-%m-%d %H:%M:%S") + return ts + # 兼容旧路径 + old = data_dir / "instruments_ext" + if old.exists(): + return _latest_sync_from_partitions(old) + return None + + # 时序: 扫描 timeseries/date=xxx + base = _ext_data_dir(config, data_dir) + if not base.exists(): + # 兼容旧路径 + base = data_dir / "kline_ext" + if not base.exists(): + return None + return _latest_sync_from_partitions(base) + + +def _latest_sync_from_partitions(base: Path) -> str | None: + """从 date=xxx 分区目录中找到最新分区的修改时间。""" + from datetime import datetime + latest_ts: float = 0 + latest_date: str | None = None + for d in base.iterdir(): + if d.is_dir() and d.name.startswith("date="): + for f in d.glob("*.parquet"): + mtime = f.stat().st_mtime + if mtime > latest_ts: + latest_ts = mtime + latest_date = d.name[5:] + if latest_date and latest_ts > 0: + ts = datetime.fromtimestamp(latest_ts).strftime("%H:%M:%S") + return f"{latest_date} {ts}" + return latest_date + + +def _date_range(config: ExtConfig, data_dir: Path) -> list[str] | None: + """返回时序型扩展数据的日期范围 [最早, 最新]。""" + if config.mode != "timeseries": + return None + base = _ext_data_dir(config, data_dir) + if not base.exists(): + # 兼容旧路径 + base = data_dir / "kline_ext" + if not base.exists(): + return None + dates: list[str] = [] + for d in base.iterdir(): + if d.is_dir() and d.name.startswith("date="): + dates.append(d.name[5:]) + if len(dates) < 1: + return None + dates.sort() + return [dates[0], dates[-1]] + + +@router.get("") +def list_configs(request: Request): + """列出所有扩展数据配置。""" + configs = _store(request).load_all() + data_dir = _data_dir(request) + items = [] + for c in configs: + d = c.to_dict() + d["latest_sync_date"] = _latest_sync_date(c, data_dir) + d["date_range"] = _date_range(c, data_dir) + items.append(d) + return {"items": items} + + +@router.post("") +def create_config(request: Request, body: CreateExtReq): + """创建扩展数据配置。""" + store = _store(request) + if store.get(body.id): + raise HTTPException(400, f"配置 '{body.id}' 已存在") + config = ExtConfig( + id=body.id, + label=body.label, + mode=body.mode, + fields=[ExtField(f.name, f.dtype, f.label) for f in body.fields], + description=body.description, + symbol_map=body.symbol_map, + code_map=body.code_map, + ) + store.upsert(config) + return config.to_dict() + + +@router.put("/{config_id}") +def update_config(request: Request, config_id: str, body: UpdateExtReq): + """更新扩展数据配置。""" + store = _store(request) + config = store.get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + if body.label is not None: + config.label = body.label + if body.fields is not None: + config.fields = [ExtField(f.name, f.dtype, f.label) for f in body.fields] + if body.description is not None: + config.description = body.description + if body.symbol_map is not None: + config.symbol_map = body.symbol_map + if body.code_map is not None: + config.code_map = body.code_map + store.upsert(config) + return config.to_dict() + + +@router.delete("/{config_id}") +def delete_config(request: Request, config_id: str): + """删除扩展数据配置。""" + store = _store(request) + if not store.delete(config_id): + raise HTTPException(404, f"配置 '{config_id}' 不存在") + return {"status": "deleted"} + + +@router.get("/{config_id}/rows") +def list_rows( + request: Request, + config_id: str, + snapshot_date: str | None = Query(None, alias="date"), + columns: str | None = Query(None, description="逗号分隔的字段列表"), + limit: int = Query(1000, ge=1, le=20000), +): + """读取扩展数据明细。 + + - snapshot: 返回当前快照。 + - timeseries: 默认返回最新日期分区,也可通过 date=YYYY-MM-DD 指定。 + """ + config = _store(request).get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + + data_dir = _data_dir(request) + df, active_date = _read_ext_dataframe(config, data_dir, snapshot_date) + df = _with_instrument_name(df, data_dir) + requested = [c.strip() for c in (columns or "").split(",") if c.strip()] + if requested: + keep = [c for c in ["symbol", "code", "name", *requested] if c in df.columns] + if keep: + df = df.select(list(dict.fromkeys(keep))) + total = len(df) + if total > limit: + df = df.head(limit) + + rows = [] + for row in df.to_dicts(): + rows.append({k: _safe_json_value(v) for k, v in row.items()}) + + return { + "id": config.id, + "label": config.label, + "mode": config.mode, + "date": active_date, + "total": total, + "limit": limit, + "fields": [f.to_dict() for f in config.fields], + "rows": rows, + } + + +# --------------------------------------------------------------------------- +# 文件上传 +# --------------------------------------------------------------------------- + +@router.post("/{config_id}/upload") +async def upload_data( + request: Request, + config_id: str, + file: UploadFile = File(...), + snapshot_date: str | None = None, +): + """上传 CSV/Excel 文件写入扩展数据。""" + store = _store(request) + config = store.get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + + # 校验文件后缀 + suffix = Path(file.filename or "").suffix.lower() + if suffix not in (".csv", ".xlsx", ".xls"): + raise HTTPException(400, "仅支持 CSV / Excel 文件") + + # 写到临时文件再解析 + tmp_dir = Path(tempfile.mkdtemp()) + tmp_path = tmp_dir / f"upload{suffix}" + try: + with tmp_path.open("wb") as f: + content = await file.read() + f.write(content) + + # 直接读取文件,不做列重命名 + if suffix == ".csv": + df = pl.read_csv(ensure_utf8_csv(tmp_path), infer_schema_length=10000) + elif suffix in (".xlsx", ".xls"): + df = pl.read_excel(tmp_path) + else: + raise HTTPException(400, f"不支持的文件格式: {suffix}") + + # 清洗列名:去掉括号内的时间戳等信息 + df = _clean_col_names(df) + + # 按映射关系自动生成 symbol 和 code 列 + df = _apply_mapping(df, config, _data_dir(request)) + except ValueError as e: + raise HTTPException(400, str(e)) from e + finally: + shutil.rmtree(tmp_dir, ignore_errors=True) + + # 确保配置的字段列存在于上传数据中(symbol/code 由映射自动生成,不校验) + auto_fields = {"symbol", "code"} + config_cols = {f.name for f in config.fields} - auto_fields + missing = config_cols - set(df.columns) + if missing: + raise HTTPException(400, f"上传数据缺少字段: {', '.join(sorted(missing))}") + + # 只保留配置中定义的列(包括自动生成的 symbol/code),忽略文件中多余的字段 + all_config_cols = {f.name for f in config.fields} + keep = [c for c in df.columns if c in all_config_cols] + df = df.select(keep) + + # 解析快照日期 + snap = date.fromisoformat(snapshot_date) if snapshot_date else date.today() + + rows = write_ext_parquet(df, config, _data_dir(request), snapshot_date=snap) + + # 刷新 DuckDB 视图 + _refresh_views(request) + + return {"status": "ok", "rows": rows, "date": snap.isoformat()} + + +# --------------------------------------------------------------------------- +# JSON 接口写入 +# --------------------------------------------------------------------------- + +@router.post("/{config_id}/ingest") +def ingest_data(request: Request, config_id: str, body: IngestReq): + """通过 JSON 接口批量写入扩展数据。""" + store = _store(request) + config = store.get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + + # 校验必填字段 + configured = {f.name for f in config.fields} + required = configured - {"symbol"} + for i, row in enumerate(body.rows): + if "symbol" not in row: + raise HTTPException(400, f"第 {i + 1} 行缺少 symbol 字段") + missing = required - set(row.keys()) + if missing: + raise HTTPException(400, f"第 {i + 1} 行缺少字段: {', '.join(sorted(missing))}") + + snap = date.fromisoformat(body.date) if body.date else date.today() + + rows_written = rows_to_parquet(body.rows, config, _data_dir(request), snapshot_date=snap) + + _refresh_views(request) + + return {"status": "ok", "rows": rows_written, "date": snap.isoformat()} + + +# --------------------------------------------------------------------------- +# 定时拉取 +# --------------------------------------------------------------------------- + +@router.put("/{config_id}/pull") +def configure_pull(request: Request, config_id: str, body: PullConfigReq): + """配置(或更新)定时拉取。""" + store = _store(request) + config = store.get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + + # 保留历史状态字段 + old_pull = config.pull + config.pull = PullConfig( + url=body.url, + method=body.method, + headers=body.headers, + body=body.body, + response_path=body.response_path, + field_map=body.field_map, + schedule_minutes=body.schedule_minutes, + enabled=body.enabled, + last_run=old_pull.last_run if old_pull else None, + last_status=old_pull.last_status if old_pull else None, + last_message=old_pull.last_message if old_pull else None, + last_rows=old_pull.last_rows if old_pull else None, + ) + store.upsert(config) + + # 刷新调度器 + pull_scheduler.refresh(_data_dir(request)) + + return {"status": "ok", "pull": config.pull.to_dict()} + + +@router.post("/{config_id}/pull/test") +async def test_pull(request: Request, config_id: str): + """测试拉取:请求外部 API 并返回预览数据,不写入。""" + store = _store(request) + config = store.get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + if not config.pull or not config.pull.url: + raise HTTPException(400, "拉取未配置或 URL 为空") + + # 临时构建一个带新配置的 config 用于测试 + from app.services.ext_pull import _extract_rows, _apply_field_map + import httpx + + pull = config.pull + try: + async with httpx.AsyncClient(timeout=30) as client: + headers = pull.headers or {} + kwargs: dict = {"headers": headers} + if pull.method.upper() == "POST" and pull.body: + kwargs["content"] = pull.body + if "content-type" not in {k.lower() for k in headers}: + kwargs["headers"]["Content-Type"] = "application/json" + resp = await client.request(pull.method.upper(), pull.url, **kwargs) + resp.raise_for_status() + data = resp.json() + + rows = _extract_rows(data, pull.response_path) + preview = _apply_field_map(rows[:5], pull.field_map) + return { + "status": "ok", + "total_rows": len(rows), + "preview": preview, + "has_symbol": bool(rows and "symbol" in rows[0]), + } + except Exception as e: + raise HTTPException(400, f"测试失败: {e}") from e + + +@router.post("/{config_id}/pull/run") +async def run_pull(request: Request, config_id: str): + """手动触发一次拉取并写入。""" + store = _store(request) + config = store.get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + if not config.pull or not config.pull.url: + raise HTTPException(400, "拉取未配置或 URL 为空") + + try: + n, d = await fetch_and_ingest(config, _data_dir(request)) + _refresh_views(request) + return {"status": "ok", "rows": n, "date": d} + except Exception as e: + raise HTTPException(400, f"拉取失败: {e}") from e + + +# --------------------------------------------------------------------------- +# --------------------------------------------------------------------------- +# Symbol 格式修复 +# --------------------------------------------------------------------------- + +@router.post("/{config_id}/fix-symbol") +def fix_symbol(request: Request, config_id: str): + """扫描已有 Parquet 数据,将 symbol 列标准化为 代码.交易所 格式。""" + store = _store(request) + config = store.get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + + fixed = fix_symbol_format(config, _data_dir(request)) + _refresh_views(request) + return {"status": "ok", "fixed_files": fixed} + + +# --------------------------------------------------------------------------- +# Schema 发现 +# --------------------------------------------------------------------------- + +_POLARS_TYPE_MAP = { + "Int64": "int", "Int32": "int", "Int16": "int", "Int8": "int", + "UInt64": "int", "UInt32": "int", "UInt16": "int", "UInt8": "int", + "Float64": "float", "Float32": "float", + "Boolean": "bool", + "Utf8": "string", "String": "string", + "Date": "string", "Datetime": "string", "Duration": "string", + "Categorical": "string", +} + + +@router.post("/detect-fields") +async def detect_fields( + request: Request, + file: UploadFile = File(...), +): + """上传 CSV/Excel 文件,自动检测列名和类型。 + + 返回 symbol_candidates(数据匹配 000001.SZ 格式的列)和 + code_candidates(数据匹配 6位纯数字的列)。 + """ + suffix = Path(file.filename or "").suffix.lower() + if suffix not in (".csv", ".xlsx", ".xls"): + raise HTTPException(400, "仅支持 CSV / Excel 文件") + + tmp_dir = Path(tempfile.mkdtemp()) + tmp_path = tmp_dir / f"upload{suffix}" + try: + with tmp_path.open("wb") as f: + content = await file.read() + f.write(content) + + # 直接读取,不要求 symbol 列 + if suffix == ".csv": + df = pl.read_csv(ensure_utf8_csv(tmp_path), infer_schema_length=10000) + elif suffix in (".xlsx", ".xls"): + df = pl.read_excel(tmp_path) + else: + raise HTTPException(400, f"不支持的文件格式: {suffix}") + except HTTPException: + raise + except Exception as e: + raise HTTPException(400, str(e)) from e + finally: + shutil.rmtree(tmp_dir, ignore_errors=True) + + # 清洗列名:去掉括号内的时间戳等信息 + df = _clean_col_names(df) + + # 构建字段列表 + fields = [] + for col_name in df.columns: + pl_type = df[col_name].dtype + dtype = _POLARS_TYPE_MAP.get(str(pl_type.base_type()), "string") + fields.append({"name": col_name, "dtype": dtype, "label": col_name}) + + # --- 分别检测 symbol 候选 (000001.SZ) 和 code 候选 (6位纯数字) --- + import re + _CODE_PAT = re.compile(r"^\d{6}$") + _SYMBOL_PAT = re.compile(r"^\d{6}\.[A-Z]{2}$") + + symbol_candidates: list[str] = [] # 数据匹配 000001.SZ 格式 + code_candidates: list[str] = [] # 数据匹配 000001 格式 + + for col in df.columns: + col_data = df[col].cast(pl.Utf8).drop_nulls() + if len(col_data) == 0: + continue + sample = col_data.head(200).to_list() + sym_hits = sum(1 for v in sample if _SYMBOL_PAT.match(str(v).strip())) + code_hits = sum(1 for v in sample if _CODE_PAT.match(str(v).strip())) + total = len(sample) + if total > 0: + if sym_hits / total > 0.5: + symbol_candidates.append(col) + elif code_hits / total > 0.5: + code_candidates.append(col) + + return { + "fields": fields, + "rows": len(df), + "symbol_candidates": symbol_candidates, + "code_candidates": code_candidates, + } + + +@router.get("/schema/{config_id}") +def discover_schema(request: Request, config_id: str): + """发现扩展数据的实际 Parquet schema(基于已有数据)。""" + config = _store(request).get(config_id) + if not config: + raise HTTPException(404, f"配置 '{config_id}' 不存在") + + data_dir = _data_dir(request) + glob = _parquet_glob(config, data_dir) + + try: + import duckdb + rows = duckdb.query( + f"SELECT column_name, data_type FROM (DESCRIBE SELECT * FROM read_parquet('{glob}', union_by_name=true))" + ).fetchall() + return {"columns": [{"name": r[0], "type": r[1]} for r in rows]} + except Exception: + # 无数据时返回配置中定义的字段 + return {"columns": [f.to_dict() for f in config.fields]} + + +@router.get("/schema-all") +def discover_all_schemas(request: Request): + """发现所有扩展表的 schema(用于前端动态列选择)。""" + configs = _store(request).load_all() + result = [] + for config in configs: + data_dir = _data_dir(request) + glob = _parquet_glob(config, data_dir) + + try: + import duckdb + cols = duckdb.query( + f"SELECT column_name, data_type FROM (DESCRIBE SELECT * FROM read_parquet('{glob}', union_by_name=true))" + ).fetchall() + field_labels = {f.name: f.label for f in config.fields} + columns = [{"name": r[0], "type": r[1], "label": field_labels.get(r[0], r[0])} for r in cols] + except Exception: + columns = [f.to_dict() for f in config.fields] + + result.append({ + "id": config.id, + "label": config.label, + "mode": config.mode, + "columns": columns, + }) + return {"items": result} + + +# --------------------------------------------------------------------------- +# 视图刷新 +# --------------------------------------------------------------------------- + +def _refresh_views(request: Request) -> None: + """重新注册 DuckDB 视图以包含新的扩展数据。""" + repo = request.app.state.repo + db = repo.store.db + d = repo.store.data_dir.as_posix() + + # 注册旧路径视图(兼容) + for name, subdir in [("instruments_ext", "instruments_ext"), ("kline_ext", "kline_ext")]: + old_glob = f"{d}/{subdir}/**/*.parquet" + old_dir = Path(d) / subdir + if old_dir.exists(): + sql = ( + f"CREATE OR REPLACE VIEW {name} AS " + f"SELECT * FROM read_parquet('{old_glob}', union_by_name=true)" + ) + try: + db.execute(sql) + except Exception: + pass + + # 注册新路径视图:每个扩展表一个视图 ext_{config_id} + ext_base = Path(d) / "ext_data" + if ext_base.exists(): + for cfg_dir in ext_base.iterdir(): + if not cfg_dir.is_dir(): + continue + cp = cfg_dir / "config.json" + if not cp.exists(): + continue + try: + raw = json.loads(cp.read_text(encoding="utf-8")) + cfg_id = raw["id"] + # 检查是否有数据文件(snapshot: part.parquet, timeseries: timeseries/ 目录) + has_data = (cfg_dir / "part.parquet").exists() or (cfg_dir / "timeseries").exists() + if has_data: + view_name = f"ext_{cfg_id}" + # snapshot: part.parquet 在 cfg_dir/ 根下; timeseries: 在 timeseries/ 子目录 + mode = raw.get("mode", "snapshot") + if mode == "snapshot": + glob_pattern = f"{cfg_dir.as_posix()}/*.parquet" + else: + glob_pattern = f"{cfg_dir.as_posix()}/timeseries/**/*.parquet" + sql = ( + f"CREATE OR REPLACE VIEW {view_name} AS " + f"SELECT * FROM read_parquet('{glob_pattern}', union_by_name=true)" + ) + db.execute(sql) + except Exception: + pass diff --git a/backend/app/api/financials.py b/backend/app/api/financials.py new file mode 100644 index 0000000..2cdf433 --- /dev/null +++ b/backend/app/api/financials.py @@ -0,0 +1,127 @@ +"""财务数据 API — 独立路由, Cap.FINANCIAL 门控。""" +from __future__ import annotations + +import logging + +import polars as pl +from fastapi import APIRouter, HTTPException, Request + +from app.services.financial_sync import get_financial_df +from app.tickflow.capabilities import Cap + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/api/financials", tags=["financials"]) + + +@router.get("/status") +def financial_status(request: Request): + """返回各财务表的同步状态。无需 FINANCIAL 权限(前端根据 available 决定是否展示)。""" + capset = request.app.state.capabilities + if not capset.has(Cap.FINANCIAL): + return {"available": False, "tables": {}} + + data_dir = request.app.state.repo.store.data_dir + tables = {} + + for table in ("metrics", "income", "balance_sheet", "cash_flow"): + path = data_dir / "financials" / table / "part.parquet" + if path.exists(): + try: + df = pl.read_parquet(path, columns=["symbol"]) + tables[table] = { + "rows": len(df), + "symbols": df["symbol"].n_unique() if not df.is_empty() else 0, + } + except Exception: + tables[table] = {"rows": 0, "symbols": 0} + else: + tables[table] = {"rows": 0, "symbols": 0} + + fs = getattr(request.app.state, "financial_scheduler", None) + last_sync = fs.last_sync if fs else {} + + return { + "available": True, + "tables": tables, + "last_sync": last_sync, + # 服务端是否正在同步(手动触发)——前端据此显示"同步中"并防重复点击, + # 且刷新页面后仍能正确反映服务端状态。 + "syncing": bool(fs and fs.is_syncing), + } + + +@router.get("/metrics") +def get_metrics(request: Request, symbol: str | None = None): + """查询核心财务指标。""" + capset = request.app.state.capabilities + capset.require(Cap.FINANCIAL) + + df = get_financial_df(request.app.state.repo.store.data_dir, "metrics") + if df.is_empty(): + return {"data": []} + if symbol: + df = df.filter(pl.col("symbol") == symbol) + return {"data": df.to_dicts()} + + +@router.get("/income") +def get_income(request: Request, symbol: str | None = None): + """查询利润表。""" + capset = request.app.state.capabilities + capset.require(Cap.FINANCIAL) + + df = get_financial_df(request.app.state.repo.store.data_dir, "income") + if df.is_empty(): + return {"data": []} + if symbol: + df = df.filter(pl.col("symbol") == symbol) + return {"data": df.to_dicts()} + + +@router.get("/balance-sheet") +def get_balance_sheet(request: Request, symbol: str | None = None): + """查询资产负债表。""" + capset = request.app.state.capabilities + capset.require(Cap.FINANCIAL) + + df = get_financial_df(request.app.state.repo.store.data_dir, "balance_sheet") + if df.is_empty(): + return {"data": []} + if symbol: + df = df.filter(pl.col("symbol") == symbol) + return {"data": df.to_dicts()} + + +@router.get("/cash-flow") +def get_cash_flow(request: Request, symbol: str | None = None): + """查询现金流量表。""" + capset = request.app.state.capabilities + capset.require(Cap.FINANCIAL) + + df = get_financial_df(request.app.state.repo.store.data_dir, "cash_flow") + if df.is_empty(): + return {"data": []} + if symbol: + df = df.filter(pl.col("symbol") == symbol) + return {"data": df.to_dicts()} + + +@router.post("/sync/{table}") +def sync_table(request: Request, table: str): + """手动触发同步。table: metrics / income / balance_sheet / cash_flow / all""" + capset = request.app.state.capabilities + capset.require(Cap.FINANCIAL) + + valid_tables = {"metrics", "income", "balance_sheet", "cash_flow", "all"} + if table not in valid_tables: + raise HTTPException(400, f"invalid table: {table}, expected one of {valid_tables}") + + fs = getattr(request.app.state, "financial_scheduler", None) + if not fs: + return {"status": "error", "message": "FinancialScheduler not available"} + + target = None if table == "all" else table + result = fs.run_now(target) + + return {"status": "ok", "synced": result} diff --git a/backend/app/api/indices.py b/backend/app/api/indices.py new file mode 100644 index 0000000..2b806aa --- /dev/null +++ b/backend/app/api/indices.py @@ -0,0 +1,149 @@ +"""指数 API。""" +from __future__ import annotations + +import logging +from datetime import date, datetime, timedelta +from typing import Optional + +import polars as pl +from fastapi import APIRouter, HTTPException, Query, Request + +from app.indicators.pipeline import compute_enriched +from app.services import index_sync, kline_sync +from app.tickflow.capabilities import Cap + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/api/index", tags=["index"]) + + +def _index_info(repo, symbol: str) -> dict: + df = repo.get_index_instruments() + if df.is_empty() or "symbol" not in df.columns: + return {} + hit = df.filter(pl.col("symbol") == symbol).head(1) + if hit.is_empty(): + return {} + return hit.to_dicts()[0] + + +@router.get("/list") +def list_indices(request: Request): + """返回已缓存的 CN_Index 指数列表。""" + repo = request.app.state.repo + df = repo.get_index_instruments() + if df.is_empty(): + return {"results": [], "count": 0} + cols = [c for c in ["symbol", "name", "code", "asset_type"] if c in df.columns] + rows = df.select(cols).sort("symbol").to_dicts() + return {"results": rows, "count": len(rows)} + + +@router.get("/search") +def search_indices( + request: Request, + q: str = Query("", min_length=0, max_length=50, description="搜索关键词"), + limit: int = Query(20, ge=1, le=100), +): + """模糊搜索指数。""" + repo = request.app.state.repo + df = repo.get_index_instruments() + if df.is_empty(): + return {"results": []} + if not q.strip(): + rows = df.head(limit).to_dicts() + return {"results": rows} + + keyword = q.strip().upper() + masks = [] + if "code" in df.columns: + masks.append(pl.col("code").cast(pl.Utf8).str.contains(keyword, literal=True)) + masks.append(pl.col("symbol").cast(pl.Utf8).str.to_uppercase().str.contains(keyword, literal=True)) + if "name" in df.columns: + masks.append(pl.col("name").cast(pl.Utf8).str.contains(q.strip(), literal=True)) + + mask = masks[0] + for m in masks[1:]: + mask = mask | m + rows = df.filter(mask).head(limit).to_dicts() + return {"results": rows} + + +@router.get("/daily") +def get_index_daily( + request: Request, + symbol: str = Query(..., description="指数代码, 如 000001.SH"), + days: int = Query(120, ge=10, le=2000), + start_date: Optional[str] = Query(None, description="起始日期 YYYY-MM-DD, 优先于 days"), + end_date: Optional[str] = Query(None, description="截止日期 YYYY-MM-DD, 默认今天"), +): + """读取指数日 K。指数数据使用独立 kline_index_* parquet。""" + repo = request.app.state.repo + end = date.fromisoformat(end_date) if end_date else date.today() + start = date.fromisoformat(start_date) if start_date else end - timedelta(days=days) + info = _index_info(repo, symbol) + + df = repo.get_index_daily(symbol, start, end) + if not df.is_empty(): + return {"symbol": symbol, "name": info.get("name"), "index_info": info, "rows": df.to_dicts(), "source": "index_enriched"} + + capset = request.app.state.capabilities + if not capset.has(Cap.KLINE_DAILY_BATCH): + return {"symbol": symbol, "name": info.get("name"), "index_info": info, "rows": [], "source": "none"} + + try: + raw = kline_sync.sync_daily_batch([symbol], count=days + 150) + except Exception as e: # noqa: BLE001 + raise HTTPException(status_code=502, detail=f"数据源 fetch failed: {e}") from e + if raw.is_empty(): + return {"symbol": symbol, "name": info.get("name"), "index_info": info, "rows": [], "source": "none"} + + enriched = compute_enriched(raw, factors=None, instruments=None) + rows = enriched.filter((pl.col("date") >= start) & (pl.col("date") <= end)).to_dicts() + return {"symbol": symbol, "name": info.get("name"), "index_info": info, "rows": rows, "source": "live"} + + +@router.get("/minute") +def get_index_minute( + request: Request, + symbol: str = Query(..., description="指数代码, 如 000001.SH"), + trade_date: date | None = Query(None, alias="date", description="交易日期, 默认今天"), +): + """实时读取指数分钟 K。不写入股票分钟 parquet。""" + repo = request.app.state.repo + info = _index_info(repo, symbol) + day = trade_date or date.today() + df = kline_sync.fetch_minute_single(symbol, day) + return { + "symbol": symbol, + "name": info.get("name"), + "index_info": info, + "date": str(day), + "rows": df.to_dicts(), + "source": "live" if not df.is_empty() else "none", + } + + +@router.post("/sync_instruments") +def sync_index_instruments(request: Request): + """同步 CN_Index 指数标的列表。""" + repo = request.app.state.repo + count = index_sync.sync_index_instruments(repo) + return {"status": "ok", "count": count} + + +@router.post("/sync_daily") +def sync_index_daily( + request: Request, + days: int = Query(365, ge=30, le=5000), +): + """同步指数日K到独立 parquet。""" + repo = request.app.state.repo + capset = request.app.state.capabilities + if not capset.has(Cap.KLINE_DAILY_BATCH): + raise HTTPException(status_code=403, detail="需要 Pro+ 权限 (batch K-line)") + end = datetime.now() + start = end - timedelta(days=days) + count = index_sync.sync_index_instruments(repo) + rows = index_sync.sync_and_persist_index_daily(repo, capset, start_date=start, end_date=end) + return {"status": "ok", "index_count": count, "rows_written": rows} diff --git a/backend/app/api/intraday.py b/backend/app/api/intraday.py new file mode 100644 index 0000000..fc715be --- /dev/null +++ b/backend/app/api/intraday.py @@ -0,0 +1,201 @@ +"""行情状态 / SSE 推送 API。 + +盘中选股相关端点已迁移至策略页面,此处仅保留全局行情基础设施。 +SSE 推送三种事件 (使用标准 SSE event 字段): + - quotes_updated: 行情数据刷新,前端 invalidate 对应 query + - strategy_alert: 策略监控/告警触发,前端弹通知 + - depth_updated: 五档盘口修正完成,前端刷新连板梯队/看板封单数据 +""" +from __future__ import annotations + +import asyncio +import json +import time + +from fastapi import APIRouter, Query, Request +from sse_starlette.sse import EventSourceResponse + +router = APIRouter(prefix="/api/intraday", tags=["quotes"]) + + +def _get_quote_service(request: Request): + """获取全局 QuoteService。""" + return getattr(request.app.state, "quote_service", None) + + +def _fallback_index_quotes_from_daily(request: Request, symbols: list[str] | None = None) -> list[dict]: + """实时指数缓存为空时,从本地指数日 K 取最近收盘价作为兜底。""" + repo = getattr(request.app.state, "repo", None) + if not repo: + return [] + + params: list[str] = [] + symbol_filter = "" + if symbols: + placeholders = ", ".join("?" for _ in symbols) + symbol_filter = f"WHERE symbol IN ({placeholders})" + params.extend(symbols) + + try: + rows = repo.execute_all( + f""" + WITH ranked AS ( + SELECT symbol, date, close, + row_number() OVER (PARTITION BY symbol ORDER BY date DESC) AS rn + FROM kline_index_daily + {symbol_filter} + ), latest AS ( + SELECT symbol, + max(CASE WHEN rn = 1 THEN date END) AS date, + max(CASE WHEN rn = 1 THEN close END) AS last_price, + max(CASE WHEN rn = 2 THEN close END) AS prev_close + FROM ranked + WHERE rn <= 2 + GROUP BY symbol + ) + SELECT latest.symbol, latest.date, latest.last_price, latest.prev_close + FROM latest + ORDER BY latest.symbol + """, + params, + ) + except Exception: # noqa: BLE001 + return [] + + out: list[dict] = [] + for symbol, dt, last_price, prev_close in rows: + change_amount = None + change_pct = None + if last_price is not None and prev_close not in (None, 0): + change_amount = float(last_price) - float(prev_close) + change_pct = change_amount / float(prev_close) * 100 + out.append({ + "symbol": symbol, + "name": None, + "date": str(dt) if dt else None, + "last_price": float(last_price) if last_price is not None else None, + "close": float(last_price) if last_price is not None else None, + "prev_close": float(prev_close) if prev_close is not None else None, + "change_amount": change_amount, + "change_pct": change_pct, + "source": "index_daily", + }) + return out + + +@router.get("/status") +def status(request: Request): + """行情状态 (来自全局 QuoteService)。""" + qs = _get_quote_service(request) + if qs: + return qs.status() + return {"enabled": False, "running": False, "symbol_count": 0, "index_symbol_count": 0, + "quote_age_ms": None, "is_trading_hours": False, "last_fetch_ms": None} + + +@router.get("/indices") +def index_quotes( + request: Request, + symbols: str | None = Query(None, description="逗号分隔的指数 symbol 列表"), +): + """返回实时指数行情缓存,不触发数据源请求。""" + symbol_list = [s.strip() for s in symbols.split(",") if s.strip()] if symbols else None + qs = _get_quote_service(request) + if not qs: + rows = _fallback_index_quotes_from_daily(request, symbol_list) + return {"rows": rows, "count": len(rows), "source": "index_daily"} + df = qs.get_index_quotes(symbol_list) + rows = df.to_dicts() if not df.is_empty() else [] + if not rows: + rows = _fallback_index_quotes_from_daily(request, symbol_list) + return {"rows": rows, "count": len(rows), "source": "index_daily"} + return {"rows": rows, "count": len(rows), "source": "realtime"} + + +@router.get("/stream") +async def quote_stream(request: Request): + """SSE 端点: 行情更新 + 告警推送 + 五档修正。 + + 使用 sse-starlette EventSourceResponse: + - 标准 SSE event 字段,前端按 event name 监听 + - 内置断线检测,客户端断开立即终止 generator + - 内置 ping 心跳,保持连接活跃 + """ + qs = _get_quote_service(request) + + async def event_generator(): + while True: + # 同时等待三类信号: 行情更新 / 告警 / 五档修正 + tasks: dict[str, asyncio.Future] = { + "quote": asyncio.ensure_future( + asyncio.to_thread(qs.wait_for_update, timeout=5.0) if qs else asyncio.sleep(5) + ), + "alert": asyncio.ensure_future( + asyncio.to_thread(qs.wait_for_alert, timeout=5.0) if qs else asyncio.sleep(5) + ), + "depth": asyncio.ensure_future( + asyncio.to_thread(qs.wait_for_depth_update, timeout=5.0) if qs else asyncio.sleep(5) + ), + } + + done, pending = await asyncio.wait( + list(tasks.values()), + timeout=30.0, + return_when=asyncio.FIRST_COMPLETED, + ) + for t in pending: + t.cancel() + + # 先推送告警 (如果有) + if qs: + alerts = qs.pop_alerts() + if alerts: + for chunk_start in range(0, len(alerts), 20): + chunk = alerts[chunk_start:chunk_start + 20] + yield { + "event": "strategy_alert", + "data": json.dumps({ + "ts": int(time.time() * 1000), + "alerts": chunk, + }, ensure_ascii=False), + } + + # 推送行情更新 (行情信号触发) + if tasks["quote"] in done: + try: + update_result = tasks["quote"].result() + except Exception: # noqa: BLE001 + update_result = False + if update_result: + yield { + "event": "quotes_updated", + "data": json.dumps({ + "ts": int(time.time() * 1000), + "symbol_count": qs._symbol_count if qs else 0, + }), + } + + # 推送五档修正完成 (depth 信号触发) — 前端刷新连板梯队封单数据 + if tasks["depth"] in done: + try: + depth_result = tasks["depth"].result() + except Exception: # noqa: BLE001 + depth_result = False + if depth_result: + yield { + "event": "depth_updated", + "data": json.dumps({ + "ts": int(time.time() * 1000), + }), + } + + return EventSourceResponse(event_generator()) + + +@router.post("/refresh") +def refresh_quotes(request: Request): + """手动刷新一次行情数据。""" + qs = _get_quote_service(request) + if qs: + return qs.refresh() + return {"error": "QuoteService not available"} diff --git a/backend/app/api/kline.py b/backend/app/api/kline.py new file mode 100644 index 0000000..ee2a54a --- /dev/null +++ b/backend/app/api/kline.py @@ -0,0 +1,813 @@ +"""K 线 / 同步 API。""" +from __future__ import annotations + +import logging +from datetime import date, timedelta +from typing import Optional + +from fastapi import APIRouter, HTTPException, Query, Request + +from app.indicators.pipeline import compute_enriched_single +from app.services import kline_sync + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/api/kline", tags=["kline"]) + + +@router.get("/instruments/search") +def search_instruments( + request: Request, + q: str = Query("", min_length=0, max_length=50, description="搜索关键词"), + limit: int = Query(20, ge=1, le=50), +): + """模糊搜索标的 (代码 / 名称)。从内存 instruments 缓存中查。""" + repo = request.app.state.repo + df = repo.get_instruments() + if df.is_empty() or not q.strip(): + return {"results": []} + + keyword = q.strip().upper() + import polars as pl + + # code/symbol 前缀优先,再 name 包含匹配 + prefix_mask = ( + pl.col("code").str.starts_with(keyword) + | pl.col("symbol").str.to_uppercase().str.starts_with(keyword) + ) + contains_mask = ( + pl.col("code").str.contains(keyword, literal=True) + | pl.col("symbol").str.to_uppercase().str.contains(keyword, literal=True) + | pl.col("name").str.contains(keyword, literal=True) + ) + + # 前缀匹配优先,剩余名额用包含匹配补充 + prefix_hits = df.filter(prefix_mask).head(limit) + if prefix_hits.height >= limit: + matched = prefix_hits + else: + remaining = limit - prefix_hits.height + # 排除已匹配的 symbol + prefix_symbols = set(prefix_hits["symbol"].to_list()) if not prefix_hits.is_empty() else set() + contain_hits = df.filter(contains_mask & ~pl.col("symbol").is_in(prefix_symbols)).head(remaining) + matched = pl.concat([prefix_hits, contain_hits]) if not prefix_hits.is_empty() else contain_hits + rows = matched.select(["symbol", "name", "code"]).to_dicts() + return {"results": rows} + + +@router.post("/instruments/names") +def instruments_names(request: Request, symbols: list[str]): + """批量查股票名称。传入 symbol 列表, 返回 {symbol: name}。""" + if not symbols: + return {"names": {}} + repo = request.app.state.repo + df = repo.get_instruments() + if df.is_empty(): + return {"names": {}} + import polars as pl + matched = df.filter(pl.col("symbol").is_in(symbols)).select(["symbol", "name"]) + names = {row["symbol"]: row["name"] for row in matched.iter_rows(named=True)} + return {"names": names} + + +def _get_stock_info(repo, symbol: str) -> dict: + """从 instruments 视图查标的名称 + 股本。""" + try: + row = repo.execute_one( + "SELECT name, total_shares, float_shares FROM instruments WHERE symbol = ? LIMIT 1", + [symbol], + ) + except Exception: # noqa: BLE001 + return {} + if not row: + return {} + return { + "name": row[0], + "total_shares": row[1], + "float_shares": row[2], + } + + +@router.get("/daily") +def get_daily( + request: Request, + symbol: str = Query(..., description="标的代码,如 000001.SZ"), + days: int = Query(120, ge=10, le=2000), + start_date: Optional[str] = Query(None, description="起始日期 YYYY-MM-DD, 优先于 days"), + end_date: Optional[str] = Query(None, description="截止日期 YYYY-MM-DD, 默认今天"), + ext_columns: Optional[str] = Query(None, description="逗号分隔的 ext 列: config_id.field_name"), +): + """读取本地 enriched 表中某只股票的日 K。 + + - 若 QuoteService 有实时行情, 追加/覆盖今日实时蜡烛 + - Free 用户: 若 enriched 表里没有该股票, 实时拉取 + 本地算 enriched 返回 + - ext_columns: 可选,动态 LEFT JOIN 扩展数据表,结果平铺到 stock_info.ext 下 + (key 为 "{config_id}__{field_name}"),供日K信息条等场景展示自定义字段 + """ + import polars as pl + + repo = request.app.state.repo + end = date.fromisoformat(end_date) if end_date else date.today() + if start_date: + start = date.fromisoformat(start_date) + else: + start = end - timedelta(days=days) + + stock_info = _get_stock_info(repo, symbol) + stock_name = stock_info.get("name") + + # 从 enriched 表读取 (已含前复权 OHLCV + 技术指标 + 信号) + df = repo.get_daily(symbol, start, end) + + if df.is_empty(): + try: + raw = kline_sync.sync_daily_batch([symbol], count=days + 30) + except Exception as e: + raise HTTPException(status_code=502, detail=f"数据源 fetch failed: {e}") from e + if raw.is_empty(): + return {"symbol": symbol, "name": stock_name, "stock_info": stock_info, "rows": []} + enriched = compute_enriched_single(raw) + rows = enriched.tail(days).to_dicts() + # 即使 live 模式也尝试追加实时蜡烛 + rows = _maybe_inject_live_candle(request, symbol, rows) + resp = {"symbol": symbol, "name": stock_name, "stock_info": stock_info, "rows": rows, "source": "live"} + return _attach_ext(resp, repo, symbol, ext_columns) + + rows = df.to_dicts() + + # 追加/覆盖今日实时蜡烛 + rows = _maybe_inject_live_candle(request, symbol, rows) + + resp = {"symbol": symbol, "name": stock_name, "stock_info": stock_info, "rows": rows, "source": "enriched"} + return _attach_ext(resp, repo, symbol, ext_columns) + + +def _attach_ext(resp: dict, repo, symbol: str, ext_columns: Optional[str]) -> dict: + """按 ext_columns 规格为单只股票 LEFT JOIN 扩展数据,平铺到 stock_info['ext']。 + + key 形如 "{config_id}__{field_name}",与自选列表 enriched 接口保持一致。 + JOIN 逻辑参考 watchlist.watchlist_enriched;任何 ext 表/字段缺失都静默跳过。 + """ + if not ext_columns or not ext_columns.strip(): + return resp + + specs: list[tuple[str, str]] = [] + for part in ext_columns.split(","): + part = part.strip() + if "." not in part: + continue + config_id, field_name = part.split(".", 1) + config_id, field_name = config_id.strip(), field_name.strip() + if config_id and field_name: + specs.append((config_id, field_name)) + if not specs: + return resp + + import polars as pl + data_dir = repo.store.data_dir + try: + from app.services.ext_data import ExtConfigStore + from app.api.ext_data import _read_ext_dataframe + ext_store = ExtConfigStore(data_dir) + configs = {c.id: c for c in ext_store.load_all()} + except Exception: # noqa: BLE001 + configs = {} + + ext_values: dict = {} + for config_id, field_name in specs: + ext_col_name = f"{config_id}__{field_name}" + value = None + try: + cfg = configs.get(config_id) + if cfg: + ext_df, _ = _read_ext_dataframe(cfg, data_dir) + else: + ext_df = pl.from_arrow( + repo.store.db.query( + f'SELECT symbol, "{field_name}" FROM ext_{config_id}' + ).arrow() + ) + if not ext_df.is_empty() and "symbol" in ext_df.columns and field_name in ext_df.columns: + # 时序表取最新分区,避免一个 symbol 多行 + row = ( + ext_df + .select(["symbol", field_name]) + .unique(subset=["symbol"], keep="last") + .filter(pl.col("symbol") == symbol) + ) + if not row.is_empty(): + value = row[field_name][0] + except Exception as e: # noqa: BLE001 + logger.debug("kline ext join failed for %s.%s: %s", config_id, field_name, e) + ext_values[ext_col_name] = value + + stock_info = dict(resp.get("stock_info") or {}) + stock_info["ext"] = ext_values + resp["stock_info"] = stock_info + return resp + + +def _maybe_inject_live_candle(request: Request, symbol: str, rows: list[dict]) -> list[dict]: + """如果 QuoteService 有实时 enriched 数据, 用实时数据生成今日蜡烛并追加/覆盖。""" + qs = getattr(request.app.state, "quote_service", None) + if not qs: + return rows + + df_today, enriched_date = qs.get_enriched_today() + if df_today.is_empty(): + return rows + + # 非交易日(周末/假日)缓存的行情日期 != 今天,跳过注入避免产生重复蜡烛 + if not enriched_date or enriched_date != date.today(): + return rows + + # 查找该 symbol 的实时 enriched 行 + import polars as pl + try: + q = df_today.filter(pl.col("symbol") == symbol).to_dicts() + if not q: + return rows + q = q[0] + except Exception: # noqa: BLE001 + return rows + + close_price = q.get("close") + if not close_price or close_price <= 0: + return rows + + today_str = str(enriched_date) + + # enriched 行已包含 OHLCV + 全套指标, 直接用它 + # 修复: API 在非交易时段可能返回 open/high/low=0, 用 close 填充避免异常蜡烛 + raw_open = q.get("open") + raw_high = q.get("high") + raw_low = q.get("low") + live_row: dict = { + "date": today_str, + "symbol": symbol, + "open": raw_open if raw_open and raw_open > 0 else close_price, + "high": raw_high if raw_high and raw_high > 0 else close_price, + "low": raw_low if raw_low and raw_low > 0 else close_price, + "close": close_price, + "volume": q.get("volume"), + "amount": q.get("amount"), + "change_pct": q.get("change_pct"), + "is_live": True, + } + # 补上 enriched 的技术指标字段 + for key in ("ma5", "ma10", "ma20", "ma30", "ma60", + "macd_dif", "macd_dea", "macd_hist", + "kdj_k", "kdj_d", "kdj_j", + "boll_upper", "boll_lower", + "rsi_6", "rsi_14", "rsi_24", + "atr_14", "vol_ratio_5d"): + if key in q and q[key] is not None: + live_row[key] = q[key] + + # 如果已有今天的 enriched 行, 覆盖; 否则追加 + found = False + for i, r in enumerate(rows): + if str(r.get("date")) == today_str: + r.update(live_row) + found = True + break + + if not found: + rows.append(live_row) + + return rows + + +class DailyBatchRequest: + """批量日K请求。""" + symbols: list[str] + days: int = 12 + + +@router.post("/daily-batch") +def get_daily_batch(request: Request, body: dict): + """批量获取多只股票最近 N 天日K (OHLCV)。 + + 用于自选列表迷你蜡烛图等场景,只返回基础列,不返回全部 enriched 指标。 + """ + symbols = body.get("symbols", []) + days = body.get("days", 12) + if not symbols: + return {"data": {}} + days = max(5, min(60, days)) + + repo = request.app.state.repo + import polars as pl + from datetime import date, timedelta + + end = date.today() + start = end - timedelta(days=days * 2) # 多取一些确保交易日够 + + cols = ["symbol", "date", "open", "high", "low", "close", "volume"] + df = repo.get_daily_batch(symbols, start, end, columns=cols) + + if df.is_empty(): + return {"data": {}} + + # 按 symbol 分组, 每只取最近 N 条 + result: dict[str, list[dict]] = {} + for sym in symbols: + sub = df.filter(pl.col("symbol") == sym).sort("date").tail(days) + if not sub.is_empty(): + result[sym] = sub.to_dicts() + + return {"data": result} + + +@router.get("/minute") +def get_minute( + request: Request, + symbol: str = Query(..., description="标的代码"), + trade_date: date | None = Query(None, alias="date", description="交易日期, 默认最新"), +): + """读取某只股票某天的分钟 K 线。 + + - 本地有完整数据(240条) → 直接返回 + - 本地无数据或不完整 → 从数据源实时拉取返回(不写入) + """ + repo = request.app.state.repo + stock_info = _get_stock_info(repo, symbol) + stock_name = stock_info.get("name") + + if trade_date is None: + trade_date = repo.latest_minute_date(symbol) + if trade_date is None: + # 本地无任何分钟K,尝试从数据源拉取当天 + trade_date = date.today() + df = kline_sync.fetch_minute_single(symbol, trade_date) + return { + "symbol": symbol, "name": stock_name, "stock_info": stock_info, + "date": str(trade_date), "rows": df.to_dicts(), "source": "live", + } + + df = repo.get_minute(symbol, trade_date) + + # 完整交易日应有 240 条分钟K;如果是今天(盘中),期望条数按已交易分钟估算 + expected = 240 + today = date.today() + if trade_date == today: + from datetime import datetime as _dt + now = _dt.now() + h, m = now.hour, now.minute + if h < 9 or (h == 9 and m < 30): + expected = 0 # 还没开盘 + elif h < 12 or (h == 12 and m == 0): + expected = (h - 9) * 60 + m - 30 # 9:30 起 + elif h < 13: + expected = 120 # 午休 + elif h < 15: + expected = 120 + (h - 13) * 60 + m + else: + expected = 240 + + is_complete = not df.is_empty() and len(df) >= expected * 0.9 # 允许 10% 容差 + + if is_complete: + return { + "symbol": symbol, "name": stock_name, "stock_info": stock_info, + "date": str(trade_date), "rows": df.to_dicts(), "source": "local", + } + + # 本地不完整或无数据 → 从数据源实时拉取 + live_df = kline_sync.fetch_minute_single(symbol, trade_date) + return { + "symbol": symbol, "name": stock_name, "stock_info": stock_info, + "date": str(trade_date), "rows": live_df.to_dicts(), + "source": "live" if not live_df.is_empty() else "none", + } + + +@router.post("/sync") +def sync_symbol( + request: Request, + symbol: str = Query(...), + days: int = Query(250, ge=10, le=2000), +): + """手动触发单股同步(Free 用户在 K 线页用)。""" + repo = request.app.state.repo + capset = request.app.state.capabilities + n = kline_sync.sync_and_persist_daily_batch([symbol], repo, capset, count=days) + return {"symbol": symbol, "rows_written": n} + + +@router.post("/sync_batch") +def sync_batch( + request: Request, + symbols: list[str], + days: int = Query(250, ge=10, le=2000), +): + repo = request.app.state.repo + capset = request.app.state.capabilities + n = kline_sync.sync_and_persist_daily_batch(symbols, repo, capset, count=days) + return {"symbols": symbols, "rows_written": n} + + +@router.post("/refresh_views") +def refresh_views(request: Request): + """刷新所有 DuckDB 视图(解决视图状态不一致问题)。""" + from app.jobs.daily_pipeline import _refresh_views + repo = request.app.state.repo + _refresh_views(repo) + return {"status": "ok"} + + +@router.post("/sync_minute") +async def sync_minute(request: Request): + """手动触发分钟 K 同步(全市场)。返回 pipeline job_id 可轮询进度。""" + import asyncio + + from app.services.pipeline_jobs import job_store + from app.api.data import invalidate_storage_cache + from app.services.preferences import get_minute_sync_days + from app.tickflow.capabilities import Cap + from app.tickflow.pools import get_pool + + repo = request.app.state.repo + capset = request.app.state.capabilities + + if not capset.has(Cap.KLINE_MINUTE_BATCH): + raise HTTPException(status_code=403, detail="需要 Pro+ 权限") + + job_id = job_store.create() + existing = job_store.get(job_id) + if existing and existing["status"] == "running": + return {"status": "reused", "job_id": job_id} + + async def task() -> None: + job_store.start(job_id) + loop = asyncio.get_event_loop() + + def progress(stage: str, pct: int, msg: str) -> None: + job_store.progress(job_id, stage, pct, msg) + + try: + progress("sync_minute", 5, "解析标的池…") + universe = sorted(set(get_pool("watchlist")) | set(get_pool("CN_Equity_A"))) + # 补充 instruments 全量标的,覆盖北交所、新股等 + inst_path = repo.store.data_dir / "instruments" / "instruments.parquet" + if inst_path.exists(): + try: + import polars as pl + inst = pl.read_parquet(inst_path, columns=["symbol"]) + universe = sorted(set(universe) | set(inst["symbol"].to_list())) + except Exception: # noqa: BLE001 + pass + progress("sync_minute", 10, f"标的池 {len(universe)} 只") + + days = get_minute_sync_days() + + def _run(): + return kline_sync.sync_and_persist_minute(universe, repo, capset, days=days) + + written = await loop.run_in_executor(_long_task_executor, _run) + + # 刷新视图 + from app.jobs.daily_pipeline import _refresh_single_view + _refresh_single_view(repo, "kline_minute") + + progress("done", 100, f"分钟 K 同步完成,{written} 行") + job_store.succeed(job_id, {"minute_rows": written, "universe_size": len(universe)}) + invalidate_storage_cache() + except Exception as e: # noqa: BLE001 + job_store.fail(job_id, str(e)) + invalidate_storage_cache() + + asyncio.create_task(task()) + return {"status": "started", "job_id": job_id} + + +@router.post("/extend_history") +async def extend_history(request: Request): + """向前扩展历史日K数据 — 独立于盘后管道。 + + body: { "value": int, "unit": "day"|"month"|"year" } + 返回 job_id,可轮询 /api/pipeline/jobs 查看进度。 + """ + import asyncio + import traceback as _tb + try: + body = await request.json() + value = body.get("value") + unit = body.get("unit", "month") + if not value or value <= 0: + raise HTTPException(status_code=400, detail="value 必须为正整数") + if unit not in ("day", "month", "year"): + raise HTTPException(status_code=400, detail="unit 只支持 day/month/year") + + repo = request.app.state.repo + capset = request.app.state.capabilities + + from app.tickflow.capabilities import Cap + if not capset.has(Cap.KLINE_DAILY_BATCH): + raise HTTPException(status_code=403, detail="需要 Pro+ 权限 (batch K-line)") + + from app.services.extend_history import run_extend_history + from app.services.pipeline_jobs import job_store + from app.api.data import invalidate_storage_cache + + job_id = job_store.create() + existing = job_store.get(job_id) + if existing and existing["status"] == "running": + return {"status": "reused", "job_id": job_id} + + async def task() -> None: + job_store.start(job_id) + loop = asyncio.get_event_loop() + + def progress(stage: str, pct: int, msg: str, + stage_pct: int | None = None, skip_log: bool = False) -> None: + job_store.progress(job_id, stage, pct, msg, + stage_pct=stage_pct, skip_log=skip_log) + + try: + result = await loop.run_in_executor( + _long_task_executor, + lambda: run_extend_history(repo, capset, value, unit, on_progress=progress), + ) + if "error" in result: + job_store.fail(job_id, result["error"]) + else: + job_store.succeed(job_id, result) + invalidate_storage_cache() + except Exception as e: + logger.exception("extend_history failed: job_id=%s", job_id) + job_store.fail(job_id, str(e)) + invalidate_storage_cache() + + asyncio.create_task(task()) + return {"status": "started", "job_id": job_id} + except HTTPException: + raise + except Exception as e: + logger.error("extend_history error: %s\n%s", e, _tb.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) from e + + +@router.post("/rebuild_enriched") +async def rebuild_enriched(request: Request): + """全量重算 enriched 表 — 不获取任何数据,仅基于已有 kline_daily + adj_factor 重算复权+指标。 + + 返回 job_id,可轮询 /api/pipeline/jobs 查看进度。 + """ + import asyncio + try: + repo = request.app.state.repo + + from app.services.pipeline_jobs import job_store + from app.api.data import invalidate_storage_cache + + job_id = job_store.create() + existing = job_store.get(job_id) + if existing and existing["status"] == "running": + return {"status": "reused", "job_id": job_id} + + async def task() -> None: + job_store.start(job_id) + loop = asyncio.get_event_loop() + + def progress(stage: str, pct: int, msg: str, + stage_pct: int | None = None, skip_log: bool = False) -> None: + job_store.progress(job_id, stage, pct, msg, + stage_pct=stage_pct, skip_log=skip_log) + + try: + progress("rebuild_enriched", 10, "全量计算 enriched…") + from app.indicators.pipeline import run_pipeline + + def _batch_progress(cur: int, tot: int) -> None: + pct = 10 + int(85 * cur / tot) + progress("rebuild_enriched", pct, + f"计算指标 批次 {cur}/{tot}", + stage_pct=int(100 * cur / tot), skip_log=True) + + written = await loop.run_in_executor( + _long_task_executor, + lambda: run_pipeline(on_batch_done=_batch_progress), + ) + + enriched_dir = repo.store.data_dir / "kline_daily_enriched" + enriched_days = len(list(enriched_dir.glob("date=*"))) if enriched_dir.exists() else 0 + + # 刷新视图 + d = repo.store.data_dir.as_posix() + for view_name, glob in [ + ("kline_enriched", f"{d}/kline_daily_enriched/**/*.parquet"), + ]: + try: + repo.db.execute( + f"CREATE OR REPLACE VIEW {view_name} AS " + f"SELECT * FROM read_parquet('{glob}', union_by_name=true)" + ) + except Exception: + pass + + progress("rebuild_enriched", 100, f"完成,覆盖 {enriched_days} 天") + job_store.succeed(job_id, { + "enriched_days": enriched_days, + "enriched_rows": written, + }) + invalidate_storage_cache() + except Exception as e: + logger.exception("rebuild_enriched failed: job_id=%s", job_id) + job_store.fail(job_id, str(e)) + invalidate_storage_cache() + + asyncio.create_task(task()) + return {"status": "started", "job_id": job_id} + except Exception as e: + import traceback as _tb + logger.error("rebuild_enriched error: %s\n%s", e, _tb.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) from e + + +# 长时间任务专用线程池(隔离于 FastAPI 默认线程池,防止阻塞请求处理) +import concurrent.futures as _cf +_long_task_executor = _cf.ThreadPoolExecutor(max_workers=2, thread_name_prefix="long-task") + + +@router.post("/extend_minute_history") +async def extend_minute_history(request: Request): + """向前扩展分钟K历史数据 — 仅拉数据,不做任何后续处理。 + + body: { "value": int, "unit": "day"|"month" } + - day 单位:1~15 天(所有有分钟K权限的套餐可用) + - month 单位:1~6 月(每月按 30 天计,即最多 180 天)—— 仅 Expert+ 可用 + 返回 job_id,可轮询 /api/pipeline/jobs 查看进度。 + """ + import asyncio + import traceback as _tb + try: + body = await request.json() + value = body.get("value") + unit = body.get("unit", "day") + if not value or value <= 0: + raise HTTPException(status_code=400, detail="value 必须为正整数") + if unit not in ("day", "month"): + raise HTTPException(status_code=400, detail="unit 只支持 day/month") + + repo = request.app.state.repo + capset = request.app.state.capabilities + + from app.tickflow.capabilities import Cap + if not capset.has(Cap.KLINE_MINUTE_BATCH): + raise HTTPException(status_code=403, detail="需要 Pro+ 权限 (batch minute K-line)") + + # month 单位(按月扩展更长的分钟K历史)仅 Expert+ 开放;Pro 仅可用 day + if unit == "month": + from app.tickflow.policy import tier_label + base_tier = tier_label().split()[0].split("+")[0].strip().lower() + if base_tier != "expert": + raise HTTPException( + status_code=403, + detail="按月扩展分钟K历史需要 Expert 及以上套餐", + ) + + # 计算天数上限:day 最多 15 天;month 最多 6 月(180 天) + from datetime import timedelta + if unit == "month": + total_days = min(value * 30, 180) + else: + total_days = min(value, 15) + + if total_days <= 0: + raise HTTPException(status_code=400, detail="扩展范围无效") + + from app.services.pipeline_jobs import job_store + from app.api.data import invalidate_storage_cache + + job_id = job_store.create() + existing = job_store.get(job_id) + if existing and existing["status"] == "running": + return {"status": "reused", "job_id": job_id} + + async def task() -> None: + job_store.start(job_id) + loop = asyncio.get_event_loop() + + def progress(stage: str, pct: int, msg: str, + stage_pct: int | None = None, skip_log: bool = False) -> None: + job_store.progress(job_id, stage, pct, msg, + stage_pct=stage_pct, skip_log=skip_log) + + try: + # 获取当前最早日期 + earliest = repo.earliest_minute_date() + if not earliest: + # 本地无分钟K数据 → 以今天为基准往前获取 + from datetime import date as _date + latest = _date.today() + else: + latest = earliest + + new_start = latest - timedelta(days=total_days) + if new_start >= latest: + job_store.fail(job_id, "扩展范围无效") + invalidate_storage_cache() + return + + start_str = new_start.strftime("%Y-%m-%d") + end_str = latest.strftime("%Y-%m-%d") + + progress("extend_minute", 5, "解析标的池…") + universe = _resolve_minute_universe(capset, repo) + progress("extend_minute", 8, f"标的池: {len(universe)} 只") + + from app.tickflow.capabilities import Cap + + lim = capset.limits(Cap.KLINE_MINUTE_BATCH) + batch_size = lim.batch if lim and lim.batch else 100 + rpm = lim.rpm if lim else 30 + + def _run(): + """全部在 executor 线程里完成,避免阻塞事件循环。""" + from app.services.kline_sync import sync_minute_batch + from datetime import datetime as _dt + + def _chunk(cur: int, tot: int) -> None: + progress("extend_minute", 8 + int(85 * cur / tot), + f"分钟K 批次 {cur}/{tot}", stage_pct=int(100 * cur / tot), skip_log=True) + + df = sync_minute_batch( + universe, + start_time=_dt.combine(new_start, _dt.min.time()), + end_time=_dt.combine(latest, _dt.min.time()), + batch_size=batch_size, rpm=rpm, + on_chunk_done=_chunk, + ) + + written = 0 + day_count = 0 + if not df.is_empty(): + import polars as pl + df = df.with_columns(pl.col("datetime").dt.date().alias("_trade_date")) + for day_df in df.partition_by("_trade_date"): + trade_date = day_df["_trade_date"][0] + out = repo.store.data_dir / "kline_minute" / f"date={trade_date}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + if out.exists(): + existing_df = pl.read_parquet(out) + if "datetime" in existing_df.columns: + existing_df = existing_df.filter(pl.col("datetime").is_not_null()) + day_df = pl.concat([existing_df, day_df.drop("_trade_date")]).unique( + subset=["symbol", "datetime"], keep="last", + ) + else: + day_df = day_df.drop("_trade_date") + day_df = day_df.sort("symbol", "datetime") + day_df.write_parquet(out) + written += day_df.height + day_count += 1 + + # 刷新视图 + d = repo.store.data_dir.as_posix() + try: + repo.db.execute( + f"CREATE OR REPLACE VIEW kline_minute AS " + f"SELECT * FROM read_parquet('{d}/kline_minute/**/*.parquet', union_by_name=true)" + ) + except Exception: + pass + return written, day_count + + progress("extend_minute", 10, f"获取分钟K [{start_str} ~ {end_str}]…") + written, day_count = await loop.run_in_executor(_long_task_executor, _run) + + progress("extend_minute", 95, f"分钟K 完成,{day_count} 天") + job_store.succeed(job_id, { + "minute_days": day_count, + "universe_size": len(universe), + "earliest_before": (earliest or latest).isoformat(), + "earliest_after": new_start.isoformat(), + }) + invalidate_storage_cache() + except Exception as e: + logger.exception("extend_minute_history failed: job_id=%s", job_id) + job_store.fail(job_id, str(e)) + invalidate_storage_cache() + + asyncio.create_task(task()) + return {"status": "started", "job_id": job_id} + except HTTPException: + raise + except Exception as e: + logger.error("extend_minute_history error: %s\n%s", e, _tb.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) from e + + +def _resolve_minute_universe(capset, repo) -> list[str]: + """分钟K标的池解析。""" + from app.tickflow.capabilities import Cap + if capset.has(Cap.KLINE_MINUTE_BATCH): + try: + from app.tickflow.pools import get_pool + all_a = get_pool("CN_Equity_A", refresh=True) + if all_a: + return sorted(all_a) + except Exception: + pass + return [] diff --git a/backend/app/api/monitor_rules.py b/backend/app/api/monitor_rules.py new file mode 100644 index 0000000..e0856af --- /dev/null +++ b/backend/app/api/monitor_rules.py @@ -0,0 +1,235 @@ +"""监控规则 API 路由 — HTTP 请求 → 调用 monitor_rules 模块 → 同步引擎内存态。 + +只做胶水: 校验 → 持久化 → 失效引擎内存态。不含评估逻辑。 +""" +from __future__ import annotations + +from pathlib import Path + +from fastapi import APIRouter, HTTPException, Request +from pydantic import BaseModel + +from app.strategy import monitor_rules + +router = APIRouter(prefix="/api/monitor-rules", tags=["monitor-rules"]) + + +def _data_dir(request: Request) -> Path: + return request.app.state.repo.store.data_dir + + +def _sync_engine(request: Request) -> None: + """保存/删除后,把最新规则集 reload 到引擎内存态。""" + engine = getattr(request.app.state, "monitor_engine", None) + if engine is not None: + rules = monitor_rules.load_all(_data_dir(request)) + engine.set_rules(rules) + + +# ── Pydantic 模型 ─────────────────────────────────────── +class ConditionModel(BaseModel): + field: str + op: str # truth | > >= < <= == != + value: float | None = None # op 非 truth 时必填 + + +class RuleModel(BaseModel): + id: str + name: str + enabled: bool = True + type: str # strategy | signal | price | market + scope: str = "symbols" # symbols | all | sector + symbols: list[str] = [] + sector: str | None = None + strategy_id: str | None = None + direction: str = "entry" # entry | exit | both + conditions: list[ConditionModel] = [] + logic: str = "and" # and | or + cooldown_seconds: int = 3600 + severity: str = "info" # info | warn | critical + webhook_url: str = "" # Webhook 推送地址 (推送到 QMT 等外部软件, 开发中) + webhook_enabled: bool = False + message: str = "" + + +# ── 字段选项 ───────────────────────────────────────────── +@router.get("/options") +def get_options(request: Request): + """返回可选字段、信号列、运算符、枚举,供前端表单使用。""" + from app.indicators.pipeline import ENRICHED_COLUMNS + from app.strategy.custom_signals import ALLOWED_FIELDS, load_all as load_csg + + # 阈值字段 (带中文标签) + threshold_fields = [ + {"key": f, "label": ENRICHED_COLUMNS.get(f, f)} + for f in sorted(ALLOWED_FIELDS) + ] + # 内置信号列 (布尔, 用于 op=truth) + builtin_signals = [ + {"key": k, "label": v} + for k, v in ENRICHED_COLUMNS.items() + if k.startswith("signal_") + ] + # 自定义信号列 (csg_) + custom_sigs = [] + try: + for cs in load_csg(_data_dir(request)): + if cs.get("enabled") is not False: + custom_sigs.append({ + "key": f"csg_{cs['id']}", + "label": cs.get("name", cs["id"]), + }) + except Exception: + pass + + return { + "threshold_fields": threshold_fields, + "builtin_signals": builtin_signals, + "custom_signals": custom_sigs, + "operators": [">", ">=", "<", "<=", "==", "!="], + "types": [ + {"key": "signal", "label": "个股信号"}, + {"key": "price", "label": "价格/涨跌"}, + {"key": "market", "label": "市场异动"}, + {"key": "strategy", "label": "策略监控"}, + ], + "scopes": [ + {"key": "symbols", "label": "指定股票"}, + {"key": "all", "label": "全市场"}, + {"key": "sector", "label": "板块"}, + ], + "logics": [ + {"key": "and", "label": "全部满足 (AND)"}, + {"key": "or", "label": "任一满足 (OR)"}, + ], + "severities": [ + {"key": "info", "label": "普通"}, + {"key": "warn", "label": "警告"}, + {"key": "critical", "label": "重要"}, + ], + "directions": [ + {"key": "entry", "label": "买入"}, + {"key": "exit", "label": "卖出"}, + {"key": "both", "label": "买卖都报"}, + ], + } + + +# ── 列表 ─────────────────────────────────────────────── +@router.get("") +def list_rules(request: Request): + rules = monitor_rules.load_all(_data_dir(request)) + # 按 created_at 倒序 + rules.sort(key=lambda r: r.get("created_at", ""), reverse=True) + return {"rules": rules} + + +# ── 新建 / 更新 ──────────────────────────────────────── +@router.post("") +def save_rule(req: RuleModel, request: Request): + rule = monitor_rules.normalize(req.model_dump()) + # 编辑现有规则时, 保留原 created_at (避免按时间排序时位置跳动) + existing = monitor_rules.load_one(_data_dir(request), rule["id"]) + if existing and existing.get("created_at"): + rule["created_at"] = existing["created_at"] + try: + monitor_rules.validate(rule) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + monitor_rules.save_one(_data_dir(request), rule) + _sync_engine(request) + return {"ok": True, "rule": rule} + + +# ── 删除 ─────────────────────────────────────────────── +@router.delete("/{rule_id}") +def delete_rule(rule_id: str, request: Request): + if not monitor_rules.ID_RE.match(rule_id): + raise HTTPException(status_code=400, detail="规则 id 非法") + deleted = monitor_rules.delete_one(_data_dir(request), rule_id) + if not deleted: + raise HTTPException(status_code=404, detail="规则不存在") + _sync_engine(request) + return {"ok": True} + + +# ── 演示数据生成 (仅 Dev 页用) ───────────────────────── + +import time as _time +from datetime import datetime, timezone + + +def _demo_rule(rule_id: str, name: str, rtype: str, scope: str, symbols: list[str], + conditions: list[dict], logic: str = "or", cooldown: int = 3600, + severity: str = "info", message: str = "", + strategy_id: str | None = None, direction: str = "entry") -> dict: + rule = monitor_rules.normalize({ + "id": rule_id, + "name": name, + "type": rtype, + "scope": scope, + "symbols": symbols, + "conditions": conditions, + "logic": logic, + "cooldown_seconds": cooldown, + "severity": severity, + "message": message, + "enabled": True, + }) + if rtype == "strategy": + rule["strategy_id"] = strategy_id + rule["direction"] = direction + return rule + + +_DEMO_RULES_TEMPLATE = [ + ("个股信号 · 茅台放量突破", "signal", "symbols", ["600519.SH"], + [{"field": "signal_volume_surge", "op": "truth"}, + {"field": "signal_n_day_high", "op": "truth"}], "or", "info"), + ("个股信号 · 宁德金叉", "signal", "symbols", ["300750.SZ"], + [{"field": "signal_ma_golden_5_20", "op": "truth"}], "or", "info"), + ("价格 · 平安跌幅监控", "price", "symbols", ["000001.SZ"], + [{"field": "change_pct", "op": "<", "value": -0.03}], "or", "warn", "warn"), + ("价格 · 比亚迪RSI超卖", "price", "symbols", ["002594.SZ"], + [{"field": "rsi_14", "op": "<", "value": 30}], "and", "warn", "warn"), + ("市场异动 · 全市场涨停", "market", "all", [], + [{"field": "signal_limit_up", "op": "truth"}], "or", "critical", "critical"), + ("市场异动 · 全市场炸板", "market", "all", [], + [{"field": "signal_broken_limit_up", "op": "truth"}], "or", "warn", "warn"), + ("市场异动 · 跌幅超5%", "market", "all", [], + [{"field": "change_pct", "op": "<", "value": -0.05}], "or", "warn", "warn"), + ("个股信号 · 茅台跌破MA20", "signal", "symbols", ["600519.SH"], + [{"field": "signal_ma20_breakdown", "op": "truth"}], "or", "info"), +] + +# 策略类型单独声明 (格式不同: 含 strategy_id + direction) +_DEMO_STRATEGY_RULES: list[dict] = [ + {"name": "策略监控 · 趋势突破", "strategy_id": "trend_breakout", "direction": "entry"}, + {"name": "策略监控 · MACD金叉", "strategy_id": "macd_golden", "direction": "both"}, +] + + +@router.post("/seed") +def seed_demo_rules(request: Request): + """生成演示监控规则 (Dev 页用)。覆盖 signal/price/market/strategy 四类。""" + ts = int(_time.time() * 1000) + created = [] + i = 0 + for (name, rtype, scope, symbols, conditions, logic, severity, sev) in _DEMO_RULES_TEMPLATE: + rule_id = f"demo_{ts}_{i}" + rule = _demo_rule(rule_id, name, rtype, scope, symbols, conditions, logic, 3600, sev) + monitor_rules.save_one(_data_dir(request), rule) + created.append(rule_id) + i += 1 + # 策略类型规则 + for sr in _DEMO_STRATEGY_RULES: + rule_id = f"demo_{ts}_{i}" + rule = _demo_rule( + rule_id, sr["name"], "strategy", "all", [], [], "and", 3600, "info", + strategy_id=sr["strategy_id"], direction=sr.get("direction", "entry"), + ) + monitor_rules.save_one(_data_dir(request), rule) + created.append(rule_id) + i += 1 + _sync_engine(request) + return {"ok": True, "generated": len(created), "ids": created} diff --git a/backend/app/api/overview.py b/backend/app/api/overview.py new file mode 100644 index 0000000..c6367c1 --- /dev/null +++ b/backend/app/api/overview.py @@ -0,0 +1,570 @@ +"""市场总览聚合 API。""" +from __future__ import annotations + +import math +import re +import time +from datetime import date +from typing import Any + +import polars as pl +from fastapi import APIRouter, Request + +from app.services.ext_data import ExtConfig, ExtConfigStore +from app.services.screener import ScreenerService + +router = APIRouter(prefix="/api/overview", tags=["overview"]) + +_CACHE_TTL = 5.0 +_cache: dict[str, Any] | None = None +_cache_key: str | None = None +_cache_ts: float = 0.0 + + +def invalidate_overview_cache() -> None: + """清空总览聚合结果缓存。 + + 清除数据后调用, 避免看板在 TTL 窗口内继续返回旧的聚合结果。 + """ + global _cache, _cache_key, _cache_ts + _cache = None + _cache_key = None + _cache_ts = 0.0 + + +CORE_INDEX_NAMES = { + "000001.SH": "上证指数", + "399001.SZ": "深证成指", + "399006.SZ": "创业板指", + "000680.SH": "科创综指", +} +CORE_INDEX_SYMBOLS = tuple(CORE_INDEX_NAMES.keys()) + +_DIMENSION_SEP = re.compile(r"[、,,;;|/\s]+") + + +def _dimension_field(config: ExtConfig, kind: str) -> str | None: + candidates = ["概念", "concept", "theme"] if kind == "concept" else ["行业", "industry", "sector"] + for candidate in candidates: + needle = candidate.lower() + for field in config.fields: + haystack = f"{field.name} {field.label}".lower() + if needle in haystack: + return field.name + return None + + +def _ext_files(data_dir, config: ExtConfig) -> list[str]: + base = data_dir / "ext_data" / config.id + if config.mode == "timeseries": + root = base / "timeseries" + return [str(p) for p in sorted(root.rglob("*.parquet")) if p.is_file()] + return [str(p) for p in sorted(base.glob("*.parquet")) if p.is_file()] + + +def _read_ext_rows(data_dir, config: ExtConfig, dimension_field: str) -> list[dict]: + files = _ext_files(data_dir, config) + if not files: + return [] + try: + df = pl.read_parquet(files, hive_partitioning=True) + except TypeError: + try: + df = pl.read_parquet(files) + except Exception: # noqa: BLE001 + return [] + except Exception: # noqa: BLE001 + return [] + if df.is_empty() or dimension_field not in df.columns: + return [] + + if config.mode == "timeseries" and "date" in df.columns: + latest = df.get_column("date").max() + if latest is not None: + df = df.filter(pl.col("date") == latest) + + symbol_cols = ["symbol", "code", "股票代码", "代码"] + for mapping in (config.symbol_map, config.code_map): + if isinstance(mapping, dict) and mapping.get("type") == "mapped" and mapping.get("col"): + symbol_cols.append(str(mapping["col"])) + cols = [] + for col in [dimension_field, *symbol_cols]: + if col in df.columns and col not in cols: + cols.append(col) + return df.select(cols).to_dicts() + + +def _dimension_values(raw: Any) -> list[str]: + if raw is None: + return [] + values = [v.strip() for v in _DIMENSION_SEP.split(str(raw).strip()) if v.strip()] + return values + + +def _symbol_keys(row: dict, config: ExtConfig) -> list[str]: + fields = ["symbol", "code", "股票代码", "代码"] + for mapping in (config.symbol_map, config.code_map): + if isinstance(mapping, dict) and mapping.get("type") == "mapped" and mapping.get("col"): + fields.append(str(mapping["col"])) + + keys: list[str] = [] + for field in fields: + raw = row.get(field) + if raw is None: + continue + text = str(raw).strip().upper() + if not text: + continue + keys.append(text) + if "." in text: + keys.append(text.split(".", 1)[0]) + return keys + + +def _dimension_rank(rows: list[dict], request: Request, kind: str, limit: int = 5, level: int | None = None) -> dict: + if not rows: + return {"leading": [], "lagging": []} + + quote_map: dict[str, dict] = {} + for row in rows: + symbol = str(row.get("symbol") or "").strip().upper() + if not symbol: + continue + quote_map[symbol] = row + quote_map[symbol.split(".", 1)[0]] = row + + store = ExtConfigStore(request.app.state.repo.store.data_dir) + groups: dict[str, dict[str, dict]] = {} + for config in store.load_all(): + field = _dimension_field(config, kind) + if not field: + continue + for ext_row in _read_ext_rows(request.app.state.repo.store.data_dir, config, field): + quote = None + for key in _symbol_keys(ext_row, config): + quote = quote_map.get(key) + if quote: + break + if not quote: + continue + symbol = str(quote.get("symbol") or "") + for value in _dimension_values(ext_row.get(field)): + # 行业按 "-" 拆分级: "银行-银行-股份制银行" → level=2 取"银行"(二级) + if level is not None and "-" in value: + parts = value.split("-") + value = parts[level - 1] if level <= len(parts) else parts[-1] + groups.setdefault(value, {})[symbol] = quote + + items = [] + for name, by_symbol in groups.items(): + stocks = list(by_symbol.values()) + changes = [_finite(s.get("change_pct")) for s in stocks] + changes = [v for v in changes if v is not None] + if not changes: + continue + leader = max(stocks, key=lambda s: _finite(s.get("change_pct")) or -999) + items.append({ + "name": name, + "count": len(stocks), + "avg_pct": sum(changes) / len(changes), + "up_count": sum(1 for v in changes if v > 0), + "down_count": sum(1 for v in changes if v < 0), + "amount": sum(_finite(s.get("amount")) or 0 for s in stocks), + "leader": { + "symbol": leader.get("symbol"), + "name": leader.get("name"), + "change_pct": _finite(leader.get("change_pct")), + }, + }) + + leading = sorted(items, key=lambda x: x["avg_pct"], reverse=True)[:limit] + lagging = sorted(items, key=lambda x: x["avg_pct"])[:limit] + return {"leading": leading, "lagging": lagging} + + +def _finite(v: Any) -> float | None: + if v is None: + return None + try: + f = float(v) + except (TypeError, ValueError): + return None + return f if math.isfinite(f) else None + + +def _json_safe(value: Any) -> Any: + if isinstance(value, dict): + return {k: _json_safe(v) for k, v in value.items()} + if isinstance(value, list): + return [_json_safe(v) for v in value] + if isinstance(value, float) and not math.isfinite(value): + return None + return value + + +def _board(symbol: str) -> str: + if symbol.endswith(".BJ"): + return "北交所" + if symbol.startswith(("300", "301")): + return "创业板" + if symbol.startswith(("688", "689")): + return "科创板" + if symbol.endswith(".SH"): + return "沪主板" + if symbol.endswith(".SZ"): + return "深主板" + return "其他" + + +def _score(value: float, low: float, high: float) -> int: + if high <= low: + return 50 + return max(0, min(100, round((value - low) / (high - low) * 100))) + + +def _quote_status(request: Request) -> dict: + qs = getattr(request.app.state, "quote_service", None) + if not qs: + return {"enabled": False, "running": False, "quote_age_ms": None, "is_trading_hours": False} + return qs.status() + + +def _index_quotes(request: Request, as_of: date | None = None) -> list[dict]: + qs = getattr(request.app.state, "quote_service", None) + rows: list[dict] = [] + if qs and as_of is None: + df = qs.get_index_quotes(list(CORE_INDEX_SYMBOLS)) + if not df.is_empty(): + rows = df.to_dicts() + + if not rows: + repo = getattr(request.app.state, "repo", None) + if repo: + placeholders = ", ".join("?" for _ in CORE_INDEX_SYMBOLS) + try: + db_rows = repo.execute_all( + f""" + WITH ranked AS ( + SELECT symbol, date, close, + row_number() OVER (PARTITION BY symbol ORDER BY date DESC) AS rn + FROM kline_index_daily + WHERE symbol IN ({placeholders}) + AND (? IS NULL OR date <= ?) + ), latest AS ( + SELECT symbol, + max(CASE WHEN rn = 1 THEN date END) AS date, + max(CASE WHEN rn = 1 THEN close END) AS last_price, + max(CASE WHEN rn = 2 THEN close END) AS prev_close + FROM ranked + WHERE rn <= 2 + GROUP BY symbol + ) + SELECT symbol, date, last_price, prev_close + FROM latest + """, + [*CORE_INDEX_SYMBOLS, as_of, as_of], + ) + except Exception: # noqa: BLE001 + db_rows = [] + for symbol, dt, last_price, prev_close in db_rows: + change_amount = None + change_pct = None + lp = _finite(last_price) + pc = _finite(prev_close) + if lp is not None and pc not in (None, 0): + change_amount = lp - pc + change_pct = change_amount / pc * 100 + rows.append({ + "symbol": symbol, + "name": CORE_INDEX_NAMES.get(symbol), + "date": str(dt) if dt else None, + "last_price": lp, + "close": lp, + "prev_close": pc, + "change_amount": change_amount, + "change_pct": change_pct, + }) + + by_symbol = {r.get("symbol"): r for r in rows} + out = [] + for symbol in CORE_INDEX_SYMBOLS: + r = by_symbol.get(symbol, {"symbol": symbol}) + out.append({ + "symbol": symbol, + "name": r.get("name") or CORE_INDEX_NAMES[symbol], + "last_price": _finite(r.get("last_price") if r.get("last_price") is not None else r.get("close")), + "change_pct": _finite(r.get("change_pct")), + "change_amount": _finite(r.get("change_amount")), + }) + return out + + +def _top_rows(rows: list[dict], key: str, descending: bool, limit: int = 8) -> list[dict]: + filtered = [r for r in rows if _finite(r.get(key)) is not None] + filtered.sort(key=lambda r: _finite(r.get(key)) or 0, reverse=descending) + return [ + { + "symbol": r.get("symbol"), + "name": r.get("name"), + "close": _finite(r.get("close")), + "change_pct": _finite(r.get("change_pct")), + "amount": _finite(r.get("amount")), + "turnover_rate": _finite(r.get("turnover_rate")), + "board": _board(str(r.get("symbol") or "")), + } + for r in filtered[:limit] + ] + + +def _pct_band_rows(values: list[float]) -> list[dict]: + bands = [ + ("<-5%", None, -0.05), + ("-5~-3%", -0.05, -0.03), + ("-3~-1%", -0.03, -0.01), + ("-1~0%", -0.01, 0), + ("0~1%", 0, 0.01), + ("1~3%", 0.01, 0.03), + ("3~5%", 0.03, 0.05), + (">5%", 0.05, None), + ] + total = len(values) or 1 + out = [] + for label, low, high in bands: + count = 0 + for v in values: + if low is None and v < high: + count += 1 + elif high is None and v >= low: + count += 1 + elif low is not None and high is not None and low <= v < high: + count += 1 + out.append({"label": label, "count": count, "pct": count / total * 100}) + return out + + +def _build_overview(request: Request, as_of: date | None = None) -> dict: + repo = request.app.state.repo + svc = ScreenerService(repo) + as_of = as_of or svc.latest_date() + status = _quote_status(request) + indices = _index_quotes(request, as_of) + + if not as_of: + return { + "as_of": None, + "quote_status": status, + "indices": indices, + "breadth": {"total": 0, "up": 0, "down": 0, "flat": 0, "up_pct": 0, "down_pct": 0}, + "amount": {"total": 0, "avg": 0}, + "boards": [], + "limit": {"limit_up": 0, "broken": 0, "failed": 0, "limit_down": 0, "max_boards": 0, "tiers": []}, + "distribution": [], + "trend": {"above_ma5": 0, "above_ma20": 0, "above_ma60": 0, "above_ma5_pct": 0, "above_ma20_pct": 0, "above_ma60_pct": 0, "new_high": 0, "new_low": 0}, + "activity": {"avg_turnover": 0, "high_turnover": 0, "high_vol_ratio": 0, "vol_ratio": 1}, + "radar": [], + "emotion": {"score": 50, "label": "暂无"}, + "top_gainers": [], + "top_losers": [], + "turnover_leaders": [], + "active_leaders": [], + "concept_rank": {"leading": [], "lagging": []}, + "industry_rank": {"leading": [], "lagging": []}, + } + + df = svc._load_enriched_for_date(as_of) + if df.is_empty(): + rows: list[dict] = [] + else: + cols = [ + "symbol", "name", "close", "change_pct", "amount", "turnover_rate", "volume", + "vol_ratio_5d", "consecutive_limit_ups", "signal_limit_up", "signal_broken_limit_up", "signal_limit_down", + "ma5", "ma20", "ma60", "high_60d", "low_60d", "signal_n_day_high", "signal_n_day_low", + ] + df = df.select([c for c in cols if c in df.columns]) + rows = df.to_dicts() + + # 过滤真停牌(volume=0 且 change_pct=0),保留有涨跌幅的浮点误差股以对齐同花顺口径 + if rows and "volume" in rows[0]: + rows = [r for r in rows + if (_finite(r.get("volume")) or 0) > 0 + or (_finite(r.get("change_pct")) or 0) != 0] + + total = len(rows) + up = sum(1 for r in rows if (_finite(r.get("change_pct")) or 0) > 0) + down = sum(1 for r in rows if (_finite(r.get("change_pct")) or 0) < 0) + flat = max(0, total - up - down) + up_pct = up / total * 100 if total else 0 + down_pct = down / total * 100 if total else 0 + + amounts = [_finite(r.get("amount")) or 0 for r in rows] + total_amount = sum(amounts) + avg_amount = total_amount / total if total else 0 + + pct_values = [_finite(r.get("change_pct")) for r in rows] + pct_values = [v for v in pct_values if v is not None] + avg_pct = sum(pct_values) / len(pct_values) if pct_values else 0 + median_pct = sorted(pct_values)[len(pct_values) // 2] if pct_values else 0 + strong_up = sum(1 for v in pct_values if v >= 0.03) + strong_down = sum(1 for v in pct_values if v <= -0.03) + + limit_up = sum(1 for r in rows if bool(r.get("signal_limit_up")) or (_finite(r.get("consecutive_limit_ups")) or 0) > 0) + broken = sum(1 for r in rows if bool(r.get("signal_broken_limit_up"))) + limit_down = sum(1 for r in rows if bool(r.get("signal_limit_down"))) + max_boards = max([int(_finite(r.get("consecutive_limit_ups")) or 0) for r in rows], default=0) + + # 五档 sealed 修正: 假涨停/假跌停不计入(需 Pro+ depth5.batch 能力) + depth_svc = getattr(request.app.state, "depth_service", None) + sealed_ready = False + fake_up = 0 + fake_down = 0 + if depth_svc: + up_map = depth_svc.get_sealed_map(as_of, is_down=False) + down_map = depth_svc.get_sealed_map(as_of, is_down=True) + sealed_ready = bool(up_map or down_map) and depth_svc.is_sealed_ready(as_of) + if up_map: + fake_up = sum(1 for v in up_map.values() if v.get("sealed") is False) + if down_map: + fake_down = sum(1 for v in down_map.values() if v.get("sealed") is False) + if sealed_ready: + limit_up = max(0, limit_up - fake_up) + limit_down = max(0, limit_down - fake_down) + + seal_rate = limit_up / (limit_up + broken) * 100 if (limit_up + broken) > 0 else 0 + + def above_ma_count(ma_key: str) -> int: + return sum(1 for r in rows if (_finite(r.get("close")) is not None and _finite(r.get(ma_key)) is not None and (_finite(r.get("close")) or 0) >= (_finite(r.get(ma_key)) or 0))) + + above_ma5 = above_ma_count("ma5") + above_ma20 = above_ma_count("ma20") + above_ma60 = above_ma_count("ma60") + new_high = sum(1 for r in rows if bool(r.get("signal_n_day_high")) or (_finite(r.get("close")) is not None and _finite(r.get("high_60d")) is not None and (_finite(r.get("close")) or 0) >= (_finite(r.get("high_60d")) or 0))) + new_low = sum(1 for r in rows if bool(r.get("signal_n_day_low")) or (_finite(r.get("close")) is not None and _finite(r.get("low_60d")) is not None and (_finite(r.get("close")) or 0) <= (_finite(r.get("low_60d")) or 0))) + + turnovers = [_finite(r.get("turnover_rate")) for r in rows] + turnovers = [v for v in turnovers if v is not None] + avg_turnover = sum(turnovers) / len(turnovers) if turnovers else 0 + high_turnover = sum(1 for v in turnovers if v >= 5) + + boards_map: dict[str, dict] = {} + for r in rows: + b = _board(str(r.get("symbol") or "")) + item = boards_map.setdefault(b, {"board": b, "count": 0, "up": 0, "down": 0, "amount": 0.0}) + item["count"] += 1 + change = _finite(r.get("change_pct")) or 0 + if change > 0: + item["up"] += 1 + elif change < 0: + item["down"] += 1 + item["amount"] += _finite(r.get("amount")) or 0 + boards = sorted(boards_map.values(), key=lambda x: x["amount"], reverse=True) + for b in boards: + count = b["count"] or 1 + b["up_pct"] = b["up"] / count * 100 + + tiers_map: dict[int, int] = {} + for r in rows: + n = int(_finite(r.get("consecutive_limit_ups")) or 0) + if n > 0: + tiers_map[n] = tiers_map.get(n, 0) + 1 + tiers = [{"boards": k, "count": v} for k, v in sorted(tiers_map.items(), key=lambda item: -item[0])] + + index_changes = [_finite(r.get("change_pct")) for r in indices] + index_changes = [v for v in index_changes if v is not None] + avg_index_pct = sum(index_changes) / len(index_changes) if index_changes else 0 + vol_ratios = [_finite(r.get("vol_ratio_5d")) for r in rows] + vol_ratios = [v for v in vol_ratios if v is not None] + avg_vol_ratio = sum(vol_ratios) / len(vol_ratios) if vol_ratios else 1 + high_vol_ratio = sum(1 for v in vol_ratios if v >= 1.5) + + concept_rank = _dimension_rank(rows, request, "concept") + industry_rank = _dimension_rank(rows, request, "industry", level=2) + + strong_diff_pct = (strong_up - strong_down) / total * 100 if total else 0 + high_vol_pct = high_vol_ratio / total * 100 if total else 0 + strong_down_pct = strong_down / total * 100 if total else 0 + tier2_count = sum(t["count"] for t in tiers if t["boards"] >= 2) + mainline_items = [*concept_rank["leading"][:3], *industry_rank["leading"][:3]] + mainline_avg = max([_finite(item.get("avg_pct")) or 0 for item in mainline_items], default=0) + mainline_cover_pct = max([(_finite(item.get("count")) or 0) / total * 100 for item in mainline_items], default=0) if total else 0 + mainline_score = round(_score(mainline_avg, -0.005, 0.03) * 0.65 + _score(mainline_cover_pct, 1, 12) * 0.35) if mainline_items else 50 + + radar = [ + {"key": "index", "label": "指数", "value": _score(avg_index_pct, -2.5, 2.5)}, + {"key": "profit", "label": "赚钱", "value": round(_score(up_pct, 20, 80) * 0.45 + _score(avg_pct, -0.02, 0.02) * 0.25 + _score(median_pct, -0.02, 0.02) * 0.20 + _score(strong_diff_pct, -8, 8) * 0.10)}, + {"key": "money", "label": "量能", "value": round(_score(avg_vol_ratio, 0.6, 1.8) * 0.70 + _score(high_vol_pct, 2, 12) * 0.30)}, + {"key": "speculation", "label": "投机", "value": round(_score(limit_up, 5, 90) * 0.25 + _score(seal_rate, 30, 85) * 0.35 + _score(max_boards, 1, 8) * 0.25 + _score(tier2_count, 0, 30) * 0.15)}, + {"key": "resilience", "label": "抗跌", "value": 100 - round(_score(down_pct, 20, 80) * 0.55 + _score(strong_down_pct, 1, 12) * 0.45)}, + {"key": "mainline", "label": "主线", "value": mainline_score}, + ] + emotion_score = round(sum(r["value"] for r in radar) / len(radar)) if radar else 50 + if emotion_score >= 70: + emotion_label = "强势" + elif emotion_score >= 55: + emotion_label = "偏暖" + elif emotion_score >= 45: + emotion_label = "震荡" + elif emotion_score >= 30: + emotion_label = "偏冷" + else: + emotion_label = "冰点" + + return _json_safe({ + "as_of": str(as_of), + "quote_status": status, + "indices": indices, + "breadth": { + "total": total, + "up": up, + "down": down, + "flat": flat, + "up_pct": up_pct, + "down_pct": down_pct, + "avg_pct": avg_pct, + "median_pct": median_pct, + "strong_up": strong_up, + "strong_down": strong_down, + }, + "amount": {"total": total_amount, "avg": avg_amount}, + "boards": boards, + "limit": {"limit_up": limit_up, "broken": broken, "failed": 0, "limit_down": limit_down, "max_boards": max_boards, "seal_rate": seal_rate, "tiers": tiers, "sealed_ready": sealed_ready, "fake_up": fake_up, "fake_down": fake_down}, + "distribution": _pct_band_rows(pct_values), + "trend": { + "above_ma5": above_ma5, + "above_ma20": above_ma20, + "above_ma60": above_ma60, + "above_ma5_pct": above_ma5 / total * 100 if total else 0, + "above_ma20_pct": above_ma20 / total * 100 if total else 0, + "above_ma60_pct": above_ma60 / total * 100 if total else 0, + "new_high": new_high, + "new_low": new_low, + }, + "activity": { + "avg_turnover": avg_turnover, + "high_turnover": high_turnover, + "high_vol_ratio": high_vol_ratio, + "vol_ratio": avg_vol_ratio, + }, + "radar": radar, + "emotion": {"score": emotion_score, "label": emotion_label}, + "top_gainers": _top_rows(rows, "change_pct", True), + "top_losers": _top_rows(rows, "change_pct", False), + "turnover_leaders": _top_rows(rows, "amount", True), + "active_leaders": _top_rows(rows, "turnover_rate", True), + "concept_rank": concept_rank, + "industry_rank": industry_rank, + }) + + +@router.get("/market") +def market_overview(request: Request, as_of: date | None = None): + """总览页单次请求聚合数据,避免前端拉全市场明细后再计算。""" + global _cache, _cache_key, _cache_ts + now = time.time() + cache_key = as_of.isoformat() if as_of else "latest" + if _cache is not None and _cache_key == cache_key and (now - _cache_ts) < _CACHE_TTL: + return _cache + data = _build_overview(request, as_of) + _cache = data + _cache_key = cache_key + _cache_ts = now + return data diff --git a/backend/app/api/pipeline.py b/backend/app/api/pipeline.py new file mode 100644 index 0000000..11f522b --- /dev/null +++ b/backend/app/api/pipeline.py @@ -0,0 +1,107 @@ +"""盘后管道 API — 异步触发 + 进度跟踪。""" +from __future__ import annotations + +import asyncio +import concurrent.futures as _cf +import logging + +from fastapi import APIRouter, HTTPException, Request + +from app.jobs import daily_pipeline +from app.services.pipeline_jobs import job_store +from app.api.data import invalidate_storage_cache + +# 长时间任务专用线程池(隔离于 FastAPI 默认线程池,防止阻塞请求处理) +_long_task_executor = _cf.ThreadPoolExecutor(max_workers=2, thread_name_prefix="long-task") + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/api/pipeline", tags=["pipeline"]) + + +@router.post("/run") +async def run_now(request: Request) -> dict: + """异步触发盘后管道,立即返回 job_id。客户端轮询 /jobs/{id} 拿进度。 + + 若已有任务在跑,**返回该任务 id 而不是开新任务**(防止并发拉数据撞限流)。 + 但如果该任务已运行超过 10 分钟 (可能因 reload 卡死), 强制标记为失败后重新创建。 + """ + repo = request.app.state.repo + capset = request.app.state.capabilities + + # 检测卡死的 running job (如 reload 后孤儿 task) + existing_id = job_store.active_id() + if existing_id: + existing = job_store.get(existing_id) + if existing and existing["status"] == "running": + from datetime import datetime, timezone + started = existing.get("started_at") + if started: + try: + start_dt = datetime.fromisoformat(started.replace("Z", "+00:00")) + elapsed = (datetime.now(timezone.utc) - start_dt).total_seconds() + if elapsed > 600: # 超过 10 分钟视为卡死 + logger.warning("强制取消卡死 job %s (已运行 %.0fs)", existing_id, elapsed) + job_store.fail(existing_id, "超时自动取消 (疑似 reload 后孤儿 task)") + except Exception: + pass + + job_id = job_store.create() + + # 如果是复用的 active job,直接返回(不重启) + existing = job_store.get(job_id) + if existing and existing["status"] == "running": + return {"job_id": job_id, "reused": True} + + # 在 executor 里跑同步任务(pipeline 内部都是阻塞 IO + CPU) + async def task() -> None: + job_store.start(job_id) + loop = asyncio.get_event_loop() + + def progress(stage: str, pct: int, msg: str, stage_pct: int | None = None, + skip_log: bool = False) -> None: + job_store.progress(job_id, stage, pct, msg, stage_pct=stage_pct, skip_log=skip_log) + + try: + result = await loop.run_in_executor( + _long_task_executor, + lambda: daily_pipeline.run_now(repo, capset, on_progress=progress), + ) + job_store.succeed(job_id, result) + invalidate_storage_cache() + repo.refresh_cache() # 刷新 Polars 缓存 + except Exception as e: # noqa: BLE001 + logger.exception("pipeline failed") + job_store.fail(job_id, str(e)) + invalidate_storage_cache() + + asyncio.create_task(task()) + return {"job_id": job_id, "reused": False} + + +@router.get("/jobs/{job_id}") +def get_job(job_id: str) -> dict: + j = job_store.get(job_id) + if not j: + raise HTTPException(status_code=404, detail="job not found") + return j + + +@router.post("/jobs/{job_id}/cancel") +def cancel_job(job_id: str) -> dict: + """手动取消一个 running 的 job。""" + j = job_store.get(job_id) + if not j: + raise HTTPException(status_code=404, detail="job not found") + if j["status"] not in ("running", "pending"): + raise HTTPException(status_code=400, detail=f"job status is {j['status']}, cannot cancel") + job_store.fail(job_id, "用户手动取消") + return {"cancelled": job_id} + + +@router.get("/jobs") +def list_jobs(limit: int = 20) -> dict: + return { + "active_id": job_store.active_id(), + "jobs": job_store.list_recent(limit=limit), + } diff --git a/backend/app/api/routes.py b/backend/app/api/routes.py new file mode 100644 index 0000000..d0df268 --- /dev/null +++ b/backend/app/api/routes.py @@ -0,0 +1,40 @@ +"""API 路由 — Phase 0 仅 /health 与 /api/capabilities。""" +from __future__ import annotations + +from fastapi import APIRouter + +from app import __version__ +from app.tickflow import client as tf_client +from app.tickflow.policy import detect_capabilities, tier_label + +router = APIRouter() + + +@router.get("/health") +def health() -> dict: + return { + "status": "ok", + "version": __version__, + # 三态: none(无key/无效) / free(免费key) / api_key(付费档) + "mode": tf_client.current_mode(), + } + + +@router.get("/api/capabilities") +def capabilities() -> dict: + """前端用来决定哪些功能可用、哪些灰显。""" + capset = detect_capabilities() + return { + "label": tier_label(), + "capabilities": capset.to_dict(), + } + + +@router.post("/api/capabilities/redetect") +def redetect() -> dict: + """用户在设置页"重新检测"按钮。""" + capset = detect_capabilities(force=True) + return { + "label": tier_label(), + "capabilities": capset.to_dict(), + } diff --git a/backend/app/api/screener.py b/backend/app/api/screener.py new file mode 100644 index 0000000..a64a837 --- /dev/null +++ b/backend/app/api/screener.py @@ -0,0 +1,706 @@ +"""Screener API。""" +from __future__ import annotations + +import logging +import math +import re +import time +from dataclasses import asdict +from datetime import date, datetime +from typing import Any, Optional + +from fastapi import APIRouter, HTTPException, Query, Request +from pydantic import BaseModel + +from app.services.screener import PRESET_STRATEGIES, ScreenerService +from app.services import strategy_cache +from app.strategy import config as strategy_config + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/api/screener", tags=["screener"]) + + +class CustomRequest(BaseModel): + conditions: list[str] + order_by: Optional[str] = None + limit: int = 30 + pool: Optional[list[str]] = None + as_of: Optional[date] = None + ext_columns: Optional[str] = None + + +class PresetRequest(BaseModel): + strategy_id: str + pool: Optional[list[str]] = None + as_of: Optional[date] = None + ext_columns: Optional[str] = None + + +def _safe(result_dict: dict) -> dict: + """sanitize for JSON(NaN / Inf → None).""" + rows = result_dict.get("rows", []) + for r in rows: + for k, v in list(r.items()): + if isinstance(v, float) and not math.isfinite(v): + r[k] = None + return result_dict + + +_EXT_IDENT_RE = re.compile(r"^[A-Za-z0-9_]+$") + + +def _safe_ext_value(value: Any) -> Any: + if isinstance(value, float) and not math.isfinite(value): + return None + if isinstance(value, (date, datetime)): + return value.isoformat() + return value + + +def _quote_ident(name: str) -> str: + return '"' + name.replace('"', '""') + '"' + + +def _load_ext_value_maps(repo, ext_columns: Optional[str]) -> dict[str, dict[str, Any]]: + """按请求加载扩展列,返回 {输出列名: {symbol: value}}。 + + 策略结果缓存是共享文件,不能被不同 ext_columns 组合污染;因此扩展列只在 + 返回前通过该投影映射追加到结果副本中。 + """ + ext_specs = _parse_ext_columns(ext_columns) if ext_columns else [] + if not ext_specs: + return {} + + import polars as pl + from app.api.ext_data import _read_ext_dataframe + from app.services.ext_data import ExtConfigStore + + db = repo.store.db + data_dir = repo.store.data_dir + ext_store = ExtConfigStore(data_dir) + configs = {c.id: c for c in ext_store.load_all()} + value_maps: dict[str, dict[str, Any]] = {} + + for config_id, field_name in ext_specs: + out_col = f"{config_id}__{field_name}" + cfg = configs.get(config_id) + try: + if cfg: + # 时序扩展表只取最新分区,避免历史分区把同一 symbol JOIN 放大。 + ext_df, _ = _read_ext_dataframe(cfg, data_dir) + else: + view_name = f"ext_{config_id}" + ext_df = pl.from_arrow(db.query( + f"SELECT symbol, {_quote_ident(field_name)} FROM {view_name}" + ).arrow()) + + if ext_df.is_empty() or "symbol" not in ext_df.columns or field_name not in ext_df.columns: + continue + + ext_df = ext_df.select(["symbol", field_name]).unique(subset=["symbol"], keep="last") + value_maps[out_col] = { + str(row["symbol"]): _safe_ext_value(row.get(field_name)) + for row in ext_df.to_dicts() + if row.get("symbol") + } + except Exception as e: # noqa: BLE001 + logger.debug("screener ext column join skipped for %s.%s: %s", config_id, field_name, e) + + return value_maps + + +def _row_with_ext(row: dict, ext_values: dict[str, dict[str, Any]], symbol: Optional[str] = None) -> dict: + next_row = dict(row) + sym = symbol or next_row.get("symbol") + for out_col, value_map in ext_values.items(): + next_row[out_col] = value_map.get(str(sym)) if sym else None + return next_row + + +def _rows_with_ext(rows: list[dict], ext_values: dict[str, dict[str, Any]]) -> list[dict]: + if not ext_values: + return rows + return [_row_with_ext(r, ext_values) for r in rows] + + +def _result_with_ext(result_dict: dict, ext_values: dict[str, dict[str, Any]]) -> dict: + if not ext_values: + return result_dict + return {**result_dict, "rows": _rows_with_ext(result_dict.get("rows", []), ext_values)} + + +def _results_with_ext(results: dict[str, dict], ext_values: dict[str, dict[str, Any]]) -> dict[str, dict]: + if not ext_values: + return results + return {sid: _result_with_ext(r, ext_values) for sid, r in results.items()} + + +def _cache_payload_with_ext(cached: dict, ext_values: dict[str, dict[str, Any]]) -> dict: + if not ext_values: + return cached + + payload = dict(cached) + payload["results"] = _results_with_ext(cached.get("results", {}), ext_values) + + ever_rows = cached.get("today_ever_rows") + if isinstance(ever_rows, dict): + enriched_ever: dict[str, dict[str, dict]] = {} + for sid, sym_map in ever_rows.items(): + if not isinstance(sym_map, dict): + continue + enriched_ever[sid] = { + sym: _row_with_ext(row, ext_values, symbol=sym) + for sym, row in sym_map.items() + if isinstance(row, dict) + } + payload["today_ever_rows"] = enriched_ever + + return payload + + +def _update_cache_strategy(data_dir, as_of: str, strategy_id: str, safe_data: dict) -> None: + """单跑后更新缓存中该策略的结果,保持缓存与最新计算一致。""" + from app.services import strategy_cache + cached = strategy_cache.read_cache(data_dir) + if cached and cached.get("as_of") == as_of: + results = cached.get("results", {}) + results[strategy_id] = { + "total": safe_data.get("total", 0), + "as_of": as_of, + "rows": safe_data.get("rows", []), + } + strategy_cache.write_cache(data_dir, as_of, results) + + +@router.get("/strategies") +def strategies(request: Request): + """策略清单(内置 + 自定义 + AI)。""" + data_dir = request.app.state.repo.store.data_dir + presets = [] + seen_ids: set[str] = set() + + # 内置策略 + for k, v in PRESET_STRATEGIES.items(): + overrides = strategy_config.load_override(data_dir, k) + name = (overrides.get("name") or v["name"]) if overrides else v["name"] + desc = (overrides.get("description") or v["description"]) if overrides else v["description"] + presets.append({"id": k, "name": name, "description": desc, "source": "builtin"}) + seen_ids.add(k) + + # 自定义/AI 策略(不在 PRESET_STRATEGIES 中的) + engine = getattr(request.app.state, "strategy_engine", None) + if engine: + for meta in engine.list_strategies(): + sid = meta["id"] + if sid not in seen_ids: + overrides = strategy_config.load_override(data_dir, sid) + name = (overrides.get("name") or meta["name"]) if overrides else meta["name"] + desc = (overrides.get("description") or meta.get("description", "")) if overrides else meta.get("description", "") + presets.append({"id": sid, "name": name, "description": desc, "source": meta.get("source", "custom")}) + seen_ids.add(sid) + + return {"presets": presets} + + +@router.post("/run") +def run_custom(req: CustomRequest, request: Request): + repo = request.app.state.repo + svc = ScreenerService(repo) + as_of = req.as_of or svc.latest_date() + if not as_of: + raise HTTPException(status_code=400, + detail="无可用数据日期 — enriched 表为空,请先运行盘后管道") + result = svc.run( + as_of=as_of, + conditions=req.conditions, + order_by=req.order_by, + limit=req.limit, + pool=req.pool, + ) + safe_data = _safe(asdict(result)) + ext_values = _load_ext_value_maps(repo, req.ext_columns) + return _result_with_ext(safe_data, ext_values) + + +@router.post("/run_preset") +def run_preset(req: PresetRequest, request: Request): + repo = request.app.state.repo + svc = ScreenerService(repo) + as_of = req.as_of or svc.latest_date() + if not as_of: + raise HTTPException(status_code=400, detail="无可用数据日期") + + # 加载用户保存的策略配置 + data_dir = request.app.state.repo.store.data_dir + ext_values = _load_ext_value_maps(repo, req.ext_columns) + overrides = strategy_config.load_override(data_dir, req.strategy_id) + bf = overrides.get("basic_filter") if overrides else None + dl = overrides.get("display_limit") if overrides else None + if dl is None and overrides and "display_limit" in overrides: + dl = 0 + + # 内置策略 + if req.strategy_id in PRESET_STRATEGIES: + try: + result = svc.run_preset(req.strategy_id, as_of=as_of, pool=req.pool, basic_filter=bf, display_limit=dl) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) from e + safe_data = _safe(asdict(result)) + _update_cache_strategy(data_dir, str(as_of), req.strategy_id, safe_data) + return _result_with_ext(safe_data, ext_values) + + # 自定义/AI 策略 — 通过 StrategyEngine 执行 + engine = getattr(request.app.state, "strategy_engine", None) + if not engine: + raise HTTPException(status_code=404, detail=f"策略引擎未初始化或策略 {req.strategy_id} 不存在") + + try: + result = engine.run(req.strategy_id, as_of, pool=req.pool, overrides=overrides or None) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) from e + + data = asdict(result) + + if dl is not None and dl > 0: + data["rows"] = data["rows"][:dl] + data["total"] = min(data["total"], dl) + + # 单跑后更新缓存中该策略的结果(保持缓存最新) + safe_data = _safe(data) + _update_cache_strategy(data_dir, str(as_of), req.strategy_id, safe_data) + + return _result_with_ext(safe_data, ext_values) + + +@router.get("/cached") +def get_cached( + request: Request, + ext_columns: Optional[str] = Query(None, description="逗号分隔: config_id.field_name"), +): + """读取策略结果缓存。返回 None 表示无缓存。""" + data_dir = request.app.state.repo.store.data_dir + cached = strategy_cache.read_cache(data_dir) + if cached is None: + return {"as_of": None, "results": {}, "updated_at": None} + ext_values = _load_ext_value_maps(request.app.state.repo, ext_columns) + return _cache_payload_with_ext(cached, ext_values) + + +@router.get("/market-snapshot") +def market_snapshot(request: Request): + """最新全市场轻量行情快照,供板块/概念聚合分析使用。""" + import polars as pl + + repo = request.app.state.repo + svc = ScreenerService(repo) + as_of = svc.latest_date() + if not as_of: + return {"as_of": None, "rows": []} + + df = svc._load_enriched_for_date(as_of) + if df.is_empty(): + return {"as_of": str(as_of), "rows": []} + + if "close" in df.columns and "total_shares" in df.columns and "market_cap" not in df.columns: + df = df.with_columns((pl.col("close") * pl.col("total_shares")).alias("market_cap")) + if "close" in df.columns and "float_shares" in df.columns and "float_market_cap" not in df.columns: + df = df.with_columns((pl.col("close") * pl.col("float_shares")).alias("float_market_cap")) + + cols = [ + "symbol", "name", "close", "change_pct", "amount", "volume", + "turnover_rate", "vol_ratio_5d", "total_shares", "float_shares", + "market_cap", "float_market_cap", "consecutive_limit_ups", + ] + df = df.select([c for c in cols if c in df.columns]) + rows = df.to_dicts() + for r in rows: + for k, v in list(r.items()): + if isinstance(v, float) and not math.isfinite(v): + r[k] = None + + return {"as_of": str(as_of), "rows": rows} + + +@router.post("/run_all") +def run_all(request: Request, body: Optional[dict] = None): + """批量运行指定策略,只返回每个策略的命中数。 + + 优化: 从 enriched 读取一次目标日期数据, 所有策略共享。 + body.strategy_ids: 只跑指定的策略 ID 列表, 为空则跑全部。 + """ + from datetime import date as date_type + + t_total = time.perf_counter() + + body = body or {} + repo = request.app.state.repo + svc = ScreenerService(repo) + + # 解析日期 + raw_date = body.get("as_of") + if raw_date: + as_of = date_type.fromisoformat(str(raw_date)) if isinstance(raw_date, str) else raw_date + else: + as_of = svc.latest_date() + if not as_of: + return {"as_of": None, "results": {}} + + # 一次读取目标日期的全部数据 + t0 = time.perf_counter() + precomputed = svc._load_enriched_for_date(as_of) + logger.info("run_all: _load_enriched_for_date took %.1fms", (time.perf_counter() - t0) * 1000) + + results: dict[str, dict] = {} + data_dir = request.app.state.repo.store.data_dir + + # 收集需要运行的策略 ID (如果指定了 strategy_ids 则只跑这些) + requested_ids = body.get("strategy_ids") + all_ids = list(PRESET_STRATEGIES.keys()) + engine = getattr(request.app.state, "strategy_engine", None) + if engine: + for meta in engine.list_strategies(): + sid = meta["id"] + if sid not in PRESET_STRATEGIES: + all_ids.append(sid) + + if requested_ids and isinstance(requested_ids, list): + id_set = set(requested_ids) + all_ids = [sid for sid in all_ids if sid in id_set] + + if not all_ids: + return {"as_of": str(as_of), "results": {}} + + # 批量预加载所有 override 配置 + t0 = time.perf_counter() + all_overrides = strategy_config.list_overrides(data_dir) + logger.info("run_all: list_overrides took %.1fms (%d overrides)", (time.perf_counter() - t0) * 1000, len(all_overrides)) + + # 历史策略: 只在需要时加载 (只加载 all_ids 中包含的 filter_history 策略) + t0 = time.perf_counter() + shared_history = None + id_set = set(all_ids) + if engine: + history_strats = [ + (sid, s) for sid, s in engine._strategies.items() + if s.filter_history_fn and sid in id_set + ] + if history_strats: + max_lb = min(max(s.lookback_days for _, s in history_strats), 30) + shared_history = svc._load_enriched_history(as_of, max(1, max_lb)) + else: + history_strats = [] + logger.info("run_all: _load_enriched_history took %.1fms (history_strats=%d)", (time.perf_counter() - t0) * 1000, len(history_strats)) + + for sid in all_ids: + try: + overrides = all_overrides.get(sid, {}) + bf = overrides.get("basic_filter") if overrides else None + dl = overrides.get("display_limit") if overrides else None + if dl is None and overrides and "display_limit" in overrides: + dl = 0 + + if sid in PRESET_STRATEGIES: + r = svc.run_preset(sid, as_of=as_of, precomputed=precomputed, basic_filter=bf, display_limit=dl) + else: + r = engine.run( + sid, as_of, overrides=overrides or None, + precomputed=precomputed, precomputed_history=shared_history, + ) + if dl is not None and dl > 0: + r.rows = r.rows[:dl] + r.total = min(r.total, dl) + + safe_rows = _safe(asdict(r)).get("rows", []) + results[sid] = {"total": r.total, "as_of": str(as_of), "rows": safe_rows} + except (ValueError, Exception): + continue + + elapsed = (time.perf_counter() - t_total) * 1000 + logger.info("run_all: total took %.1fms (%d strategies)", elapsed, len(all_ids)) + + # 写入策略缓存 (供页面秒加载) + if results: + try: + strategy_cache.write_cache(data_dir, str(as_of), results) + except Exception: # noqa: BLE001 + pass + + ext_values = _load_ext_value_maps(repo, body.get("ext_columns")) + return {"as_of": str(as_of), "results": _results_with_ext(results, ext_values)} + + +@router.get("/limit-ladder") +def limit_ladder( + request: Request, + as_of: Optional[date] = None, + direction: str = Query("up", description="up=涨停梯队 | down=跌停梯队"), + ext_columns: Optional[str] = Query(None, description="逗号分隔: config_id.field_name"), +): + """连板/连跌梯队 — 按连板数分组, 含三状态。 + 返回: tiers = [{ boards, count, stocks: [{symbol,name,change_pct,status,...}] }] + + direction=up (默认): + status: limit_up=涨停 | broken=炸板(摸板未封) | failed=断板(晋级失败) + direction=down: + status: limit_down=跌停 | recovery=翘板(跌停后回升,含收阳条件) | failed=止跌(昨日跌停今日未跌停也未翘板) + + ext_columns: 动态 JOIN 扩展数据, 如 "concept.concept,industry.industry" + """ + from datetime import timedelta + + import polars as pl + + is_down = direction == "down" + + # 按 direction 参数化字段映射 + if is_down: + sig_col = "signal_limit_down" + consec_col = "consecutive_limit_downs" + broken_col = "signal_limit_down_recovery" + status_main, status_broken, status_failed = "limit_down", "recovery", "failed" + else: + sig_col = "signal_limit_up" + consec_col = "consecutive_limit_ups" + broken_col = "signal_broken_limit_up" + status_main, status_broken, status_failed = "limit_up", "broken", "failed" + + repo = request.app.state.repo + svc = ScreenerService(repo) + as_of = as_of or svc.latest_date() + if not as_of: + raise HTTPException(status_code=400, detail="无可用数据日期") + + df = svc._load_enriched_for_date(as_of) + if df.is_empty(): + return {"as_of": str(as_of), "tiers": [], "counts": {"up": 0, "down": 0}} + + # 双方向涨跌停计数(不论当前 direction, 前端始终同时显示) + count_up_raw = int(df.filter(pl.col("signal_limit_up").fill_null(False)).height) if "signal_limit_up" in df.columns else 0 + count_down_raw = int(df.filter(pl.col("signal_limit_down").fill_null(False)).height) if "signal_limit_down" in df.columns else 0 + + # 双方向 sealed 修正: 减去各自的假涨停(假涨停已归炸板, 不计入涨停数) + depth_svc_global = getattr(request.app.state, "depth_service", None) + fake_up = 0 + fake_down = 0 + sealed_up_ready = False + sealed_down_ready = False + if depth_svc_global: + up_map = depth_svc_global.get_sealed_map(as_of, is_down=False) + down_map = depth_svc_global.get_sealed_map(as_of, is_down=True) + sealed_up_ready = bool(up_map) and depth_svc_global.is_sealed_ready(as_of) + sealed_down_ready = bool(down_map) and depth_svc_global.is_sealed_ready(as_of) + if up_map: + fake_up = sum(1 for v in up_map.values() if v.get("sealed") is False) + if down_map: + fake_down = sum(1 for v in down_map.values() if v.get("sealed") is False) + count_up = count_up_raw - fake_up if sealed_up_ready else count_up_raw + count_down = count_down_raw - fake_down if sealed_down_ready else count_down_raw + + # 双方向 sealed 明细(供前端弹窗同时显示涨跌停) + def _count_sealed(m: dict, ready: bool): + if not m or not ready: + return {"real": 0, "fake": 0, "pending": 0} + real = sum(1 for v in m.values() if v.get("sealed") is True) + fake = sum(1 for v in m.values() if v.get("sealed") is False) + pending = sum(1 for v in m.values() if v.get("sealed") is None) + return {"real": real, "fake": fake, "pending": pending} + sealed_counts_up = _count_sealed(up_map, sealed_up_ready) + sealed_counts_down = _count_sealed(down_map, sealed_down_ready) + + # 加载前一日数据获取 prev consecutive_limit_ups/downs + prev_consec: pl.DataFrame = pl.DataFrame() + for delta in range(1, 10): + candidate = as_of - timedelta(days=delta) + df_prev = svc._load_enriched_for_date(candidate) + if not df_prev.is_empty() and consec_col in df_prev.columns: + prev_consec = df_prev.select( + "symbol", + pl.col(consec_col).alias("prev_consec"), + ) + break + + if not prev_consec.is_empty(): + df = df.join(prev_consec, on="symbol", how="left") + else: + df = df.with_columns(pl.lit(0).cast(pl.UInt32).alias("prev_consec")) + + # 表达式 + is_limit = pl.col(sig_col).fill_null(False) if sig_col in df.columns else pl.lit(False) + is_broken = pl.col(broken_col).fill_null(False) if broken_col in df.columns else pl.lit(False) + consec = pl.col(consec_col).fill_null(0) if consec_col in df.columns else pl.lit(0) + prev_c = pl.col("prev_consec").fill_null(0) + + # 计算 status + boards (结构涨跌停对称, 仅字段与字面量不同) + is_failed = ~is_limit & ~is_broken & (prev_c > 0) + df = df.with_columns([ + pl.when(is_limit).then(pl.lit(status_main)) + .when(is_broken).then(pl.lit(status_broken)) + .when(is_failed).then(pl.lit(status_failed)) + .otherwise(None).alias("status"), + pl.when(is_limit).then(consec) + .when(is_broken | is_failed).then(prev_c + 1) + .otherwise(0).cast(pl.UInt32).alias("boards"), + ]) + + df = df.filter(pl.col("status").is_not_null() & (pl.col("boards") > 0)) + + # ── 五档 sealed 叠加(独立旁路, 不改 signal_limit_up) ── + # 假涨停(收盘价=涨停价但卖一有量)从 limit 降级为 broken(归炸板视图) + # 真涨停保留 + 附封单量; sealed=null(待确认/降级)保持原状 + depth_svc = getattr(request.app.state, "depth_service", None) + sealed_ready = False + sealed_age: float | None = None + if depth_svc: + sealed_map = depth_svc.get_sealed_map(as_of, is_down=is_down) + sealed_ready = bool(sealed_map) and depth_svc.is_sealed_ready(as_of) + sealed_age = depth_svc.get_sealed_age(as_of) if sealed_ready else None + + if sealed_map: + # 构建 sealed 列(symbol → sealed bool, vol) + sym_sealed = {s: v.get("sealed") for s, v in sealed_map.items()} + sym_vol = {s: v.get("vol") for s, v in sealed_map.items()} + + # JOIN sealed: 对每只 status=main 的票, 看 sealed 值 + sealed_rows = pl.DataFrame({ + "symbol": list(sym_sealed.keys()), + "_sealed": list(sym_sealed.values()), + "_sealed_vol": list(sym_vol.values()), + }) if sym_sealed else pl.DataFrame() + + if not sealed_rows.is_empty(): + df = df.join(sealed_rows, on="symbol", how="left") + # 假涨停(main 状态但 sealed=False)→ 降级为 broken + df = df.with_columns( + pl.when( + (pl.col("status") == status_main) + & pl.col("_sealed").is_not_null() + & (pl.col("_sealed") == False) # noqa: E712 + ).then(pl.lit(status_broken)) + .otherwise(pl.col("status")).alias("status"), + # sealed_status: real/fake/pending/null + pl.when( + (pl.col("status") == status_main) + & (pl.col("_sealed") == True) # noqa: E712 + ).then(pl.lit("real")) + .when( + (pl.col("_sealed") == False) # noqa: E712 + ).then(pl.lit("fake")) + .when( + (pl.col("status") == status_main) + & pl.col("_sealed").is_null() + ).then(pl.lit("pending")) + .otherwise(None).alias("sealed_status"), + pl.col("_sealed_vol").alias("sealed_vol"), + ).drop(["_sealed", "_sealed_vol"]) + else: + df = df.with_columns( + pl.lit(None).alias("sealed_status"), + pl.lit(None).alias("sealed_vol"), + ) + else: + df = df.with_columns( + pl.lit(None).alias("sealed_status"), + pl.lit(None).alias("sealed_vol"), + ) + else: + df = df.with_columns( + pl.lit(None).alias("sealed_status"), + pl.lit(None).alias("sealed_vol"), + ) + + # 动态 JOIN 扩展数据 + ext_specs = _parse_ext_columns(ext_columns) if ext_columns else [] + ext_col_names: list[str] = [] + if ext_specs: + db = repo.store.db + data_dir = repo.store.data_dir + from app.services.ext_data import ExtConfigStore + + ext_store = ExtConfigStore(data_dir) + configs = {c.id: c for c in ext_store.load_all()} + + for config_id, field_name in ext_specs: + view_name = f"ext_{config_id}" + ext_col_name = f"{config_id}__{field_name}" + try: + ext_df = pl.from_arrow(db.query( + f"SELECT symbol, \"{field_name}\" FROM {view_name}" + ).arrow()) + if not ext_df.is_empty() and "symbol" in ext_df.columns: + ext_df = ext_df.rename({field_name: ext_col_name}) + df = df.join(ext_df.select(["symbol", ext_col_name]), on="symbol", how="left") + ext_col_names.append(ext_col_name) + except Exception: + cfg = configs.get(config_id) + if cfg: + try: + from app.api.ext_data import _parquet_glob + glob = _parquet_glob(cfg, data_dir) + ext_df = pl.read_parquet(glob) + if not ext_df.is_empty() and "symbol" in ext_df.columns and field_name in ext_df.columns: + ext_df = ext_df.select(["symbol", field_name]).rename({field_name: ext_col_name}) + df = df.join(ext_df, on="symbol", how="left") + ext_col_names.append(ext_col_name) + except Exception: + pass + + # 选择输出列 + cols = ["symbol", "name", "close", "change_pct", "boards", "status", consec_col, "sealed_status", "sealed_vol"] + ext_col_names + df = df.select([c for c in cols if c in df.columns]) + # 排序: boards 降序, status 按主状态→炸/翘→断/止 + status_order = pl.when(pl.col("status") == status_main).then(0) + status_order = status_order.when(pl.col("status") == status_broken).then(1) + status_order = status_order.otherwise(2).alias("_status_order") + df = df.with_columns(status_order).sort(["boards", "_status_order"], descending=[True, False]).drop("_status_order") + + rows = df.to_dicts() + for r in rows: + for k, v in list(r.items()): + if isinstance(v, float) and not math.isfinite(v): + r[k] = None + + # 按 boards 分组 + tiers: dict[int, list] = {} + for r in rows: + n = int(r.get("boards") or 0) + tiers.setdefault(n, []).append(r) + + tier_list = [ + {"boards": n, "count": len(stocks), "stocks": stocks} + for n, stocks in sorted(tiers.items(), key=lambda x: -x[0]) + ] + + return { + "as_of": str(as_of), + "tiers": tier_list, + "counts": {"up": count_up, "down": count_down}, + "counts_raw": {"up": count_up_raw, "down": count_down_raw}, + "sealed_ready": sealed_ready, + "sealed_age": round(sealed_age, 0) if sealed_age is not None else None, + "sealed_counts": { + "real": sum(1 for t in tier_list for s in t.get("stocks", []) if s.get("sealed_status") == "real"), + "fake": sum(1 for t in tier_list for s in t.get("stocks", []) if s.get("sealed_status") == "fake"), + "pending": sum(1 for t in tier_list for s in t.get("stocks", []) if s.get("sealed_status") == "pending"), + }, + "sealed_counts_up": sealed_counts_up, + "sealed_counts_down": sealed_counts_down, + } + + +def _parse_ext_columns(ext_columns: str) -> list[tuple[str, str]]: + """解析 'config_id1.field1,config_id2.field2' 为 [(config_id, field_name), ...]。""" + result = [] + for part in ext_columns.split(","): + part = part.strip() + if "." not in part: + continue + config_id, field_name = part.split(".", 1) + config_id = config_id.strip() + field_name = field_name.strip() + if not config_id or not field_name: + continue + if not _EXT_IDENT_RE.match(config_id) or "\x00" in field_name: + continue + result.append((config_id, field_name)) + return result diff --git a/backend/app/api/settings.py b/backend/app/api/settings.py new file mode 100644 index 0000000..19bd1a1 --- /dev/null +++ b/backend/app/api/settings.py @@ -0,0 +1,854 @@ +"""设置 API — Key 配置 / 模式切换。 + +提供面向非开发者的 UI 配置入口,避免逼用户改 .env。 +""" +from __future__ import annotations + +import logging +import time + +from fastapi import APIRouter, Request +from pydantic import BaseModel + +from app import secrets_store +from app.services.financial_sync import financial_scheduler +from app.tickflow import client as tf_client +from app.tickflow.policy import ( + detect_capabilities, + extras_caps, + missing_caps, + probe_log, + tier_label, +) + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/api/settings", tags=["settings"]) + +# 默认端点 —— endpoints.json 列表第一项,UI"当前使用"始终对齐此项。 +# 注意:Free 模式 SDK 实际走 free-api(免费数据通道),但 UI 显示统一用默认节点。 +DEFAULT_PAID_ENDPOINT = "https://api.tickflow.org" + + +class TickflowKeyIn(BaseModel): + api_key: str + + +def _sync_financial_scheduler(request: Request, capset) -> None: + """Key 变更后同步财务调度器状态,无需重启服务。""" + try: + financial_scheduler.update(request.app.state.repo.store.data_dir, capset) + except Exception as e: # noqa: BLE001 + logger.warning("financial_scheduler update failed: %s", e) + + +@router.get("") +def get_settings() -> dict: + """返回当前配置概况(Key 脱敏)。""" + from app.config import settings + from app.services import preferences + + key = secrets_store.get_tickflow_key() + return { + "mode": tf_client.current_mode(), + "tickflow_api_key_masked": secrets_store.mask(key), + "has_tickflow_key": bool(key), + "tier_label": tier_label(), + "current_endpoint": tf_client.current_endpoint(), + "probe_log": probe_log(), + "missing_caps": missing_caps(), + "extras_caps": extras_caps(), + # 首次使用引导 + "onboarding_completed": preferences.get_onboarding_completed(), + # AI 配置 + "ai_provider": secrets_store.get_ai_config("ai_provider", settings.ai_provider), + "ai_base_url": secrets_store.get_ai_config("ai_base_url", settings.ai_base_url), + "ai_api_key_masked": secrets_store.mask(secrets_store.get_ai_key()), + "has_ai_key": bool(secrets_store.get_ai_key()), + "ai_model": secrets_store.get_ai_config("ai_model", settings.ai_model), + "ai_daily_token_budget": int(secrets_store.get_ai_config("ai_daily_token_budget", str(settings.ai_daily_token_budget)) or settings.ai_daily_token_budget), + } + + +class SwitchEndpointIn(BaseModel): + url: str + + +@router.post("/switch_endpoint") +def switch_endpoint(req: SwitchEndpointIn, request: Request) -> dict: + """切换数据源端点并立即生效。 + + 端点切换仅对付费档(starter+,走付费 API 节点)有意义; + none/free 档运行在 free-api 服务器,无付费端点权限,禁止切换。 + """ + # none/free 档没有付费端点权限,禁止切换 + if tf_client.current_mode() != "api_key": + return {"ok": False, "error": "当前档位无法切换端点,仅付费套餐(Starter+)支持"} + + url = req.url.strip().rstrip("/") + if not url.startswith("https://"): + return {"ok": False, "error": "仅支持 HTTPS 端点"} + + # 持久化到 secrets.json + secrets_store.save({"tickflow_base_url": url}) + # 重置客户端,下次调用自动用新端点 + tf_client.reset_clients() + + return { + "ok": True, + "current_endpoint": tf_client.current_endpoint(), + } + + +@router.post("/tickflow-key") +def save_tickflow_key(req: TickflowKeyIn, request: Request) -> dict: + """保存数据源 API Key 并立即重新探测能力。 + + 先探后存(关键改动,修复乱填 key 也会被持久化的问题): + 1. 临时用新 key 探测(付费端点),判定档位 + 2. 判定为 none(连单只日K都拿不到)→ key 无效:不存,清除已存的, + 返回 {ok: false, reason: "invalid"},前端提示「Key 无效」 + 3. 判定为 free(免费有效 key)→ 存 key,客户端切到 free-api 服务器 + 4. 判定为 starter+ → 存 key,切到付费端点(现有逻辑) + + 端点联动:从无 key 升级到付费 key 时,残留的 free-api 端点不可用, + 故自动切到默认付费端点;free 档则清除自定义端点。 + """ + from app.tickflow.policy import ( + base_tier_name, is_invalid_key, + ) + + key = req.api_key.strip() + if not key: + return {"ok": False, "error": "key empty"} + + # ===== 1) 临时存 key + 重置客户端,让探测走付费端点 ===== + secrets_store.save({"tickflow_api_key": key}) + tf_client.reset_clients() + + # 立即重新探测(此时 client 已按档位判定,但首次探测必然走付费端点验证) + capset = detect_capabilities(force=True) + request.app.state.capabilities = capset + _sync_financial_scheduler(request, capset) + + # ===== 2) 判定为无效 key(连单只日K都拿不到)→ 不存,清除 ===== + if is_invalid_key() or base_tier_name() == "none": + # 无效 key:清除刚存的,避免乱填被持久化;退回 none 档 + secrets_store.clear("tickflow_api_key", "tickflow_base_url") + tf_client.reset_clients() + capset = detect_capabilities(force=True) + request.app.state.capabilities = capset + _sync_financial_scheduler(request, capset) + return { + "ok": False, + "reason": "invalid", + "error": "Key 无效或已过期,请检查后重试", + "mode": "none", + "tier_label": tier_label(), + "current_endpoint": tf_client.current_endpoint(), + "probe_log": [], + "capabilities_count": len(capset.all()), + } + + # ===== 3) free 档(免费有效 key)→ 存 key,切到 free-api 服务器 ===== + if base_tier_name() == "free": + # 免费档运行时走 free-api 服务器,清除付费端点的自定义配置 + secrets_store.clear("tickflow_base_url") + tf_client.reset_clients() + return { + "ok": True, + "tickflow_api_key_masked": secrets_store.mask(key), + "mode": "free", + "tier_label": tier_label(), + "current_endpoint": tf_client.current_endpoint(), + "probe_log": [], + "capabilities_count": len(capset.all()), + } + + # ===== 4) starter+ 付费档 → 确保走付费端点(现有逻辑) ===== + # 若之前是 none/free(无自定义付费端点),切到默认付费端点 + base = secrets_store.load().get("tickflow_base_url") + if not base: + secrets_store.save({"tickflow_base_url": DEFAULT_PAID_ENDPOINT}) + tf_client.reset_clients() + + return { + "ok": True, + "tickflow_api_key_masked": secrets_store.mask(key), + "mode": "api_key", + "tier_label": tier_label(), + "current_endpoint": tf_client.current_endpoint(), + "probe_log": [], + "capabilities_count": len(capset.all()), + } + + +@router.delete("/tickflow-key") +def clear_tickflow_key(request: Request) -> dict: + """清除 Key,退回无档(none)。 + + 同时清除 tickflow_base_url(测速切换的自定义端点),使客户端走 free-api + 服务器取历史日K;档位标签为 None(无档)。 + """ + secrets_store.clear("tickflow_api_key", "tickflow_base_url") + tf_client.reset_clients() + + capset = detect_capabilities(force=True) + request.app.state.capabilities = capset + _sync_financial_scheduler(request, capset) + + return { + "ok": True, + "mode": "none", + "tier_label": tier_label(), + "current_endpoint": tf_client.current_endpoint(), + "capabilities_count": len(capset.all()), + } + + +@router.post("/onboarding/complete") +def complete_onboarding() -> dict: + """标记首次使用向导完成。 + + 写入 preferences.json,前端守卫据此判断是否需要再次展示向导。 + 跨设备/清缓存安全 —— 状态落在后端文件,不依赖浏览器本地存储。 + """ + from app.services import preferences + done = preferences.set_onboarding_completed(True) + return {"ok": True, "onboarding_completed": done} + + +class AiSettingsIn(BaseModel): + provider: str = "openai_compat" + base_url: str = "" + api_key: str | None = None + model: str = "" + daily_token_budget: int = 500_000 + + +@router.post("/ai") +def save_ai_settings(req: AiSettingsIn) -> dict: + """保存 AI 配置(全部持久化到 secrets.json)""" + from app.config import settings + + updates: dict = {} + if req.provider: + updates["ai_provider"] = req.provider + settings.ai_provider = req.provider + if req.base_url: + updates["ai_base_url"] = req.base_url + settings.ai_base_url = req.base_url + if req.api_key is not None: + if req.api_key: + updates["ai_api_key"] = req.api_key + settings.ai_api_key = req.api_key + else: + secrets_store.clear("ai_api_key") + settings.ai_api_key = "" + if req.model: + updates["ai_model"] = req.model + settings.ai_model = req.model + updates["ai_daily_token_budget"] = req.daily_token_budget + settings.ai_daily_token_budget = req.daily_token_budget + + if updates: + secrets_store.save(updates) + + return {"ok": True} + + +# ===== 偏好设置 ===== + +def _realtime_allowed() -> bool: + """当前档位是否允许实时行情(none/free 不允许)。""" + from app.services.quote_service import QuoteService + return QuoteService.is_realtime_allowed() + + +class MinuteSyncPrefs(BaseModel): + minute_sync_enabled: bool + minute_sync_days: int = 5 + + +@router.get("/preferences") +def get_preferences() -> dict: + """返回用户偏好设置。""" + from app.services import preferences + return { + "realtime_quotes_enabled": preferences.get_realtime_quotes_enabled(), + "realtime_allowed": _realtime_allowed(), + "indices_nav_pinned": preferences.get_indices_nav_pinned(), + "minute_sync_enabled": preferences.get_minute_sync_enabled(), + "minute_sync_days": preferences.get_minute_sync_days(), + "pipeline_schedule": preferences.get_pipeline_schedule(), + "instruments_schedule": preferences.get_instruments_schedule(), + "enriched_batch_size": preferences.get_enriched_batch_size(), + "index_daily_batch_size": preferences.get_index_daily_batch_size(), + "watchlist_columns": preferences.get_watchlist_columns(), + "screener_result_columns": preferences.get_screener_result_columns(), + "sse_refresh_pages": preferences.get_sse_refresh_pages(), + "strategy_monitor_enabled": preferences.get_strategy_monitor_enabled(), + "strategy_monitor_ids": preferences.get_strategy_monitor_ids(), + "system_notify_enabled": preferences.get_system_notify_enabled(), + "sidebar_index_symbols": preferences.get_sidebar_index_symbols(), + "nav_order": preferences.get_nav_order(), + "nav_hidden": preferences.get_nav_hidden(), + "screener_auto_run": preferences.get_screener_auto_run(), + "limit_ladder_monitor_enabled": preferences.get_limit_ladder_monitor_enabled(), + "depth_polling_interval": preferences.get_depth_polling_interval(), + "depth_finalize_time": preferences.get_depth_finalize_time(), + } + + +@router.get("/preferences/watchlist-columns") +def get_watchlist_columns() -> dict: + """返回自选列表列配置。""" + from app.services import preferences + cols = preferences.get_watchlist_columns() + return {"columns": cols} + + +class NavOrderIn(BaseModel): + nav_order: list[str] + + +class NavHiddenIn(BaseModel): + nav_hidden: list[str] + + +@router.put("/preferences/nav-order") +def update_nav_order(req: NavOrderIn) -> dict: + """保存左侧菜单排序(内置页面 path + 扩展分析菜单 id 的有序列表)。""" + from app.services import preferences + saved = preferences.set_nav_order(req.nav_order) + return {"nav_order": saved} + + +@router.put("/preferences/nav-hidden") +def update_nav_hidden(req: NavHiddenIn) -> dict: + """保存左侧菜单隐藏项。""" + from app.services import preferences + saved = preferences.set_nav_hidden(req.nav_hidden) + return {"nav_hidden": saved} + + +@router.put("/preferences/watchlist-columns") +def update_watchlist_columns(req: dict) -> dict: + """保存自选列表列配置。""" + from app.services import preferences + columns = req.get("columns", []) + saved = preferences.set_watchlist_columns(columns) + return {"columns": saved} + + +@router.get("/preferences/screener-result-columns") +def get_screener_result_columns() -> dict: + """返回策略结果列表列配置。""" + from app.services import preferences + cols = preferences.get_screener_result_columns() + return {"columns": cols} + + +@router.put("/preferences/screener-result-columns") +def update_screener_result_columns(req: dict) -> dict: + """保存策略结果列表列配置。""" + from app.services import preferences + columns = req.get("columns", []) + saved = preferences.set_screener_result_columns(columns) + return {"columns": saved} + + +@router.put("/preferences/minute-sync") +def update_minute_sync(req: MinuteSyncPrefs) -> dict: + """保存分钟 K 同步偏好。""" + from app.services import preferences + days = max(1, min(30, req.minute_sync_days)) + preferences.save({ + "minute_sync_enabled": req.minute_sync_enabled, + "minute_sync_days": days, + }) + return { + "minute_sync_enabled": req.minute_sync_enabled, + "minute_sync_days": days, + } + + +class RealtimeQuotesPrefs(BaseModel): + realtime_quotes_enabled: bool + + +@router.put("/preferences/realtime-quotes") +def update_realtime_quotes(req: RealtimeQuotesPrefs, request: Request) -> dict: + """保存全局实时行情开关。 + + none/free 档无实时行情权限:拒绝开启,persist 为关闭并返回 allowed=False, + 前端据此把开关置灰 / 回弹。 + """ + from app.services import preferences + qs = getattr(request.app.state, "quote_service", None) + + allowed = qs.is_realtime_allowed() if qs else True + if req.realtime_quotes_enabled and not allowed: + # 当前档位不允许开启实时行情 — 强制关闭 + preferences.save({"realtime_quotes_enabled": False}) + if qs: + qs.disable() + return {"realtime_quotes_enabled": False, "realtime_allowed": False} + + preferences.save({"realtime_quotes_enabled": req.realtime_quotes_enabled}) + if qs: + if req.realtime_quotes_enabled: + qs.enable() + else: + qs.disable() + + return {"realtime_quotes_enabled": req.realtime_quotes_enabled, "realtime_allowed": allowed} + + +class IndicesNavPinnedPrefs(BaseModel): + indices_nav_pinned: bool + + +@router.put("/preferences/indices-nav-pinned") +def update_indices_nav_pinned(req: IndicesNavPinnedPrefs) -> dict: + """保存侧栏指数报价卡片固定显示开关。 + ON=常驻显示;OFF=跟随实时行情开关(仅实时开时显示)。""" + from app.services import preferences + preferences.save({"indices_nav_pinned": req.indices_nav_pinned}) + return {"indices_nav_pinned": req.indices_nav_pinned} + + +class RealtimeMonitorConfigIn(BaseModel): + sse_refresh_pages: dict[str, bool] | None = None + strategy_monitor_enabled: bool | None = None + strategy_monitor_ids: list[str] | None = None + sidebar_index_symbols: list[str] | None = None + screener_auto_run: bool | None = None + + +@router.put("/preferences/realtime-monitor") +def update_realtime_monitor_config(req: RealtimeMonitorConfigIn, request: Request) -> dict: + """更新实时监控配置。策略监控统一迁移为 MonitorRule,由监控引擎评估。""" + from app.services import preferences + + cfg = req.model_dump(exclude_none=True) + result = preferences.set_realtime_monitor_config(cfg) + + # 策略监控开关/池变化 → 同步迁移为 type=strategy 规则 + reload 引擎 + if req.strategy_monitor_ids is not None or req.strategy_monitor_enabled is not None: + monitor_engine = getattr(request.app.state, "monitor_engine", None) + strategy_engine = getattr(request.app.state, "strategy_engine", None) + data_dir = request.app.state.repo.store.data_dir + if monitor_engine is not None and strategy_engine is not None: + from app.strategy import monitor_rules as mr_store + try: + if preferences.get_strategy_monitor_enabled(): + ids = preferences.get_strategy_monitor_ids() + names = {s.id: s.name for s in strategy_engine.list_strategies()} + mr_store.migrate_strategy_monitors(data_dir, ids, names) + else: + # 关闭策略监控: 停用所有策略规则 + mr_store.migrate_strategy_monitors(data_dir, [], {}) + # reload 规则到引擎 + monitor_engine.set_rules(mr_store.load_all(data_dir)) + except Exception: + pass + + return result + + +class QuoteIntervalIn(BaseModel): + interval: float + + +class SystemNotifyPrefsIn(BaseModel): + enabled: bool + + +@router.put("/preferences/system-notify") +def update_system_notify(req: SystemNotifyPrefsIn) -> dict: + """系统通知开关 — 开启后监控告警同时推送到操作系统通知中心。 + + 纯偏好, 无副作用 (不像策略监控要迁移规则), 直接落盘即可。 + quote_service 在每轮告警评估时读此开关决定是否发系统通知。 + """ + from app.services import preferences + saved = preferences.set_system_notify_enabled(req.enabled) + return {"system_notify_enabled": saved} + + +@router.put("/preferences/quote-interval") +def update_quote_interval(req: QuoteIntervalIn, request: Request) -> dict: + """更新行情轮询间隔。按档位自动 clamp。""" + qs = getattr(request.app.state, "quote_service", None) + if not qs: + return {"interval": req.interval, "min_interval": qs.get_min_interval(), "max_interval": 60.0} + clamped = qs.set_interval(req.interval) + return { + "interval": clamped, + "min_interval": qs.get_min_interval(), + "max_interval": qs.MAX_INTERVAL, + } + + +@router.get("/preferences/quote-interval") +def get_quote_interval(request: Request) -> dict: + """获取当前行情轮询间隔和档位限制。""" + qs = getattr(request.app.state, "quote_service", None) + if not qs: + return {"interval": 10.0, "min_interval": 5.0, "max_interval": 60.0} + return { + "interval": qs._interval, + "min_interval": qs.get_min_interval(), + "max_interval": qs.MAX_INTERVAL, + } + + +class TestEndpointIn(BaseModel): + url: str + # 测试轮数;不传时取 endpoints.json 的 testRounds(默认 5) + rounds: int | None = None + + +# 官方端点发现清单 —— 前端浏览器无法直接跨域拉取数据源官网 /endpoints.json +# (无 CORS 头),因此由后端代理。缓存 5 分钟,失败时回退到内置列表。 +ENDPOINTS_URL = "https://tickflow.org/endpoints.json" +ENDPOINTS_TTL = 300.0 # 秒 + +# 回退列表 —— 与官方 endpoints.json 的 endpoints[] 字段对齐。 +# 当远程拉取失败时使用,保证 UI 永远有内容可显示。 +_FALLBACK_ENDPOINTS: list[dict] = [ + { + "id": "default", + "url": "https://api.tickflow.org", + "label": "默认端点", + "region": "auto", + "description": "默认端点", + "premium": False, + }, + { + "id": "hk", + "url": "https://hk-api.tickflow.org", + "label": "香港端点", + "region": "ap-east-1", + "description": "备用端点,部分地区访问更稳定", + "premium": False, + }, + { + "id": "sg", + "url": "https://sg-api.tickflow.org", + "label": "新加坡端点", + "region": "ap-southeast-1", + "description": "备用端点,亚太地区访问更稳定", + "premium": False, + }, + { + "id": "us", + "url": "https://us-api.tickflow.org", + "label": "美国端点", + "region": "us-east-1", + "description": "备用端点,欧美地区访问更稳定", + "premium": False, + }, + { + "id": "cn", + "url": "https://139.196.55.234:50443", + "label": "中国大陆端点(Beta)", + "region": "cn-east-1", + "description": "备用端点,中国大陆地区访问更稳定,目前处于测试阶段,谨慎使用", + "premium": False, + }, + { + "id": "cn-premium", + "url": "https://106.15.238.72:50443", + "label": "中国大陆专线端点", + "region": "cn-east-1", + "description": "专线加速端点,需要专线加速权限(该权限包含在 Expert 及以上套餐中,也可通过自定义组合单独开通)", + "premium": True, + }, +] + +# 进程内缓存:{ "ts": float, "data": dict } +_endpoints_cache: dict = {"ts": 0.0, "data": None} + + +@router.get("/endpoints") +def list_endpoints() -> dict: + """代理拉取数据源官网 /endpoints.json 并返回规范化端点列表。 + + 前端无法跨域直连该 URL(无 CORS 头),故由本接口代理。带 8s 超时、 + 5 分钟内存缓存,远程失败时回退到内置列表,保证 UI 始终有内容。 + 返回结构与原始 endpoints.json 一致(透传 schema/version 等元信息)。 + """ + import httpx + + now = time.monotonic() + cached = _endpoints_cache.get("data") + if cached is not None and (now - _endpoints_cache["ts"]) < ENDPOINTS_TTL: + return cached + + source = "remote" + data: dict | None = None + try: + resp = httpx.get(ENDPOINTS_URL, timeout=8.0, follow_redirects=True) + if resp.status_code == 200: + parsed = resp.json() + eps = parsed.get("endpoints") + # 校验:必须是列表且每项含必要字段,否则视为无效 + if isinstance(eps, list) and all( + isinstance(e, dict) and "url" in e for e in eps + ): + data = { + "version": parsed.get("version", 1), + "description": parsed.get( + "description", "API 端点配置" + ), + "healthPath": parsed.get("healthPath", "/health"), + "testRounds": parsed.get("testRounds", 5), + "endpoints": eps, + } + except (httpx.HTTPError, ValueError): + logger.warning("拉取 endpoints.json 失败,使用内置回退列表", exc_info=True) + + if data is None: + source = "fallback" + data = { + "version": 1, + "description": "API 端点配置", + "healthPath": "/health", + "testRounds": 5, + "endpoints": _FALLBACK_ENDPOINTS, + } + + # 标记数据来源,便于前端提示(回退时显示"内置列表")。 + data["source"] = source + _endpoints_cache["ts"] = now + _endpoints_cache["data"] = data + return data + + +async def _http_ping(url: str, timeout: float = 10.0) -> float | None: + """单次异步 GET 请求并返回延迟(ms),失败返回 None。 + + 对齐官方 latency_test.py:用 /health 轻量端点测真实网络延迟, + 不携带 API Key(/health 公开)。异步实现,保证多端点并行测速不阻塞。 + """ + import httpx + + t0 = time.perf_counter() + try: + async with httpx.AsyncClient(timeout=timeout, follow_redirects=True) as client: + resp = await client.get(url) + dt = (time.perf_counter() - t0) * 1000 + # 只把 <400 视为成功;4xx/5xx 也算"不可达" + if resp.status_code < 400: + return round(dt, 2) + return None + except (httpx.TimeoutException, httpx.ConnectError, httpx.HTTPError, OSError): + return None + + +@router.post("/test_endpoint") +async def test_endpoint(req: TestEndpointIn) -> dict: + """测试端点网络延迟:对 /health 多轮探测取中位数。 + + 参考官方 latency_test.py: + - 路径用 /health(公开、轻量),反映真实网络延迟而非业务接口耗时 + - 多轮探测(默认 5 轮,取自 endpoints.json 的 testRounds),间隔 0.3s + - 返回 median/min/max/success,前端显示中位数 + - 异步实现,保证"全部测速"时多端点真正并行 + """ + import asyncio + import statistics + + base = req.url.rstrip("/") + rounds = max(1, min(10, req.rounds or _endpoints_cache.get("data", {}).get("testRounds", 5))) + health_url = base + "/health" + + latencies: list[float] = [] + for _ in range(rounds): + ms = await _http_ping(health_url) + if ms is not None: + latencies.append(ms) + # 官方脚本间隔 0.3s;末轮无需等待 + await asyncio.sleep(0.3) + + success = len(latencies) + if success == 0: + return { + "ok": False, + "error": "不可达", + "url": req.url, + "rounds": rounds, + "success": 0, + "median_ms": None, + "min_ms": None, + "max_ms": None, + } + + median = round(statistics.median(latencies), 2) + return { + "ok": True, + "url": req.url, + "rounds": rounds, + "success": success, + "median_ms": median, + "min_ms": round(min(latencies), 2), + "max_ms": round(max(latencies), 2), + # 兼容旧字段:取中位数作为代表延迟 + "latency_ms": median, + } + + +class PipelineScheduleIn(BaseModel): + hour: int + minute: int + + +@router.put("/preferences/pipeline-schedule") +def update_pipeline_schedule(req: PipelineScheduleIn, request: Request) -> dict: + """保存盘后管道调度时间并立即 reschedule。""" + from app.services import preferences + sched = preferences.set_pipeline_schedule(req.hour, req.minute) + + # 动态 reschedule + from apscheduler.triggers.cron import CronTrigger + scheduler = getattr(request.app.state, "scheduler", None) + if scheduler: + scheduler.reschedule_job( + "daily_pipeline", + trigger=CronTrigger( + day_of_week="mon-fri", + hour=sched["hour"], + minute=sched["minute"], + timezone="Asia/Shanghai", + ), + ) + logger.info("pipeline rescheduled to %02d:%02d mon-fri", sched["hour"], sched["minute"]) + + return sched + + +@router.put("/preferences/instruments-schedule") +def update_instruments_schedule(req: PipelineScheduleIn, request: Request) -> dict: + """保存盘前标的维表调度时间并立即 reschedule。""" + from app.services import preferences + sched = preferences.set_instruments_schedule(req.hour, req.minute) + + from apscheduler.triggers.cron import CronTrigger + scheduler = getattr(request.app.state, "scheduler", None) + if scheduler: + scheduler.reschedule_job( + "pre_market_instruments", + trigger=CronTrigger( + day_of_week="mon-fri", + hour=sched["hour"], + minute=sched["minute"], + timezone="Asia/Shanghai", + ), + ) + return sched + + +class EnrichedBatchSizeIn(BaseModel): + size: int + + +@router.put("/preferences/enriched-batch-size") +def update_enriched_batch_size(req: EnrichedBatchSizeIn) -> dict: + """保存 enriched 全量计算批次大小。""" + from app.services import preferences + size = preferences.set_enriched_batch_size(req.size) + return {"enriched_batch_size": size} + + +class IndexDailyBatchSizeIn(BaseModel): + size: int + + +@router.put("/preferences/index-daily-batch-size") +def update_index_daily_batch_size(req: IndexDailyBatchSizeIn) -> dict: + """保存指数日 K 同步批次大小。""" + from app.services import preferences + size = preferences.set_index_daily_batch_size(req.size) + return {"index_daily_batch_size": size} + + +# ── 五档盘口 sealed 配置 ────────────────────────────── + +class LimitLadderMonitorIn(BaseModel): + enabled: bool + + +@router.put("/preferences/limit-ladder-monitor") +def update_limit_ladder_monitor(req: LimitLadderMonitorIn, request: Request) -> dict: + """连板梯队 5 档监控开关。开启→启动 depth 轮询, 关闭→停止。""" + from app.services import preferences + preferences.save({"limit_ladder_monitor_enabled": req.enabled}) + + # 立即应用: 启停 depth 轮询线程 + depth_svc = getattr(request.app.state, "depth_service", None) + if depth_svc: + depth_svc.apply_monitor_toggle(req.enabled) + + return {"limit_ladder_monitor_enabled": req.enabled} + + +@router.post("/preferences/limit-ladder-monitor/run") +def run_limit_ladder_fix(request: Request) -> dict: + """立即手动修正一次真假板(拉取五档盘口 + 更新缓存)。需 Pro+。""" + from app.tickflow.capabilities import Cap + capset = request.app.state.capabilities + capset.require(Cap.DEPTH5_BATCH) # 无能力抛 CapabilityDenied(403) + + depth_svc = getattr(request.app.state, "depth_service", None) + if not depth_svc: + raise HTTPException(status_code=503, detail="depth 服务未初始化") + return depth_svc.run_once() + + +class DepthPollingIntervalIn(BaseModel): + interval: float + + +@router.put("/preferences/depth-polling-interval") +def update_depth_polling_interval(req: DepthPollingIntervalIn, request: Request) -> dict: + """保存五档盘口盘中轮询间隔(秒)。需 Pro+。""" + from app.tickflow.capabilities import Cap + request.app.state.capabilities.require(Cap.DEPTH5_BATCH) + + from app.services import preferences + interval = preferences.set_depth_polling_interval(req.interval) + return {"depth_polling_interval": interval} + + +class DepthFinalizeTimeIn(BaseModel): + hour: int + minute: int + + +@router.put("/preferences/depth-finalize-time") +def update_depth_finalize_time(req: DepthFinalizeTimeIn, request: Request) -> dict: + """保存盘后 sealed 定版时间(范围15:01~18:00)并立即 reschedule。需 Pro+。""" + from app.tickflow.capabilities import Cap + request.app.state.capabilities.require(Cap.DEPTH5_BATCH) + + from app.services import preferences + sched = preferences.set_depth_finalize_time(req.hour, req.minute) + + from apscheduler.triggers.cron import CronTrigger + scheduler = getattr(request.app.state, "scheduler", None) + if scheduler: + scheduler.reschedule_job( + "depth_finalize", + trigger=CronTrigger( + day_of_week="mon-fri", + hour=sched["hour"], + minute=sched["minute"], + timezone="Asia/Shanghai", + ), + ) + logger.info("depth_finalize rescheduled to %02d:%02d mon-fri", sched["hour"], sched["minute"]) + + return sched + diff --git a/backend/app/api/signals.py b/backend/app/api/signals.py new file mode 100644 index 0000000..66e1772 --- /dev/null +++ b/backend/app/api/signals.py @@ -0,0 +1,100 @@ +"""自定义信号 API 路由 — HTTP 请求 → 调用 custom_signals 模块 → 返回响应。 + +只做胶水:校验 → 持久化 → 失效缓存。不含表达式编译逻辑。 +""" +from __future__ import annotations + +from pathlib import Path + +from fastapi import APIRouter, HTTPException, Request +from pydantic import BaseModel + +from app.strategy import custom_signals + +router = APIRouter(prefix="/api/custom-signals", tags=["custom-signals"]) + + +def _data_dir(request: Request) -> Path: + return request.app.state.repo.store.data_dir + + +def _invalidate() -> None: + """失效 pipeline 的自定义信号缓存,下次计算重新加载。""" + from app.indicators.pipeline import invalidate_custom_signals + invalidate_custom_signals() + + +class ConditionModel(BaseModel): + left: str # 字段名(须在白名单) + op: str # > >= < <= == != + right: str # "field:xxx" 或数字字符串 + + +class SignalModel(BaseModel): + id: str + name: str + kind: str # entry | exit | both + conditions: list[ConditionModel] + enabled: bool = True + + +# ── 字段选项 / 运算符 ─────────────────────────────────── + + +@router.get("/options") +def get_options(): + """返回可选字段与运算符,供前端下拉框使用。""" + # 字段带中文标签(取自 ENRICHED_COLUMNS,回退为字段名本身) + from app.indicators.pipeline import ENRICHED_COLUMNS + + fields = [ + {"key": f, "label": ENRICHED_COLUMNS.get(f, f)} + for f in sorted(custom_signals.ALLOWED_FIELDS) + ] + return { + "fields": fields, + "operators": [">", ">=", "<", "<=", "==", "!="], + "kinds": [ + {"key": "entry", "label": "买入"}, + {"key": "exit", "label": "卖出"}, + {"key": "both", "label": "买卖通用"}, + ], + } + + +# ── 列表 ─────────────────────────────────────────────── + + +@router.get("") +def list_signals(request: Request): + sigs = custom_signals.load_all(_data_dir(request)) + return {"signals": sigs} + + +# ── 新建 / 更新 ──────────────────────────────────────── + + +@router.post("") +def save_signal(req: SignalModel, request: Request): + sig = req.model_dump() + try: + custom_signals.validate(sig) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + custom_signals.save_one(_data_dir(request), sig) + _invalidate() + return {"ok": True, "signal": sig} + + +# ── 删除 ─────────────────────────────────────────────── + + +@router.delete("/{signal_id}") +def delete_signal(signal_id: str, request: Request): + if not custom_signals.ID_RE.match(signal_id): + raise HTTPException(status_code=400, detail="信号 id 非法") + deleted = custom_signals.delete_one(_data_dir(request), signal_id) + if not deleted: + raise HTTPException(status_code=404, detail="信号不存在") + _invalidate() + return {"ok": True} diff --git a/backend/app/api/strategy.py b/backend/app/api/strategy.py new file mode 100644 index 0000000..dae6ddc --- /dev/null +++ b/backend/app/api/strategy.py @@ -0,0 +1,440 @@ +"""策略 API 路由 — HTTP 请求 → 调用策略模块 → 返回响应。 + +只做胶水,不含业务逻辑。 +""" +from __future__ import annotations + +import math +from dataclasses import asdict +from datetime import date +from pathlib import Path +from typing import Any + +from fastapi import APIRouter, HTTPException, Request +from pydantic import BaseModel + +from app.strategy import config as strategy_config +from app.strategy.engine import StrategyEngine, StrategyDef +from app.strategy.ai_generator import AIStrategyGenerator +from app.strategy.prompt_builder import build_step1, build_step2 +from app.strategy.monitor import StrategyMonitorService, StrategyAlert + +router = APIRouter(prefix="/api/strategies", tags=["strategies"]) + +# ── Helpers ────────────────────────────────────────────────────────── + + +def _get_engine(request: Request) -> StrategyEngine: + engine = getattr(request.app.state, "strategy_engine", None) + if not engine: + raise HTTPException(status_code=503, detail="策略引擎未初始化") + return engine + + +def _get_monitor(request: Request) -> StrategyMonitorService: + mon = getattr(request.app.state, "strategy_monitor", None) + if not mon: + raise HTTPException(status_code=503, detail="策略监控未初始化") + return mon + + +def _data_dir(request: Request) -> Path: + return request.app.state.repo.store.data_dir + + +def _safe(result_dict: dict) -> dict: + rows = result_dict.get("rows", []) + for r in rows: + for k, v in list(r.items()): + if isinstance(v, float) and not math.isfinite(v): + r[k] = None + return result_dict + + +def _strategy_detail(s: StrategyDef, overrides: dict | None = None) -> dict: + """策略详情(含用户覆盖)""" + bf = {**s.basic_filter} + scoring = dict(s.meta.get("scoring", {})) + params_defaults = {p["id"]: p["default"] for p in s.meta.get("params", [])} + + if overrides: + if overrides.get("basic_filter"): + bf.update(overrides["basic_filter"]) + if overrides.get("scoring"): + scoring.update(overrides["scoring"]) + # 用户保存的参数覆盖默认值: 合并进 params_defaults, 前端据此回显 + if overrides.get("params"): + params_defaults.update(overrides["params"]) + + # 名称/描述可被用户覆盖 + name = overrides.get("name", s.meta.get("name", "")) if overrides else s.meta.get("name", "") + description = overrides.get("description", s.meta.get("description", "")) if overrides else s.meta.get("description", "") + + return { + "id": s.meta["id"], + "name": name or s.meta.get("name", ""), + "description": description or s.meta.get("description", ""), + "tags": s.meta.get("tags", []), + "source": s.source, + "version": s.meta.get("version", "1.0.0"), + "basic_filter": bf, + "params": s.meta.get("params", []), + "params_defaults": params_defaults, + "scoring": scoring, + "entry_signals": s.entry_signals, + "exit_signals": s.exit_signals, + "stop_loss": overrides.get("stop_loss", s.stop_loss) if overrides else s.stop_loss, + "trailing_stop": getattr(s, "trailing_stop", None), + "trailing_take_profit_activate": getattr(s, "trailing_take_profit_activate", None), + "trailing_take_profit_drawdown": getattr(s, "trailing_take_profit_drawdown", None), + "max_hold_days": overrides.get("max_hold_days", s.max_hold_days) if overrides else s.max_hold_days, + "alerts": s.alerts, + "order_by": s.meta.get("order_by", "score"), + "descending": s.meta.get("descending", True), + "limit": s.meta.get("limit", 30), + "display_limit": overrides.get("display_limit") if overrides and "display_limit" in overrides else None, + } + + +# ── Request Models ─────────────────────────────────────────────────── + + +class RunRequest(BaseModel): + strategy_id: str + as_of: date | None = None + pool: list[str] | None = None + params: dict | None = None + + +class RunAllRequest(BaseModel): + as_of: date | None = None + + +class SaveConfigRequest(BaseModel): + strategy_id: str + overrides: dict + + +class AIGenerateRequest(BaseModel): + prompt: str + + +class AISaveRequest(BaseModel): + code: str + strategy_id: str + + +class MonitorStartRequest(BaseModel): + strategy_id: str + + +# ── 列表 / 详情 ───────────────────────────────────────────────────── + + +@router.get("") +def list_strategies(request: Request): + engine = _get_engine(request) + data_dir = _data_dir(request) + all_overrides = strategy_config.list_overrides(data_dir) + + result = [] + for meta in engine.list_strategies(): + sid = meta["id"] + s = engine.get(sid) + overrides = all_overrides.get(sid) + result.append(_strategy_detail(s, overrides)) + return {"strategies": result} + + +@router.get("/{strategy_id}") +def get_strategy(strategy_id: str, request: Request): + engine = _get_engine(request) + try: + s = engine.get(strategy_id) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) from e + overrides = strategy_config.load_override(_data_dir(request), strategy_id) + return _strategy_detail(s, overrides or None) + + +# ── 执行选股 ───────────────────────────────────────────────────────── + + +@router.post("/run") +def run_strategy(req: RunRequest, request: Request): + engine = _get_engine(request) + data_dir = _data_dir(request) + + # 读取用户覆盖配置 + overrides = strategy_config.load_override(data_dir, req.strategy_id) + params = req.params or {} + # 合并用户保存的策略参数 + if overrides.get("params"): + merged = dict(overrides["params"]) + merged.update(params) # 请求里的优先 + params = merged + + # 确定日期 + as_of = req.as_of + if not as_of: + from app.services.screener import ScreenerService + svc = ScreenerService(request.app.state.repo) + as_of = svc.latest_date() + if not as_of: + raise HTTPException(status_code=400, detail="无可用数据日期") + + try: + result = engine.run( + req.strategy_id, as_of, + pool=req.pool, + params=params, + overrides=overrides or None, + ) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) from e + + return _safe(asdict(result)) + + +@router.post("/run-all") +def run_all(req: RunAllRequest, request: Request): + engine = _get_engine(request) + data_dir = _data_dir(request) + + as_of = req.as_of + if not as_of: + from app.services.screener import ScreenerService + svc = ScreenerService(request.app.state.repo) + as_of = svc.latest_date() + if not as_of: + return {"as_of": None, "results": {}} + + all_overrides = strategy_config.list_overrides(data_dir) + results: dict[str, dict] = {} + for sid, result in engine.run_all(as_of, overrides_map=all_overrides).items(): + results[sid] = {"total": result.total, "as_of": str(as_of)} + + return {"as_of": str(as_of), "results": results} + + +# ── 配置持久化 ─────────────────────────────────────────────────────── + + +@router.post("/config") +def save_config(req: SaveConfigRequest, request: Request): + engine = _get_engine(request) + if not engine.has(req.strategy_id): + raise HTTPException(status_code=404, detail=f"策略 {req.strategy_id} 不存在") + + # 剥离与策略默认值相同的字段,只保存用户真正修改过的值 + overrides = _strip_defaults(req.strategy_id, req.overrides, engine) + + strategy_config.save_override(_data_dir(request), req.strategy_id, overrides) + return {"ok": True} + + +def _strip_defaults(strategy_id: str, overrides: dict, engine) -> dict: + """剥离与策略默认值相同的字段,避免默认值被固化到 override 中。 + + 核心问题: 前端把策略的默认 basic_filter 全量发回后端保存, + 导致隐含的默认过滤条件 (如 market_cap_min, amount_min) 被写入 override 文件。 + 即使前端 UI 不展示这些字段,它们仍会在策略运行时生效。 + """ + s = engine.get(strategy_id) + result = dict(overrides) + + # 处理 basic_filter: 只保留与策略默认值不同的键 + bf = result.get("basic_filter") + if bf and isinstance(bf, dict): + default_bf = s.basic_filter if s else {} + stripped_bf = {} + for k, v in bf.items(): + default_val = default_bf.get(k) + # 保留与默认值不同的键,以及没有默认值的键 + if k not in default_bf or v != default_val: + stripped_bf[k] = v + if stripped_bf: + result["basic_filter"] = stripped_bf + else: + del result["basic_filter"] + + return result + + +@router.delete("/config/{strategy_id}") +def reset_config(strategy_id: str, request: Request): + strategy_config.delete_override(_data_dir(request), strategy_id) + return {"ok": True} + + +# ── AI 生成 ─────────────────────────────────────────────────────────── + +class BuildRequest(BaseModel): + """两步策略构建请求""" + step: int # 1 / 2 + # step1 字段 + name: str = "" + description: str = "" + direction: str = "long" + rules: str = "" + strategy_id: str = "" + # step2 字段 + current_code: str = "" + instruction: str = "" + + +@router.get("/ai/status") +def ai_status(request: Request): + """检查 AI 配置状态""" + from app.config import settings + from app import secrets_store + has_key = bool(secrets_store.get_ai_key()) + has_model = bool(settings.ai_model) + return {"configured": has_key and has_model, "has_key": has_key, "has_model": has_model} + + +@router.get("/{strategy_id}/source") +def get_strategy_source(strategy_id: str, request: Request): + """获取策略源文件内容(用于 AI 修改)""" + from pathlib import Path + + # 先查 StrategyEngine 获取文件路径 + engine = _get_engine(request) + try: + s = engine.get(strategy_id) + except ValueError: + raise HTTPException(status_code=404, detail=f"策略 {strategy_id} 不存在") + + path = s.file_path + if not path or not path.exists(): + raise HTTPException(status_code=404, detail="策略源文件不存在") + + return {"code": path.read_text(encoding="utf-8"), "source": s.source} + + +@router.post("/ai/test") +async def ai_test(request: Request): + """测试 AI 连通性 — 发送简单请求验证 Key 和模型""" + from app.config import settings + from app import secrets_store + from openai import AsyncOpenAI + + ai_key = secrets_store.get_ai_key() + if not ai_key: + return {"ok": False, "error": "未配置 API Key"} + + try: + client = AsyncOpenAI(api_key=ai_key, base_url=settings.ai_base_url) + resp = await client.chat.completions.create( + model=settings.ai_model, + messages=[{"role": "user", "content": "回复 OK"}], + max_tokens=5, + timeout=15, + ) + return {"ok": True, "model": resp.model, "usage": {"prompt": resp.usage.prompt_tokens, "completion": resp.usage.completion_tokens} if resp.usage else None} + except Exception as e: + return {"ok": False, "error": str(e)} + + +@router.post("/build") +async def build_strategy(req: BuildRequest, request: Request): + """两步策略构建。 + step1: name + description + direction + rules → 完整策略 + step2: current_code + instruction → 修改任意部分 + """ + gen = AIStrategyGenerator() + + if req.step == 1: + prompt = build_step1(req.name, req.description, req.direction, req.rules, req.strategy_id) + elif req.step == 2: + prompt = build_step2(req.current_code, req.instruction) + else: + raise HTTPException(status_code=400, detail=f"无效步骤: {req.step}") + + try: + result = await gen.generate(prompt) + except RuntimeError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + return result + + + +@router.post("/ai/generate") +async def ai_generate(req: AIGenerateRequest, request: Request): + try: + gen = AIStrategyGenerator() + result = await gen.generate(req.prompt) + except RuntimeError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + except Exception as e: + raise HTTPException(status_code=500, detail=f"AI生成失败: {e}") from e + return result + + +@router.post("/ai/save") +async def ai_save(req: AISaveRequest, request: Request): + data_dir = _data_dir(request) + out_dir = data_dir / "strategies" / "ai" + out_dir.mkdir(parents=True, exist_ok=True) + path = out_dir / f"{req.strategy_id}.py" + previous_code = path.read_text(encoding="utf-8") if path.exists() else None + path.write_text(req.code, encoding="utf-8") + + # 热重载,并确认保存的策略真的被引擎加载。 + engine = _get_engine(request) + engine.reload() + if not engine.has(req.strategy_id): + if previous_code is None: + path.unlink(missing_ok=True) + else: + path.write_text(previous_code, encoding="utf-8") + engine.reload() + raise HTTPException( + status_code=400, + detail=f"策略保存成功但加载失败: {req.strategy_id},请检查代码语法和 META.id 是否一致", + ) + return {"ok": True, "path": str(path)} + + +@router.delete("/{strategy_id}") +def delete_strategy(strategy_id: str, request: Request): + """删除自定义策略 — 清除 .py 文件 + overrides + 热重载。内置策略不可删除。""" + from pathlib import Path + + engine = _get_engine(request) + try: + s = engine.get(strategy_id) + except ValueError: + raise HTTPException(status_code=404, detail=f"策略 {strategy_id} 不存在") + + if s.source == "builtin": + raise HTTPException(status_code=403, detail="内置策略不可删除") + + # 删除策略文件 + if s.file_path and s.file_path.exists(): + s.file_path.unlink() + + # 删除 overrides + data_dir = _data_dir(request) + override_path = data_dir / "user_data" / "strategy_overrides" / f"{strategy_id}.json" + if override_path.exists(): + override_path.unlink() + + # 热重载 + engine.reload() + return {"ok": True} + + +# ── 监控 ───────────────────────────────────────────────────────────── +# 注: 策略监控已统一迁移到 MonitorRuleEngine (监控通知页), 旧的 start/stop/status +# 路由已移除。StrategyMonitorService 类保留 (其 _check_signals 被 MonitorRuleEngine 复用)。 + + +# ── 热重载 ─────────────────────────────────────────────────────────── + + +@router.post("/reload") +def reload_strategies(request: Request): + engine = _get_engine(request) + engine.reload() + return {"ok": True, "count": len(engine.list_strategies())} diff --git a/backend/app/api/watchlist.py b/backend/app/api/watchlist.py new file mode 100644 index 0000000..183b875 --- /dev/null +++ b/backend/app/api/watchlist.py @@ -0,0 +1,202 @@ +"""自选股 API。""" +from __future__ import annotations + +import logging +import math +import time +from datetime import date + +import polars as pl +from fastapi import APIRouter, Query, Request +from pydantic import BaseModel + +from app.services import watchlist + +logger = logging.getLogger(__name__) + +router = APIRouter(prefix="/api/watchlist", tags=["watchlist"]) + + +class AddRequest(BaseModel): + symbol: str + note: str = "" + + +class BatchAddRequest(BaseModel): + symbols: list[str] + note: str = "" + + +@router.get("") +def list_all(): + return {"symbols": watchlist.list_symbols()} + + +@router.post("") +def add_one(req: AddRequest): + rows = watchlist.add(req.symbol, req.note) + return {"symbols": rows} + + +@router.post("/batch") +def add_batch(req: BatchAddRequest): + for sym in req.symbols: + watchlist.add(sym, req.note) + return {"symbols": watchlist.list_symbols(), "added": len(req.symbols)} + + +@router.delete("/{symbol}") +def remove_one(symbol: str): + rows = watchlist.remove(symbol) + return {"symbols": rows} + + +@router.delete("") +def clear_all(): + """清空自选列表。""" + count = watchlist.clear() + return {"removed": count} + + +# 自选页需要的列 +_WATCHLIST_COLS = [ + "symbol", "close", "change_pct", "change_amount", "amount", + "turnover_rate", + "amplitude", "annual_vol_20d", + "vol_ratio_5d", + "ma5", "ma10", "ma20", "ma60", + "vol_ma5", "vol_ma10", + "high_60d", "low_60d", + "rsi_6", "rsi_14", "rsi_24", + "macd_dif", "macd_dea", "macd_hist", + "kdj_k", "kdj_d", "kdj_j", + "boll_upper", "boll_lower", + "atr_14", + "momentum_5d", "momentum_10d", "momentum_20d", "momentum_30d", "momentum_60d", + "consecutive_limit_ups", "consecutive_limit_downs", + "signal_limit_up", "signal_limit_down", "signal_volume_surge", + "signal_ma_golden_5_20", "signal_macd_golden", "signal_n_day_high", + "signal_boll_breakout_upper", "signal_ma20_breakout", + "signal_ma_dead_5_20", "signal_macd_dead", "signal_n_day_low", + "signal_boll_breakdown_lower", "signal_ma20_breakdown", +] + + +@router.get("/enriched") +def watchlist_enriched( + request: Request, + ext_columns: str | None = Query(None, description="逗号分隔的 ext 列: config_id.field_name"), +): + """自选股 enriched 数据 — 直接从 enriched 最新日读取, 无即时计算。 + + ext_columns 参数示例: "industry_rating.score,fund_flow.net_inflow" + 会动态 LEFT JOIN 对应的 ext_{config_id} DuckDB view。 + """ + t0 = time.perf_counter() + + repo = request.app.state.repo + symbols = [r["symbol"] for r in watchlist.list_symbols()] + if not symbols: + return {"rows": [], "as_of": None, "elapsed_ms": 0} + + df_e, cache_date = repo.get_enriched_latest() + if df_e.is_empty(): + return {"rows": [], "as_of": None, "elapsed_ms": 0} + + # 按 symbol 过滤 + df = df_e.filter(pl.col("symbol").is_in(symbols)) + if df.is_empty(): + return {"rows": [], "as_of": str(cache_date) if cache_date else None, "elapsed_ms": 0} + + # JOIN instruments 取 name + float_shares + df_i = repo.get_instruments() + if not df_i.is_empty() and "name" in df_i.columns: + inst_cols = [c for c in ["symbol", "name", "float_shares"] if c in df_i.columns] + df = df.join(df_i.select(inst_cols), on="symbol", how="left") + + # 选择内置需要的列 + keep = [c for c in _WATCHLIST_COLS + ["name", "float_shares"] if c in df.columns] + df = df.select(keep) + + # 动态 JOIN 扩展数据表 + ext_specs = _parse_ext_columns(ext_columns) if ext_columns else [] + if ext_specs: + db = repo.store.db + data_dir = repo.store.data_dir + from app.services.ext_data import ExtConfigStore + from app.api.ext_data import _read_ext_dataframe + + ext_store = ExtConfigStore(data_dir) + configs = {c.id: c for c in ext_store.load_all()} + + for config_id, field_name in ext_specs: + view_name = f"ext_{config_id}" + ext_col_name = f"{config_id}__{field_name}" + try: + # 扩展时序数据必须只取最新分区;否则一个 symbol 会按历史分区数被 JOIN 放大。 + cfg = configs.get(config_id) + if cfg: + ext_df, _ = _read_ext_dataframe(cfg, data_dir) + else: + ext_df = pl.from_arrow(db.query( + f"SELECT symbol, \"{field_name}\" FROM {view_name}" + ).arrow()) + if not ext_df.is_empty() and "symbol" in ext_df.columns: + ext_df = ( + ext_df + .select(["symbol", field_name]) + .unique(subset=["symbol"], keep="last") + .rename({field_name: ext_col_name}) + ) + df = df.join(ext_df.select(["symbol", ext_col_name]), on="symbol", how="left") + except Exception: + # view 不存在或字段不存在,尝试直接读 parquet + cfg = configs.get(config_id) + if cfg: + try: + ext_df, _ = _read_ext_dataframe(cfg, data_dir) + if not ext_df.is_empty() and "symbol" in ext_df.columns and field_name in ext_df.columns: + ext_df = ( + ext_df + .select(["symbol", field_name]) + .unique(subset=["symbol"], keep="last") + .rename({field_name: ext_col_name}) + ) + df = df.join(ext_df, on="symbol", how="left") + except Exception as e2: + logger.debug("ext join fallback failed for %s.%s: %s", config_id, field_name, e2) + + # sanitize NaN / Inf + float_cols = [c for c in df.columns if df[c].dtype.is_float()] + if float_cols: + df = df.with_columns([ + pl.when(pl.col(c).is_nan() | pl.col(c).is_infinite()) + .then(None) + .otherwise(pl.col(c)) + .alias(c) + for c in float_cols + ]) + + # 按自选添加顺序(新加的在前)重排行 + order_map = {s: i for i, s in enumerate(symbols)} + df = df.with_columns(pl.col("symbol").map_elements(lambda s: order_map.get(s, len(symbols)), return_dtype=pl.Int32).alias("_sort_order")) + df = df.sort("_sort_order").drop("_sort_order") + + rows = df.to_dicts() + elapsed = (time.perf_counter() - t0) * 1000 + return {"rows": rows, "as_of": str(cache_date) if cache_date else None, "elapsed_ms": elapsed} + + +def _parse_ext_columns(ext_columns: str) -> list[tuple[str, str]]: + """解析 'config_id1.field1,config_id2.field2' 为 [(config_id, field_name), ...]""" + result = [] + for part in ext_columns.split(","): + part = part.strip() + if "." not in part: + continue + config_id, field_name = part.split(".", 1) + config_id = config_id.strip() + field_name = field_name.strip() + if config_id and field_name: + result.append((config_id, field_name)) + return result diff --git a/backend/app/auth.py b/backend/app/auth.py new file mode 100644 index 0000000..8f7f4e7 --- /dev/null +++ b/backend/app/auth.py @@ -0,0 +1,189 @@ +"""访问门控 —— 支持管理员令牌 + 动态 UUID 两种凭证。 + +部署方式(优先级从高到低): +1. ADMIN_TOKEN: 管理员初始令牌(如 admin7226132)。验证通过后进入管理页, + 可创建普通 UUID 供合伙人使用,管理员本身也可访问全部功能。 +2. 动态 UUID: 管理员通过 /admin/uuids 创建的访问 UUID,持久化在 + data/user_data/access_uuids.json。 +3. ACCESS_UUID: 遗留单共享 UUID,保持向后兼容。 + +以上全部留空则门控不启用。 +""" +from __future__ import annotations + +import hmac +import logging +import secrets +import time +from enum import Enum +from typing import Any + +from fastapi import HTTPException, Request +from pydantic import BaseModel + +from app.config import settings +from app import uuid_store + +logger = logging.getLogger(__name__) + + +class AuthRole(str, Enum): + ADMIN = "admin" + USER = "user" + + +# 内存中的令牌缓存:{token: {"role": role, "expires_at": float}} +_token_cache: dict[str, dict[str, Any]] = {} + +# 令牌默认有效期:7 天 +TOKEN_TTL_SECONDS = 7 * 24 * 60 * 60 + + +class VerifyIn(BaseModel): + credential: str + + +class VerifyOut(BaseModel): + valid: bool + role: str | None = None + token: str | None = None + + +class AuthStatusOut(BaseModel): + enabled: bool + verified: bool + role: str | None = None + + +class UuidRecordOut(BaseModel): + uuid: str + label: str + enabled: bool + created_at: int + + +class UuidCreateIn(BaseModel): + label: str = "" + + +def access_control_enabled() -> bool: + """是否启用了任何访问门控。""" + return bool(settings.admin_token) or bool(settings.access_uuid) + + +def admin_mode_enabled() -> bool: + """是否启用了管理员令牌模式。""" + return bool(settings.admin_token) + + +def _constant_time_compare(a: str, b: str) -> bool: + """常量时间字符串比较,降低时序攻击风险。""" + return hmac.compare_digest(a.encode(), b.encode()) + + +def verify_admin_token(credential: str | None) -> bool: + """校验是否为管理员令牌。""" + if not credential or not settings.admin_token: + return False + return _constant_time_compare(credential.strip(), settings.admin_token.strip()) + + +def verify_uuid(credential: str | None) -> bool: + """校验输入是否为有效访问 UUID(遗留单 UUID 或动态 UUID)。""" + if not credential: + return False + stripped = credential.strip() + # 动态 UUID + if uuid_store.exists(stripped): + return True + # 遗留单共享 UUID + if settings.access_uuid and _constant_time_compare(stripped, settings.access_uuid.strip()): + return True + return False + + +def verify_credential(credential: str | None) -> AuthRole | None: + """校验任意凭证,返回对应角色;无效返回 None。""" + if not credential: + return None + if verify_admin_token(credential): + return AuthRole.ADMIN + if verify_uuid(credential): + return AuthRole.USER + return None + + +def create_access_token(role: AuthRole) -> str: + """生成一个随机访问令牌并缓存。""" + token = secrets.token_urlsafe(32) + _token_cache[token] = {"role": role, "expires_at": time.time() + TOKEN_TTL_SECONDS} + return token + + +def validate_access_token(token: str | None) -> AuthRole | None: + """校验令牌是否有效,返回角色。""" + if not token: + return None + cached = _token_cache.get(token) + if cached is None: + return None + expires_at = cached.get("expires_at", 0) + if expires_at > 0 and time.time() > expires_at: + _token_cache.pop(token, None) + return None + return cached.get("role") + + +def revoke_access_token(token: str | None) -> None: + """使指定令牌失效。""" + if token: + _token_cache.pop(token, None) + + +def get_access_token_from_request(request: Request) -> str | None: + """从请求头或 query 参数中提取访问令牌。""" + header = request.headers.get("X-Access-Token") + if header: + return header.strip() + return request.query_params.get("access_token") + + +def require_access(request: Request, allowed_roles: set[AuthRole] | None = None) -> AuthRole: + """FastAPI 依赖:未通过校验时抛出 401。 + + allowed_roles: 仅允许指定角色访问;None 表示 admin/user 均可。 + """ + if not access_control_enabled(): + return AuthRole.ADMIN # 未启用门控时视为最高权限 + token = get_access_token_from_request(request) + role = validate_access_token(token) + if role is None: + raise HTTPException(status_code=401, detail="访问令牌无效或已过期") + if allowed_roles is not None and role not in allowed_roles: + raise HTTPException(status_code=403, detail="权限不足") + return role + + +def require_admin(request: Request) -> AuthRole: + """FastAPI 依赖:仅管理员可访问。""" + return require_access(request, allowed_roles={AuthRole.ADMIN}) + + +def is_public_path(path: str) -> bool: + """判断请求路径是否属于白名单(无需校验)。""" + public_prefixes = ( + "/health", + "/api/auth/", + "/assets/", + "/index.html", + "/favicon.ico", + "/robots.txt", + "/manifest.json", + ) + lowered = path.lower() + return lowered.startswith(public_prefixes) or lowered == "/" + + +def is_admin_path(path: str) -> bool: + """判断是否为管理员接口路径。""" + return path.lower().startswith("/api/admin/") diff --git a/backend/app/backtest/__init__.py b/backend/app/backtest/__init__.py new file mode 100644 index 0000000..adfd49b --- /dev/null +++ b/backend/app/backtest/__init__.py @@ -0,0 +1,4 @@ +"""回测模块 — 因子回测 + 策略回测 + 信号回测。 + +架构: BacktestEngine (共享) → FactorBacktestService / StrategyBacktestService +""" diff --git a/backend/app/backtest/engine.py b/backend/app/backtest/engine.py new file mode 100644 index 0000000..8d43975 --- /dev/null +++ b/backend/app/backtest/engine.py @@ -0,0 +1,1507 @@ +"""回测引擎 — 共享数据加载 + 撮合 + 统计计算。 + +纯 Polars/NumPy 实现,不依赖 pandas/vectorbt。 +""" +from __future__ import annotations + +import hashlib +import logging +import time +from collections import OrderedDict +from dataclasses import dataclass +from datetime import date +from typing import Callable + +logger = logging.getLogger(__name__) +from typing import Literal + +import numpy as np +import polars as pl + +from app.tickflow.repository import KlineRepository + +logger = logging.getLogger(__name__) + + +# ================================================================ +# 数据结构 +# ================================================================ + +@dataclass +class MatcherConfig: + # matching 为向后兼容入口: 仅传 matching 时, entry_fill/exit_fill 都取 matching 的值。 + # 显式传入 entry_fill/exit_fill 时以二者为准 (允许建仓/清仓口径不同)。 + matching: Literal["close_t", "open_t+1"] = "close_t" + entry_fill: Literal["close_t", "open_t+1"] | None = None + exit_fill: Literal["close_t", "open_t+1"] | None = None + fees_pct: float = 0.0002 + slippage_bps: float = 5.0 + stop_loss_pct: float | None = None + trailing_stop_pct: float | None = None + trailing_take_profit_activate_pct: float | None = None + trailing_take_profit_drawdown_pct: float | None = None + max_hold_days: int | None = None + max_positions: int = 10 + max_exposure_pct: float = 1.0 + score_min: float | None = None + score_max: float | None = None + initial_capital: float = 1_000_000.0 + position_sizing: Literal["equal", "score_weight"] = "equal" + + def __post_init__(self) -> None: + # 解析最终口径: 优先 entry_fill/exit_fill, 否则回退到 matching (向后兼容)。 + if self.entry_fill is None: + self.entry_fill = self.matching + if self.exit_fill is None: + self.exit_fill = self.matching + + +@dataclass +class TradeRecord: + symbol: str + entry_date: date + exit_date: date + entry_price: float + exit_price: float + pnl_pct: float + duration: int + exit_reason: str # "signal" | "stop_loss" | "trailing_stop" | "trailing_take_profit" | "max_hold" | "end" + # 退出优先级 (高→低): pending_exit(历史挂单) > 风控(止损/移动止损/移动止盈) > signal(卖点) > max_hold(到期) > end + name: str = "" + shares: float = 0.0 + lots: float = 0.0 + position_pct: float = 0.0 + entry_value: float = 0.0 + exit_value: float = 0.0 + pnl_amount: float = 0.0 + entry_score: float | None = None + entry_signal_date: date | str | None = None + exit_signal_date: date | str | None = None + blocked_exit_days: int = 0 + + +@dataclass +class SimResult: + equity_curve: list[dict] # [{date, value}] + drawdown_curve: list[dict] # [{date, value}] + trades: list[TradeRecord] + per_symbol_stats: list[dict] + stats: dict + + +# ================================================================ +# PanelCache — 避免重复 scan_parquet + compute_all +# ================================================================ + +class _CacheEntry: + __slots__ = ("df", "ts") + + def __init__(self, df: pl.DataFrame, ts: float): + self.df = df + self.ts = ts + + +class PanelCache: + """LRU + TTL 数据面板缓存。""" + + def __init__(self, max_size: int = 2, ttl_seconds: int = 180): + self._cache: OrderedDict[str, _CacheEntry] = OrderedDict() + self._max_size = max_size + self._ttl = ttl_seconds + + def get_or_compute( + self, + symbols: list[str] | None, + start: date, + end: date, + columns: list[str] | None, + compute_fn, + ) -> pl.DataFrame: + key = self._make_key(symbols, start, end, columns) + now = time.monotonic() + + if key in self._cache: + entry = self._cache[key] + if now - entry.ts < self._ttl: + self._cache.move_to_end(key) + return entry.df + del self._cache[key] + + df = compute_fn(symbols, start, end, columns) + self._cache[key] = _CacheEntry(df=df, ts=now) + if len(self._cache) > self._max_size: + self._cache.popitem(last=False) + return df + + def invalidate(self) -> None: + self._cache.clear() + + @staticmethod + def _make_key(symbols: list[str] | None, start: date, end: date, columns: list[str] | None) -> str: + if symbols is None: + h = "all" + else: + h = hashlib.md5(",".join(sorted(symbols)).encode()).hexdigest()[:12] + cols = "all" if columns is None else hashlib.md5(",".join(sorted(columns)).encode()).hexdigest()[:8] + return f"{h}:{start}:{end}:{cols}" + + +# ================================================================ +# BacktestEngine +# ================================================================ + +class BacktestEngine: + """回测引擎 — 数据加载 + 撮合模拟 + 统计计算。""" + + def __init__(self, repo: KlineRepository) -> None: + self.repo = repo + self._cache = PanelCache() + + # ── 数据加载 ────────────────────────────────────── + + def load_panel( + self, + symbols: list[str] | None, + start: date, + end: date, + columns: list[str] | None = None, + ) -> pl.DataFrame: + """加载 enriched 数据面板,带缓存。""" + return self._cache.get_or_compute(symbols, start, end, columns, self._load_panel_inner) + + def _load_panel_inner( + self, + symbols: list[str] | None, + start: date, + end: date, + columns: list[str] | None = None, + ) -> pl.DataFrame: + t0 = time.perf_counter() + + # 近期区间优先复用 repository 的预计算 enriched 历史缓存,避免重复 scan_parquet + compute_all。 + try: + if self.repo is not None and hasattr(self.repo, "get_enriched_range"): + cached = self.repo.get_enriched_range(start, end, symbols=symbols, columns=columns) + if cached is not None and not cached.is_empty(): + elapsed = (time.perf_counter() - t0) * 1000 + logger.info("load_panel(cache): %.0fms, %d rows, %d columns", elapsed, len(cached), len(cached.columns)) + return cached + except Exception as e: # noqa: BLE001 + logger.debug("backtest load panel cache miss: %s", e) + + enriched_glob = str(self.repo.store.data_dir / "kline_daily_enriched" / "**" / "*.parquet") + + try: + lf = pl.scan_parquet(enriched_glob) + if symbols is not None: + lf = lf.filter(pl.col("symbol").is_in(symbols)) + if columns is not None: + available = set(lf.collect_schema().names()) + selected = [c for c in columns if c in available] + if "symbol" not in selected and "symbol" in available: + selected.insert(0, "symbol") + if "date" not in selected and "date" in available: + selected.insert(1, "date") + lf = lf.select(selected) + df = ( + lf.filter( + (pl.col("date") >= start) + & (pl.col("date") <= end) + ) + .sort(["symbol", "date"]) + .collect(streaming=True) + ) + except Exception as e: + logger.warning("backtest load panel failed: %s", e) + return pl.DataFrame() + + if df.is_empty(): + return df + + if columns is not None: + elapsed = (time.perf_counter() - t0) * 1000 + logger.info("load_panel: %.0fms, %d rows, %d columns", elapsed, len(df), len(df.columns)) + return df + + from app.indicators.pipeline import compute_all + instruments = self.repo.get_instruments() + df = compute_all(df, instruments=instruments) + if not instruments.is_empty() and "name" not in df.columns: + inst_cols = [c for c in ["symbol", "name"] if c in instruments.columns] + if len(inst_cols) == 2: + df = df.join( + instruments.select(inst_cols).unique(subset=["symbol"]), + on="symbol", + how="left", + ) + + elapsed = (time.perf_counter() - t0) * 1000 + logger.info("load_panel: %.0fms, %d rows", elapsed, len(df)) + return df + + # ── 撮合模拟 ────────────────────────────────────── + + def simulate( + self, + panel: pl.DataFrame, + entries: pl.Series | None, + exits: pl.Series | None, + config: MatcherConfig, + ) -> SimResult: + """纯 NumPy 撮合模拟 — 逐 symbol 状态机。""" + if panel.is_empty(): + return self._empty_result() + + n = len(panel) + panel_dates = panel["date"].to_numpy() + panel_symbols = panel["symbol"].to_numpy() + + # 构建信号数组 + ent = np.zeros(n, dtype=bool) + ext = np.zeros(n, dtype=bool) + if entries is not None and len(entries) == n: + ent = entries.to_numpy().astype(bool) + if exits is not None and len(exits) == n: + ext = exits.to_numpy().astype(bool) + + if not ent.any(): + return self._empty_result() + + # 成交口径: entry/exit 可分别配置 close_t (信号当日收盘) 或 open_t+1 (次日开盘)。 + # open_t+1 时信号右移 1 天 (用前一根的信号 + 当根的 open 成交)。 + open_prices = panel["open"].to_numpy() + close_prices = panel["close"].to_numpy() + + # 同一 symbol 内相邻行掩码, 跨 symbol 边界不允许 shift (避免错配)。 + same_prev_symbol = np.zeros(n, dtype=bool) + same_prev_symbol[1:] = panel_symbols[1:] == panel_symbols[:-1] + + entry_prices = open_prices if config.entry_fill == "open_t+1" else close_prices + exit_prices = open_prices if config.exit_fill == "open_t+1" else close_prices + + if config.entry_fill == "open_t+1": + ent_s = np.zeros(n, dtype=bool) + ent_s[1:] = ent[:-1] & same_prev_symbol + ent = ent_s + if config.exit_fill == "open_t+1": + ext_s = np.zeros(n, dtype=bool) + ext_s[1:] = ext[:-1] & same_prev_symbol + ext = ext_s + + # 逐 symbol 撮合 + trades: list[TradeRecord] = [] + unique_symbols = np.unique(panel_symbols) + + for sym in unique_symbols: + mask = panel_symbols == sym + sym_ent = ent[mask] + sym_ext = ext[mask] + sym_entry_prices = entry_prices[mask] + sym_exit_prices = exit_prices[mask] + sym_close = close_prices[mask] + sym_dates = panel_dates[mask] + + holding = False + entry_idx = -1 + entry_price = 0.0 + hold_days = 0 + + for i in range(len(sym_ent)): + if not holding: + if sym_ent[i]: + holding = True + entry_idx = i + entry_price = float(sym_entry_prices[i]) + hold_days = 0 + else: + hold_days += 1 + exit_triggered = False + exit_reason = "" + + # 止损 — 用当日 close 检测 (优先级最高) + if config.stop_loss_pct is not None: + pnl = (float(sym_close[i]) - entry_price) / entry_price + if pnl <= -abs(config.stop_loss_pct): + exit_triggered = True + exit_reason = "stop_loss" + + # 信号退出 (优先于 max_hold: 卖点信号是策略主动离场) + if not exit_triggered and sym_ext[i]: + exit_triggered = True + exit_reason = "signal" + + # 最大持仓天数 (兜底: 无信号/未止损时强制平仓) + if not exit_triggered and config.max_hold_days is not None: + if hold_days >= config.max_hold_days: + exit_triggered = True + exit_reason = "max_hold" + + if exit_triggered: + exit_price = float(sym_exit_prices[i]) + pnl_pct = (exit_price - entry_price) / entry_price if entry_price > 0 else 0.0 + fee_cost = config.fees_pct * 2 + config.slippage_bps / 10000.0 * 2 + pnl_pct -= fee_cost + + e_date = sym_dates[entry_idx] + x_date = sym_dates[i] + trades.append(TradeRecord( + symbol=str(sym), + entry_date=e_date.item() if hasattr(e_date, "item") else e_date, + exit_date=x_date.item() if hasattr(x_date, "item") else x_date, + entry_price=round(entry_price, 4), + exit_price=round(exit_price, 4), + pnl_pct=round(pnl_pct, 6), + duration=int(hold_days), + exit_reason=exit_reason, + )) + holding = False + + # 净值曲线: 按出场日期归集收益 + all_dates_sorted = np.sort(np.unique(panel_dates)) + equity_curve, drawdown_curve = self._build_curves(trades, all_dates_sorted, config.initial_capital) + + # 统计 + date_min = panel_dates.min() + date_max = panel_dates.max() + d_min = date_min.item() if hasattr(date_min, "item") else date_min + d_max = date_max.item() if hasattr(date_max, "item") else date_max + stats = self._calc_stats(trades, config.initial_capital, d_min, d_max) + per_symbol = self._calc_per_symbol(trades) + + return SimResult( + equity_curve=equity_curve, + drawdown_curve=drawdown_curve, + trades=trades, + per_symbol_stats=per_symbol, + stats=stats, + ) + + def simulate_independent_candidates( + self, + panel: pl.DataFrame, + entries: pl.Series | None, + exits: pl.Series | None, + config: MatcherConfig, + progress_cb: "Callable[[dict], None] | None" = None, + cancel_event: "threading.Event | None" = None, + ) -> SimResult: + """全量候选独立执行:每个买入信号都是独立样本, 不受资金/仓位限制。""" + if panel.is_empty(): + return self._empty_result() + + n = len(panel) + panel_dates = panel["date"].to_numpy() + panel_symbols = panel["symbol"].to_numpy() + + ent_raw = np.zeros(n, dtype=bool) + ext_raw = np.zeros(n, dtype=bool) + if entries is not None and len(entries) == n: + ent_raw = entries.to_numpy().astype(bool) + if exits is not None and len(exits) == n: + ext_raw = exits.to_numpy().astype(bool) + n_candidates = int(ent_raw.sum()) + if n_candidates <= 0: + return self._empty_result() + + entry_signal_dates = np.array([None] * n, dtype=object) + exit_signal_dates = np.array([None] * n, dtype=object) + same_prev_symbol = panel_symbols[1:] == panel_symbols[:-1] + + # 建仓口径: close_t 用信号日收盘, open_t+1 右移到次日 open 成交。 + ent = np.zeros(n, dtype=bool) + if config.entry_fill == "open_t+1": + ent[1:] = ent_raw[:-1] & same_prev_symbol + for idx in np.flatnonzero(ent): + entry_signal_dates[idx] = self._date_str(panel_dates[idx - 1]) + else: + ent = ent_raw + for idx in np.flatnonzero(ent): + entry_signal_dates[idx] = self._date_str(panel_dates[idx]) + + # 清仓口径: 独立于建仓, close_t 用信号日收盘, open_t+1 右移到次日 open。 + ext = np.zeros(n, dtype=bool) + if config.exit_fill == "open_t+1": + ext[1:] = ext_raw[:-1] & same_prev_symbol + for idx in np.flatnonzero(ext): + exit_signal_dates[idx] = self._date_str(panel_dates[idx - 1]) + else: + ext = ext_raw + for idx in np.flatnonzero(ext): + exit_signal_dates[idx] = self._date_str(panel_dates[idx]) + + open_prices = panel["open"].to_numpy() + high_prices = panel["high"].to_numpy() if "high" in panel.columns else open_prices + low_prices = panel["low"].to_numpy() + close_prices = panel["close"].to_numpy() + # 撮合价: 建仓/清仓各自独立选列。 + entry_prices = open_prices if config.entry_fill == "open_t+1" else close_prices + exit_prices = open_prices if config.exit_fill == "open_t+1" else close_prices + has_volume = "volume" in panel.columns + volumes = panel["volume"].fill_null(0).to_numpy() if has_volume else np.ones(n, dtype=float) + names = panel["name"].fill_null("").to_numpy() if "name" in panel.columns else np.array([""] * n) + scores = panel["score"].fill_null(0).to_numpy() if "score" in panel.columns else np.zeros(n, dtype=float) + trade_scores = scores.copy() + # 评分跟随建仓口径 shift (评分在买入日生效)。 + if config.entry_fill == "open_t+1": + trade_scores[1:] = np.where(panel_symbols[1:] == panel_symbols[:-1], scores[:-1], trade_scores[1:]) + limit_up_flags = ( + panel["signal_limit_up"].fill_null(False).to_numpy().astype(bool) + if "signal_limit_up" in panel.columns else np.zeros(n, dtype=bool) + ) + limit_down_flags = ( + panel["signal_limit_down"].fill_null(False).to_numpy().astype(bool) + if "signal_limit_down" in panel.columns else np.zeros(n, dtype=bool) + ) + + symbol_rows: dict[str, list[int]] = {} + row_pos_in_symbol = np.zeros(n, dtype=int) + for i, sym_value in enumerate(panel_symbols): + sym = str(sym_value) + rows = symbol_rows.setdefault(sym, []) + row_pos_in_symbol[i] = len(rows) + rows.append(i) + + buy_cost_pct = config.fees_pct + config.slippage_bps / 10000.0 + sell_cost_pct = config.fees_pct + config.slippage_bps / 10000.0 + score_min = getattr(config, "score_min", None) + score_max = getattr(config, "score_max", None) + trades: list[TradeRecord] = [] + execution_stats: dict[str, int] = { + "buy_invalid_price": 0, + "buy_suspended": 0, + "buy_limit_up": 0, + "buy_score_filter": 0, + "buy_no_next_bar": max(n_candidates - int(ent.sum()), 0), + "sell_invalid_price": 0, + "sell_suspended": 0, + "sell_limit_down": 0, + "sell_no_future": 0, + "pending_exit": 0, + } + + def _count(key: str) -> None: + execution_stats[key] = execution_stats.get(key, 0) + 1 + + def _valid_price(value) -> bool: + try: + v = float(value) + except (TypeError, ValueError): + return False + return v > 0 and np.isfinite(v) + + def _is_suspended(idx: int) -> bool: + o = float(open_prices[idx]) + h = float(high_prices[idx]) + l = float(low_prices[idx]) + c = float(close_prices[idx]) + valid_bar = any(_valid_price(x) for x in (o, h, l, c)) + if not valid_bar: + return True + if has_volume and float(volumes[idx] or 0) <= 0: + same_price = max(o, h, l, c) - min(o, h, l, c) <= max(abs(c) * 1e-4, 0.01) + if same_price: + return True + return False + + def _is_one_price_limit(idx: int, direction: str) -> bool: + if _is_suspended(idx): + return False + o = float(open_prices[idx]) + h = float(high_prices[idx]) + l = float(low_prices[idx]) + c = float(close_prices[idx]) + if not all(_valid_price(x) for x in (o, h, l, c)): + return False + same_price = max(o, h, l, c) - min(o, h, l, c) <= max(abs(c) * 1e-4, 0.01) + if direction == "up": + return bool(limit_up_flags[idx]) and same_price + return bool(limit_down_flags[idx]) and same_price + + def _can_buy(idx: int) -> tuple[bool, str]: + if _is_suspended(idx): + return False, "buy_suspended" + if not _valid_price(entry_prices[idx]): + return False, "buy_invalid_price" + if _is_one_price_limit(idx, "up"): + return False, "buy_limit_up" + return True, "" + + def _can_sell(idx: int, exit_price_override: float | None = None) -> tuple[bool, str]: + if _is_suspended(idx): + return False, "sell_suspended" + exit_price = exit_price_override if exit_price_override is not None else exit_prices[idx] + if not _valid_price(exit_price): + return False, "sell_invalid_price" + if _is_one_price_limit(idx, "down"): + return False, "sell_limit_down" + return True, "" + + def _risk_exit(pos: dict, idx: int) -> tuple[str | None, float | None]: + if pos.get("pending_exit_reason") or pos.get("entry_idx") == idx: + return None, None + entry_price = float(pos["entry_price"]) + if entry_price <= 0: + return None, None + open_price = float(open_prices[idx]) + low_price = float(low_prices[idx]) + peak_price = float(pos.get("max_high", entry_price)) + risk_lines: list[tuple[float, str]] = [] + + if config.stop_loss_pct is not None: + risk_lines.append((entry_price * (1 - abs(config.stop_loss_pct)), "stop_loss")) + if config.trailing_stop_pct is not None and peak_price > 0: + risk_lines.append((peak_price * (1 - abs(config.trailing_stop_pct)), "trailing_stop")) + + activate_pct = getattr(config, "trailing_take_profit_activate_pct", None) + drawdown_pct = getattr(config, "trailing_take_profit_drawdown_pct", None) + if activate_pct is not None and drawdown_pct is not None and peak_price > entry_price: + peak_profit = peak_price / entry_price - 1 + if peak_profit >= abs(float(activate_pct)): + risk_lines.append((entry_price * (1 + peak_profit - abs(float(drawdown_pct))), "trailing_take_profit")) + + risk_lines = [(line, reason) for line, reason in risk_lines if _valid_price(line)] + if not risk_lines: + return None, None + stop_price, reason = max(risk_lines, key=lambda item: item[0]) + if _valid_price(open_price) and open_price <= stop_price: + return reason, open_price + if _valid_price(low_price) and low_price <= stop_price: + return reason, stop_price + return None, None + + def _try_close(pos: dict, idx: int, reason: str, signal_date: str, exit_price_override: float | None = None) -> bool: + ok, block_reason = _can_sell(idx, exit_price_override) + if not ok: + if not pos.get("pending_exit_reason"): + pos["pending_exit_reason"] = reason + pos["pending_exit_signal_date"] = signal_date + _count("pending_exit") + pos["blocked_exit_days"] = int(pos.get("blocked_exit_days", 0)) + 1 + _count(block_reason) + return False + + exit_price = float(exit_price_override) if exit_price_override is not None else float(exit_prices[idx]) + shares = 100.0 + entry_value = shares * float(pos["entry_price"]) * (1 + buy_cost_pct) + exit_value = shares * exit_price * (1 - sell_cost_pct) + pnl_amount = exit_value - entry_value + pnl_pct = pnl_amount / entry_value if entry_value > 0 else 0.0 + trades.append(TradeRecord( + symbol=str(pos["symbol"]), + name=str(pos.get("name", "")), + entry_date=pos["entry_date"], + exit_date=self._date_str(panel_dates[idx]), + entry_price=round(float(pos["entry_price"]), 4), + exit_price=round(exit_price, 4), + pnl_pct=round(float(pnl_pct), 6), + duration=int(pos["hold_days"]), + exit_reason=reason, + shares=shares, + lots=1.0, + position_pct=0.0, + entry_value=round(float(entry_value), 2), + exit_value=round(float(exit_value), 2), + pnl_amount=round(float(pnl_amount), 2), + entry_score=round(float(pos["entry_score"]), 2) if pos.get("entry_score") is not None else None, + entry_signal_date=pos.get("entry_signal_date"), + exit_signal_date=signal_date, + blocked_exit_days=int(pos.get("blocked_exit_days", 0)), + )) + return True + + candidate_indices = np.flatnonzero(ent) + for seq, entry_idx in enumerate(candidate_indices, start=1): + if cancel_event is not None and cancel_event.is_set(): + logger.info("全量模拟被用户取消 (第 %d/%d 个候选)", seq, len(candidate_indices)) + break + if progress_cb is not None and (seq == 1 or seq % 500 == 0): + try: + progress_cb({ + "day": seq, + "total": len(candidate_indices), + "date": self._date_str(panel_dates[entry_idx]), + "equity": 0, + }) + except Exception: + pass + + ok, block_reason = _can_buy(entry_idx) + if not ok: + _count(block_reason) + continue + score = float(trade_scores[entry_idx] or 0.0) + if score_min is not None and score < score_min: + _count("buy_score_filter") + continue + if score_max is not None and score > score_max: + _count("buy_score_filter") + continue + + sym = str(panel_symbols[entry_idx]) + rows = symbol_rows.get(sym, []) + start_pos = int(row_pos_in_symbol[entry_idx]) + if start_pos >= len(rows): + _count("sell_no_future") + continue + + entry_price = float(entry_prices[entry_idx]) + pos = { + "symbol": sym, + "name": str(names[entry_idx] or ""), + "entry_idx": entry_idx, + "entry_date": self._date_str(panel_dates[entry_idx]), + "entry_signal_date": entry_signal_dates[entry_idx] or self._date_str(panel_dates[entry_idx]), + "entry_price": entry_price, + "entry_score": score, + "hold_days": 0, + "max_high": entry_price, + "pending_exit_reason": None, + "pending_exit_signal_date": None, + "blocked_exit_days": 0, + } + hi = float(high_prices[entry_idx]) + if _valid_price(hi): + pos["max_high"] = max(float(pos["max_high"]), hi) + + closed = False + last_idx = entry_idx + for idx in rows[start_pos + 1:]: + last_idx = idx + pos["hold_days"] = int(pos["hold_days"]) + 1 + d_str = self._date_str(panel_dates[idx]) + + def _scheduled_reason() -> tuple[str | None, str]: + if pos.get("pending_exit_reason"): + return str(pos["pending_exit_reason"]), str(pos.get("pending_exit_signal_date") or d_str) + # 卖点信号优先于到期: 策略主动离场先于 max_hold 兜底。 + if ext[idx]: + return "signal", str(exit_signal_dates[idx] or d_str) + if config.max_hold_days is not None and pos["hold_days"] >= config.max_hold_days: + return "max_hold", d_str + if idx == rows[-1]: + return "end", d_str + return None, d_str + + # 统一退出顺序: 风控(止损/移动止损/止盈)先于计划出场 (signal/max_hold/end)。 + # 无论 entry/exit 口径如何, 风控都是保护性离场, 必须最高优先级。 + reason, override_price = _risk_exit(pos, idx) + if reason and _try_close(pos, idx, reason, d_str, override_price): + closed = True + break + reason, signal_date = _scheduled_reason() + if reason and _try_close(pos, idx, reason, signal_date): + closed = True + break + + hi = float(high_prices[idx]) + if _valid_price(hi): + pos["max_high"] = max(float(pos.get("max_high", entry_price)), hi) + + if not closed: + if last_idx == entry_idx: + _count("sell_no_future") + elif not pos.get("pending_exit_reason"): + _try_close(pos, last_idx, "end", self._date_str(panel_dates[last_idx])) + + return self._calc_independent_candidate_result(trades, n_candidates, execution_stats) + + def simulate_portfolio( + self, + panel: pl.DataFrame, + entries: pl.Series | None, + exits: pl.Series | None, + config: MatcherConfig, + progress_cb: "Callable[[dict], None] | None" = None, + cancel_event: "threading.Event | None" = None, + ) -> SimResult: + """账户级组合回测:日线信号 → 成交约束 → 仓位/现金撮合。""" + if panel.is_empty(): + return self._empty_result() + + n = len(panel) + panel_dates = panel["date"].to_numpy() + panel_symbols = panel["symbol"].to_numpy() + + ent_raw = np.zeros(n, dtype=bool) + ext_raw = np.zeros(n, dtype=bool) + if entries is not None and len(entries) == n: + ent_raw = entries.to_numpy().astype(bool) + if exits is not None and len(exits) == n: + ext_raw = exits.to_numpy().astype(bool) + if not ent_raw.any(): + return self._empty_result() + + entry_signal_dates = np.array([None] * n, dtype=object) + exit_signal_dates = np.array([None] * n, dtype=object) + same_prev_symbol = panel_symbols[1:] == panel_symbols[:-1] + + # 建仓口径: close_t 用信号日收盘, open_t+1 右移到次日 open 成交。 + ent = np.zeros(n, dtype=bool) + if config.entry_fill == "open_t+1": + ent[1:] = ent_raw[:-1] & same_prev_symbol + for idx in np.flatnonzero(ent): + entry_signal_dates[idx] = self._date_str(panel_dates[idx - 1]) + else: + ent = ent_raw + for idx in np.flatnonzero(ent): + entry_signal_dates[idx] = self._date_str(panel_dates[idx]) + + # 清仓口径: 独立于建仓。 + ext = np.zeros(n, dtype=bool) + if config.exit_fill == "open_t+1": + ext[1:] = ext_raw[:-1] & same_prev_symbol + for idx in np.flatnonzero(ext): + exit_signal_dates[idx] = self._date_str(panel_dates[idx - 1]) + else: + ext = ext_raw + for idx in np.flatnonzero(ext): + exit_signal_dates[idx] = self._date_str(panel_dates[idx]) + + open_prices = panel["open"].to_numpy() + high_prices = panel["high"].to_numpy() if "high" in panel.columns else open_prices + low_prices = panel["low"].to_numpy() + close_prices = panel["close"].to_numpy() + # 撮合价: 建仓/清仓各自独立选列。 + entry_prices = open_prices if config.entry_fill == "open_t+1" else close_prices + exit_prices = open_prices if config.exit_fill == "open_t+1" else close_prices + has_volume = "volume" in panel.columns + volumes = panel["volume"].fill_null(0).to_numpy() if has_volume else np.ones(n, dtype=float) + names = ( + panel["name"].fill_null("").to_numpy() + if "name" in panel.columns else np.array([""] * n) + ) + scores = ( + panel["score"].fill_null(0).to_numpy() + if "score" in panel.columns else np.zeros(n, dtype=float) + ) + trade_scores = scores.copy() + # 评分跟随建仓口径 shift (评分在买入日生效)。 + if config.entry_fill == "open_t+1": + trade_scores[1:] = np.where(panel_symbols[1:] == panel_symbols[:-1], scores[:-1], trade_scores[1:]) + limit_up_flags = ( + panel["signal_limit_up"].fill_null(False).to_numpy().astype(bool) + if "signal_limit_up" in panel.columns else np.zeros(n, dtype=bool) + ) + limit_down_flags = ( + panel["signal_limit_down"].fill_null(False).to_numpy().astype(bool) + if "signal_limit_down" in panel.columns else np.zeros(n, dtype=bool) + ) + + date_to_indices: dict[str, list[int]] = {} + for i, d in enumerate(panel_dates): + d_str = self._date_str(d) + date_to_indices.setdefault(d_str, []).append(i) + all_dates = sorted(date_to_indices.keys()) + if not all_dates: + return self._empty_result() + + buy_cost_pct = config.fees_pct + config.slippage_bps / 10000.0 + sell_cost_pct = config.fees_pct + config.slippage_bps / 10000.0 + cash = float(config.initial_capital) + peak = cash + max_positions = max(int(config.max_positions), 0) + max_exposure_pct = min(max(float(getattr(config, "max_exposure_pct", 1.0)), 0.0), 1.0) + score_min = getattr(config, "score_min", None) + score_max = getattr(config, "score_max", None) + positions: dict[str, dict] = {} + last_close: dict[str, float] = {} + trades: list[TradeRecord] = [] + equity_curve: list[dict] = [] + drawdown_curve: list[dict] = [] + execution_stats: dict[str, int] = { + "buy_invalid_price": 0, + "buy_suspended": 0, + "buy_limit_up": 0, + "buy_no_slot": 0, + "buy_cash": 0, + "buy_lot_size": 0, + "buy_same_day_reentry": 0, + "buy_exposure": 0, + "buy_score_filter": 0, + "sell_invalid_price": 0, + "sell_suspended": 0, + "sell_limit_down": 0, + "pending_exit": 0, + } + + def _count(key: str) -> None: + execution_stats[key] = execution_stats.get(key, 0) + 1 + + def _valid_price(value) -> bool: + try: + v = float(value) + except (TypeError, ValueError): + return False + return v > 0 and np.isfinite(v) + + def _market_value() -> float: + value = 0.0 + for pos in positions.values(): + mark = last_close.get(pos["symbol"], pos["entry_price"]) + value += pos["shares"] * mark + return value + + def _is_suspended(idx: int) -> bool: + o = float(open_prices[idx]) + h = float(high_prices[idx]) + l = float(low_prices[idx]) + c = float(close_prices[idx]) + valid_bar = any(_valid_price(x) for x in (o, h, l, c)) + if not valid_bar: + return True + if has_volume and float(volumes[idx] or 0) <= 0: + same_price = max(o, h, l, c) - min(o, h, l, c) <= max(abs(c) * 1e-4, 0.01) + if same_price: + return True + return False + + def _is_one_price_limit(idx: int, direction: str) -> bool: + if _is_suspended(idx): + return False + o = float(open_prices[idx]) + h = float(high_prices[idx]) + l = float(low_prices[idx]) + c = float(close_prices[idx]) + if not all(_valid_price(x) for x in (o, h, l, c)): + return False + same_price = max(o, h, l, c) - min(o, h, l, c) <= max(abs(c) * 1e-4, 0.01) + if direction == "up": + return bool(limit_up_flags[idx]) and same_price + return bool(limit_down_flags[idx]) and same_price + + def _can_buy(idx: int) -> tuple[bool, str]: + if _is_suspended(idx): + return False, "buy_suspended" + if not _valid_price(entry_prices[idx]): + return False, "buy_invalid_price" + if _is_one_price_limit(idx, "up"): + return False, "buy_limit_up" + return True, "" + + def _can_sell(idx: int, exit_price_override: float | None = None) -> tuple[bool, str]: + if _is_suspended(idx): + return False, "sell_suspended" + exit_price = exit_price_override if exit_price_override is not None else exit_prices[idx] + if not _valid_price(exit_price): + return False, "sell_invalid_price" + if _is_one_price_limit(idx, "down"): + return False, "sell_limit_down" + return True, "" + + def _mark_pending(sym: str, reason: str, signal_date: str) -> None: + pos = positions[sym] + if not pos.get("pending_exit_reason"): + pos["pending_exit_reason"] = reason + pos["pending_exit_signal_date"] = signal_date + _count("pending_exit") + pos["blocked_exit_days"] = int(pos.get("blocked_exit_days", 0)) + 1 + + def _sell( + sym: str, + idx: int, + reason: str, + signal_date: str, + sold_today: set[str], + exit_price_override: float | None = None, + ) -> None: + nonlocal cash + pos = positions.pop(sym) + exit_price = float(exit_price_override) if exit_price_override is not None else float(exit_prices[idx]) + exit_value = pos["shares"] * exit_price * (1 - sell_cost_pct) + cash += exit_value + pnl_amount = exit_value - pos["entry_value"] + pnl_pct = (exit_value - pos["entry_value"]) / pos["entry_value"] if pos["entry_value"] > 0 else 0.0 + sold_today.add(sym) + trades.append(TradeRecord( + symbol=sym, + name=pos.get("name", ""), + entry_date=pos["entry_date"], + exit_date=self._date_str(panel_dates[idx]), + entry_price=round(float(pos["entry_price"]), 4), + exit_price=round(exit_price, 4), + pnl_pct=round(float(pnl_pct), 6), + duration=int(pos["hold_days"]), + exit_reason=reason, + shares=round(float(pos["shares"]), 4), + lots=round(float(pos["lots"]), 2), + position_pct=round(float(pos.get("position_pct", 0.0)), 6), + entry_value=round(float(pos["entry_value"]), 2), + exit_value=round(float(exit_value), 2), + pnl_amount=round(float(pnl_amount), 2), + entry_score=round(float(pos["entry_score"]), 2) if pos.get("entry_score") is not None else None, + entry_signal_date=pos.get("entry_signal_date"), + exit_signal_date=signal_date, + blocked_exit_days=int(pos.get("blocked_exit_days", 0)), + )) + + def _try_sell( + sym: str, + idx: int | None, + reason: str, + signal_date: str, + sold_today: set[str], + exit_price_override: float | None = None, + ) -> bool: + if idx is None: + _mark_pending(sym, reason, signal_date) + _count("sell_suspended") + return False + ok, block_reason = _can_sell(idx, exit_price_override) + if not ok: + _mark_pending(sym, reason, signal_date) + _count(block_reason) + return False + _sell(sym, idx, reason, signal_date, sold_today, exit_price_override) + return True + + def _process_scheduled_exits( + d_idx: int, + d_str: str, + row_by_symbol: dict[str, int], + sold_today: set[str], + ) -> None: + for sym in list(positions.keys()): + pos = positions.get(sym) + if pos is None: + continue + idx = row_by_symbol.get(sym) + reason = "" + signal_date = d_str + if pos.get("pending_exit_reason"): + reason = str(pos["pending_exit_reason"]) + signal_date = str(pos.get("pending_exit_signal_date") or d_str) + # 卖点信号优先于到期: 策略主动离场先于 max_hold 兜底。 + elif idx is not None and ext[idx]: + reason = "signal" + signal_date = str(exit_signal_dates[idx] or d_str) + elif config.max_hold_days is not None and pos["hold_days"] >= config.max_hold_days: + reason = "max_hold" + elif d_idx == len(all_dates) - 1: + reason = "end" + if reason: + _try_sell(sym, idx, reason, signal_date, sold_today) + + def _process_risk_exits(d_str: str, row_by_symbol: dict[str, int], sold_today: set[str]) -> None: + for sym in list(positions.keys()): + pos = positions.get(sym) + if pos is None or pos.get("pending_exit_reason"): + continue + if pos.get("entry_date") == d_str: + continue + idx = row_by_symbol.get(sym) + if idx is None or pos["entry_price"] <= 0: + continue + open_price = float(open_prices[idx]) + low_price = float(low_prices[idx]) + entry_price = float(pos["entry_price"]) + peak_price = float(pos.get("max_high", entry_price)) + risk_lines: list[tuple[float, str]] = [] + + if config.stop_loss_pct is not None: + risk_lines.append((entry_price * (1 - abs(config.stop_loss_pct)), "stop_loss")) + + if config.trailing_stop_pct is not None and peak_price > 0: + risk_lines.append((peak_price * (1 - abs(config.trailing_stop_pct)), "trailing_stop")) + + activate_pct = getattr(config, "trailing_take_profit_activate_pct", None) + drawdown_pct = getattr(config, "trailing_take_profit_drawdown_pct", None) + if activate_pct is not None and drawdown_pct is not None and peak_price > entry_price: + peak_profit = peak_price / entry_price - 1 + if peak_profit >= abs(float(activate_pct)): + take_profit_line = entry_price * (1 + peak_profit - abs(float(drawdown_pct))) + risk_lines.append((take_profit_line, "trailing_take_profit")) + + risk_lines = [(line, reason) for line, reason in risk_lines if _valid_price(line)] + if not risk_lines: + continue + stop_price, reason = max(risk_lines, key=lambda item: item[0]) + exit_price_override = None + if _valid_price(open_price) and open_price <= stop_price: + exit_price_override = open_price + elif _valid_price(low_price) and low_price <= stop_price: + exit_price_override = stop_price + if exit_price_override is not None: + _try_sell(sym, idx, reason, d_str, sold_today, exit_price_override) + + def _process_entries( + d_str: str, + idxs: list[int], + sold_today: set[str], + ) -> None: + nonlocal cash + if max_positions <= 0: + return + candidates: list[tuple[int, str, float]] = [] + for idx in idxs: + if not ent[idx]: + continue + sym = str(panel_symbols[idx]) + if sym in positions: + continue + if sym in sold_today: + _count("buy_same_day_reentry") + continue + ok, block_reason = _can_buy(idx) + if not ok: + _count(block_reason) + continue + score = float(trade_scores[idx] or 0.0) + if score_min is not None and score < score_min: + _count("buy_score_filter") + continue + if score_max is not None and score > score_max: + _count("buy_score_filter") + continue + candidates.append((idx, sym, score)) + if not candidates: + return + candidates.sort(key=lambda x: x[2], reverse=True) + + slots = max_positions - len(positions) + if slots <= 0: + execution_stats["buy_no_slot"] += len(candidates) + return + + selected = candidates[:slots] + market_value_before = _market_value() + account_equity_before_buy = cash + market_value_before + if account_equity_before_buy <= 0 or max_exposure_pct <= 0: + execution_stats["buy_exposure"] += len(selected) + return + target_position_value = account_equity_before_buy * max_exposure_pct / max_positions + max_exposure_value = account_equity_before_buy * max_exposure_pct + exposure_capacity = max_exposure_value - market_value_before + if exposure_capacity <= 0: + execution_stats["buy_exposure"] += len(selected) + return + + weights = np.repeat(1 / len(selected), len(selected)) + if config.position_sizing == "score_weight": + raw = np.array([max(x[2], 0.0) for x in selected], dtype=float) + if raw.sum() > 0: + weights = raw / raw.sum() + total_budget = min(cash, exposure_capacity, target_position_value * len(selected)) + + for (idx, sym, _score), weight in zip(selected, weights): + if len(positions) >= max_positions: + _count("buy_no_slot") + break + current_market_value = _market_value() + current_equity = cash + current_market_value + current_exposure_capacity = current_equity * max_exposure_pct - current_market_value + allocation = min(total_budget * float(weight), target_position_value, cash, current_exposure_capacity) + if allocation <= 0: + _count("buy_exposure") + continue + entry_price = float(entry_prices[idx]) + shares = np.floor(allocation / (entry_price * (1 + buy_cost_pct)) / 100) * 100 + entry_value = shares * entry_price * (1 + buy_cost_pct) + if shares <= 0: + _count("buy_lot_size") + continue + if entry_value > cash + 1e-6: + _count("buy_cash") + continue + if entry_value > current_exposure_capacity + 1e-6: + _count("buy_exposure") + continue + cash -= entry_value + positions[sym] = { + "symbol": sym, + "name": str(names[idx] or ""), + "entry_date": self._date_str(panel_dates[idx]), + "entry_signal_date": entry_signal_dates[idx] or self._date_str(panel_dates[idx]), + "entry_price": entry_price, + "entry_value": entry_value, + "shares": shares, + "lots": shares / 100, + "position_pct": entry_value / account_equity_before_buy if account_equity_before_buy > 0 else 0.0, + "entry_score": _score, + "max_high": entry_price, + "hold_days": 0, + "pending_exit_reason": None, + "pending_exit_signal_date": None, + "blocked_exit_days": 0, + } + + for d_idx, d_str in enumerate(all_dates): + if d_idx % 20 == 0: + if cancel_event is not None and cancel_event.is_set(): + logger.info("回测被用户取消 (第 %d/%d 天)", d_idx, len(all_dates)) + break + if progress_cb is not None: + try: + progress_cb({ + "day": d_idx + 1, + "total": len(all_dates), + "date": str(d_str)[:10], + "equity": round(cash + _market_value(), 2), + }) + except Exception: + pass + + idxs = date_to_indices[d_str] + row_by_symbol = {str(panel_symbols[i]): i for i in idxs} + sold_today: set[str] = set() + + for pos in positions.values(): + pos["hold_days"] += 1 + + # 统一执行顺序 (不分口径): 风控(止损/移动止损/止盈) → 计划出场(signal/max_hold/end) → 建仓。 + # 风控是保护性离场, 必须最先; 计划出场次之; 建仓最后 (卖出释放的现金/仓位先用于满足新买)。 + # 当天新建仓不会被风控误杀 (_process_risk_exits 跳过 entry_date == d_str 的仓位)。 + _process_risk_exits(d_str, row_by_symbol, sold_today) + _process_scheduled_exits(d_idx, d_str, row_by_symbol, sold_today) + if d_idx < len(all_dates) - 1: + _process_entries(d_str, idxs, sold_today) + + for sym, pos in positions.items(): + idx = row_by_symbol.get(sym) + if idx is not None: + hi = float(high_prices[idx]) + if _valid_price(hi): + pos["max_high"] = max(float(pos.get("max_high", pos["entry_price"])), hi) + + for i in idxs: + c = float(close_prices[i]) + if c > 0 and np.isfinite(c): + last_close[str(panel_symbols[i])] = c + + market_value = _market_value() + equity = cash + market_value + peak = max(peak, equity) + dd = (equity - peak) / peak if peak > 0 else 0.0 + exposure = market_value / equity if equity > 0 else 0.0 + equity_curve.append({ + "date": d_str[:10], + "value": round(float(equity), 2), + "cash": round(float(cash), 2), + "positions": len(positions), + "exposure": round(float(exposure), 4), + }) + drawdown_curve.append({"date": d_str[:10], "value": round(float(dd), 4)}) + + stats = self._calc_portfolio_stats(equity_curve, trades, config.initial_capital) + stats["execution"] = execution_stats + stats["pending_exit_positions"] = sum(1 for p in positions.values() if p.get("pending_exit_reason")) + per_symbol = self._calc_per_symbol(trades) + return SimResult( + equity_curve=equity_curve, + drawdown_curve=drawdown_curve, + trades=trades, + per_symbol_stats=per_symbol, + stats=stats, + ) + + # ── 净值曲线 ────────────────────────────────────── + + @staticmethod + def _build_curves( + trades: list[TradeRecord], + all_dates: np.ndarray, + initial_capital: float, + ) -> tuple[list[dict], list[dict]]: + """从交易记录构建日频净值曲线和回撤曲线。 + + 资金模型: 每笔交易等权分配 (1/N_capital),N_capital = 同时持仓数上限。 + 简化版: 按出场日归集所有已平仓交易的平均收益作为当日组合收益。 + """ + if not trades or len(all_dates) == 0: + return [], [] + + # 按出场日归集 pnl + exit_pnl: dict[str, list[float]] = {} + for t in trades: + d_str = str(t.exit_date) + exit_pnl.setdefault(d_str, []).append(t.pnl_pct) + + equity = initial_capital + peak = initial_capital + curve: list[dict] = [] + dd_curve: list[dict] = [] + + for d in all_dates: + d_str = str(d.item() if hasattr(d, "item") else d) + pnls = exit_pnl.get(d_str, []) + # 当日组合收益 = 该日所有出场交易的平均收益 + daily_ret = float(np.mean(pnls)) if pnls else 0.0 + equity *= (1 + daily_ret) + peak = max(peak, equity) + dd = (equity - peak) / peak if peak > 0 else 0.0 + curve.append({"date": d_str[:10], "value": round(equity, 2)}) + dd_curve.append({"date": d_str[:10], "value": round(dd, 4)}) + + return curve, dd_curve + + # ── 统计计算 ────────────────────────────────────── + + @staticmethod + def _calc_stats( + trades: list[TradeRecord], + initial_capital: float, + start: date, + end: date, + ) -> dict: + if not trades: + return {"total_return": 0, "n_trades": 0} + + pnls = np.array([t.pnl_pct for t in trades]) + n_trades = len(trades) + + # 从净值曲线推算总收益 (等权组合) + cumulative = 1.0 + for p in pnls: + cumulative *= (1 + p) + # 修正: 等权组合的总收益不等于各笔复乘,用曲线终点更准 + # 但这里作为简化,用各笔复乘作为近似 + total_return = cumulative - 1.0 + + # 年化 + n_days = max((end - start).days, 1) + years = n_days / 365.25 + if total_return > -1.0 and years > 0: + annual_return = (1 + total_return) ** (1 / years) - 1 + else: + annual_return = total_return + + # 胜率 + wins = pnls[pnls > 0] + losses = pnls[pnls <= 0] + win_rate = len(wins) / n_trades + + # 盈亏比 + avg_win = float(np.mean(wins)) if len(wins) > 0 else 0.0 + avg_loss = abs(float(np.mean(losses))) if len(losses) > 0 else 0.0 + profit_factor = avg_win / avg_loss if avg_loss > 0 else (float("inf") if avg_win > 0 else 0.0) + + # 最大回撤 — 用交易序列近似 + equity = initial_capital + peak = initial_capital + max_dd = 0.0 + for p in pnls: + equity *= (1 + p) + peak = max(peak, equity) + dd = (equity - peak) / peak + max_dd = min(max_dd, dd) + + # 夏普 — 用交易收益标准差近似 + sharpe = float(np.mean(pnls) / np.std(pnls)) * np.sqrt(252) if np.std(pnls) > 0 else 0.0 + + # Calmar + calmar = annual_return / abs(max_dd) if abs(max_dd) > 0.001 else 0.0 + + return { + "total_return": round(float(total_return), 4), + "annual_return": round(float(annual_return), 4), + "max_drawdown": round(float(max_dd), 4), + "sharpe": round(float(sharpe), 2), + "calmar": round(float(calmar), 2), + "win_rate": round(float(win_rate), 4), + "profit_factor": round(float(profit_factor), 2) if np.isfinite(profit_factor) else None, + "n_trades": n_trades, + "avg_pnl": round(float(np.mean(pnls)), 4), + "avg_win": round(avg_win, 4), + "avg_loss": round(avg_loss, 4), + } + + @staticmethod + def _calc_per_symbol(trades: list[TradeRecord]) -> list[dict]: + if not trades: + return [] + by_sym: dict[str, dict] = {} + for t in trades: + s = t.symbol + d = by_sym.setdefault(s, { + "symbol": s, "n_trades": 0, "total_return": 1.0, + "best": -999.0, "worst": 999.0, "wins": 0, "pnls": [], + }) + d["n_trades"] += 1 + d["pnls"].append(t.pnl_pct) + d["total_return"] *= (1 + t.pnl_pct) + d["best"] = max(d["best"], t.pnl_pct) + d["worst"] = min(d["worst"], t.pnl_pct) + if t.pnl_pct > 0: + d["wins"] += 1 + + result = [] + for d in by_sym.values(): + result.append({ + "symbol": d["symbol"], + "n_trades": d["n_trades"], + "total_return": round(d["total_return"] - 1.0, 4), + "win_rate": round(d["wins"] / d["n_trades"], 4) if d["n_trades"] > 0 else 0.0, + "best": round(d["best"], 4), + "worst": round(d["worst"], 4), + }) + return sorted(result, key=lambda x: x["total_return"], reverse=True) + + @staticmethod + def _calc_independent_candidate_result( + trades: list[TradeRecord], + n_candidates: int, + execution_stats: dict[str, int], + ) -> SimResult: + """全量独立候选统计:按每个候选样本的实际执行收益聚合。""" + if not trades: + return SimResult( + equity_curve=[], + drawdown_curve=[], + trades=[], + per_symbol_stats=[], + stats={ + "mode": "full", + "full_kind": "candidate_execution", + "error": "no executable trades", + "n_candidates": int(n_candidates), + "n_trades": 0, + "execution": execution_stats, + }, + ) + + pnls = np.array([t.pnl_pct for t in trades], dtype=float) + durations = np.array([t.duration for t in trades], dtype=float) + wins = pnls[pnls > 0] + losses = pnls[pnls <= 0] + avg_win = float(np.mean(wins)) if len(wins) else 0.0 + avg_loss = abs(float(np.mean(losses))) if len(losses) else 0.0 + + # 按退出日聚合已实现样本收益, 构造“样本收益曲线”。它不是账户净值。 + daily_returns: dict[str, list[float]] = {} + for t in trades: + daily_returns.setdefault(str(t.exit_date)[:10], []).append(float(t.pnl_pct)) + + equity_curve: list[dict] = [] + drawdown_curve: list[dict] = [] + equity = 1.0 + peak = 1.0 + daily_avg: list[float] = [] + for d_str in sorted(daily_returns.keys()): + values = daily_returns[d_str] + avg_ret = float(np.mean(values)) if values else 0.0 + daily_avg.append(avg_ret) + equity *= (1 + avg_ret) + peak = max(peak, equity) + dd = (equity - peak) / peak if peak > 0 else 0.0 + equity_curve.append({ + "date": d_str, + "value": round(float(equity), 4), + "positions": len(values), + }) + drawdown_curve.append({"date": d_str, "value": round(float(dd), 4)}) + + values = np.array([r["value"] for r in equity_curve], dtype=float) + total_return = float(values[-1] - 1.0) if len(values) else 0.0 + peaks = np.maximum.accumulate(values) if len(values) else np.array([]) + drawdowns = values / peaks - 1 if len(values) else np.array([]) + max_drawdown = float(drawdowns.min()) if len(drawdowns) else 0.0 + daily = np.array(daily_avg, dtype=float) + sharpe = float(np.mean(daily) / np.std(daily) * np.sqrt(252)) if len(daily) > 1 and np.std(daily) > 0 else 0.0 + + lo, hi, nbins = -0.20, 0.20, 20 + clipped = np.clip(pnls, lo, hi) + counts, edges = np.histogram(clipped, bins=nbins, range=(lo, hi)) + dist = [ + { + "range": f"{(edges[i]*100):+.0f}~{(edges[i+1]*100):+.0f}%", + "count": int(counts[i]), + "ratio": round(float(counts[i] / pnls.size), 4) if pnls.size else 0.0, + } + for i in range(nbins) + ] + + stats = { + "mode": "full", + "full_kind": "candidate_execution", + "n_candidates": int(n_candidates), + "n_trades": int(len(trades)), + "n_days": int(len(daily_returns)), + "avg_daily_candidates": round(float(len(trades) / max(len(daily_returns), 1)), 1), + "avg_return": round(float(np.mean(pnls)), 4), + "median_return": round(float(np.median(pnls)), 4), + "win_rate": round(float(len(wins) / len(pnls)), 4) if len(pnls) else 0.0, + "profit_factor": round(float(avg_win / avg_loss), 2) if avg_loss > 0 else None, + "best": round(float(np.max(pnls)), 4), + "worst": round(float(np.min(pnls)), 4), + "avg_duration": round(float(np.mean(durations)), 1) if len(durations) else 0.0, + "total_return": round(float(total_return), 4), + "max_drawdown": round(float(max_drawdown), 4), + "sharpe": round(float(sharpe), 2), + "return_distribution": dist, + "execution": execution_stats, + } + + return SimResult( + equity_curve=equity_curve, + drawdown_curve=drawdown_curve, + trades=trades, + per_symbol_stats=BacktestEngine._calc_per_symbol(trades), + stats=stats, + ) + + @staticmethod + def _calc_portfolio_stats( + equity_curve: list[dict], + trades: list[TradeRecord], + initial_capital: float, + ) -> dict: + if not equity_curve: + return {"total_return": 0, "n_trades": 0} + final_equity = float(equity_curve[-1]["value"]) + total_return = final_equity / initial_capital - 1 if initial_capital > 0 else 0.0 + values = np.array([float(r["value"]) for r in equity_curve], dtype=float) + daily = values[1:] / values[:-1] - 1 if len(values) > 1 else np.array([]) + annual_return = (1 + total_return) ** (252 / max(len(equity_curve), 1)) - 1 if total_return > -1 else total_return + peaks = np.maximum.accumulate(values) + drawdowns = values / peaks - 1 + max_drawdown = float(drawdowns.min()) if len(drawdowns) else 0.0 + sharpe = float(np.mean(daily) / np.std(daily) * np.sqrt(252)) if len(daily) and np.std(daily) > 0 else 0.0 + pnls = np.array([t.pnl_pct for t in trades], dtype=float) if trades else np.array([]) + exposures = np.array([float(r.get("exposure", 0.0)) for r in equity_curve], dtype=float) + wins = pnls[pnls > 0] + losses = pnls[pnls <= 0] + avg_win = float(np.mean(wins)) if len(wins) else 0.0 + avg_loss = abs(float(np.mean(losses))) if len(losses) else 0.0 + return { + "total_return": round(float(total_return), 4), + "annual_return": round(float(annual_return), 4), + "max_drawdown": round(float(max_drawdown), 4), + "sharpe": round(float(sharpe), 2), + "calmar": round(float(annual_return / abs(max_drawdown)), 2) if abs(max_drawdown) > 0.001 else 0.0, + "win_rate": round(float(len(wins) / len(pnls)), 4) if len(pnls) else 0.0, + "profit_factor": round(float(avg_win / avg_loss), 2) if avg_loss > 0 else None, + "n_trades": len(trades), + "avg_pnl": round(float(np.mean(pnls)), 4) if len(pnls) else 0.0, + "avg_win": round(avg_win, 4), + "avg_loss": round(avg_loss, 4), + "final_equity": round(final_equity, 2), + "initial_capital": round(float(initial_capital), 2), + "avg_exposure": round(float(np.mean(exposures)), 4) if len(exposures) else 0.0, + "max_exposure": round(float(np.max(exposures)), 4) if len(exposures) else 0.0, + } + + @staticmethod + def _date_str(value) -> str: + value = value.item() if hasattr(value, "item") else value + return str(value)[:10] + + @staticmethod + def _empty_result() -> SimResult: + return SimResult( + equity_curve=[], drawdown_curve=[], trades=[], + per_symbol_stats=[], stats={"error": "no data or no signals"}, + ) + + # ── 截面工具 (因子回测用) ───────────────────────── + + @staticmethod + def cross_section_rank(panel: pl.DataFrame, col: str) -> pl.DataFrame: + return panel.with_columns( + pl.col(col).rank(method="random").over("date").alias(f"{col}_rank") + ) + + @staticmethod + def cross_section_qcut(panel: pl.DataFrame, col: str, n_groups: int) -> pl.DataFrame: + return panel.with_columns( + pl.col(col).qcut(n_groups, labels=[f"Q{i+1}" for i in range(n_groups)]) + .over("date").alias("_group") + ) diff --git a/backend/app/backtest/factor.py b/backend/app/backtest/factor.py new file mode 100644 index 0000000..740582a --- /dev/null +++ b/backend/app/backtest/factor.py @@ -0,0 +1,480 @@ +"""因子回测服务 — IC/IR 分析 + 分层回测 + 多空组合。 + +纯 Polars 向量化实现,无 pandas 依赖。 +""" +from __future__ import annotations + +import logging +import time +import uuid +from dataclasses import dataclass, field +from datetime import date, timedelta +from typing import Literal + +import numpy as np +import polars as pl + +from app.backtest.engine import BacktestEngine + +logger = logging.getLogger(__name__) + +# 可用因子列 (从 ENRICHED_COLUMNS 过滤出数值型指标) +FACTOR_COLUMNS: list[dict] = [ + {"id": "momentum_5d", "label": "5日动量", "group": "动量", "desc": "5日涨跌幅,正值表示上涨趋势"}, + {"id": "momentum_10d", "label": "10日动量", "group": "动量", "desc": "10日涨跌幅,中短期趋势指标"}, + {"id": "momentum_20d", "label": "20日动量", "group": "动量", "desc": "月度涨跌幅,常用因子"}, + {"id": "momentum_30d", "label": "30日动量", "group": "动量", "desc": "30日涨跌幅"}, + {"id": "momentum_60d", "label": "60日动量", "group": "动量", "desc": "季度涨跌幅,中期动量"}, + {"id": "rsi_6", "label": "RSI(6)", "group": "超买超卖", "desc": "6日相对强弱指标,敏感度高"}, + {"id": "rsi_14", "label": "RSI(14)", "group": "超买超卖", "desc": "14日相对强弱指标,经典周期"}, + {"id": "rsi_24", "label": "RSI(24)", "group": "超买超卖", "desc": "24日相对强弱指标"}, + {"id": "annual_vol_20d","label": "20日波动率", "group": "波动率", "desc": "20日年化波动率"}, + {"id": "atr_14", "label": "ATR(14)", "group": "波动率", "desc": "14日平均真实波幅"}, + {"id": "vol_ratio_5d", "label": "量比(5日)", "group": "量价", "desc": "当日成交量 / 5日均量"}, + {"id": "turnover_rate", "label": "换手率", "group": "量价", "desc": "当日换手率"}, + {"id": "macd_hist", "label": "MACD柱", "group": "趋势", "desc": "MACD柱状图值"}, + {"id": "kdj_k", "label": "KDJ-K", "group": "趋势", "desc": "KDJ指标K值"}, + {"id": "change_pct", "label": "日涨跌幅", "group": "基础", "desc": "当日涨跌幅"}, + {"id": "amplitude", "label": "日振幅", "group": "基础", "desc": "当日振幅 (最高-最低)/昨收"}, +] + +FACTOR_WARMUP_DAYS = 120 + + +@dataclass +class FactorConfig: + factor_name: str + symbols: list[str] | None + start: date + end: date + n_groups: int = 5 + rebalance: Literal["daily", "weekly", "monthly"] = "monthly" + weight: Literal["equal", "factor_weight"] = "equal" + fees_pct: float = 0.0002 + slippage_bps: float = 5.0 + + +@dataclass +class GroupStats: + group: int + label: str + total_return: float + annual_return: float + max_drawdown: float + sharpe: float + win_rate: float + + +@dataclass +class FactorResult: + run_id: str + config: dict + # IC 分析 + ic_mean: float | None = None + ic_std: float | None = None + ir: float | None = None + ic_win_rate: float | None = None + ic_series: list[dict] = field(default_factory=list) + # 分层 + group_stats: list[dict] = field(default_factory=list) + group_nav: list[dict] = field(default_factory=list) + # 多空 + long_short_stats: dict = field(default_factory=dict) + long_short_nav: list[dict] = field(default_factory=list) + # 元信息 + elapsed_ms: float = 0.0 + n_symbols: int = 0 + n_dates: int = 0 + error: str | None = None + + +class FactorBacktestService: + def __init__(self, engine: BacktestEngine) -> None: + self.engine = engine + + def run(self, config: FactorConfig) -> FactorResult: + t0 = time.perf_counter() + run_id = uuid.uuid4().hex[:10] + + def _err(msg: str) -> FactorResult: + return FactorResult( + run_id=run_id, + config=self._config_to_dict(config), + error=msg, + elapsed_ms=(time.perf_counter() - t0) * 1000, + ) + + # 加载基础面板: 当前 enriched parquet 只持久化基础列, 指标因子可能需要运行时计算。 + panel_columns = ["symbol", "date", "open", "high", "low", "close", "volume", "turnover_rate"] + if config.factor_name not in panel_columns: + panel_columns.append(config.factor_name) + load_start = config.start + if config.factor_name not in {"turnover_rate"}: + load_start = config.start - timedelta(days=FACTOR_WARMUP_DAYS) + + panel = self.engine.load_panel( + config.symbols, + load_start, + config.end, + columns=panel_columns, + ) + if panel.is_empty(): + return _err("无数据,请检查日期范围或先运行盘后管道") + + factor_col = config.factor_name + if factor_col not in panel.columns: + panel = self._compute_missing_factor(panel, factor_col) + if factor_col not in panel.columns: + return _err(f"因子列 '{factor_col}' 不存在于 enriched 数据中, 且无法从基础行情计算") + if "close" not in panel.columns: + return _err("enriched 数据缺少收盘价 close") + panel = panel.select(["symbol", "date", "close", factor_col]) + panel = panel.filter((pl.col("date") >= config.start) & (pl.col("date") <= config.end)) + + # 过滤有效行 + panel = panel.filter( + pl.col(factor_col).is_not_null() + & pl.col("close").is_not_null() + & (pl.col("close") > 0) + ) + if panel.is_empty(): + return _err("过滤后无有效数据") + + n_symbols = panel["symbol"].n_unique() + n_dates = panel["date"].n_unique() + + # 计算下期收益 + # 根据调仓频率计算不同周期的 forward return + if config.rebalance == "daily": + panel = panel.with_columns( + (pl.col("close").shift(-1).over("symbol") / pl.col("close") - 1) + .alias("_next_return") + ) + else: + # weekly/monthly: 计算到下个调仓日的收益 + panel = self._calc_period_return(panel, config.rebalance) + + # ── 1. IC 分析 ── + ic_df = self._calc_ic(panel, factor_col) + ic_series = [ + {"date": str(row["date"]), "ic": round(float(row["ic"]), 4)} + for row in ic_df.iter_rows(named=True) + if row["ic"] is not None and not np.isnan(float(row["ic"])) + ] + ic_values = [r["ic"] for r in ic_series] + ic_mean = float(np.mean(ic_values)) if ic_values else None + ic_std = float(np.std(ic_values)) if ic_values else None + ir = (ic_mean / ic_std) if (ic_mean is not None and ic_std and ic_std > 1e-8) else None + ic_win_rate = (sum(1 for v in ic_values if v > 0) / len(ic_values)) if ic_values else None + + # ── 2. 分层回测 ── + panel = self._add_groups(panel, factor_col, config.n_groups) + group_nav = self._calc_group_nav(panel, config) + group_stats = self._calc_group_stats(group_nav, config.start, config.end) + + # ── 3. 多空组合 ── + long_short_nav, long_short_stats = self._calc_long_short(group_nav, config) + + elapsed = (time.perf_counter() - t0) * 1000 + return FactorResult( + run_id=run_id, + config=self._config_to_dict(config), + ic_mean=round(ic_mean, 4) if ic_mean is not None else None, + ic_std=round(ic_std, 4) if ic_std is not None else None, + ir=round(ir, 4) if ir is not None else None, + ic_win_rate=round(ic_win_rate, 4) if ic_win_rate is not None else None, + ic_series=ic_series, + group_stats=group_stats, + group_nav=group_nav, + long_short_stats=long_short_stats, + long_short_nav=long_short_nav, + elapsed_ms=round(elapsed, 1), + n_symbols=n_symbols, + n_dates=n_dates, + ) + + @staticmethod + def _compute_missing_factor(panel: pl.DataFrame, factor_col: str) -> pl.DataFrame: + required = {"symbol", "date", "open", "high", "low", "close", "volume"} + if not required.issubset(panel.columns): + missing = sorted(required - set(panel.columns)) + logger.warning("factor %s cannot be computed, missing columns: %s", factor_col, missing) + return panel + + from app.indicators.pipeline import compute_indicators + + computed = compute_indicators(panel) + if factor_col not in computed.columns: + return panel + return computed.select(["symbol", "date", "close", factor_col]) + + # ── IC 计算 ── + + @staticmethod + def _calc_ic(panel: pl.DataFrame, factor_col: str) -> pl.DataFrame: + """计算截面 Rank IC (因子值 rank vs 下期收益 rank 的相关系数)。""" + return ( + panel.filter(pl.col("_next_return").is_not_null()) + .group_by("date") + .agg( + pl.corr( + pl.col(factor_col).rank(method="random"), + pl.col("_next_return").rank(method="random"), + ).alias("ic") + ) + .sort("date") + ) + + # ── 调仓期收益 ── + + @staticmethod + def _calc_period_return(panel: pl.DataFrame, rebalance: str) -> pl.DataFrame: + """计算到下个调仓日的收益。 + + weekly: 下周一的 open / 今日 close - 1 + monthly: 下月首个交易日的 open / 今日 close - 1 + 只在调仓日标记行有效,其他行为 null。 + """ + import datetime as _dt + + all_dates = sorted(panel["date"].unique().to_list()) + date_set = set(all_dates) + + if rebalance == "weekly": + # 调仓日 = 每周一 + rebalance_dates = set() + for d in all_dates: + if hasattr(d, "weekday"): + wd = d.weekday() + else: + wd = _dt.date.fromisoformat(str(d)).weekday() + if wd == 0: # Monday + rebalance_dates.add(d) + else: # monthly + # 调仓日 = 每月首个交易日 + seen_months: set[str] = set() + rebalance_dates = set() + for d in sorted(all_dates): + m = str(d)[:7] # "YYYY-MM" + if m not in seen_months: + seen_months.add(m) + rebalance_dates.add(d) + + if not rebalance_dates: + panel = panel.with_columns(pl.lit(None).cast(pl.Float64).alias("_next_return")) + return panel + + # 对每个调仓日,找到下一个调仓日 + sorted_rebalance = sorted(rebalance_dates) + next_rebalance_map: dict = {} + for i, d in enumerate(sorted_rebalance): + if i + 1 < len(sorted_rebalance): + next_rebalance_map[d] = sorted_rebalance[i + 1] + # 最后一个调仓日没有下一个,不计算收益 + + # 构建 (date, symbol) → next_rebalance_date 的 close 价格映射 + # 简化: 用下个调仓日的 close / 当前 close + panel = panel.sort(["symbol", "date"]) + dates_col = panel["date"].to_list() + close_col = panel["close"].to_list() + symbol_col = panel["symbol"].to_list() + + # 先找下个调仓日的 close + # 建立 (date, symbol) → close 的快速查找 + price_map: dict[tuple, float] = {} + for i in range(len(dates_col)): + price_map[(str(dates_col[i]), symbol_col[i])] = close_col[i] + + next_returns = [None] * len(panel) + for i in range(len(panel)): + d = dates_col[i] + d_val = d if isinstance(d, _dt.date) else _dt.date.fromisoformat(str(d)) + if d not in rebalance_dates: + continue + next_d = next_rebalance_map.get(d) + if next_d is None: + continue + next_d_str = str(next_d)[:10] + d_str = str(d)[:10] + sym = symbol_col[i] + next_close = price_map.get((next_d_str, sym)) + cur_close = close_col[i] + if next_close is not None and cur_close and cur_close > 0: + next_returns[i] = (next_close / cur_close - 1.0) + + panel = panel.with_columns( + pl.Series("_next_return", next_returns, dtype=pl.Float64) + ) + return panel + + # ── 分组 ── + + @staticmethod + def _add_groups(panel: pl.DataFrame, factor_col: str, n_groups: int) -> pl.DataFrame: + """截面分位数分组。""" + return panel.with_columns( + pl.col(factor_col) + .qcut(n_groups, labels=[f"Q{i+1}" for i in range(n_groups)]) + .over("date") + .alias("_group") + ) + + # ── 分组净值 ── + + @staticmethod + def _calc_group_nav(panel: pl.DataFrame, config: FactorConfig) -> list[dict]: + """计算分组净值曲线 — 只在调仓日更新净值。""" + # 只保留有下期收益的行 (= 调仓日) + group_ret = ( + panel.filter(pl.col("_next_return").is_not_null() & pl.col("_group").is_not_null()) + .group_by(["date", "_group"]) + .agg(pl.col("_next_return").mean().alias("group_return")) + ) + + # pivot: date × group + pivot = group_ret.pivot(index="date", columns="_group", values="group_return").sort("date") + + if pivot.is_empty(): + return [] + + group_cols = [c for c in pivot.columns if c != "date"] + + # 累乘净值曲线 + result: list[dict] = [] + nav_values: dict[str, float] = {c: 1.0 for c in group_cols} + + for row in pivot.iter_rows(named=True): + entry: dict = {"date": str(row["date"])[:10]} + for c in group_cols: + ret = float(row[c]) if row[c] is not None else 0.0 + nav_values[c] *= (1 + ret) + entry[c] = round(nav_values[c], 4) + result.append(entry) + + return result + + # ── 分组统计 ── + + @staticmethod + def _calc_group_stats( + group_nav: list[dict], start: date, end: date, + ) -> list[dict]: + if not group_nav: + return [] + + group_cols = [k for k in group_nav[0] if k != "date"] + n_days = max((end - start).days, 1) + years = n_days / 365.25 + + stats = [] + for i, c in enumerate(sorted(group_cols)): + values = [r[c] for r in group_nav if r.get(c) is not None] + if not values: + continue + total_return = values[-1] - 1.0 + annual_return = (values[-1]) ** (1 / max(years, 0.01)) - 1 if values[-1] > 0 else 0.0 + + # 最大回撤 + peak = 1.0 + max_dd = 0.0 + for v in values: + peak = max(peak, v) + dd = (v - peak) / peak + max_dd = min(max_dd, dd) + + # 日收益序列 + daily_rets = [] + for j in range(1, len(values)): + if values[j - 1] > 0: + daily_rets.append(values[j] / values[j - 1] - 1) + + # 夏普 + if daily_rets: + arr = np.array(daily_rets) + sharpe = float(np.mean(arr) / np.std(arr)) * np.sqrt(252) if np.std(arr) > 0 else 0.0 + win_rate = float(np.mean(arr > 0)) + else: + sharpe = 0.0 + win_rate = 0.0 + + stats.append({ + "group": i + 1, + "label": c, + "total_return": round(total_return, 4), + "annual_return": round(annual_return, 4), + "max_drawdown": round(max_dd, 4), + "sharpe": round(sharpe, 2), + "win_rate": round(win_rate, 4), + }) + + return stats + + # ── 多空组合 ── + + @staticmethod + def _calc_long_short( + group_nav: list[dict], config: FactorConfig, + ) -> tuple[list[dict], dict]: + """多空组合: 做多最高组 + 做空最低组。""" + if not group_nav: + return [], {} + + group_cols = sorted([k for k in group_nav[0] if k != "date"]) + if len(group_cols) < 2: + return [], {} + + top_col = group_cols[-1] # Q5 (最高) + bottom_col = group_cols[0] # Q1 (最低) + + # 独立计算 top 和 bottom 的日收益,然后合成 + ls_value = 1.0 + prev_top = 1.0 + prev_bot = 1.0 + peak = 1.0 + max_dd = 0.0 + ls_nav: list[dict] = [] + + for row in group_nav: + top_nav = float(row.get(top_col, 1.0)) if row.get(top_col) is not None else 1.0 + bot_nav = float(row.get(bottom_col, 1.0)) if row.get(bottom_col) is not None else 1.0 + + # top 组收益 (做多) + top_ret = (top_nav / prev_top - 1) if prev_top > 0 else 0.0 + # bottom 组收益 (做空 = 取反) + bot_ret = -(bot_nav / prev_bot - 1) if prev_bot > 0 else 0.0 + # 多空组合收益 + ls_ret = (top_ret + bot_ret) / 2 # 各分配 50% 资金 + ls_value *= (1 + ls_ret) + + prev_top = top_nav + prev_bot = bot_nav + + peak = max(peak, ls_value) + dd = (ls_value - peak) / peak if peak > 0 else 0.0 + max_dd = min(max_dd, dd) + + ls_nav.append({"date": row["date"], "value": round(ls_value, 4)}) + + total_ret = ls_value - 1.0 + ls_stats = { + "total_return": round(total_ret, 4), + "max_drawdown": round(max_dd, 4), + "top_group": top_col, + "bottom_group": bottom_col, + } + + return ls_nav, ls_stats + + @staticmethod + def _config_to_dict(c: FactorConfig) -> dict: + return { + "factor_name": c.factor_name, + "symbols": c.symbols, + "start": str(c.start), + "end": str(c.end), + "n_groups": c.n_groups, + "rebalance": c.rebalance, + "weight": c.weight, + "fees_pct": c.fees_pct, + "slippage_bps": c.slippage_bps, + } diff --git a/backend/app/backtest/strategy.py b/backend/app/backtest/strategy.py new file mode 100644 index 0000000..125169e --- /dev/null +++ b/backend/app/backtest/strategy.py @@ -0,0 +1,714 @@ +"""策略回测服务 — 复用 StrategyDef 体系做全周期回测。 + +核心优化: 向量化 filter_fn,不逐日调用 StrategyEngine.run()。 +""" +from __future__ import annotations + +import logging +import time +import uuid +from dataclasses import dataclass, field +from datetime import date, timedelta +from typing import Callable, Literal + +import numpy as np +import polars as pl + +from app.backtest.engine import BacktestEngine, MatcherConfig, SimResult +from app.strategy.engine import StrategyEngine, StrategyDef + +logger = logging.getLogger(__name__) + +BENCHMARK_SYMBOL = "000001.SH" + + +@dataclass +class StrategyBacktestConfig: + strategy_id: str + symbols: list[str] | None + start: date + end: date + params: dict | None = None + overrides: dict | None = None + # matching 为向后兼容入口; 显式传 entry_fill/exit_fill 时以二者为准。 + matching: Literal["close_t", "open_t+1"] = "open_t+1" + entry_fill: Literal["close_t", "open_t+1"] | None = None + exit_fill: Literal["close_t", "open_t+1"] | None = None + fees_pct: float = 0.0002 + slippage_bps: float = 5.0 + max_positions: int = 10 + max_exposure_pct: float = 1.0 + initial_capital: float = 1_000_000.0 + position_sizing: Literal["equal", "score_weight"] = "equal" + mode: Literal["position", "full"] = "position" + holding_days: int = 5 + + def __post_init__(self) -> None: + if self.entry_fill is None: + self.entry_fill = self.matching + if self.exit_fill is None: + self.exit_fill = self.matching + + +@dataclass +class StrategyBacktestResult: + run_id: str + config: dict + stats: dict = field(default_factory=dict) + equity_curve: list[dict] = field(default_factory=list) + drawdown_curve: list[dict] = field(default_factory=list) + benchmark_curve: list[dict] = field(default_factory=list) + trades: list[dict] = field(default_factory=list) + per_symbol_stats: list[dict] = field(default_factory=list) + strategy_info: dict = field(default_factory=dict) + elapsed_ms: float = 0.0 + error: str | None = None + + +class StrategyBacktestService: + def __init__( + self, + engine: BacktestEngine, + strategy_engine: StrategyEngine, + ) -> None: + self.engine = engine + self.strategy_engine = strategy_engine + + def run( + self, + config: StrategyBacktestConfig, + progress_cb: "Callable[[dict], None] | None" = None, + cancel_event: "threading.Event | None" = None, + ) -> StrategyBacktestResult: + t0 = time.perf_counter() + run_id = uuid.uuid4().hex[:10] + + def _err(msg: str) -> StrategyBacktestResult: + return StrategyBacktestResult( + run_id=run_id, + config=self._config_to_dict(config), + error=msg, + elapsed_ms=(time.perf_counter() - t0) * 1000, + ) + + # 获取策略定义 + try: + s = self.strategy_engine.get(config.strategy_id) + except ValueError as e: + return _err(str(e)) + + params = self._normalize_params(config.params or {}, s) + overrides = config.overrides or {} + basic_filter = self._effective_basic_filter(s, overrides) + entry_signals = self._effective_signals(overrides, "entry_signals", s.entry_signals) + exit_signals = self._effective_signals(overrides, "exit_signals", s.exit_signals) + stop_loss = self._override_value(overrides, "stop_loss", s.stop_loss) + trailing_stop = self._normalize_pct( + self._override_value(overrides, "trailing_stop", getattr(s, "trailing_stop", None)), + 0.005, + 0.5, + ) + trailing_take_profit_activate = self._normalize_pct( + self._override_value(overrides, "trailing_take_profit_activate", getattr(s, "trailing_take_profit_activate", None)), + 0.01, + 2.0, + ) + trailing_take_profit_drawdown = self._normalize_pct( + self._override_value(overrides, "trailing_take_profit_drawdown", getattr(s, "trailing_take_profit_drawdown", None)), + 0.005, + 0.5, + ) + if trailing_take_profit_activate is not None and trailing_take_profit_drawdown is not None: + trailing_take_profit_drawdown = min(trailing_take_profit_drawdown, trailing_take_profit_activate) + max_hold_days = self._override_value(overrides, "max_hold_days", s.max_hold_days) + score_min, score_max = self._normalize_score_range( + overrides.get("score_min"), + overrides.get("score_max"), + ) + + timing_ms: dict[str, float] = {} + + # 加载面板 (含 warmup + 全量指标 + 信号)。warmup 只用于指标/形态计算, 不参与正式交易。 + warmup_days = max(120, int(max(s.lookback_days or 1, 1) * 1.5)) + load_start = config.start - timedelta(days=warmup_days) + + # 全量模式: entries 只在正式区间触发, exits 需要 end 之后的尾部数据继续执行策略卖点。 + # 若策略有 max_hold_days, 用它决定尾部窗口;否则 holding_days 只作为兜底观察上限。 + full_horizon_days = int(max_hold_days or config.holding_days or 5) + full_horizon_days = max(full_horizon_days, 1) + load_end = config.end + if config.mode == "full": + fwd_buffer = full_horizon_days + 5 # 多取几天, 容错停牌缺口/open_t+1 + load_end = config.end + timedelta(days=fwd_buffer * 2) # 日历日放宽, 确保覆盖 N 个交易日 + + t_load = time.perf_counter() + panel = self.engine.load_panel(config.symbols, load_start, load_end) + timing_ms["load_panel"] = round((time.perf_counter() - t_load) * 1000, 1) + if panel.is_empty(): + return _err("无数据,请检查日期范围或先运行盘后管道") + + formal_range = self._date_range_mask(panel, config.start, config.end) + if not formal_range.any(): + return _err("正式回测区间内无数据") + + t_signal = time.perf_counter() + + # basic_filter 只影响买入候选, 不能删除行情 panel, 否则持仓 mark / 卖出 / full forward return 都会失真。 + basic_mask = pl.Series("_basic", [True] * len(panel), dtype=pl.Boolean) + if basic_filter and basic_filter.get("enabled", True): + expr = StrategyEngine._basic_filter_expr(panel, basic_filter) + if expr is not None: + try: + basic_mask = panel.select(expr.alias("_basic"))["_basic"].fill_null(False).cast(pl.Boolean) + except Exception as e: # noqa: BLE001 + logger.warning("basic_filter mask failed: %s", e) + return _err(f"基础过滤计算失败: {e}") + + # 策略候选层用于评分归一化;entry_signals 只是买点层, 不参与 score universe。 + candidate_filter_mask = self._build_candidate_filter_mask(panel, s, params) + candidate_mask = basic_mask & candidate_filter_mask + panel = self._apply_score(panel, s, overrides, universe_mask=candidate_mask) + + entry_mask = self._build_entry_mask_from_candidate(panel, candidate_mask, s, entry_signals) + entry_mask = entry_mask & formal_range + raw_exit_mask = self._build_signal_mask(panel, exit_signals, "_exit") + exit_mask = raw_exit_mask & (self._date_range_mask(panel, config.start, load_end) if config.mode == "full" else formal_range) + timing_ms["signals_score"] = round((time.perf_counter() - t_signal) * 1000, 1) + + if not entry_mask.any(): + return _err("在指定区间内未产生买入信号") + + # warmup 之后才交给撮合;full mode 保留 end 之后前瞻段用于 shift(-N)。 + sim_end = load_end if config.mode == "full" else config.end + sim_range = self._date_range_mask(panel, config.start, sim_end) + sim_panel = panel.filter(sim_range) + sim_entry_mask = entry_mask.filter(sim_range) + sim_exit_mask = exit_mask.filter(sim_range) + if sim_panel.is_empty(): + return _err("正式回测区间内无数据") + + t_sim = time.perf_counter() + matcher_config = MatcherConfig( + matching=config.matching, + entry_fill=config.entry_fill, + exit_fill=config.exit_fill, + fees_pct=config.fees_pct, + slippage_bps=config.slippage_bps, + stop_loss_pct=stop_loss, + trailing_stop_pct=trailing_stop, + trailing_take_profit_activate_pct=trailing_take_profit_activate, + trailing_take_profit_drawdown_pct=trailing_take_profit_drawdown, + max_hold_days=max_hold_days, + max_positions=config.max_positions, + max_exposure_pct=config.max_exposure_pct, + score_min=score_min, + score_max=score_max, + initial_capital=config.initial_capital, + position_sizing=config.position_sizing, + ) + # 撮合 — full 为全候选独立执行;position 为账户级仓位模拟。 + if config.mode == "full": + result = self.engine.simulate_independent_candidates( + sim_panel, + sim_entry_mask, + sim_exit_mask, + matcher_config, + progress_cb, + cancel_event, + ) + else: + result = self.engine.simulate_portfolio(sim_panel, sim_entry_mask, sim_exit_mask, matcher_config, progress_cb, cancel_event) + timing_ms["simulate"] = round((time.perf_counter() - t_sim) * 1000, 1) + + # 检查是否被取消 + if cancel_event is not None and cancel_event.is_set(): + return StrategyBacktestResult( + run_id=run_id, + config=self._config_to_dict(config), + error="cancelled", + elapsed_ms=round((time.perf_counter() - t0) * 1000, 1), + ) + + if result.stats.get("error"): + return _err(result.stats["error"]) + + timing_ms["total"] = round((time.perf_counter() - t0) * 1000, 1) + result.stats["timing_ms"] = timing_ms + result.stats["panel_rows"] = int(sim_panel.height) + + benchmark_curve = self._build_benchmark_curve(config.start, config.end) + + # 构建策略信息 + strategy_info = { + "id": s.meta.get("id", config.strategy_id), + "name": s.meta.get("name", config.strategy_id), + "description": s.meta.get("description", ""), + "entry_signals": entry_signals, + "exit_signals": exit_signals, + "stop_loss": stop_loss, + "trailing_stop": trailing_stop, + "trailing_take_profit_activate": trailing_take_profit_activate, + "trailing_take_profit_drawdown": trailing_take_profit_drawdown, + "max_hold_days": max_hold_days, + "full_horizon_days": full_horizon_days, + "score_min": score_min, + "score_max": score_max, + "source": s.source, + } + + elapsed = (time.perf_counter() - t0) * 1000 + + return StrategyBacktestResult( + run_id=run_id, + config=self._config_to_dict(config), + stats=result.stats, + equity_curve=result.equity_curve, + drawdown_curve=result.drawdown_curve, + benchmark_curve=benchmark_curve, + trades=[self._trade_to_dict(t) for t in result.trades], + per_symbol_stats=result.per_symbol_stats, + strategy_info=strategy_info, + elapsed_ms=round(elapsed, 1), + ) + + # ── 全量模拟 (选股能力统计, 不建组合不算净值) ── + + def _run_full_simulation( + self, + panel: pl.DataFrame, + entry_mask: pl.Series, + holding_days: int, + ) -> SimResult: + """对 entry_mask 命中的全部候选, 算持有 N 天后的前瞻收益统计。 + + 不受 max_positions/资金约束, 反映策略选股能力本身。 + equity_curve 复用为"累计日均超额收益曲线"(基准归零)。 + """ + n = holding_days if holding_days and holding_days > 0 else 5 + + df = panel.with_columns([ + entry_mask.cast(pl.Boolean).alias("_is_candidate"), + (pl.col("close").shift(-n).over("symbol") / pl.col("close") - 1).alias("_fwd_return"), + ]).filter( + pl.col("_is_candidate") + & pl.col("_fwd_return").is_not_null() + & pl.col("_fwd_return").is_not_nan() + ) + + if df.is_empty(): + return self.engine._empty_result() + + fwd = df["_fwd_return"].to_numpy() + wins = fwd[fwd > 0] + losses = fwd[fwd <= 0] + avg_win = float(wins.mean()) if wins.size else 0.0 + avg_loss = abs(float(losses.mean())) if losses.size else 0.0 + + # 按日聚合: 当日候选的平均前瞻收益 + daily = ( + df.group_by("date").agg( + pl.col("_fwd_return").mean().alias("avg_ret"), + pl.col("_fwd_return").count().alias("n_cand"), + ).sort("date") + ) + + # 累计超额曲线: 每日复利平均收益 (基准归零, 故 equity 即累计策略收益) + equity_curve: list[dict] = [] + equity = 1.0 + peak = 1.0 + drawdown_curve: list[dict] = [] + for row in daily.iter_rows(named=True): + ret = float(row["avg_ret"] or 0.0) + equity *= (1 + ret) + peak = max(peak, equity) + dd = (equity - peak) / peak if peak > 0 else 0.0 + d_str = str(row["date"])[:10] + equity_curve.append({ + "date": d_str, + "value": round(equity, 4), + "positions": int(row["n_cand"]), + }) + drawdown_curve.append({"date": d_str, "value": round(dd, 4)}) + + # 同期上证收益 (用 benchmark close 算) + benchmark_curve = self._build_benchmark_curve( + daily["date"].min(), daily["date"].max() + ) + benchmark_return = 0.0 + if benchmark_curve: + closes = [b["close"] for b in benchmark_curve if b.get("close")] + if len(closes) >= 2 and closes[0] > 0: + benchmark_return = closes[-1] / closes[0] - 1 + + total_return = equity - 1.0 + max_dd = min((d["value"] for d in drawdown_curve), default=0.0) + + # 日收益序列算 Sharpe (年化) + daily_rets = daily["avg_ret"].to_numpy() + sharpe = ( + float(daily_rets.mean() / daily_rets.std() * np.sqrt(252)) + if daily_rets.size > 1 and daily_rets.std() > 0 else 0.0 + ) + + # 收益分布直方图: 按 [-20%, +20%] 分 21 档 (每档 2%), 超出归入首尾档 + lo, hi, nbins = -0.20, 0.20, 20 + clipped = np.clip(fwd, lo, hi) + counts, edges = np.histogram(clipped, bins=nbins, range=(lo, hi)) + dist = [ + { + "range": f"{(edges[i]*100):+.0f}~{(edges[i+1]*100):+.0f}%", + "count": int(counts[i]), + "ratio": round(float(counts[i] / fwd.size), 4) if fwd.size else 0.0, + } + for i in range(nbins) + ] + + stats = { + "mode": "full", + "n_candidates": int(fwd.size), + "n_days": int(daily.height), + "avg_daily_candidates": round(float(daily["n_cand"].mean()), 1), + "avg_return": round(float(fwd.mean()), 4), + "median_return": round(float(np.median(fwd)), 4), + "win_rate": round(float(wins.size / fwd.size), 4) if fwd.size else 0.0, + "profit_factor": round(avg_win / avg_loss, 2) if avg_loss > 0 else None, + "best": round(float(fwd.max()), 4), + "worst": round(float(fwd.min()), 4), + "total_return": round(float(total_return), 4), + "max_drawdown": round(float(max_dd), 4), + "sharpe": round(sharpe, 2), + "benchmark_return": round(float(benchmark_return), 4), + "excess": round(float(total_return - benchmark_return), 4), + "return_distribution": dist, + } + + return SimResult( + equity_curve=equity_curve, + drawdown_curve=drawdown_curve, + trades=[], + per_symbol_stats=[], + stats=stats, + ) + + # ── 向量化信号生成 ── + + @staticmethod + def _date_range_mask(panel: pl.DataFrame, start: date, end: date) -> pl.Series: + return panel.select( + ((pl.col("date") >= start) & (pl.col("date") <= end)).alias("_range") + )["_range"].fill_null(False).cast(pl.Boolean) + + def _build_candidate_filter_mask( + self, + panel: pl.DataFrame, + s: StrategyDef, + params: dict, + ) -> pl.Series: + """生成策略候选层 mask。filter_history/filter 决定候选池, 不包含 entry_signals。""" + false_mask = pl.Series("_candidate_filter", [False] * len(panel), dtype=pl.Boolean) + true_mask = pl.Series("_candidate_filter", [True] * len(panel), dtype=pl.Boolean) + + history_failed = False + # 优先: filter_history_fn 策略 (涨停/反包等多日形态, 与选股路径共用同一逻辑) + if s.filter_history_fn: + try: + hit_df = s.filter_history_fn(panel, params) + if hit_df is None or hit_df.is_empty(): + return false_mask + # 命中行 (symbol,date) → 转 panel 等长布尔 mask + hits = hit_df.select(["symbol", "date"]).unique() + marked = ( + panel.select(["symbol", "date"]) + .join( + hits.with_columns(pl.lit(True).alias("_hit")), + on=["symbol", "date"], + how="left", + ) + ) + return marked["_hit"].fill_null(False).cast(pl.Boolean) + except Exception as e: + history_failed = True + logger.warning("strategy filter_history_fn failed: %s", e) + # 失败则回退到 filter_fn (若存在) + + # 策略 filter_fn: 候选层 (filter_history 不可用或失败时) + if s.filter_fn: + try: + expr = s.filter_fn(panel, params) + if expr is not None: + result = panel.select(expr.alias("_candidate_filter")) + if not result.is_empty(): + return result["_candidate_filter"].fill_null(False).cast(pl.Boolean) + except Exception as e: + logger.warning("strategy filter_fn failed: %s", e) + return false_mask + + if history_failed: + return false_mask + + # 没有策略候选层时, 由 entry_signals 直接决定买点。 + return true_mask + + def _build_entry_mask_from_candidate( + self, + panel: pl.DataFrame, + candidate_mask: pl.Series, + s: StrategyDef, + entry_signals: list[str], + ) -> pl.Series: + """向量化生成买入掩码:候选层 AND 买点层;无买点时只用策略候选层。""" + signal_mask = self._build_signal_mask(panel, entry_signals, "_entry_signal") + if entry_signals: + return candidate_mask & signal_mask + if s.filter_history_fn or s.filter_fn: + return candidate_mask + return pl.Series("_entry", [False] * len(panel), dtype=pl.Boolean) + + def _build_entry_mask( + self, + panel: pl.DataFrame, + s: StrategyDef, + params: dict, + entry_signals: list[str], + ) -> pl.Series: + """兼容旧调用: 候选层 AND 买点层。""" + candidate_mask = self._build_candidate_filter_mask(panel, s, params) + return self._build_entry_mask_from_candidate(panel, candidate_mask, s, entry_signals) + + @staticmethod + def _build_signal_mask(panel: pl.DataFrame, signals: list[str], name: str) -> pl.Series: + """向量化合并信号列,多个信号 OR。支持内置 signal_ 与自定义 csg_ 前缀。""" + masks: list[pl.Series] = [] + for sig in signals: + # csg_ (自定义信号) 直接用;否则按 signal_ 解析 + col = sig if (sig.startswith("signal_") or sig.startswith("csg_")) else f"signal_{sig}" + if col in panel.columns: + masks.append(panel[col].fill_null(False).cast(pl.Boolean)) + + if not masks: + return pl.Series(name, [False] * len(panel), dtype=pl.Boolean) + + combined = masks[0] + for m in masks[1:]: + combined = combined | m + return combined + + def _build_benchmark_curve(self, start: date, end: date) -> list[dict]: + try: + df = self.engine.repo.get_index_daily(BENCHMARK_SYMBOL, start, end, columns=["date", "close"]) + except Exception as e: + logger.warning("load benchmark %s failed: %s", BENCHMARK_SYMBOL, e) + return [] + + if df.is_empty() or "close" not in df.columns: + return [] + + df = df.filter(pl.col("close").is_not_null() & (pl.col("close") > 0)).sort("date") + if df.is_empty(): + return [] + + return [ + { + "date": str(row["date"])[:10], + "value": round(float(row["close"]), 4), + "close": round(float(row["close"]), 4), + "name": "上证指数", + "symbol": BENCHMARK_SYMBOL, + } + for row in df.iter_rows(named=True) + if row["close"] is not None + ] + + # ── 工具 ── + + @staticmethod + def _effective_basic_filter(s: StrategyDef, overrides: dict) -> dict: + basic_filter = dict(s.basic_filter or {}) + override_filter = overrides.get("basic_filter") + if isinstance(override_filter, dict): + basic_filter.update(override_filter) + return basic_filter + + @staticmethod + def _effective_signals(overrides: dict, key: str, default: list[str]) -> list[str]: + value = overrides.get(key) + if isinstance(value, list): + return [str(v) for v in value if v] + return list(default or []) + + @staticmethod + def _override_value(overrides: dict, key: str, default): + if key in overrides: + return overrides.get(key) + return default + + @staticmethod + def _normalize_pct(value, min_value: float, max_value: float) -> float | None: + if value is None or value == "": + return None + try: + pct = abs(float(value)) + except (TypeError, ValueError): + return None + return min(max(pct, min_value), max_value) + + @staticmethod + def _normalize_score_range(min_value, max_value) -> tuple[float | None, float | None]: + def _bound(value) -> float | None: + if value is None or value == "": + return None + try: + score = float(value) + except (TypeError, ValueError): + return None + if not np.isfinite(score): + return None + return min(max(score, 0.0), 100.0) + + score_min = _bound(min_value) + score_max = _bound(max_value) + if score_min is not None and score_max is not None and score_min > score_max: + score_min, score_max = score_max, score_min + return score_min, score_max + + @staticmethod + def _normalize_params(params: dict, s: StrategyDef) -> dict: + normalized = dict(params) + for param in s.meta.get("params", []): + pid = param.get("id") + if not pid: + continue + value = normalized.get(pid, param.get("default")) + p_type = param.get("type") + if p_type in {"float", "int"}: + try: + num = float(value) + except (TypeError, ValueError): + num = float(param.get("default", 0) or 0) + if param.get("min") is not None: + num = max(num, float(param["min"])) + if param.get("max") is not None: + num = min(num, float(param["max"])) + normalized[pid] = int(num) if p_type == "int" else num + elif p_type == "select" and param.get("options"): + normalized[pid] = value if value in param["options"] else param.get("default") + elif p_type == "bool": + if isinstance(value, bool): + normalized[pid] = value + elif isinstance(value, str): + normalized[pid] = value.lower() == "true" + else: + normalized[pid] = bool(param.get("default", False)) + else: + normalized[pid] = value + return normalized + + @staticmethod + def _trade_to_dict(t) -> dict: + return { + "symbol": t.symbol, + "name": t.name, + "entry_date": str(t.entry_date) if isinstance(t.entry_date, date) else str(t.entry_date), + "exit_date": str(t.exit_date) if isinstance(t.exit_date, date) else str(t.exit_date), + "entry_price": t.entry_price, + "exit_price": t.exit_price, + "pnl_pct": t.pnl_pct, + "duration": t.duration, + "exit_reason": t.exit_reason, + "shares": t.shares, + "lots": t.lots, + "position_pct": t.position_pct, + "entry_value": t.entry_value, + "exit_value": t.exit_value, + "pnl_amount": t.pnl_amount, + "entry_score": getattr(t, "entry_score", None), + "entry_signal_date": str(t.entry_signal_date) if getattr(t, "entry_signal_date", None) is not None else None, + "exit_signal_date": str(t.exit_signal_date) if getattr(t, "exit_signal_date", None) is not None else None, + "blocked_exit_days": getattr(t, "blocked_exit_days", 0), + } + + @staticmethod + def _config_to_dict(c: StrategyBacktestConfig) -> dict: + score_min, score_max = StrategyBacktestService._normalize_score_range( + (c.overrides or {}).get("score_min"), + (c.overrides or {}).get("score_max"), + ) + return { + "strategy_id": c.strategy_id, + "symbols": c.symbols, + "start": str(c.start), + "end": str(c.end), + "params": c.params, + "overrides": c.overrides, + "score_min": score_min, + "score_max": score_max, + "matching": c.matching, + "entry_fill": c.entry_fill, + "exit_fill": c.exit_fill, + "fees_pct": c.fees_pct, + "slippage_bps": c.slippage_bps, + "max_positions": c.max_positions, + "max_exposure_pct": c.max_exposure_pct, + "initial_capital": c.initial_capital, + "position_sizing": c.position_sizing, + "mode": c.mode, + "holding_days": c.holding_days, + } + + @staticmethod + def _apply_score( + panel: pl.DataFrame, + s: StrategyDef, + overrides: dict | None, + universe_mask: pl.Series | None = None, + ) -> pl.DataFrame: + scoring = s.meta.get("scoring", {}) + scoring_overrides = (overrides or {}).get("scoring") + if scoring_overrides: + scoring = {**scoring, **scoring_overrides} + + work = panel + has_universe = universe_mask is not None and len(universe_mask) == len(panel) + if has_universe: + work = work.with_columns(universe_mask.rename("_score_universe")) + + def _value_in_universe(col: str) -> pl.Expr: + if has_universe: + return pl.when(pl.col("_score_universe")).then(pl.col(col)).otherwise(None) + return pl.col(col) + + def _finish(df: pl.DataFrame) -> pl.DataFrame: + return df.drop("_score_universe") if "_score_universe" in df.columns else df + + if scoring: + total_weight = sum(scoring.values()) + if total_weight > 0: + score_parts: list[pl.Expr] = [] + for col, weight in scoring.items(): + if col not in work.columns: + continue + w = weight / total_weight + value = _value_in_universe(col) + col_min = value.min().over("date") + col_max = value.max().over("date") + col_range = col_max - col_min + normalized = pl.when(col_range > 0).then( + (pl.col(col) - col_min) / col_range + ).otherwise(pl.lit(0.5)) + if has_universe: + normalized = pl.when(pl.col("_score_universe")).then(normalized).otherwise(0.0) + score_parts.append(normalized * w) + if score_parts: + score_expr = score_parts[0] + for part in score_parts[1:]: + score_expr = score_expr + part + return _finish(work.with_columns((score_expr * 100).fill_null(0).alias("score"))) + + order_by = s.meta.get("order_by") + if order_by and order_by != "score" and order_by in work.columns: + direction = 1 if s.meta.get("descending", True) else -1 + score_expr = pl.col(order_by).fill_null(0) * direction + if has_universe: + score_expr = pl.when(pl.col("_score_universe")).then(score_expr).otherwise(0.0) + return _finish(work.with_columns(score_expr.alias("score"))) + return _finish(work.with_columns(pl.lit(0.0).alias("score"))) diff --git a/backend/app/config.py b/backend/app/config.py new file mode 100644 index 0000000..26a3387 --- /dev/null +++ b/backend/app/config.py @@ -0,0 +1,50 @@ +"""全局配置 — 硬编码,个人工具不依赖 .env。""" +from __future__ import annotations + +from pathlib import Path + +from pydantic import Field +from pydantic_settings import BaseSettings, SettingsConfigDict + + +class Settings(BaseSettings): + model_config = SettingsConfigDict( + env_file=None, # 不读取 .env + extra="ignore", + ) + + # 数据源 API Key(个人工具直接写死;如分享代码请改为空字符串或从环境变量注入) + tickflow_api_key: str = "tk_94a20304993f45b5b0e376b9767597cc" + + # AI(可选,留空即关闭) + ai_provider: str = "openai_compat" + ai_base_url: str = "https://api.deepseek.com/v1" + ai_api_key: str = "" + ai_model: str = "deepseek-chat" + ai_daily_token_budget: int = 500_000 + + # Server + host: str = "0.0.0.0" + port: int = 3018 + log_level: str = "INFO" + backtest_range_guard: bool = False + + # 访问门控:留空则不启用,部署时通过 ACCESS_UUID 环境变量注入 + # 优先级:ADMIN_TOKEN > 动态 UUID > ACCESS_UUID + access_uuid: str = "" + # 管理员初始令牌,硬编码以便开箱即用;如需更安全可改为空字符串并从环境变量 ADMIN_TOKEN 注入 + admin_token: str = "admin7226132" + + # 路径 — 硬编码为 Docker 容器内路径,确保数据持久化 + data_dir: Path = Path("/app/data") + tiers_yaml: Path = Path("/app/tiers.yaml") + static_dir: Path = Path("/app/static") + + @property + def use_free_mode(self) -> bool: + """是否走 Free 模式。优先看 secrets.json,其次看 .env。""" + from app import secrets_store + return not secrets_store.get_tickflow_key() + + +settings = Settings() diff --git a/backend/app/indicators/__init__.py b/backend/app/indicators/__init__.py new file mode 100644 index 0000000..47c096f --- /dev/null +++ b/backend/app/indicators/__init__.py @@ -0,0 +1 @@ +"""技术指标 — Polars 实现(§7.5 / §7.7)。""" diff --git a/backend/app/indicators/pipeline.py b/backend/app/indicators/pipeline.py new file mode 100644 index 0000000..dcab138 --- /dev/null +++ b/backend/app/indicators/pipeline.py @@ -0,0 +1,1494 @@ +"""enriched 表计算流水线(§7.5 / §7.7 Step 2)。 + +存储层 (enriched parquet): + 仅存储基础行情窄表 (14 列), 指标和信号由各服务即时计算。 + + 存储列: symbol, date, OHLCV(前复权), volume, amount, + raw_close, raw_high, raw_low, turnover_rate, + consecutive_limit_ups, consecutive_limit_downs + +设计: + - 100% Polars 表达式(SQL 窗口无法表达递归 EMA) + - 每只标的独立计算(`.over("symbol")`) + - 有 adj_factor 时先应用前复权再算指标;无因子时直接用 raw + - streaming collect 控制内存 +""" +from __future__ import annotations + +import logging +from collections.abc import Callable +from pathlib import Path + +import polars as pl + +from app.config import settings + +logger = logging.getLogger(__name__) + + +# ── 自定义信号缓存 ───────────────────────────────────── +# 从 data/user_data/custom_signals/*.json 加载并编译为 Polars 表达式。 +# 模块级缓存:首次调用时加载,invalidate_custom_signals() 后下次重载。 +_custom_signal_exprs: dict[str, pl.Expr] | None = None + + +def _get_custom_signal_exprs() -> dict[str, pl.Expr]: + """懒加载自定义信号表达式(带模块级缓存)。""" + global _custom_signal_exprs + if _custom_signal_exprs is None: + from app.strategy import custom_signals + try: + sigs = custom_signals.load_all(settings.data_dir) + _custom_signal_exprs = custom_signals.build_expressions(sigs) + except Exception as e: + logger.warning("custom signals load failed: %s", e) + _custom_signal_exprs = {} + return _custom_signal_exprs + + +def invalidate_custom_signals() -> None: + """失效自定义信号缓存(保存/删除信号后调用,下次计算重新加载)。""" + global _custom_signal_exprs + _custom_signal_exprs = None + + +# enriched parquet 仅存储的列 (14 列) +ENRICHED_STORAGE_COLS = [ + "symbol", "date", + "open", "high", "low", "close", # 前复权 + "volume", "amount", + "raw_close", "raw_high", "raw_low", # 不复权原始价 + "turnover_rate", # 依赖当时的 float_shares, 不可回推 + "consecutive_limit_ups", # 递推状态, 需从历史 cum_sum + "consecutive_limit_downs", +] + + +# ================================================================ +# enriched 完整列清单 (存储 + 运行时计算) +# 供 AI 审查代码时参考: 策略/筛选/回测 可直接使用以下列名。 +# 分类: 存储列 → 指标列 → 信号列 → JOIN 列 +# ================================================================ +ENRICHED_COLUMNS: dict[str, dict[str, str]] = { + # ── 存储列 (parquet 持久化) ────────────────────────── + "symbol": "股票代码", + "date": "交易日期", + "open": "前复权开盘价", + "high": "前复权最高价", + "low": "前复权最低价", + "close": "前复权收盘价", + "volume": "成交量", + "amount": "成交额", + "raw_close": "原始收盘价(未复权)", + "raw_high": "原始最高价(未复权)", + "raw_low": "原始最低价(未复权)", + "turnover_rate": "换手率", + "consecutive_limit_ups": "连板数", + "consecutive_limit_downs": "连跌数", + # ── 基础指标 ───────────────────────────────────────── + "prev_close": "前收盘价", + "change_pct": "日涨跌幅(小数, 如 0.05 = 5%)", + "change_amount": "日涨跌额", + "amplitude": "日振幅 (最高-最低)/昨收", + # ── 均线 MA ────────────────────────────────────────── + "ma5": "5日简单均线", + "ma10": "10日简单均线", + "ma20": "20日简单均线", + "ma30": "30日简单均线", + "ma60": "60日简单均线(季线)", + # ── 指数均线 EMA ───────────────────────────────────── + "ema5": "5日指数均线", + "ema10": "10日指数均线", + "ema20": "20日指数均线", + "ema30": "30日指数均线", + "ema60": "60日指数均线", + # ── MACD ───────────────────────────────────────────── + "macd_dif": "MACD DIF线(快线-慢线)", + "macd_dea": "MACD DEA线(信号线)", + "macd_hist": "MACD柱状图 (DIF-DEA)×2", + # ── 布林带 BOLL ────────────────────────────────────── + "boll_upper": "布林带上轨 MA20+2σ", + "boll_lower": "布林带下轨 MA20-2σ", + # ── KDJ ────────────────────────────────────────────── + "kdj_k": "KDJ K值", + "kdj_d": "KDJ D值", + "kdj_j": "KDJ J值 (3K-2D)", + # ── ATR ────────────────────────────────────────────── + "atr_14": "14日平均真实波幅", + # ── 量价 ───────────────────────────────────────────── + "vol_ma5": "5日成交均量", + "vol_ma10": "10日成交均量", + "vol_ratio_5d": "量比 (成交量/5日均量)", + # ── 极值 ───────────────────────────────────────────── + "high_60d": "60日最高价", + "low_60d": "60日最低价", + # ── 动量 ───────────────────────────────────────────── + "momentum_5d": "5日动量(涨跌幅小数)", + "momentum_10d": "10日动量", + "momentum_20d": "20日动量", + "momentum_30d": "30日动量", + "momentum_60d": "60日动量", + # ── 波动率 ─────────────────────────────────────────── + "annual_vol_20d": "20日年化波动率", + # ── RSI ────────────────────────────────────────────── + "rsi_6": "6日相对强弱指标", + "rsi_14": "14日相对强弱指标", + "rsi_24": "24日相对强弱指标", + # ── 信号列 (bool) ──────────────────────────────────── + "signal_ma_golden_5_20": "MA5上穿MA20 (金叉)", + "signal_ma_dead_5_20": "MA5下穿MA20 (死叉)", + "signal_ma_golden_20_60": "MA20上穿MA60", + "signal_macd_golden": "MACD金叉 (DIF上穿DEA)", + "signal_macd_dead": "MACD死叉 (DIF下穿DEA)", + "signal_ma20_breakout": "收盘突破MA20上方", + "signal_ma20_breakdown": "收盘跌破MA20下方", + "signal_n_day_high": "创60日新高", + "signal_n_day_low": "创60日新低", + "signal_boll_breakout_upper": "突破布林上轨", + "signal_boll_breakdown_lower": "跌破布林下轨", + "signal_volume_surge": "放量 (量比≥2.0)", + "signal_limit_up": "涨停", + "signal_limit_down": "跌停", + "signal_limit_down_recovery": "跌停翘板(跌停后回升)", + "signal_broken_limit_up": "炸板(最高触及涨停但收盘未封住)", + # ── JOIN 列 (由 repository 从 instruments 表补充) ─── + "name": "股票名称 (来自 instruments)", + "total_shares": "总股本 (来自 instruments)", + "float_shares": "流通股本 (来自 instruments)", +} + +# 仅供 AI/开发者快速索引: 按类别的列名列表 +ENRICHED_COLUMNS_BY_CATEGORY: dict[str, list[str]] = { + "storage": [k for k in ENRICHED_COLUMNS if k in ENRICHED_STORAGE_COLS], + "basic": ["prev_close", "change_pct", "change_amount", "amplitude"], + "ma": ["ma5", "ma10", "ma20", "ma30", "ma60"], + "ema": ["ema5", "ema10", "ema20", "ema30", "ema60"], + "macd": ["macd_dif", "macd_dea", "macd_hist"], + "boll": ["boll_upper", "boll_lower"], + "kdj": ["kdj_k", "kdj_d", "kdj_j"], + "atr": ["atr_14"], + "volume": ["vol_ma5", "vol_ma10", "vol_ratio_5d"], + "extremes": ["high_60d", "low_60d"], + "momentum": ["momentum_5d", "momentum_10d", "momentum_20d", "momentum_30d", "momentum_60d"], + "volatility": ["annual_vol_20d"], + "rsi": ["rsi_6", "rsi_14", "rsi_24"], + "signals": [k for k in ENRICHED_COLUMNS if k.startswith("signal_")], + "join": ["name", "total_shares", "float_shares"], +} + + +def _ema_alpha(span: int) -> float: + return 2.0 / (span + 1) + + +def _math_half_up(expr: pl.Expr, decimals: int = 2) -> pl.Expr: + """交易所四舍五入 (round half up),替代 Python round()(银行家舍入)。 + + round(2.625, 2) = 2.62 ← Python 银行家舍入 + exchange_round(2.625) = 2.63 ← 交易所四舍五入 + """ + factor = 10 ** decimals + return (expr * factor + 0.5).floor() / factor + + +def _limit_price(prev: pl.Expr, limit_pct: pl.Expr, up: bool) -> pl.Expr: + """用「分」为单位的整数算术计算涨跌停价,规避浮点精度问题。 + + 交易所涨跌停价 = round(prev × (1 ± limit), 2),标准四舍五入。 + 若直接用浮点 prev × (1 ± limit) 会丢精度: + 18.90 × 0.95 = 17.955,浮点存储为 17.954999..., 四舍五入后得 17.95(错)。 + 本函数先把 prev 转成整数「分」(round 到分避免输入含厘误差), + 再用整数系数 105/95、110/90、120/80、130/70 相乘后四舍五入回元,全程不丢精度。 + """ + sign = 1 if up else -1 + # limit_pct ∈ {0.05, 0.10, 0.20, 0.30} → 系数分子 105/95、110/90、120/80、130/70 + num = ((1 + sign * limit_pct) * 100).cast(pl.Int64) # 105, 110, 120, 130 等 + cents = (prev * 100 + 0.5).floor().cast(pl.Int64) # 价格转「分」(四舍五入到分) + # cents × num / 100, 四舍五入到分(加 50) + return (((cents * num + 50) // 100) / 100) + + +def _apply_adj_factor(raw: pl.DataFrame, factors: pl.DataFrame) -> pl.DataFrame: + """对 raw K 线应用前复权 (forward adjustment)。 + + adj_factor 结构: symbol, trade_date, ex_factor + ex_factor 含义: 每次除权事件的 pre/post 比值(个股级,非累积)。 + + 前复权原理: + - 保持最新价格不变,将历史价格向下调整以消除除权缺口 + - adjusted = raw × cumprod_at_D / total_cumprod + - 等价于: adjusted = raw / (该日期之后所有事件的 ex_factor 乘积) + """ + if factors.is_empty(): + return raw + + # 确保类型一致 + factors = factors.with_columns( + pl.col("trade_date").cast(pl.Date, strict=False), + pl.col("ex_factor").cast(pl.Float64, strict=False), + ).select("symbol", "trade_date", "ex_factor").drop_nulls() + + if factors.is_empty(): + return raw + + # 去重 + 排序 + 累积乘积 (一趟完成) + factors_sorted = ( + factors.sort(["symbol", "trade_date"]) + .unique(subset=["symbol", "trade_date"]) + .sort(["symbol", "trade_date"]) + .with_columns( + pl.col("ex_factor").cum_prod().over("symbol").alias("cum_factor"), + ) + ) + + # 每个 symbol 的总累积因子 + total_factors = ( + factors_sorted + .group_by("symbol") + .agg(pl.col("cum_factor").last().alias("total_factor")) + ) + + raw_sorted = raw.sort(["symbol", "date"]) + + # join_asof backward: 每根 K 线取 <= 其 date 的最新累积因子 + # 同时带 trade_date 列用于判断除权日标记 + df = raw_sorted.join_asof( + factors_sorted.select("symbol", "trade_date", "cum_factor"), + left_on="date", + right_on="trade_date", + by="symbol", + strategy="backward", + ) + + # 补充 total_factor + 前复权 + 除权标记,一次 with_columns 完成 + df = df.join(total_factors, on="symbol", how="left") + + is_ex = pl.col("trade_date") == pl.col("date") + ratio = pl.col("cum_factor").fill_null(1.0) / pl.col("total_factor").fill_null(1.0) + price_cols = [c for c in ("open", "high", "low", "close") if c in df.columns] + + df = df.with_columns( + [pl.col(c) * ratio for c in price_cols] + + [ + is_ex.alias("ex_rights"), + ] + ).drop(["trade_date", "cum_factor", "total_factor"]) + + return df + + +# ================================================================ +# 技术指标计算 (从 OHLCV 计算) +# ================================================================ + +def compute_indicators(df: pl.DataFrame) -> pl.DataFrame: + """从 OHLCV 数据计算全套技术指标。 + + 输入必须包含: symbol, date, open, high, low, close, volume + 返回添加了所有指标列的 DataFrame。 + """ + if df.is_empty(): + return df + + import time as _time + _t0 = _time.perf_counter() + + df = df.sort(["symbol", "date"]) + + # Pass 1: 均线 + EMA + MACD 基础 + BOLL 基础 + KDJ 基础 + ATR 基础 + 量价 + 极值 + prev_close = pl.col("close").shift(1).over("symbol") + df = df.with_columns([ + # 前收盘价 + prev_close.alias("prev_close"), + # MA (最大 MA60) + pl.col("close").rolling_mean(5).over("symbol").alias("ma5"), + pl.col("close").rolling_mean(10).over("symbol").alias("ma10"), + pl.col("close").rolling_mean(20).over("symbol").alias("ma20"), + pl.col("close").rolling_mean(30).over("symbol").alias("ma30"), + pl.col("close").rolling_mean(60).over("symbol").alias("ma60"), + # EMA (不含 ema12/ema26, MACD 内部自算) + pl.col("close").ewm_mean(alpha=_ema_alpha(5), adjust=False).over("symbol").alias("ema5"), + pl.col("close").ewm_mean(alpha=_ema_alpha(10), adjust=False).over("symbol").alias("ema10"), + pl.col("close").ewm_mean(alpha=_ema_alpha(20), adjust=False).over("symbol").alias("ema20"), + pl.col("close").ewm_mean(alpha=_ema_alpha(30), adjust=False).over("symbol").alias("ema30"), + pl.col("close").ewm_mean(alpha=_ema_alpha(60), adjust=False).over("symbol").alias("ema60"), + # MACD base (内部计算, 不存 ema12/ema26) + pl.col("close").ewm_mean(alpha=_ema_alpha(12), adjust=False).over("symbol").alias("_ema12"), + pl.col("close").ewm_mean(alpha=_ema_alpha(26), adjust=False).over("symbol").alias("_ema26"), + # BOLL base + pl.col("close").rolling_std(20).over("symbol").alias("_boll_std"), + # KDJ base + pl.col("low").rolling_min(9).over("symbol").alias("_kdj_ln"), + pl.col("high").rolling_max(9).over("symbol").alias("_kdj_hn"), + # ATR base + pl.max_horizontal( + pl.col("high") - pl.col("low"), + (pl.col("high") - prev_close).abs(), + (pl.col("low") - prev_close).abs(), + ).alias("_tr"), + # 量价 base + pl.col("volume").rolling_mean(5).over("symbol").alias("vol_ma5"), + pl.col("volume").rolling_mean(10).over("symbol").alias("vol_ma10"), + pl.col("volume").rolling_mean(5).over("symbol").alias("_vol_ma5"), + # 极值 + pl.col("close").rolling_max(60).over("symbol").alias("high_60d"), + pl.col("close").rolling_min(60).over("symbol").alias("low_60d"), + ]) + + # Pass 2: MACD + BOLL (基于 Pass 1 基础列) + df = df.with_columns([ + (pl.col("_ema12") - pl.col("_ema26")).alias("macd_dif"), + (pl.col("ma20") + 2 * pl.col("_boll_std")).alias("boll_upper"), + (pl.col("ma20") - 2 * pl.col("_boll_std")).alias("boll_lower"), + ]).with_columns( + pl.col("macd_dif").ewm_mean(alpha=_ema_alpha(9), adjust=False).over("symbol").alias("macd_dea"), + ).with_columns( + ((pl.col("macd_dif") - pl.col("macd_dea")) * 2).alias("macd_hist"), + ) + + # Pass 3: KDJ + _kdj_rsv = ( + 100 * (pl.col("close") - pl.col("_kdj_ln")) + / (pl.col("_kdj_hn") - pl.col("_kdj_ln")).fill_null(1e-12) + ) + df = df.with_columns([ + _kdj_rsv.ewm_mean(alpha=1.0 / 3, adjust=False).over("symbol").alias("kdj_k"), + ]).with_columns([ + pl.col("kdj_k").ewm_mean(alpha=1.0 / 3, adjust=False).over("symbol").alias("kdj_d"), + ]).with_columns([ + (3 * pl.col("kdj_k") - 2 * pl.col("kdj_d")).alias("kdj_j"), + ]) + + # Pass 4: ATR + 量比 + 动量 + 波动 + 涨跌幅 + 涨跌额 + 振幅 + df = df.with_columns( + pl.col("_tr").ewm_mean(alpha=1.0 / 14, adjust=False).over("symbol").alias("atr_14"), + ).with_columns( + (pl.col("volume") / pl.col("_vol_ma5")).alias("vol_ratio_5d"), + ).with_columns([ + # 动量: 5d/10d/20d/30d/60d + (pl.col("close") / pl.col("close").shift(5).over("symbol") - 1).alias("momentum_5d"), + (pl.col("close") / pl.col("close").shift(10).over("symbol") - 1).alias("momentum_10d"), + (pl.col("close") / pl.col("close").shift(20).over("symbol") - 1).alias("momentum_20d"), + (pl.col("close") / pl.col("close").shift(30).over("symbol") - 1).alias("momentum_30d"), + (pl.col("close") / pl.col("close").shift(60).over("symbol") - 1).alias("momentum_60d"), + # 日涨跌幅 + (pl.col("close") / pl.col("close").shift(1).over("symbol") - 1).alias("change_pct"), + ]).with_columns( + # 涨跌额 + (pl.col("close") - pl.col("close").shift(1).over("symbol")).alias("change_amount"), + ).with_columns( + # 振幅 = (high - low) / prev_close + pl.when(pl.col("close").shift(1).over("symbol") > 0) + .then((pl.col("high") - pl.col("low")) / pl.col("close").shift(1).over("symbol")) + .otherwise(None) + .alias("amplitude"), + ).with_columns( + # 日涨跌幅 (用于波动率) + pl.col("close").pct_change().over("symbol").alias("_daily_pct"), + ).with_columns( + # 年化波动率 + (pl.col("_daily_pct").rolling_std(20).over("symbol") * (252 ** 0.5)) + .alias("annual_vol_20d"), + ) + + # Pass 5: RSI + df = df.with_columns( + pl.col("close").diff().over("symbol").alias("_delta"), + ).with_columns([ + pl.when(pl.col("_delta") > 0).then(pl.col("_delta")).otherwise(0.0).alias("_gain"), + pl.when(pl.col("_delta") < 0).then(-pl.col("_delta")).otherwise(0.0).alias("_loss"), + ]) + for n in (6, 14, 24): + a = 1.0 / n + df = df.with_columns([ + pl.col("_gain").ewm_mean(alpha=a, adjust=False).over("symbol").alias(f"_rsi_avg_gain_{n}"), + pl.col("_loss").ewm_mean(alpha=a, adjust=False).over("symbol").alias(f"_rsi_avg_loss_{n}"), + ]).with_columns( + (100 - 100 / (1 + pl.col(f"_rsi_avg_gain_{n}") / + pl.when(pl.col(f"_rsi_avg_loss_{n}") == 0) + .then(1e-12) + .otherwise(pl.col(f"_rsi_avg_loss_{n}")) + )).alias(f"rsi_{n}"), + ) + + # Pass 6: 换手率 (需要 float_shares, 后续在 compute_all 中 JOIN instruments 后补充) + + # 清理临时列 + df = df.drop(["_boll_std", "_tr", "_ema12", "_ema26", + "_kdj_ln", "_kdj_hn", "_vol_ma5", "_daily_pct", + "_delta", "_gain", "_loss", + "_rsi_avg_gain_6", "_rsi_avg_loss_6", + "_rsi_avg_gain_14", "_rsi_avg_loss_14", + "_rsi_avg_gain_24", "_rsi_avg_loss_24"]) + + _elapsed = (_time.perf_counter() - _t0) * 1000 + import logging as _logging + _logging.getLogger(__name__).debug("compute_indicators: %.1fms, %d rows", _elapsed, len(df)) + + return df + + +def compute_signals(df: pl.DataFrame) -> pl.DataFrame: + """从已有指标列计算原子信号布尔列。 + + 输入必须包含 compute_indicators() 产出的指标列。 + """ + if df.is_empty(): + return df + + df = df.with_columns([ + ((pl.col("ma5") > pl.col("ma20")) & + (pl.col("ma5").shift(1).over("symbol") <= pl.col("ma20").shift(1).over("symbol"))) + .alias("signal_ma_golden_5_20"), + ((pl.col("ma5") < pl.col("ma20")) & + (pl.col("ma5").shift(1).over("symbol") >= pl.col("ma20").shift(1).over("symbol"))) + .alias("signal_ma_dead_5_20"), + ((pl.col("ma20") > pl.col("ma60")) & + (pl.col("ma20").shift(1).over("symbol") <= pl.col("ma60").shift(1).over("symbol"))) + .alias("signal_ma_golden_20_60"), + ((pl.col("macd_dif") > pl.col("macd_dea")) & + (pl.col("macd_dif").shift(1).over("symbol") <= pl.col("macd_dea").shift(1).over("symbol"))) + .alias("signal_macd_golden"), + ((pl.col("macd_dif") < pl.col("macd_dea")) & + (pl.col("macd_dif").shift(1).over("symbol") >= pl.col("macd_dea").shift(1).over("symbol"))) + .alias("signal_macd_dead"), + ((pl.col("close") > pl.col("ma20")) & + (pl.col("close").shift(1).over("symbol") <= pl.col("ma20").shift(1).over("symbol"))) + .alias("signal_ma20_breakout"), + ((pl.col("close") < pl.col("ma20")) & + (pl.col("close").shift(1).over("symbol") >= pl.col("ma20").shift(1).over("symbol"))) + .alias("signal_ma20_breakdown"), + (pl.col("close") >= pl.col("high_60d")).alias("signal_n_day_high"), + (pl.col("close") <= pl.col("low_60d")).alias("signal_n_day_low"), + (pl.col("close") > pl.col("boll_upper")).alias("signal_boll_breakout_upper"), + (pl.col("close") < pl.col("boll_lower")).alias("signal_boll_breakdown_lower"), + (pl.col("vol_ratio_5d") >= 2.0).alias("signal_volume_surge"), + ]) + + # 自定义信号(用户配置的字段+运算符+值组合,编译为布尔列) + from app.strategy import custom_signals + df = custom_signals.inject(df, _get_custom_signal_exprs()) + + return df + + +def compute_limit_signals(df: pl.DataFrame, instruments: pl.DataFrame) -> pl.DataFrame: + """计算涨跌停相关信号。 + + 产出: + signal_limit_up, consecutive_limit_ups + signal_limit_down, consecutive_limit_downs + signal_limit_down_recovery (跌停翘板) + signal_broken_limit_up (炸板: 最高价触及涨停价但收盘未封住) + + 输入必须包含: symbol, date, raw_close, raw_high, open, high, low, close, + change_pct, vol_ratio_5d。 + """ + if df.is_empty(): + return df + + # 从 instruments 取 ST 标记 + 流通股本(换手率用) + inst_cols = ["symbol"] + if "name" in instruments.columns: + inst_cols.append("name") + if "float_shares" in instruments.columns: + inst_cols.append("float_shares") + inst_subset = instruments.select(inst_cols).unique(subset=["symbol"]) + + if "name" in instruments.columns: + st_flag = ( + instruments + .select("symbol", pl.col("name").str.contains("ST").alias("_is_st")) + .unique(subset=["symbol"]) + ) + inst_subset = inst_subset.join(st_flag, on="symbol", how="left") + + df = df.join(inst_subset, on="symbol", how="left", suffix="_inst") + + # 计算换手率(%) = volume(手) * 10000 / float_shares(股) + if "float_shares" in df.columns and "volume" in df.columns: + df = df.with_columns( + pl.when(pl.col("float_shares") > 0) + .then(pl.col("volume") * 10000.0 / pl.col("float_shares")) + .otherwise(None) + .alias("turnover_rate") + ) + elif "turnover_rate" not in df.columns: + df = df.with_columns(pl.lit(None).cast(pl.Float64).alias("turnover_rate")) + + # 前一日参考收盘价(交易所涨跌停基准价) + # 仅在 adj_factor 发生变化(除权除息 XD/DR)时使用前复权昨收作为交易所参考价; + # 否则使用原始 raw_close.shift(1) 以避免浮点精度误差。 + _adj_today = pl.col("close") / pl.col("raw_close") + _adj_yesterday = pl.col("close").shift(1).over("symbol") / pl.col("raw_close").shift(1).over("symbol") + _adj_changed = (_adj_today - _adj_yesterday).abs() > 1e-6 + df = df.with_columns( + pl.when(_adj_changed) + .then(pl.col("close").shift(1).over("symbol")) # 除权: 使用前复权昨收 + .otherwise(pl.col("raw_close").shift(1).over("symbol")) # 正常: 使用原始昨收 + .alias("_prev_raw_close") + ) + + # 板块涨跌停比例 + is_chinext = pl.col("symbol").str.starts_with("300") | pl.col("symbol").str.starts_with("301") + is_star = pl.col("symbol").str.starts_with("688") | pl.col("symbol").str.starts_with("689") + is_bj = pl.col("symbol").str.ends_with(".BJ") + + df = df.with_columns( + pl.when(is_chinext).then(0.20) + .when(is_star).then(0.20) + .when(is_bj).then(0.30) + .otherwise(0.10) + .alias("_board_pct") + ) + + # ST → 5%(覆盖板块默认值) + if "_is_st" in df.columns: + df = df.with_columns( + pl.when(pl.col("_is_st").fill_null(False)) + .then(0.05) + .otherwise(pl.col("_board_pct")) + .alias("_limit_pct") + ) + else: + df = df.with_columns(pl.col("_board_pct").alias("_limit_pct")) + + # 理论涨停价 = prev_close × (1 + limit_pct) 整数算术,避免浮点误差 + df = df.with_columns( + _limit_price(pl.col("_prev_raw_close"), pl.col("_limit_pct"), up=True) + .alias("_theoretical_limit_up") + ) + + # 理论跌停价 = prev_close × (1 - limit_pct) + df = df.with_columns( + _limit_price(pl.col("_prev_raw_close"), pl.col("_limit_pct"), up=False) + .alias("_theoretical_limit_down") + ) + + # ── signal_limit_up ── + df = df.with_columns( + pl.when( + pl.col("_prev_raw_close").is_not_null() + & (pl.col("_prev_raw_close") > 0) + & (pl.col("raw_close") > 0) + ).then( + (pl.col("raw_close") - pl.col("_theoretical_limit_up")).abs() < 0.005 + ).otherwise(None).cast(pl.Boolean) + .alias("signal_limit_up") + ) + + # ── consecutive_limit_ups ── + df = df.with_columns( + (~pl.col("signal_limit_up").fill_null(False)) + .cast(pl.UInt32) + .cum_sum() + .over("symbol") + .alias("_grp_up") + ).with_columns( + pl.col("signal_limit_up") + .cast(pl.UInt32) + .cum_sum() + .over("symbol", "_grp_up") + .cast(pl.UInt32) + .alias("consecutive_limit_ups") + ).with_columns( + pl.when(pl.col("signal_limit_up").fill_null(False)) + .then(pl.col("consecutive_limit_ups")) + .otherwise(0) + .cast(pl.UInt32) + .alias("consecutive_limit_ups") + ) + + # ── signal_limit_down ── + df = df.with_columns( + pl.when( + pl.col("_prev_raw_close").is_not_null() + & (pl.col("_prev_raw_close") > 0) + & (pl.col("raw_close") > 0) + ).then( + (pl.col("raw_close") - pl.col("_theoretical_limit_down")).abs() < 0.005 + ).otherwise(None).cast(pl.Boolean) + .alias("signal_limit_down") + ) + + # ── consecutive_limit_downs ── + df = df.with_columns( + (~pl.col("signal_limit_down").fill_null(False)) + .cast(pl.UInt32) + .cum_sum() + .over("symbol") + .alias("_grp_down") + ).with_columns( + pl.col("signal_limit_down") + .cast(pl.UInt32) + .cum_sum() + .over("symbol", "_grp_down") + .cast(pl.UInt32) + .alias("consecutive_limit_downs") + ).with_columns( + pl.when(pl.col("signal_limit_down").fill_null(False)) + .then(pl.col("consecutive_limit_downs")) + .otherwise(0) + .cast(pl.UInt32) + .alias("consecutive_limit_downs") + ) + + # ── signal_limit_down_recovery (跌停翘板) ── + # 条件: 当日最低价曾触及跌停价 + 最终没有跌停 + 收阳 + df = df.with_columns( + pl.when( + pl.col("_prev_raw_close").is_not_null() + & (pl.col("_prev_raw_close") > 0) + ).then( + (~pl.col("signal_limit_down").fill_null(False)) # 最终没跌停 + & (pl.col("low") <= pl.col("_theoretical_limit_down") + 0.005) # 曾触及跌停 + & (pl.col("close") > pl.col("open")) # 收阳 + ).otherwise(None).cast(pl.Boolean) + .alias("signal_limit_down_recovery") + ) + + # ── signal_broken_limit_up (炸板) ── + # 条件: 最高价曾触及涨停价 + 最终没有封住涨停 + df = df.with_columns( + pl.when( + pl.col("_prev_raw_close").is_not_null() + & (pl.col("_prev_raw_close") > 0) + & (pl.col("raw_high") > 0) + ).then( + (~pl.col("signal_limit_up").fill_null(False)) # 最终没封住涨停 + & (pl.col("raw_high") >= pl.col("_theoretical_limit_up") - 0.005) # 曾触及涨停价 + ).otherwise(None).cast(pl.Boolean) + .alias("signal_broken_limit_up") + ) + + # 清理临时列 + JOIN 引入的 instruments 列 (不存入 enriched) + cleanup = ["_prev_raw_close", "_board_pct", "_limit_pct", + "_theoretical_limit_up", "_theoretical_limit_down", + "_grp_up", "_grp_down"] + if "_is_st" in df.columns: + cleanup.append("_is_st") + # 清理 join 产生的重复列 + for c in df.columns: + if c.endswith("_inst"): + cleanup.append(c) + # name 和 float_shares 只用于计算, 不存入 enriched + for c in ["name", "float_shares"]: + if c in df.columns and c != "turnover_rate": + cleanup.append(c) + df = df.drop([c for c in cleanup if c in df.columns]) + + return df + + +def compute_all(df: pl.DataFrame, instruments: pl.DataFrame | None = None) -> pl.DataFrame: + """从 OHLCV 计算全套指标 + 信号。一站式调用。 + + 输入: symbol, date, open, high, low, close, volume, amount, raw_close + """ + df = compute_indicators(df) + df = compute_signals(df) + if instruments is not None and not instruments.is_empty(): + df = compute_limit_signals(df, instruments) + + # 清理 NaN / Inf + float_cols = [c for c in df.columns if df[c].dtype.is_float()] + if float_cols: + df = df.with_columns([ + pl.when(pl.col(c).is_nan() | pl.col(c).is_infinite()) + .then(None) + .otherwise(pl.col(c)) + .alias(c) + for c in float_cols + ]) + + return df + + +def filter_halt_days(df: pl.DataFrame) -> pl.DataFrame: + """过滤停牌日。 + + 停牌日的 open/high 必然为 0 (无集合竞价)。注意 close 可能被数据源 + 填充为前收盘价而非 0, 因此不能用 "OHLC 全零" 判断, 否则会漏过这类 + 停牌记录 (如 *ST 撤销风险警示的停牌日), 污染 MA/ATR 等指标。 + """ + if df.is_empty() or "open" not in df.columns or "high" not in df.columns: + return df + return df.filter(~((pl.col("open") == 0) & (pl.col("high") == 0))) + + +# ================================================================ +# Pipeline: 盘后全量计算 + 写入 +# ================================================================ + +def compute_enriched( + raw: pl.DataFrame, + factors: pl.DataFrame | None = None, + instruments: pl.DataFrame | None = None, +) -> pl.DataFrame: + """对原始日 K 应用前复权 + 全量计算指标 + 信号, 产出完整 enriched (含全部指标列)。 + + 输入应包含至少: symbol, date, open, high, low, close, volume (可选 amount)。 + 如果提供了 factors, 先应用前复权再算指标。 + 如果提供了 instruments, 计算涨跌停信号和换手率。 + """ + if raw.is_empty(): + return raw + + # 过滤停牌日 (会污染指标计算) + raw = filter_halt_days(raw) + + if raw.is_empty(): + return raw + + # 保留不复权原始价格(涨停/炸板/跌停判断需用不复权价格) + raw = raw.with_columns( + pl.col("close").alias("raw_close"), + pl.col("high").alias("raw_high"), + pl.col("low").alias("raw_low"), + ) + + # 应用前复权(只改 open/high/low/close,raw_close 不受影响) + if factors is not None and not factors.is_empty(): + raw = _apply_adj_factor(raw, factors) + + # 排序 + df = raw.sort(["symbol", "date"]) + + # 全量计算指标 + 信号 + df = compute_all(df, instruments=instruments) + + return df + + +def _select_storage_cols(df: pl.DataFrame) -> pl.DataFrame: + """写入 parquet 前裁剪到存储列 (14 列)。""" + cols = [c for c in ENRICHED_STORAGE_COLS if c in df.columns] + return df.select(cols) + + +def run_pipeline(data_dir: Path | None = None, + symbols: list[str] | None = None, + new_dates_only: bool = False, + on_batch_done: Callable[[int, int], None] | None = None) -> int: + """运行盘后管道:读 kline_daily + adj_factor → 前复权 + 计算存储列 → 写 enriched。 + + enriched 表仅存储 14 列基础行情窄表 (OHLCV + raw_close/high/low + turnover_rate + 连板数)。 + + 模式: + - 全量 (symbols=None, new_dates_only=False): + 读全部 kline_daily, 全部重写 enriched 分区。 + 用于首次同步、往前扩展历史。 + - 向后增量 (new_dates_only=True): + 只读 enriched 中尚不存在的日期分区对应的 daily 数据, + 为所有标的生成新的 enriched 分区; + 若同时传 symbols, 还会对这些个股的全部已有日期做重算 + (因为除权因子链变了,历史数据的复权比例也要更新)。 + - 除权因子增量 (symbols 指定, new_dates_only=False): + 只对指定 symbol 做局部重算并合并回已有 enriched。 + 用于无新日K数据、仅除权因子变更的场景。 + 返回写入的行数。 + """ + import time as _t + t0 = _t.perf_counter() + + d = Path(data_dir or settings.data_dir) + daily_dir = d / "kline_daily" + enriched_base = d / "kline_daily_enriched" + factor_path = d / "adj_factor" / "all.parquet" + inst_glob = str(d / "instruments" / "**" / "*.parquet") + + if not daily_dir.exists() or not any(daily_dir.rglob("*.parquet")): + logger.info("无日K数据, 跳过管道") + return 0 + + daily_glob = (daily_dir / "**" / "*.parquet").as_posix() + _cast = pl.ScanCastOptions(integer_cast="allow-float") + written = 0 + + # 加载 instruments (涨跌停+换手率需要) + instruments = pl.DataFrame() + try: + instruments = pl.scan_parquet(inst_glob, cast_options=_cast).collect() + except Exception as e: # noqa: BLE001 + logger.warning("instruments 读取失败: %s", e) + + if new_dates_only: + # ── 向后增量模式 ── + # 1. 找出 daily 有但 enriched 还没有的日期 + enriched_dates = set() + if enriched_base.exists(): + enriched_dates = {p.stem.split("=")[1] for p in enriched_base.glob("date=*")} + + # 读新增日期的 daily 数据 (所有标的) + new_date_dirs = sorted( + p for p in daily_dir.glob("date=*") + if p.stem.split("=")[1] not in enriched_dates + ) + if not new_date_dirs and not symbols: + logger.info("增量模式: 无新日期, 无需重算") + return 0 + + # 加载复权因子 (全量,因为所有标的都可能需要) + factors = _load_factors(factor_path) + + # 2. 为新日期计算 enriched (所有标的) + if new_date_dirs: + raw_new = pl.scan_parquet(new_date_dirs[0] / "*.parquet", cast_options=_cast) + for nd in new_date_dirs[1:]: + raw_new = pl.concat([raw_new, pl.scan_parquet(nd / "*.parquet", cast_options=_cast)], how="diagonal_relaxed") + raw_new = raw_new.sort(["symbol", "date"]).collect(streaming=True) + + # 增量模式: 只算新日期, 但指标需要历史窗口 + # 读已有 enriched 最近 60 天作为历史前缀 + sym_list = raw_new["symbol"].unique().to_list() + hist_df = _load_recent_history(enriched_base, sym_list, days=60) + + # 合并历史 + 新数据 + if not hist_df.is_empty(): + # 只取基础行情列做历史前缀 + hist_cols = [c for c in ["symbol", "date", "open", "high", "low", "close", + "volume", "amount", "raw_close", "raw_high", "raw_low"] + if c in hist_df.columns] + raw_full = pl.concat([hist_df.select(hist_cols), raw_new], how="diagonal_relaxed") + else: + raw_full = raw_new + + enriched_new = compute_enriched(raw_full, factors=factors, instruments=instruments) + + # 只保留新日期的行 + new_date_set = set() + for nd in new_date_dirs: + ds = nd.stem.split("=")[1] + new_date_set.add(ds) + enriched_new = enriched_new.filter( + pl.col("date").map_elements(lambda x: x.isoformat(), return_dtype=pl.Utf8).is_in(list(new_date_set)) + ) + + t_new = _t.perf_counter() + logger.info("增量计算: %d 个新日期, %d 行, 耗时 %.2fs", + len(new_date_dirs), enriched_new.height, t_new - t0) + + if not enriched_new.is_empty(): + for date_df in enriched_new.partition_by("date"): + dt = date_df["date"][0] + ds = dt.isoformat() if hasattr(dt, "isoformat") else str(dt) + out = enriched_base / f"date={ds}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + date_df = _select_storage_cols(date_df).sort(["symbol"]) + date_df.write_parquet(out) + written += date_df.height + t_write_new = _t.perf_counter() + logger.info("增量写入: %.2fs, %d 行", t_write_new - t_new, written) + + # 3. 受除权因子影响的个股: 重算全部已有日期 (累积因子链变了) + if symbols: + sym_set = set(symbols) + raw_sym = pl.scan_parquet(daily_glob, cast_options=_cast).sort(["symbol", "date"]) + raw_sym = raw_sym.filter(pl.col("symbol").is_in(list(sym_set))) + raw_sym = raw_sym.collect(streaming=True) + if not raw_sym.is_empty(): + factors_sym = factors.filter(pl.col("symbol").is_in(list(sym_set))) if not factors.is_empty() else factors + inst_sym = instruments.filter(pl.col("symbol").is_in(list(sym_set))) if not instruments.is_empty() else instruments + enriched_sym = compute_enriched(raw_sym, factors=factors_sym, instruments=inst_sym) + for date_df in enriched_sym.partition_by("date"): + dt = date_df["date"][0] + ds = dt.isoformat() if hasattr(dt, "isoformat") else str(dt) + out = enriched_base / f"date={ds}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + date_df_storage = _select_storage_cols(date_df) + if out.exists(): + existing = pl.read_parquet(out) + existing = existing.filter(~pl.col("symbol").is_in(list(sym_set))) + date_df_storage = pl.concat([existing, date_df_storage], how="diagonal_relaxed") + date_df_storage = date_df_storage.sort(["symbol"]) + date_df_storage.write_parquet(out) + written += date_df.height + logger.info("除权重算: %d 只, 共写入 %d 行", len(sym_set), written) + + t_done = _t.perf_counter() + logger.info("增量管道完成: %.2fs, %d 行", t_done - t0, written) + return written + + # ── 全量 或 除权因子增量 模式 ── + mode = f"incremental ({len(symbols)} symbols)" if symbols else "full" + base = d / "kline_daily_enriched" + + # 加载复权因子 (全量加载一次,每批复用) + factors = _load_factors(factor_path) + + # 局部模式: 过滤 instruments + inst_use = instruments + + import gc + + # ── 按 symbol 分批处理: 每只股只有 ~244 行, 无冗余计算 ── + # 先获取全部 symbol 列表 + lf_all = pl.scan_parquet(daily_glob, cast_options=_cast) + if symbols: + sym_set = set(symbols) + lf_all = lf_all.filter(pl.col("symbol").is_in(list(sym_set))) + + all_symbols = ( + lf_all.select("symbol").unique().sort("symbol") + .collect(streaming=True)["symbol"].to_list() + ) + if not all_symbols: + logger.info("无日K数据, 跳过管道") + return 0 + + total_syms = len(all_symbols) + logger.info("全量计算: %d 只标的, 按 symbol 分批 [%s]", total_syms, mode) + + if not factors.is_empty() and symbols: + factors = factors.filter(pl.col("symbol").is_in(list(sym_set))) + if not factors.is_empty(): + logger.info("读取复权因子: %d 行", factors.height) + if not instruments.is_empty() and symbols: + inst_use = instruments.filter(pl.col("symbol").is_in(list(sym_set))) + + from app.services import preferences as prefs_mod + SYM_BATCH = prefs_mod.get_enriched_batch_size() # 每批 N 只 × ~244 天, 可在设置中调整 + total_batches = (total_syms + SYM_BATCH - 1) // SYM_BATCH + + # 全量模式: 先清理旧 enriched 目录, 最后一次性按日期写入 + # 收集所有批次结果, 按日期分区写入 + from collections import defaultdict + date_buffers: dict[str, list[pl.DataFrame]] = defaultdict(list) + + for batch_start in range(0, total_syms, SYM_BATCH): + batch_end = min(batch_start + SYM_BATCH, total_syms) + batch_syms = all_symbols[batch_start:batch_end] + + # 只读取本批 symbol 的数据 + lf_batch = pl.scan_parquet(daily_glob, cast_options=_cast) + lf_batch = lf_batch.filter(pl.col("symbol").is_in(batch_syms)) + raw = lf_batch.sort(["symbol", "date"]).collect(streaming=True) + + if raw.is_empty(): + continue + + # 本批的 factors / instruments + batch_factors = ( + factors.filter(pl.col("symbol").is_in(batch_syms)) + if not factors.is_empty() else factors + ) + batch_inst = ( + inst_use.filter(pl.col("symbol").is_in(batch_syms)) + if not inst_use.is_empty() else inst_use + ) + + # 计算 + enriched = compute_enriched(raw, factors=batch_factors, instruments=batch_inst) + + if not enriched.is_empty(): + if symbols: + # 局部模式: 直接按日期合并写入 + for date_df in enriched.partition_by("date"): + dt = date_df["date"][0] + ds = dt.isoformat() if hasattr(dt, "isoformat") else str(dt) + out = base / f"date={ds}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + date_df_storage = _select_storage_cols(date_df) + if out.exists(): + existing = pl.read_parquet(out) + existing = existing.filter(~pl.col("symbol").is_in(batch_syms)) + date_df_storage = pl.concat([existing, date_df_storage], how="diagonal_relaxed") + date_df_storage = date_df_storage.sort(["symbol"]) + date_df_storage.write_parquet(out) + written += date_df_storage.height + else: + # 全量模式: 缓冲到 date_buffers, 最后一次性写入 + for date_df in enriched.partition_by("date"): + dt = date_df["date"][0] + ds = dt.isoformat() if hasattr(dt, "isoformat") else str(dt) + date_buffers[ds].append(_select_storage_cols(date_df).sort(["symbol"])) + written += date_df.height + + del raw, enriched, batch_factors, batch_inst + gc.collect() + + logger.info("symbol 批次 %d/%d (%s ~ %s), 已处理 %d 行", + batch_start // SYM_BATCH + 1, + total_batches, + batch_syms[0], batch_syms[-1], written) + + # 通知进度 + if on_batch_done: + on_batch_done(batch_start // SYM_BATCH + 1, total_batches) + + # 全量模式: 按日期分区写入 + if not symbols and date_buffers: + if base.exists(): + import shutil + shutil.rmtree(base) + base.mkdir(parents=True, exist_ok=True) + + for ds, dfs in date_buffers.items(): + out = base / f"date={ds}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + merged = pl.concat(dfs, how="diagonal_relaxed").sort(["symbol"]) + merged.write_parquet(out) + + date_buffers.clear() + gc.collect() + + t_done = _t.perf_counter() + adj_label = "含复权" if not factors.is_empty() else "无复权" + logger.info("enriched 完成 [%s]: %.2fs, 共 %d 行, %s", + mode, t_done - t0, written, adj_label) + return written + + +def _load_factors(factor_path: Path) -> pl.DataFrame: + """加载复权因子文件。""" + if not factor_path.exists(): + return pl.DataFrame() + try: + return pl.read_parquet(factor_path) + except Exception as e: # noqa: BLE001 + logger.warning("复权因子读取失败: %s", e) + return pl.DataFrame() + + +def _load_recent_history(enriched_base: Path, symbols: list[str], days: int) -> pl.DataFrame: + """从已有 enriched parquet 加载最近 N 天的历史数据(用于增量模式的指标计算窗口)。 + + 只读基础行情列, 作为指标计算的历史前缀。 + """ + from datetime import date, timedelta + cutoff = date.today() - timedelta(days=days + 30) # 多读 30 天余量 + + try: + lf = ( + pl.scan_parquet(str(enriched_base / "**" / "*.parquet"), cast_options=_cast) + .filter( + (pl.col("symbol").is_in(symbols)) + & (pl.col("date") >= cutoff) + ) + .sort(["symbol", "date"]) + ) + hist_cols = [c for c in ["symbol", "date", "open", "high", "low", "close", + "volume", "amount", "raw_close", "raw_high", "raw_low"] + if c in lf.schema] + return lf.select(hist_cols).collect() + except Exception as e: # noqa: BLE001 + logger.warning("历史数据加载失败: %s", e) + return pl.DataFrame() + + +def compute_enriched_single(daily_for_symbol: pl.DataFrame) -> pl.DataFrame: + """单股版本 — Free 用户用,拉下来单股 K 后即时计算全部指标+信号返回给前端。""" + if daily_for_symbol.is_empty(): + return daily_for_symbol + + # 过滤停牌 + daily_for_symbol = filter_halt_days(daily_for_symbol) + if daily_for_symbol.is_empty(): + return daily_for_symbol + + # 保留 raw_close 用于涨停判断 + daily_for_symbol = daily_for_symbol.with_columns(pl.col("close").alias("raw_close")) + + # 即时计算全套指标 + 信号 (无复权因子, 无 instruments) + return compute_all(daily_for_symbol) + + +# ================================================================ +# 盘中增量计算: 只算今天 5500 行 (不复算历史) +# ================================================================ + +def compute_enriched_today( + live_agg: pl.DataFrame, + prev_enriched: pl.DataFrame, + today_ohlcv: pl.DataFrame, + instruments: pl.DataFrame | None = None, +) -> pl.DataFrame: + """用昨天的递推状态 + 今天的 OHLCV 增量计算今天的 enriched 数据。 + + 只处理 ~5500 行, 耗时 ~10-50ms (替代全量 compute_enriched 的 1.5-2s)。 + + 参数: + live_agg: repo.get_live_agg() — 包含所有递推状态 + 窗口聚合 + prev_enriched: repo.get_enriched_latest() — 昨天的完整 enriched (用于信号交叉判断) + today_ohlcv: 今天的 OHLCV (symbol, date, open, high, low, close, volume, amount) + instruments: 维表 (涨跌停/换手率需要) + + 返回: + 今天的 enriched DataFrame (~5500 行, 64 列) + """ + if today_ohlcv.is_empty() or live_agg.is_empty(): + return pl.DataFrame() + + alpha = _ema_alpha + + # ---- JOIN: 今天的 OHLCV + 昨天的递推状态 ---- + df = today_ohlcv.join(live_agg, on="symbol", how="inner") + + # ---- 前复权: 保存原始价 → 调整 OHLCV ---- + df = df.with_columns([ + pl.col("close").alias("raw_close"), + pl.col("high").alias("raw_high"), + pl.col("low").alias("raw_low"), + ]) + if "_adj_factor" in df.columns: + af = pl.col("_adj_factor").fill_null(1.0) + df = df.with_columns([ + (pl.col("open") * af).alias("open"), + (pl.col("high") * af).alias("high"), + (pl.col("low") * af).alias("low"), + (pl.col("close") * af).alias("close"), + ]) + + # ---- volume 统一 Float64 ---- + df = df.with_columns(pl.col("volume").cast(pl.Float64)) + + # ---- ex_rights: 盘中除权极罕见, 直接 false ---- + df = df.with_columns(pl.lit(False).alias("ex_rights")) + + # ---- 基础涨跌 ---- + # prev_close: 有则直接用 (来自 API quote_extra, raw), 需要乘 adj_factor 对齐复权价 + if "prev_close" not in df.columns: + prev_close = pl.col("close_right") if "close_right" in df.columns else pl.col("close") + df = df.with_columns(prev_close.alias("prev_close")) + elif "_adj_factor" in df.columns: + # 保存 API 原始前收盘价 (用于涨跌停价计算) + df = df.with_columns(pl.col("prev_close").alias("_prev_close_raw")) + # API 返回的 prev_close 是原始价, 乘复权因子对齐复权价 (用于 change_pct) + df = df.with_columns((pl.col("prev_close") * pl.col("_adj_factor").fill_null(1.0)).alias("prev_close")) + + # change_pct / change_amount / amplitude: 有则直接用, 无则计算 + if "change_pct" not in df.columns: + df = df.with_columns((pl.col("close") / pl.col("prev_close") - 1).alias("change_pct")) + if "change_amount" not in df.columns: + df = df.with_columns((pl.col("close") - pl.col("prev_close")).alias("change_amount")) + if "amplitude" not in df.columns: + df = df.with_columns( + pl.when(pl.col("prev_close") > 0) + .then((pl.col("high") - pl.col("low")) / pl.col("prev_close")) + .otherwise(None) + .alias("amplitude"), + ) + + # ---- EMA (递推) ---- + df = df.with_columns([ + (alpha(5) * pl.col("close") + (1 - alpha(5)) * pl.col("ema5")).alias("ema5"), + (alpha(10) * pl.col("close") + (1 - alpha(10)) * pl.col("ema10")).alias("ema10"), + (alpha(20) * pl.col("close") + (1 - alpha(20)) * pl.col("ema20")).alias("ema20"), + (alpha(30) * pl.col("close") + (1 - alpha(30)) * pl.col("ema30")).alias("ema30"), + (alpha(60) * pl.col("close") + (1 - alpha(60)) * pl.col("ema60")).alias("ema60"), + ]) + + # ---- MACD (递推) ---- + ema12 = alpha(12) * pl.col("close") + (1 - alpha(12)) * pl.col("_ema12") + ema26 = alpha(26) * pl.col("close") + (1 - alpha(26)) * pl.col("_ema26") + dif = ema12 - ema26 + dea = alpha(9) * dif + (1 - alpha(9)) * pl.col("macd_dea") + df = df.with_columns([ + dif.alias("macd_dif"), + dea.alias("macd_dea"), + ((dif - dea) * 2).alias("macd_hist"), + ]) + + # ---- MA (用部分和) ---- + df = df.with_columns([ + ((pl.col("_ma5_partial_sum") + pl.col("close")) / 5).alias("ma5"), + ((pl.col("_ma10_partial_sum") + pl.col("close")) / 10).alias("ma10"), + ((pl.col("_ma20_partial_sum") + pl.col("close")) / 20).alias("ma20"), + ((pl.col("_ma30_partial_sum") + pl.col("close")) / 30).alias("ma30"), + ((pl.col("_ma60_partial_sum") + pl.col("close")) / 60).alias("ma60"), + ]) + + # ---- Bollinger ---- + boll_sum = pl.col("_boll_partial_sum") + pl.col("close") + boll_sq_sum = pl.col("_boll_partial_sq_sum") + pl.col("close") ** 2 + boll_ma = boll_sum / 20 + boll_var = boll_sq_sum / 20 - boll_ma ** 2 + boll_std = pl.when(boll_var > 0).then(boll_var.sqrt()).otherwise(0.0) + df = df.with_columns([ + (boll_ma + 2 * boll_std).alias("boll_upper"), + (boll_ma - 2 * boll_std).alias("boll_lower"), + ]) + + # ---- KDJ (递推) ---- + kdj_ln = pl.min_horizontal(pl.col("_kdj_8d_low"), pl.col("low")) + kdj_hn = pl.max_horizontal(pl.col("_kdj_8d_high"), pl.col("high")) + rsv = (pl.col("close") - kdj_ln) / (kdj_hn - kdj_ln).fill_null(1e-12) * 100 + k_today = rsv / 3 + pl.col("kdj_k") * 2 / 3 + d_today = k_today / 3 + pl.col("kdj_d") * 2 / 3 + df = df.with_columns([ + k_today.alias("kdj_k"), + d_today.alias("kdj_d"), + (3 * k_today - 2 * d_today).alias("kdj_j"), + ]) + + # ---- ATR (递推) ---- + tr = pl.max_horizontal( + pl.col("high") - pl.col("low"), + (pl.col("high") - pl.col("prev_close")).abs(), + (pl.col("low") - pl.col("prev_close")).abs(), + ) + df = df.with_columns( + (tr / 14 + pl.col("atr_14") * 13 / 14).alias("atr_14"), + ) + + # ---- RSI (递推, n=6,14,24) ---- + delta = pl.col("close") - pl.col("prev_close") + gain = pl.when(delta > 0).then(delta).otherwise(0.0) + loss = pl.when(delta < 0).then(-delta).otherwise(0.0) + for n in (6, 14, 24): + a = 1.0 / n + avg_gain = (1 - a) * pl.col(f"_rsi_avg_gain_{n}") + a * gain + avg_loss = (1 - a) * pl.col(f"_rsi_avg_loss_{n}") + a * loss + df = df.with_columns([ + avg_gain.alias(f"_rsi_avg_gain_{n}"), + avg_loss.alias(f"_rsi_avg_loss_{n}"), + (100 - 100 / (1 + avg_gain / pl.when(avg_loss == 0).then(1e-12).otherwise(avg_loss))) + .alias(f"rsi_{n}"), + ]) + + # ---- 量比 ---- + vol_ma5 = (pl.col("_vol_ma5_partial_sum") + pl.col("volume")) / 5 + vol_ma10 = (pl.col("_vol_ma10_partial_sum") + pl.col("volume")) / 10 + df = df.with_columns([ + vol_ma5.alias("vol_ma5"), + vol_ma10.alias("vol_ma10"), + (pl.col("volume") / vol_ma5).alias("vol_ratio_5d"), + ]) + + # ---- 极值 60 日 ---- + df = df.with_columns([ + pl.max_horizontal(pl.col("_high_59d"), pl.col("high")).alias("high_60d"), + pl.min_horizontal(pl.col("_low_59d"), pl.col("low")).alias("low_60d"), + ]) + + # ---- 动量 (5d/10d/20d/30d/60d) ---- + df = df.with_columns([ + (pl.col("close") / pl.col("_close_5d_ago") - 1).alias("momentum_5d"), + (pl.col("close") / pl.col("_close_10d_ago") - 1).alias("momentum_10d"), + (pl.col("close") / pl.col("_close_20d_ago") - 1).alias("momentum_20d"), + (pl.col("close") / pl.col("_close_30d_ago") - 1).alias("momentum_30d"), + (pl.col("close") / pl.col("_close_60d_ago") - 1).alias("momentum_60d"), + ]) + + # ---- 年化波动率 20d (递推) ---- + # 用 Welford 简化: sum + sum_sq of 19 historical returns + today's return + today_ret = pl.col("close") / pl.col("prev_close") - 1 + total_sum = pl.col("_vol_19d_pct_sum").fill_null(0.0) + today_ret + total_sq_sum = pl.col("_vol_19d_pct_sq_sum").fill_null(0.0) + today_ret ** 2 + vol_mean = total_sum / 20 + vol_var = total_sq_sum / 20 - vol_mean ** 2 + df = df.with_columns( + pl.when(vol_var > 0) + .then(vol_var.sqrt() * (252 ** 0.5)) + .otherwise(None) + .alias("annual_vol_20d"), + ) + + # ---- 信号 (需要昨天的指标值判断交叉) ---- + if not prev_enriched.is_empty(): + sig_prev = prev_enriched.select( + "symbol", + pl.col("ma5").alias("_prev_ma5"), + pl.col("ma20").alias("_prev_ma20"), + pl.col("ma60").alias("_prev_ma60"), + pl.col("macd_dif").alias("_prev_dif"), + pl.col("macd_dea").alias("_prev_dea"), + pl.col("boll_upper").alias("_prev_boll_upper"), + pl.col("boll_lower").alias("_prev_boll_lower"), + pl.col("close").alias("_prev_close_enriched"), + ) + df = df.join(sig_prev, on="symbol", how="left") + + df = df.with_columns([ + # MA 金叉/死叉 + ((pl.col("ma5") > pl.col("ma20")) & (pl.col("_prev_ma5") <= pl.col("_prev_ma20"))) + .alias("signal_ma_golden_5_20"), + ((pl.col("ma5") < pl.col("ma20")) & (pl.col("_prev_ma5") >= pl.col("_prev_ma20"))) + .alias("signal_ma_dead_5_20"), + ((pl.col("ma20") > pl.col("ma60")) & (pl.col("_prev_ma20") <= pl.col("_prev_ma60"))) + .alias("signal_ma_golden_20_60"), + # MACD 金叉/死叉 + ((pl.col("macd_dif") > pl.col("macd_dea")) & (pl.col("_prev_dif") <= pl.col("_prev_dea"))) + .alias("signal_macd_golden"), + ((pl.col("macd_dif") < pl.col("macd_dea")) & (pl.col("_prev_dif") >= pl.col("_prev_dea"))) + .alias("signal_macd_dead"), + # MA20 突破/跌破 + ((pl.col("close") > pl.col("ma20")) & (pl.col("_prev_close_enriched") <= pl.col("_prev_ma20"))) + .alias("signal_ma20_breakout"), + ((pl.col("close") < pl.col("ma20")) & (pl.col("_prev_close_enriched") >= pl.col("_prev_ma20"))) + .alias("signal_ma20_breakdown"), + # BOLL 突破 + (pl.col("close") >= pl.col("boll_upper")).alias("signal_boll_breakout_upper"), + (pl.col("close") <= pl.col("boll_lower")).alias("signal_boll_breakdown_lower"), + ]) + + df = df.drop([ + c for c in df.columns + if c.startswith("_prev_") and c not in {"_prev_consec_up", "_prev_consec_down"} + ]) + + # N日新高/新低 + 放量 + df = df.with_columns([ + (pl.col("close") >= pl.col("high_60d")).alias("signal_n_day_high"), + (pl.col("close") <= pl.col("low_60d")).alias("signal_n_day_low"), + (pl.col("vol_ratio_5d") >= 2.0).alias("signal_volume_surge"), + ]) + + # ---- 涨跌停 + 换手率 + 炸板 + 连板 ---- + if instruments is not None and not instruments.is_empty(): + df = _compute_limit_signals_today(df, instruments) + + # ---- 清理内部列 ---- + drop_cols = [ + "close_right", "high_right", "low_right", "_prev_close_raw", + "_ma5_partial_sum", "_ma10_partial_sum", "_ma20_partial_sum", + "_ma30_partial_sum", "_ma60_partial_sum", + "_boll_partial_sum", "_boll_partial_sq_sum", + "_high_59d", "_low_59d", + "_close_5d_ago", "_close_10d_ago", "_close_20d_ago", + "_close_30d_ago", "_close_60d_ago", + "_vol_ma5_partial_sum", "_vol_ma10_partial_sum", + "_kdj_8d_low", "_kdj_8d_high", + "_window_len", + "_rsi_avg_gain_6", "_rsi_avg_loss_6", + "_rsi_avg_gain_14", "_rsi_avg_loss_14", + "_rsi_avg_gain_24", "_rsi_avg_loss_24", + "_ema12", "_ema26", + "_adj_factor", + "_vol_19d_pct_sum", "_vol_19d_pct_sq_sum", + "_prev_consec_up", "_prev_consec_down", + ] + df = df.drop([c for c in drop_cols if c in df.columns]) + + # 自定义信号(日级实时路径同样注入) + from app.strategy import custom_signals + df = custom_signals.inject(df, _get_custom_signal_exprs()) + + # 清理 NaN / Inf + float_cols = [c for c in df.columns if df[c].dtype.is_float()] + if float_cols: + df = df.with_columns([ + pl.when(pl.col(c).is_nan() | pl.col(c).is_infinite()) + .then(None) + .otherwise(pl.col(c)) + .alias(c) + for c in float_cols + ]) + + return df + + +def _compute_limit_signals_today(df: pl.DataFrame, instruments: pl.DataFrame) -> pl.DataFrame: + """盘中增量版的涨跌停/换手率/炸板/连板计算。""" + inst_cols = ["symbol"] + if "float_shares" in instruments.columns: + inst_cols.append("float_shares") + inst_subset = instruments.select(inst_cols).unique(subset=["symbol"]) + if "name" in instruments.columns: + st_flag = ( + instruments + .select("symbol", pl.col("name").str.contains("ST").alias("_is_st")) + .unique(subset=["symbol"]) + ) + inst_subset = inst_subset.join(st_flag, on="symbol", how="left") + + df = df.join(inst_subset, on="symbol", how="left", suffix="_inst") + + # 换手率: API 有则直接用, 无则从 float_shares 计算 + if "turnover_rate" not in df.columns: + if "float_shares" in df.columns and "volume" in df.columns: + df = df.with_columns( + pl.when(pl.col("float_shares") > 0) + .then(pl.col("volume") * 10000.0 / pl.col("float_shares")) + .otherwise(None) + .alias("turnover_rate") + ) + + # 涨跌停 (用 raw_close / raw_high 和前一日原始收盘价) + # 优先用 API 原始前收盘价, 回退到 close_right, 最后回退到 raw_close + if "_prev_close_raw" in df.columns: + if "close_right" in df.columns: + prev_raw = pl.when(pl.col("_prev_close_raw").is_not_null()).then(pl.col("_prev_close_raw")).otherwise(pl.col("close_right")) + else: + prev_raw = pl.col("_prev_close_raw") + elif "close_right" in df.columns: + prev_raw = pl.col("close_right") + else: + prev_raw = pl.col("raw_close") + is_chinext = pl.col("symbol").str.starts_with("300") | pl.col("symbol").str.starts_with("301") + is_star = pl.col("symbol").str.starts_with("688") | pl.col("symbol").str.starts_with("689") + is_bj = pl.col("symbol").str.ends_with(".BJ") + limit_pct = ( + pl.when(is_chinext).then(0.20) + .when(is_star).then(0.20) + .when(is_bj).then(0.30) + .otherwise(0.10) + ) + if "_is_st" in df.columns: + limit_pct = pl.when(pl.col("_is_st").fill_null(False)).then(0.05).otherwise(limit_pct) + limit_pct = limit_pct.alias("_limit_pct") + + limit_up_price = _limit_price(prev_raw, limit_pct, up=True) + limit_down_price = _limit_price(prev_raw, limit_pct, up=False) + + is_limit_up = ( + pl.when((prev_raw > 0) & (pl.col("raw_close") > 0)) + .then((pl.col("raw_close") - limit_up_price).abs() < 0.005) + .otherwise(None).cast(pl.Boolean) + ) + is_limit_down = ( + pl.when((prev_raw > 0) & (pl.col("raw_close") > 0)) + .then((pl.col("raw_close") - limit_down_price).abs() < 0.005) + .otherwise(None).cast(pl.Boolean) + ) + + df = df.with_columns([ + is_limit_up.alias("signal_limit_up"), + is_limit_down.alias("signal_limit_down"), + # 跌停翘板 + pl.when(prev_raw > 0) + .then( + (~is_limit_down.fill_null(True)) + & (pl.col("low") <= limit_down_price + 0.005) + & (pl.col("close") > pl.col("open")) + ).otherwise(None).cast(pl.Boolean) + .alias("signal_limit_down_recovery"), + # 炸板: 最高价曾触及涨停价 + 最终未封住 + pl.when((prev_raw > 0) & (pl.col("raw_high") > 0)) + .then( + (~is_limit_up.fill_null(True)) + & (pl.col("raw_high") >= limit_up_price - 0.005) + ).otherwise(None).cast(pl.Boolean) + .alias("signal_broken_limit_up"), + ]) + + # 连板数: 同向 +1, 不同向归零 + # _prev_consec_up / _prev_consec_down 来自 live_agg (昨日 enriched) + if "_prev_consec_up" not in df.columns: + df = df.with_columns(pl.lit(0).cast(pl.UInt32).alias("_prev_consec_up")) + if "_prev_consec_down" not in df.columns: + df = df.with_columns(pl.lit(0).cast(pl.UInt32).alias("_prev_consec_down")) + prev_up = pl.col("_prev_consec_up").fill_null(0).cast(pl.UInt32) + prev_down = pl.col("_prev_consec_down").fill_null(0).cast(pl.UInt32) + df = df.with_columns([ + pl.when(is_limit_up.fill_null(False)) + .then((prev_up + 1).cast(pl.UInt32)) + .otherwise(pl.lit(0).cast(pl.UInt32)) + .alias("consecutive_limit_ups"), + pl.when(is_limit_down.fill_null(False)) + .then((prev_down + 1).cast(pl.UInt32)) + .otherwise(pl.lit(0).cast(pl.UInt32)) + .alias("consecutive_limit_downs"), + ]) + + # 清理 + cleanup = ["_limit_pct", "_is_st"] + for c in df.columns: + if c.endswith("_inst"): + cleanup.append(c) + for c in ["name", "float_shares"]: + if c in df.columns: + cleanup.append(c) + df = df.drop([c for c in cleanup if c in df.columns]) + + return df diff --git a/backend/app/jobs/__init__.py b/backend/app/jobs/__init__.py new file mode 100644 index 0000000..3daa442 --- /dev/null +++ b/backend/app/jobs/__init__.py @@ -0,0 +1 @@ +"""APScheduler 任务。""" diff --git a/backend/app/jobs/daily_pipeline.py b/backend/app/jobs/daily_pipeline.py new file mode 100644 index 0000000..d22edfc --- /dev/null +++ b/backend/app/jobs/daily_pipeline.py @@ -0,0 +1,532 @@ +"""盘后管道 + 盘前维表同步。 + +调度: + 09:10 盘前 — 同步标的维表 instruments (全量覆盖) + 15:30 盘后 — 日K同步 + 增量除权因子 + enriched 计算 + 刷新视图 + +盘后同步策略: + 日 K: QuoteService 交易时段已实时落盘 → 有数据时跳过 batch,首次拉 1 年区间 + 除权因子: 从已有数据最新日期的下一天开始增量获取,避免重复拉取和计算 +""" +from __future__ import annotations + +import logging +from collections.abc import Callable +from pathlib import Path + +import polars as pl +from apscheduler.schedulers.asyncio import AsyncIOScheduler +from apscheduler.triggers.cron import CronTrigger + +from app.indicators.pipeline import run_pipeline +from app.config import settings +from app.services import index_sync, instrument_sync, kline_sync +from app.tickflow.capabilities import Cap, CapabilitySet +from app.tickflow.pools import DEMO_SYMBOLS, get_pool +from app.tickflow.repository import KlineRepository + +logger = logging.getLogger(__name__) + +ProgressCb = Callable[..., None] + + +def _noop(stage: str, pct: int, msg: str, **kwargs) -> None: # noqa: ARG001 + pass + + +def _invalidate(table: str | None = None) -> None: + """stage 写完调用,让 /api/data/status 只重算被影响的那张表。""" + from app.api.data import invalidate_data_cache + invalidate_data_cache(table) + + +def _resolve_universe(capset: CapabilitySet) -> list[str]: + """解析标的池 — 以 CN_Equity_A (沪深京A股 ~5522只) 为主。 + + 有 batch 能力 → 直接拉 CN_Equity_A universe + 其他用户 → 用 instruments parquet + watchlist 兜底 + """ + if capset.has(Cap.KLINE_DAILY_BATCH): + try: + all_a = get_pool("CN_Equity_A", refresh=True) + if all_a: + return sorted(all_a) + except Exception as e: # noqa: BLE001 + logger.warning("CN_Equity_A pool unavailable, fallback: %s", e) + + # Free 用户兜底: instruments parquet + watchlist + demo + base: set[str] = set(DEMO_SYMBOLS) + base.update(get_pool("watchlist")) + d = Path(settings.data_dir) + inst_path = d / "instruments" / "instruments.parquet" + if inst_path.exists(): + try: + inst = pl.read_parquet(inst_path, columns=["symbol"]) + base.update(inst["symbol"].to_list()) + except Exception as e: # noqa: BLE001 + logger.warning("instruments supplement failed: %s", e) + return sorted(base) + + +def run_instruments_sync(repo: KlineRepository) -> dict: + """盘前同步标的维表。""" + rows = instrument_sync.sync_instruments(repo.store.data_dir) + _refresh_instruments_view(repo) + _invalidate("instruments") + return {"instruments_rows": rows} + + +def run_now( + repo: KlineRepository, + capset: CapabilitySet, + on_progress: ProgressCb | None = None, +) -> dict: + """立即执行一次盘后管道,支持进度回调。 + + 跳过的 stage **不 emit**,避免前端把"无 capability"的卡片错误标记为 active/done。 + result 里带 skipped_stages 列表供前端展示。 + """ + emit = on_progress or _noop + skipped: list[str] = [] + + # Step 0: 先同步标的维表, 再解析标的池 — 确保标的池基于最新 instruments + emit("sync_instruments", 2, "同步标的维表…") + inst_rows = instrument_sync.sync_instruments(repo.store.data_dir) + if inst_rows > 0: + _refresh_instruments_view(repo) + emit("sync_instruments", 8, f"标的维表同步完成,{inst_rows} 只标的") + _invalidate("instruments") + + emit("resolve_universe", 9, "解析标的池…") + universe = _resolve_universe(capset) + emit("resolve_universe", 10, f"标的池规模:{len(universe)} 只") + + # Step 1: 日 K 同步 + # 今天有数据 → 实时行情接口拉一次覆写(1请求全市场) + # 今天没数据 → batch K-line API 补齐 + # 无任何数据 → batch K-line API 拉首次 1 年 + from datetime import date as _date, timedelta as _td, datetime as _dt + latest_daily = repo.latest_daily_date() + today = _date.today() + today_exists = latest_daily and latest_daily >= today + new_daily_days = 0 + + if today_exists: + # 今天有数据(QuoteService 已落盘)→ 实时行情覆写,确保最新 + emit("sync_daily", 12, f"获取日K [{today} ~ {today}] 实时行情…") + written_daily = kline_sync.sync_daily_by_quotes(repo) + new_daily_days = 1 + emit("sync_daily", 45, f"日K 完成,{written_daily} 只标的") + logger.info("sync_daily: [%s ~ %s] live quotes, %d symbols", today, today, written_daily) + elif latest_daily: + # 有历史但今天没数据 → batch 补齐缺口 + start_date = latest_daily + emit("sync_daily", 12, f"获取日K [{start_date} ~ {today}]…") + logger.info("sync_daily: [%s ~ %s] gap fill", start_date, today) + + def _daily_chunk_progress(cur: int, tot: int) -> None: + emit("sync_daily", 12 + int(33 * cur / tot), + f"日K 批次 {cur}/{tot}", stage_pct=int(100 * cur / tot), skip_log=True) + written_daily = kline_sync.sync_and_persist_daily_batch( + universe, repo, capset, + start_date=_dt.combine(start_date, _dt.min.time()), + end_date=_dt.combine(today, _dt.min.time()), + on_chunk_done=_daily_chunk_progress, + ) + gap_days = (today - start_date).days + new_daily_days = gap_days + emit("sync_daily", 45, f"日K 完成,覆盖 {gap_days} 天") + logger.info("sync_daily: [%s ~ %s] done, %d days", start_date, today, gap_days) + else: + # 首次:无任何数据 → batch 拉 1 年 + start_date = today - _td(days=365) + emit("sync_daily", 12, f"获取日K [{start_date} ~ {today}]…") + logger.info("sync_daily: [%s ~ %s] initial fetch", start_date, today) + + def _daily_chunk_progress(cur: int, tot: int) -> None: + emit("sync_daily", 12 + int(33 * cur / tot), + f"日K 批次 {cur}/{tot}", stage_pct=int(100 * cur / tot), skip_log=True) + written_daily = kline_sync.sync_and_persist_daily_batch( + universe, repo, capset, + start_date=_dt.combine(start_date, _dt.min.time()), + end_date=_dt.combine(today, _dt.min.time()), + on_chunk_done=_daily_chunk_progress, + ) + new_daily_days = 365 + emit("sync_daily", 45, "日K 完成") + logger.info("sync_daily: [%s ~ %s] done", start_date, today) + _invalidate("daily") + + # Step 1.5: 增量同步除权因子 — 从已有数据最新日期的下一天开始获取 + written_adj = 0 + affected_symbols: list[str] = [] + if capset.has(Cap.ADJ_FACTOR): + from datetime import datetime, timedelta + adj_end = datetime.now() + # 从已有除权因子数据的最新日期开始获取,避免重复拉取 + adj_factor_path = repo.store.data_dir / "adj_factor" / "all.parquet" + fallback_start = adj_end - timedelta(days=30) + if adj_factor_path.exists(): + try: + from datetime import date as date_cls + max_date = pl.scan_parquet(adj_factor_path).select( + pl.col("trade_date").max() + ).collect().item() + if max_date is not None: + # trade_date 可能是 date / datetime / string 类型 + if isinstance(max_date, str): + td = date_cls.fromisoformat(max_date) + elif isinstance(max_date, datetime): + td = max_date.date() + else: + td = max_date + adj_start = datetime.combine(td, datetime.min.time()) + else: + adj_start = fallback_start + except Exception: + adj_start = fallback_start + else: + adj_start = fallback_start + adj_start_str = adj_start.strftime("%Y-%m-%d") + adj_end_str = adj_end.strftime("%Y-%m-%d") + emit("sync_adj", 50, f"获取除权因子 [{adj_start_str} ~ {adj_end_str}]…") + logger.info("sync_adj: [%s ~ %s] start", adj_start_str, adj_end_str) + + def _adj_chunk_progress(cur: int, tot: int) -> None: + emit("sync_adj", 50 + int(10 * cur / tot), + f"除权因子批次 {cur}/{tot}", stage_pct=int(100 * cur / tot), skip_log=True) + written_adj, affected_symbols = kline_sync.sync_adj_factor( + universe, repo, capset, + start_time=adj_start, end_time=adj_end, + on_chunk_done=_adj_chunk_progress, + ) + if affected_symbols: + _refresh_single_view(repo, "adj_factor") + emit("sync_adj", 60, f"除权因子完成,新增 {len(affected_symbols)} 只个股") + logger.info("sync_adj: [%s ~ %s] done, %d symbols", adj_start_str, adj_end_str, len(affected_symbols)) + else: + emit("sync_adj", 60, "除权因子完成,无新增") + logger.info("sync_adj: [%s ~ %s] no new factors", adj_start_str, adj_end_str) + _invalidate("adj_factor") + else: + skipped.append("sync_adj") + logger.info("sync_adj skipped: no ADJ_FACTOR capability") + + # Step 2: 计算 enriched + # 判断策略: + # - 首次 (enriched 目录不存在) → 全量 + # - 往前扩展历史 (新日期 < enriched 已有最早日期) → 全量 + # 前面的除权因子会改变累积因子链,影响后面所有日期的复权价格 + # - 往后新增日期 (新日期 > enriched 已有最晚日期) + # → 增量补新区块(所有标的) + 受除权影响个股全日期重算 + # - 无新日期 + 有新除权因子 → 增量: 只重算受影响个股的全部日期 + # - 无新日期 + 无变化 → 跳过 + enriched_dir = repo.store.data_dir / "kline_daily_enriched" + enriched_exists = enriched_dir.exists() and any(enriched_dir.glob("date=*")) + daily_dir = repo.store.data_dir / "kline_daily" + daily_days = len(list(daily_dir.glob("date=*"))) if daily_dir.exists() else 0 + prev_enriched_days = len(list(enriched_dir.glob("date=*"))) if enriched_exists else 0 + + # 判断新日期方向: 找 daily 和 enriched 的日期集合做比较 + forward_incremental = False + backward_extension = False + + if daily_days > prev_enriched_days and enriched_exists: + daily_dates = sorted(d.stem.split("=")[1] for d in daily_dir.glob("date=*")) + enriched_dates = sorted(d.stem.split("=")[1] for d in enriched_dir.glob("date=*")) + earliest_enriched = enriched_dates[0] + latest_enriched = enriched_dates[-1] + new_dates = set(daily_dates) - set(enriched_dates) + if new_dates: + # 有新日期早于 enriched 最早日期 → 往前扩展 + if any(d < earliest_enriched for d in new_dates): + backward_extension = True + # 有新日期晚于 enriched 最晚日期 → 往后新增 + if any(d > latest_enriched for d in new_dates): + forward_incremental = True + + def _enriched_batch_progress(cur: int, tot: int) -> None: + emit("compute_enriched", 65 + int(23 * cur / tot), + f"计算指标 批次 {cur}/{tot}", stage_pct=int(100 * cur / tot), skip_log=True) + + if not enriched_exists or backward_extension: + # 首次 或 往前扩展 → 全量 + emit("compute_enriched", 65, "全量计算 enriched…") + logger.info("compute_enriched: full rebuild (first=%s, backward=%s, daily=%d, enriched=%d)", + not enriched_exists, backward_extension, daily_days, prev_enriched_days) + written_enriched = run_pipeline(on_batch_done=_enriched_batch_progress) + new_enriched_days = len(list(enriched_dir.glob("date=*"))) + emit("compute_enriched", 88, f"enriched 完成,覆盖 {new_enriched_days} 天") + logger.info("compute_enriched: full rebuild done, %d days", new_enriched_days) + elif forward_incremental: + # 往后新增日期: 增量补新区块 + 受影响个股全日期重算 + symbols_to_recompute = list(set(affected_symbols)) if affected_symbols else [] + emit("compute_enriched", 65, + f"增量计算 enriched (新日期 + {len(symbols_to_recompute)} 只个股重算)…" + if symbols_to_recompute else "增量计算 enriched (新日期)…") + logger.info("compute_enriched: forward incremental, %d symbols to recompute", + len(symbols_to_recompute)) + written_enriched = run_pipeline( + new_dates_only=True, + symbols=symbols_to_recompute or None, + on_batch_done=_enriched_batch_progress, + ) + new_enriched_days = len(list(enriched_dir.glob("date=*"))) + emit("compute_enriched", 88, f"enriched 完成,覆盖 {new_enriched_days} 天") + logger.info("compute_enriched: forward incremental done, %d days", new_enriched_days) + elif affected_symbols: + # 无新日期,仅除权因子变更 → 只重算受影响个股的全部日期 + emit("compute_enriched", 65, f"增量计算 enriched ({len(affected_symbols)} 只个股)…") + logger.info("compute_enriched: adj_factor incremental, %d symbols", len(affected_symbols)) + written_enriched = run_pipeline(symbols=affected_symbols, on_batch_done=_enriched_batch_progress) + emit("compute_enriched", 88, f"enriched 完成,{len(affected_symbols)} 只个股") + else: + written_enriched = 0 + logger.info("compute_enriched: skip (no new daily, no adj_factor changes)") + _refresh_single_view(repo, "kline_enriched") + _invalidate("enriched") + + # Step 2.3: 指数同步 — 独立 kline_index_* 存储,不进入股票选股/策略链路。 + written_index_daily = 0 + index_count = 0 + if capset.has(Cap.KLINE_DAILY_BATCH): + emit("sync_index", 88, "同步指数列表与日K…") + try: + index_count = index_sync.sync_index_instruments(repo) + index_dir = repo.store.data_dir / "kline_index_enriched" + index_dates = sorted( + d.name[5:] for d in index_dir.glob("date=*") + if d.is_dir() and d.name.startswith("date=") + ) if index_dir.exists() else [] + index_start = _date.fromisoformat(index_dates[-1]) if index_dates else today - _td(days=365) + written_index_daily = index_sync.sync_and_persist_index_daily( + repo, + capset, + start_date=_dt.combine(index_start, _dt.min.time()), + end_date=_dt.combine(today, _dt.min.time()), + ) + repo.refresh_index_views() + _invalidate("index_instruments") + _invalidate("index_daily") + _invalidate("index_enriched") + emit("sync_index", 89, f"指数完成,{index_count} 只指数,{written_index_daily} 行日K") + except Exception as e: # noqa: BLE001 + logger.warning("sync_index failed: %s", e) + emit("sync_index", 89, f"指数同步失败:{e}") + else: + skipped.append("sync_index") + + # Step 2.5: 分钟 K 同步(可选) — 未启用或无 capability 时静默跳过(不 emit) + from app.services import preferences + minute_on = preferences.get_minute_sync_enabled() + minute_days = preferences.get_minute_sync_days() + written_minute = 0 + if minute_on and capset.has(Cap.KLINE_MINUTE_BATCH): + minute_start = today - _td(days=minute_days) + emit("sync_minute", 90, f"获取分钟K [{minute_start} ~ {today}]…") + logger.info("sync_minute: [%s ~ %s] start", minute_start, today) + minute_symbols = _resolve_minute_symbols(capset) + def _minute_chunk_progress(cur: int, tot: int) -> None: + emit("sync_minute", 90 + int(3 * cur / tot), + f"分钟K 批次 {cur}/{tot}", stage_pct=int(100 * cur / tot), skip_log=True) + written_minute = kline_sync.sync_and_persist_minute( + minute_symbols, repo, capset, days=minute_days, + on_chunk_done=_minute_chunk_progress, + ) + minute_dir = repo.store.data_dir / "kline_minute" + minute_cover_days = len(list(minute_dir.glob("date=*"))) if minute_dir.exists() else 0 + emit("sync_minute", 93, f"分钟K完成,覆盖 {minute_cover_days} 天") + logger.info("sync_minute: [%s ~ %s] done, %d days", minute_start, today, minute_cover_days) + _invalidate("minute") + else: + skipped.append("sync_minute") + if minute_on: + logger.info("sync_minute skipped: no KLINE_MINUTE_BATCH capability") + else: + logger.info("sync_minute skipped: user disabled") + + # Step 3: 刷新视图 + emit("refresh_views", 95, "刷新 DuckDB 视图…") + _refresh_views(repo) + + emit("done", 100, "完成") + _invalidate(None) # 兜底:全清 + + return { + "universe_size": len(universe), + "daily_days": new_daily_days, + "adj_factor_symbols": len(affected_symbols), + "enriched_days": written_enriched, + "index_count": index_count, + "index_daily_rows": written_index_daily, + "minute_rows": written_minute, + "skipped_stages": skipped, + } + + +def _refresh_views(repo: KlineRepository) -> None: + """刷新所有 DuckDB 视图。""" + d = repo.store.data_dir.as_posix() + views = { + "kline_daily": f"{d}/kline_daily/**/*.parquet", + "kline_enriched": f"{d}/kline_daily_enriched/**/*.parquet", + "kline_index_daily": f"{d}/kline_index_daily/**/*.parquet", + "kline_index_enriched": f"{d}/kline_index_enriched/**/*.parquet", + "kline_minute": f"{d}/kline_minute/**/*.parquet", + "adj_factor": f"{d}/adj_factor/**/*.parquet", + "instruments": f"{d}/instruments/**/*.parquet", + "instruments_index": f"{d}/instruments_index/**/*.parquet", + } + for name, path in views.items(): + try: + repo.db.execute( + f"CREATE OR REPLACE VIEW {name} AS " + f"SELECT * FROM read_parquet('{path}', union_by_name=true)" + ) + except Exception as e: # noqa: BLE001 + logger.warning("refresh view %s failed: %s", name, e) + + +def _refresh_single_view(repo: KlineRepository, name: str) -> None: + """刷新单个 DuckDB 视图。""" + d = repo.store.data_dir.as_posix() + paths = { + "kline_daily": f"{d}/kline_daily/**/*.parquet", + "kline_enriched": f"{d}/kline_daily_enriched/**/*.parquet", + "kline_index_daily": f"{d}/kline_index_daily/**/*.parquet", + "kline_index_enriched": f"{d}/kline_index_enriched/**/*.parquet", + "kline_minute": f"{d}/kline_minute/**/*.parquet", + "adj_factor": f"{d}/adj_factor/**/*.parquet", + "instruments": f"{d}/instruments/**/*.parquet", + "instruments_index": f"{d}/instruments_index/**/*.parquet", + } + path = paths.get(name) + if not path: + return + try: + repo.db.execute( + f"CREATE OR REPLACE VIEW {name} AS " + f"SELECT * FROM read_parquet('{path}', union_by_name=true)" + ) + except Exception as e: # noqa: BLE001 + logger.warning("refresh view %s failed: %s", name, e) + + +def _resolve_minute_symbols(capset: CapabilitySet) -> list[str]: + """分钟 K 同步标的 — 与日K共用同一标的池。""" + return _resolve_universe(capset) + + +def _refresh_instruments_view(repo: KlineRepository) -> None: + """单独刷新 instruments 视图。""" + d = repo.store.data_dir.as_posix() + try: + repo.db.execute( + f"CREATE OR REPLACE VIEW instruments AS " + f"SELECT * FROM read_parquet('{d}/instruments/**/*.parquet', union_by_name=true)" + ) + except Exception as e: # noqa: BLE001 + logger.warning("refresh instruments view failed: %s", e) + + +def _run_tracked(fn, job_label: str) -> None: + """调度触发时包装 JobStore 跟踪,确保同步历史有记录。""" + from app.services.pipeline_jobs import job_store + + job_id = job_store.create() + job_store.start(job_id) + + def progress(stage: str, pct: int, msg: str, stage_pct: int | None = None, + skip_log: bool = False) -> None: + job_store.progress(job_id, stage, pct, msg, stage_pct=stage_pct, skip_log=skip_log) + + try: + result = fn(on_progress=progress) + job_store.succeed(job_id, result) + logger.info("scheduled %s completed: job_id=%s", job_label, job_id) + except Exception: + logger.exception("scheduled %s failed: job_id=%s", job_label, job_id) + job_store.fail(job_id, f"scheduled {job_label} failed") + + +def start_scheduler(repo: KlineRepository, capset: CapabilitySet) -> AsyncIOScheduler: + """启动调度器。 + + 工作日 09:10 — 同步标的维表 + 工作日 HH:MM — 盘后管道(时间由用户偏好决定,默认 15:30) + """ + from app.services import preferences + sched = preferences.get_pipeline_schedule() + inst_sched = preferences.get_instruments_schedule() + + scheduler = AsyncIOScheduler(timezone="Asia/Shanghai") + + # 盘前: 同步 instruments(时间由偏好决定) + def _instruments_task(on_progress=None): + emit = on_progress or _noop + emit("sync_instruments", 0, "同步标的维表…") + result = run_instruments_sync(repo) + emit("done", 100, f"标的维表同步完成,{result.get('instruments_rows', 0)} 只标的") + return result + + scheduler.add_job( + lambda: _run_tracked(_instruments_task, "instruments_sync"), + trigger=CronTrigger(day_of_week="mon-fri", + hour=inst_sched["hour"], minute=inst_sched["minute"], + timezone="Asia/Shanghai"), + id="pre_market_instruments", + misfire_grace_time=1800, + replace_existing=True, + ) + + # 盘后: 日 K + enriched(时间由偏好决定) + scheduler.add_job( + lambda: _run_tracked( + lambda on_progress=None: run_now(repo, capset, on_progress=on_progress), + "daily_pipeline", + ), + trigger=CronTrigger(day_of_week="mon-fri", + hour=sched["hour"], minute=sched["minute"], + timezone="Asia/Shanghai"), + id="daily_pipeline", + misfire_grace_time=3600, + replace_existing=True, + ) + + # 盘后: 五档盘口 sealed 定版(时间由偏好决定, 默认15:02, 范围15:01~18:00) + depth_sched = preferences.get_depth_finalize_time() + + def _depth_finalize(): + depth_svc = getattr(_get_app_state(), "depth_service", None) if _get_app_state() else None + if depth_svc: + depth_svc.finalize() + + scheduler.add_job( + _depth_finalize, + trigger=CronTrigger(day_of_week="mon-fri", + hour=depth_sched["hour"], minute=depth_sched["minute"], + timezone="Asia/Shanghai"), + id="depth_finalize", + misfire_grace_time=3600, + replace_existing=True, + ) + + scheduler.start() + logger.info("scheduler started; instruments@%02d:%02d, pipeline@%02d:%02d, depth@%02d:%02d mon-fri", + inst_sched["hour"], inst_sched["minute"], sched["hour"], sched["minute"], + depth_sched["hour"], depth_sched["minute"]) + return scheduler + + +# app_state 延迟引用(start_scheduler 在 lifespan 早期调用, app.state 可能还没就绪) +_app_state_ref = None + + +def set_app_state(app_state) -> None: + """lifespan 注册 app.state 引用, 供 scheduled job 访问 depth_service 等单例。""" + global _app_state_ref + _app_state_ref = app_state + + +def _get_app_state(): + return _app_state_ref diff --git a/backend/app/main.py b/backend/app/main.py new file mode 100644 index 0000000..0739d17 --- /dev/null +++ b/backend/app/main.py @@ -0,0 +1,265 @@ +"""FastAPI 入口。""" +from __future__ import annotations + +import logging +from contextlib import asynccontextmanager +from pathlib import Path + +from fastapi import FastAPI, Request +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse, JSONResponse +from fastapi.staticfiles import StaticFiles + +from app import __version__ +from app import auth as auth_module +from app.api import analysis, auth, backtest, data, ext_data, financials, indices, intraday, kline, monitor_rules, alerts, overview, pipeline, screener, settings as settings_api, signals, strategy, watchlist +from app.api.routes import router as core_router +from app.config import settings +from app.jobs import daily_pipeline +from app.services.quote_service import QuoteService +from app.tickflow import client as tf_client +from app.tickflow.policy import detect_capabilities +from app.tickflow.repository import DataStore, KlineRepository + +logging.basicConfig( + level=settings.log_level, + format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", +) +logger = logging.getLogger(__name__) + + +@asynccontextmanager +async def lifespan(app: FastAPI): + logger.info( + "Stock Panel v%s starting (mode=%s)", + __version__, tf_client.current_mode(), + ) + + # 数据层 + store = DataStore() + repo = KlineRepository(store) + app.state.datastore = store + app.state.repo = repo + + # Polars 缓存预热 + repo.refresh_cache() + + # 能力探测 + capset = detect_capabilities() + app.state.capabilities = capset + logger.info("ready; %d capabilities active", len(capset.all())) + + # 全局行情服务 + qs = QuoteService() + app.state.quote_service = qs + qs.set_repo(repo) + qs.boot_check() + + # QuoteService 需要访问 strategy_monitor 等单例 + # 先创建 strategy_monitor,再注入 app.state + from app.strategy.monitor import StrategyMonitorService + strategy_monitor = StrategyMonitorService() + app.state.strategy_monitor = strategy_monitor + qs.set_app_state(app.state) + + # 五档盘口 sealed 服务(真假涨停/跌停, 独立旁路线) + from app.services.depth_service import DepthService + depth_service = DepthService() + depth_service.set_repo(repo) + depth_service.set_app_state(app.state) + app.state.depth_service = depth_service + + # 启动调度器(若 enriched 数据为空,首次启动可手动 POST /api/pipeline/run) + try: + daily_pipeline.set_app_state(app.state) # 供 depth_finalize job 访问 depth_service + scheduler = daily_pipeline.start_scheduler(repo, capset) + app.state.scheduler = scheduler + except Exception as e: # noqa: BLE001 + logger.warning("scheduler not started: %s", e) + app.state.scheduler = None + + # depth sealed: 启动补跑(当天文件不存在) + 盘中轮询(有能力时) + try: + depth_service.boot_check() + depth_service.start_polling() + except Exception as e: # noqa: BLE001 + logger.warning("depth_service init failed: %s", e) + + # 扩展数据定时拉取 + from app.services.ext_pull import pull_scheduler + pull_scheduler.start(store.data_dir) + pull_scheduler.refresh(store.data_dir) + app.state.pull_scheduler = pull_scheduler + + # 财务数据独立调度 (需 Expert 套餐) + from app.services.financial_sync import financial_scheduler + financial_scheduler.start(store.data_dir, capset) + app.state.financial_scheduler = financial_scheduler + + # 策略引擎 + from app.strategy.engine import StrategyEngine + from app.strategy.monitor import StrategyMonitorService + from app.services.screener import ScreenerService + + _screener_svc = ScreenerService(repo) + strategy_dirs = [ + Path(__file__).resolve().parent / "strategy" / "builtin", + store.data_dir / "strategies" / "custom", + store.data_dir / "strategies" / "ai", + ] + strategy_engine = StrategyEngine( + enriched_loader=_screener_svc._load_enriched_for_date, + enriched_history_loader=_screener_svc._load_enriched_history, + strategy_dirs=strategy_dirs, + ) + app.state.strategy_engine = strategy_engine + logger.info("strategy engine loaded: %d strategies", len(strategy_engine.list_strategies())) + + # 通用监控规则引擎: 启动时 reload 规则到内存态 (修复重启后告警失效) + from app.strategy.monitor import MonitorRuleEngine + from app.strategy import monitor_rules as mr_store + from app.services import preferences + monitor_engine = MonitorRuleEngine() + monitor_engine.set_strategy_engine(strategy_engine) + monitor_engine.set_data_dir(store.data_dir) + + # 自动迁移: 把旧 strategy_monitor_ids 同步为 type=strategy 规则 (统一到监控页) + try: + if preferences.get_strategy_monitor_enabled(): + ids = preferences.get_strategy_monitor_ids() + if ids: + names = {s.id: s.name for s in strategy_engine.list_strategies()} + mr_store.migrate_strategy_monitors(store.data_dir, ids, names) + logger.info("strategy monitor migrated: %d strategies", len(ids)) + except Exception as e: # noqa: BLE001 + logger.warning("strategy monitor migration failed: %s", e) + + try: + rules = mr_store.load_all(store.data_dir) + monitor_engine.set_rules(rules) + logger.info("monitor engine loaded: %d rules", monitor_engine.rule_count) + except Exception as e: # noqa: BLE001 + logger.warning("monitor engine load failed: %s", e) + app.state.monitor_engine = monitor_engine + + yield + + if app.state.scheduler: + app.state.scheduler.shutdown(wait=False) + ps = getattr(app.state, "pull_scheduler", None) + if ps: + ps.stop() + fsc = getattr(app.state, "financial_scheduler", None) + if fsc: + fsc.stop() + qs = getattr(app.state, "quote_service", None) + if qs: + qs.stop() + dsvc = getattr(app.state, "depth_service", None) + if dsvc: + dsvc.stop_polling() + logger.info("shutdown") + + +app = FastAPI( + title="Stock Panel", + version=__version__, + description="A 股选股 + 监控 + 回测面板", + lifespan=lifespan, +) + +# CORS: 允许局域网访问 (自托管场景, 放开所有来源) +# 注: allow_credentials=True 与 allow_origins=['*'] 不能共存 (浏览器规范), +# 本项目认证走 header (API Key), 不依赖 cookie, 故关闭 credentials 换取通配来源。 +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=False, + allow_methods=["*"], + allow_headers=["*"], +) + + +# 访问门控中间件:仅对 /api/* 路径校验,静态资源和前端路由放行, +# 由前端 AccessGuard 控制 UI 展示。 +@app.middleware("http") +async def access_uuid_middleware(request: Request, call_next): + if auth_module.access_control_enabled(): + path = request.url.path + # 白名单直接放行 + if not auth_module.is_public_path(path): + token = auth_module.get_access_token_from_request(request) + role = auth_module.validate_access_token(token) + # 管理员接口需 admin 角色 + if auth_module.is_admin_path(path): + if role != auth_module.AuthRole.ADMIN: + return JSONResponse( + status_code=403 if role else 401, + content={"detail": "需要管理员权限"}, + ) + # 其它 API 调用需任意有效角色 + elif path.startswith("/api/"): + if role is None: + return JSONResponse( + status_code=401, + content={"detail": "访问令牌无效或已过期,请先验证"}, + ) + return await call_next(request) + + +# 路由 +app.include_router(core_router) +app.include_router(auth.router) +app.include_router(auth.admin_router) +app.include_router(kline.router) +app.include_router(watchlist.router) +app.include_router(screener.router) +app.include_router(backtest.router) +app.include_router(intraday.router) +app.include_router(indices.router) +app.include_router(overview.router) +app.include_router(analysis.router) +app.include_router(pipeline.router) +app.include_router(data.router) +app.include_router(ext_data.router) +app.include_router(financials.router) +app.include_router(settings_api.router) +app.include_router(strategy.router) +app.include_router(signals.router) +app.include_router(monitor_rules.router) +app.include_router(alerts.router) + + +# 能力门控异常 → 403(而非默认 500) +# 业务代码用 capset.require(Cap.X) 断言能力,缺失时抛 CapabilityDenied; +# 若不注册 handler 会冒泡成 500 Internal Server Error,对前端不友好且语义错误。 +from app.tickflow.capabilities import CapabilityDenied + + +@app.exception_handler(CapabilityDenied) +async def capability_denied_handler(request: Request, exc: CapabilityDenied) -> JSONResponse: + return JSONResponse( + status_code=403, + content={"detail": str(exc), "suggestion": exc.suggestion}, + ) + +# 生产期静态文件(前端 dist) +_static = Path(settings.static_dir) +if _static.exists(): + if (_static / "assets").exists(): + app.mount("/assets", StaticFiles(directory=_static / "assets"), name="assets") + + @app.get("/{full_path:path}", include_in_schema=False) + def spa_fallback(full_path: str): # noqa: ARG001 + """所有未匹配路径回退到 index.html — React Router 接管。 + + index.html 禁止缓存 (Cache-Control: no-store), 确保浏览器每次拿到 + 最新版本引用的 JS/CSS 文件名 (assets 带 hash, 可长缓存)。 + """ + index = _static / "index.html" + if index.exists(): + return FileResponse( + index, + headers={"Cache-Control": "no-store, must-revalidate"}, + ) + return {"error": "frontend not built"} diff --git a/backend/app/secrets_store.py b/backend/app/secrets_store.py new file mode 100644 index 0000000..4ae774b --- /dev/null +++ b/backend/app/secrets_store.py @@ -0,0 +1,96 @@ +"""Key / 凭据本地存储(§14)。 + +存储位置:`data/user_data/secrets.json`,权限 0600。 +优先级:secrets.json > .env > 空(Free 模式)。 + +UI 改 Key 时只动这个文件,不动 .env。 +""" +from __future__ import annotations + +import json +import logging +import os +from pathlib import Path + +logger = logging.getLogger(__name__) + + +def _path() -> Path: + from app.config import settings + p = settings.data_dir / "user_data" / "secrets.json" + p.parent.mkdir(parents=True, exist_ok=True) + return p + + +def load() -> dict: + p = _path() + if p.exists(): + try: + return json.loads(p.read_text(encoding="utf-8")) + except Exception as e: # noqa: BLE001 + logger.warning("secrets.json malformed: %s", e) + return {} + + +def save(updates: dict) -> dict: + """合并写入(不会清掉未提及的字段)。返回新内容。""" + current = load() + current.update({k: v for k, v in updates.items() if v is not None}) + p = _path() + p.write_text(json.dumps(current, indent=2, ensure_ascii=False), encoding="utf-8") + try: + os.chmod(p, 0o600) + except OSError: + pass + return current + + +def clear(*keys: str) -> dict: + """清掉指定字段(留空清全部)。""" + p = _path() + if not p.exists(): + return {} + if not keys: + p.unlink() + return {} + current = load() + for k in keys: + current.pop(k, None) + p.write_text(json.dumps(current, indent=2, ensure_ascii=False), encoding="utf-8") + return current + + +def get_tickflow_key() -> str: + """取当前数据源 Key:secrets.json 优先,否则 .env。""" + val = load().get("tickflow_api_key") + if val: + return val + from app.config import settings + return settings.tickflow_api_key or "" + + +def get_ai_key() -> str: + """取当前 AI Key:secrets.json 优先,否则 .env。""" + val = load().get("ai_api_key") + if val: + return val + from app.config import settings + return settings.ai_api_key or "" + + +def get_ai_config(key: str, default: str = "") -> str: + """取 AI 配置项:secrets.json 优先,否则 config。""" + val = load().get(key) + if val: + return val + from app.config import settings + return getattr(settings, key, default) or default + + +def mask(key: str, prefix: int = 4, suffix: int = 4) -> str: + """脱敏显示。""" + if not key: + return "" + if len(key) <= prefix + suffix: + return "•" * len(key) + return f"{key[:prefix]}{'•' * 6}{key[-suffix:]}" diff --git a/backend/app/services/__init__.py b/backend/app/services/__init__.py new file mode 100644 index 0000000..829d0ed --- /dev/null +++ b/backend/app/services/__init__.py @@ -0,0 +1 @@ +"""业务服务层。""" diff --git a/backend/app/services/alert_store.py b/backend/app/services/alert_store.py new file mode 100644 index 0000000..961331a --- /dev/null +++ b/backend/app/services/alert_store.py @@ -0,0 +1,209 @@ +"""告警触发记录存储 — JSONL 追加写 + 滚动清理。 + +职责: + - 把每次触发的 AlertEvent 追加写入 data/user_data/alerts.jsonl + - 提供查询 (按来源/类型过滤、时间倒序、限量) + - 滚动清理: 保留近 N 天 + 上限 M 条 (取交集) + +设计: + - JSONL 每行一个 JSON 对象,便于增量追加和流式读取 + - 清理策略: 追加后按需 prune (按 ts 删旧),避免文件无限膨胀 + - 读时全量加载到内存过滤 (记录量受上限约束, 5000 条量级无压力) +""" +from __future__ import annotations + +import json +import logging +import threading +from pathlib import Path + +logger = logging.getLogger(__name__) + +# 保留策略 +MAX_DAYS = 7 +MAX_RECORDS = 5000 +# 每隔多少次写入触发一次清理 (避免每次写都 prune) +PRUNE_EVERY = 20 + +_lock = threading.Lock() +_write_count = 0 + + +def _path(data_dir: Path) -> Path: + p = data_dir / "user_data" / "alerts.jsonl" + p.parent.mkdir(parents=True, exist_ok=True) + return p + + +def append(data_dir: Path, event: dict) -> None: + """追加一条触发记录。event 应含 ts(毫秒)、rule_id、source 等字段。""" + line = json.dumps(event, ensure_ascii=False) + with _lock: + p = _path(data_dir) + with p.open("a", encoding="utf-8") as f: + f.write(line + "\n") + global _write_count + _write_count += 1 + if _write_count >= PRUNE_EVERY: + _write_count = 0 + _prune_locked(p) + + +def append_many(data_dir: Path, events: list[dict]) -> None: + """批量追加。""" + if not events: + return + with _lock: + p = _path(data_dir) + with p.open("a", encoding="utf-8") as f: + for ev in events: + f.write(json.dumps(ev, ensure_ascii=False) + "\n") + global _write_count + _write_count += len(events) + if _write_count >= PRUNE_EVERY: + _write_count = 0 + _prune_locked(p) + + +def list_recent( + data_dir: Path, + days: int = MAX_DAYS, + limit: int = MAX_RECORDS, + source: str | None = None, + type: str | None = None, +) -> list[dict]: + """读取近 N 天记录,按时间倒序,支持按 source/type 过滤。""" + import time + cutoff = (time.time() - days * 86400) * 1000 # 毫秒 + out: list[dict] = [] + p = _path(data_dir) + if not p.exists(): + return [] + try: + with p.open("r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + try: + ev = json.loads(line) + except Exception: + continue + if ev.get("ts", 0) < cutoff: + continue + if source and ev.get("source") != source: + continue + if type and ev.get("type") != type: + continue + out.append(ev) + except Exception as e: + logger.warning("alert_store read failed: %s", e) + return [] + # 时间倒序 + 截断 + out.sort(key=lambda x: x.get("ts", 0), reverse=True) + return out[:limit] + + +def clear(data_dir: Path) -> int: + """清空全部记录,返回清除的条数。""" + with _lock: + p = _path(data_dir) + if not p.exists(): + return 0 + count = 0 + try: + with p.open("r", encoding="utf-8") as f: + count = sum(1 for line in f if line.strip()) + except Exception: + pass + p.write_text("", encoding="utf-8") + return count + + +def delete_one(data_dir: Path, ts: int) -> bool: + """删除指定 ts 的单条记录,返回是否删除成功。 + + JSONL 无主键, 用 ts(毫秒时间戳) 作为标识。 + 若存在多条同 ts, 只删第一条。 + """ + with _lock: + p = _path(data_dir) + if not p.exists(): + return False + kept: list[dict] = [] + deleted = False + try: + with p.open("r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + try: + ev = json.loads(line) + except Exception: + continue + if not deleted and ev.get("ts") == ts: + deleted = True + continue + kept.append(ev) + except Exception as e: + logger.warning("alert_store delete_one read failed: %s", e) + return False + if not deleted: + return False + try: + with p.open("w", encoding="utf-8") as f: + for ev in kept: + f.write(json.dumps(ev, ensure_ascii=False) + "\n") + except Exception as e: + logger.warning("alert_store delete_one write failed: %s", e) + return False + return True + return count + + +def count(data_dir: Path) -> int: + """返回当前记录总数。""" + p = _path(data_dir) + if not p.exists(): + return 0 + try: + with p.open("r", encoding="utf-8") as f: + return sum(1 for line in f if line.strip()) + except Exception: + return 0 + + +def _prune_locked(p: Path) -> None: + """(调用方需持锁) 保留近 MAX_DAYS 天 + 上限 MAX_RECORDS 条。""" + import time + cutoff = (time.time() - MAX_DAYS * 86400) * 1000 + kept: list[dict] = [] + try: + with p.open("r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + try: + ev = json.loads(line) + except Exception: + continue + if ev.get("ts", 0) >= cutoff: + kept.append(ev) + except FileNotFoundError: + return + except Exception as e: + logger.warning("alert_store prune read failed: %s", e) + return + # 上限截断 (保留最新的) + if len(kept) > MAX_RECORDS: + kept.sort(key=lambda x: x.get("ts", 0)) + kept = kept[-MAX_RECORDS:] + # 重写文件 + try: + with p.open("w", encoding="utf-8") as f: + for ev in kept: + f.write(json.dumps(ev, ensure_ascii=False) + "\n") + except Exception as e: + logger.warning("alert_store prune write failed: %s", e) diff --git a/backend/app/services/backtest.py b/backend/app/services/backtest.py new file mode 100644 index 0000000..806541c --- /dev/null +++ b/backend/app/services/backtest.py @@ -0,0 +1,392 @@ +"""回测服务(§6.7)。 + +包 vectorbt — 全项目唯一一处出现 pandas。 +""" +from __future__ import annotations + +import logging +import uuid +from dataclasses import dataclass, field +from datetime import date +from typing import Literal + +import numpy as np +import pandas as pd +import polars as pl + +from app.config import settings +from app.tickflow.repository import KlineRepository + +logger = logging.getLogger(__name__) + +# vectorbt 是 optional extras(见 pyproject.toml).未装时只有 backtest 不可用,其他功能正常. +_vbt = None +_vbt_unavailable_reason: str | None = None + + +class VectorbtUnavailable(RuntimeError): + """vectorbt 未安装 — 提示用户 `uv sync --extra backtest`.""" + + +def _get_vbt(): + global _vbt, _vbt_unavailable_reason + if _vbt is not None: + return _vbt + if _vbt_unavailable_reason is not None: + raise VectorbtUnavailable(_vbt_unavailable_reason) + try: + import vectorbt as vbt + _vbt = vbt + return _vbt + except ImportError as e: + _vbt_unavailable_reason = ( + "vectorbt 未安装 — 它是回测的可选依赖.macOS Intel 用户先 `brew install cmake` " + "然后 `uv sync --extra backtest`" + ) + logger.warning("vectorbt unavailable: %s", e) + raise VectorbtUnavailable(_vbt_unavailable_reason) from e + + +def is_available() -> bool: + """供 API 层快速检测.""" + try: + _get_vbt() + return True + except VectorbtUnavailable: + return False + + +SignalKind = Literal[ + "macd_golden", "macd_dead", + "ma_golden_5_20", "ma_dead_5_20", + "ma_golden_20_60", + "ma20_breakout", "ma20_breakdown", + "n_day_high", "n_day_low", + "boll_breakout_upper", "boll_breakdown_lower", + "volume_surge", + "rsi_oversold", "rsi_overbought", + "stop_loss", "trailing_stop", "max_hold", +] + + +@dataclass +class BacktestConfig: + symbols: list[str] + start: date + end: date + # 买入信号(任一触发即买) + entries: list[str] = field(default_factory=list) + # 卖出信号(任一触发即卖) + exits: list[str] = field(default_factory=list) + # 其他参数 + stop_loss_pct: float | None = None # 例 -0.05 = -5% + max_hold_days: int | None = None + fees_pct: float = 0.0002 # 万二佣金 + slippage_bps: float = 5 # 5 bps + # 撮合 + matching: Literal["close_t", "open_t+1"] = "close_t" + rsi_oversold_threshold: float = 30 + rsi_overbought_threshold: float = 70 + + +@dataclass +class BacktestResult: + run_id: str + config: dict + stats: dict + equity_curve: list[dict] # [{date, value}] + trades: list[dict] # [{symbol, entry_date, exit_date, pnl_pct, ...}] + per_symbol_stats: list[dict] # 每只股票的统计 + + +# enriched 表里的信号列名映射 +_SIGNAL_COLS: dict[SignalKind, str] = { + "macd_golden": "signal_macd_golden", + "macd_dead": "signal_macd_dead", + "ma_golden_5_20": "signal_ma_golden_5_20", + "ma_dead_5_20": "signal_ma_dead_5_20", + "ma_golden_20_60": "signal_ma_golden_20_60", + "ma20_breakout": "signal_ma20_breakout", + "ma20_breakdown": "signal_ma20_breakdown", + "n_day_high": "signal_n_day_high", + "n_day_low": "signal_n_day_low", + "boll_breakout_upper": "signal_boll_breakout_upper", + "boll_breakdown_lower": "signal_boll_breakdown_lower", + "volume_surge": "signal_volume_surge", +} + + +class BacktestService: + def __init__(self, repo: KlineRepository) -> None: + self.repo = repo + + def _load_panel( + self, + symbols: list[str], + start: date, + end: date, + ) -> pd.DataFrame: + """加载 [date × symbol] 价格面板 — Polars scan_parquet + 即时计算指标。 + + **全项目唯一从 Polars 转 pandas 的边界**(§7.4 / ADR-19)。 + """ + try: + enriched_glob = str(self.repo.store.data_dir / "kline_daily_enriched" / "**" / "*.parquet") + df = ( + pl.scan_parquet(enriched_glob) + .filter( + (pl.col("symbol").is_in(symbols)) + & (pl.col("date") >= start) + & (pl.col("date") <= end) + ) + .sort(["date", "symbol"]) + .collect() + ) + except Exception as e: # noqa: BLE001 + logger.warning("backtest load failed: %s", e) + return pd.DataFrame() + + if df.is_empty(): + return pd.DataFrame() + + # 即时计算指标 + 信号 + from app.indicators.pipeline import compute_all + df = compute_all(df) + + # 选择需要的列 + needed_cols = [ + "date", "symbol", "open", "high", "low", "close", "volume", + "rsi_14", "signal_macd_golden", "signal_macd_dead", + "signal_ma_golden_5_20", "signal_ma_dead_5_20", + "signal_ma_golden_20_60", + "signal_ma20_breakout", "signal_ma20_breakdown", + "signal_n_day_high", "signal_n_day_low", + "signal_boll_breakout_upper", "signal_boll_breakdown_lower", + "signal_volume_surge", + ] + existing = [c for c in needed_cols if c in df.columns] + df = df.select(existing) + + # to_pandas 边界 + return df.to_pandas(use_pyarrow_extension_array=False) + + def _build_signal_matrix( + self, + panel: pd.DataFrame, + kinds: list[str], + config: BacktestConfig, + ) -> pd.DataFrame: + """从面板构造 [date × symbol] 的布尔信号矩阵。""" + if not kinds or panel.empty: + return pd.DataFrame() + + # pivot 成 [date × symbol] 形式 + result = None + for kind in kinds: + mat = None + if kind in _SIGNAL_COLS: + col = _SIGNAL_COLS[kind] + mat = panel.pivot(index="date", columns="symbol", values=col).fillna(False).astype(bool) + elif kind == "rsi_oversold": + mat = (panel.pivot(index="date", columns="symbol", values="rsi_14") + < config.rsi_oversold_threshold) + elif kind == "rsi_overbought": + mat = (panel.pivot(index="date", columns="symbol", values="rsi_14") + > config.rsi_overbought_threshold) + # stop_loss / trailing / max_hold 通过 vectorbt 参数处理,不参与信号矩阵 + + if mat is not None: + result = mat if result is None else (result | mat) + return result if result is not None else pd.DataFrame() + + def run(self, config: BacktestConfig) -> BacktestResult: + vbt = _get_vbt() + run_id = uuid.uuid4().hex[:10] + + panel = self._load_panel(config.symbols, config.start, config.end) + if panel.empty: + return BacktestResult( + run_id=run_id, + config=_config_to_dict(config), + stats={"error": "no data"}, + equity_curve=[], + trades=[], + per_symbol_stats=[], + ) + + # 价格面板 + close = panel.pivot(index="date", columns="symbol", values="close") + + # 信号矩阵 + entries = self._build_signal_matrix(panel, config.entries, config) + exits = self._build_signal_matrix(panel, config.exits, config) + + # 对齐 index/columns + if not entries.empty: + entries = entries.reindex_like(close).fillna(False).astype(bool) + else: + entries = pd.DataFrame(False, index=close.index, columns=close.columns) + if not exits.empty: + exits = exits.reindex_like(close).fillna(False).astype(bool) + else: + exits = pd.DataFrame(False, index=close.index, columns=close.columns) + + if not entries.any().any(): + return BacktestResult( + run_id=run_id, + config=_config_to_dict(config), + stats={"error": "no buy signals"}, + equity_curve=[], + trades=[], + per_symbol_stats=[], + ) + + # T+1 适配:vectorbt 默认信号当根 K 撮合 + # close_t 撮合:维持默认 + # open_t+1 撮合:shift 信号 1 根 + 用 open 作为价 + if config.matching == "open_t+1": + entries = entries.shift(1).fillna(False).astype(bool) + exits = exits.shift(1).fillna(False).astype(bool) + price = panel.pivot(index="date", columns="symbol", values="open") + else: + price = close + + # 跑回测 + try: + pf_kwargs = dict( + close=close, + entries=entries, + exits=exits, + price=price, + fees=config.fees_pct, + slippage=config.slippage_bps / 10000.0, + freq="1D", + ) + if config.stop_loss_pct is not None: + pf_kwargs["sl_stop"] = abs(config.stop_loss_pct) + if config.max_hold_days is not None: + # vectorbt 没有内置 max-hold;用时间退出近似: + # 在 max_hold_days 后强制 exit + exits_idx = entries.copy() + for col in entries.columns: + entry_rows = np.where(entries[col].values)[0] + for i in entry_rows: + end_i = min(i + config.max_hold_days, len(entries) - 1) + if end_i > i: + exits_idx.iloc[end_i][col] = True + pf_kwargs["exits"] = (exits | exits_idx).astype(bool) + + pf = vbt.Portfolio.from_signals(**pf_kwargs) + except Exception as e: # noqa: BLE001 + logger.exception("vectorbt backtest failed") + return BacktestResult( + run_id=run_id, + config=_config_to_dict(config), + stats={"error": str(e)}, + equity_curve=[], + trades=[], + per_symbol_stats=[], + ) + + # 提取结果 + try: + stats_series = pf.stats(silence_warnings=True) + if isinstance(stats_series, pd.DataFrame): + # 多列时取 agg + stats_dict = stats_series.mean(numeric_only=True).to_dict() + else: + stats_dict = stats_series.to_dict() + except Exception: # noqa: BLE001 + stats_dict = {} + + # 净值曲线(组合平均) + equity = pf.value().mean(axis=1) if isinstance(pf.value(), pd.DataFrame) else pf.value() + equity_curve = [ + {"date": str(idx.date() if hasattr(idx, "date") else idx), "value": float(v)} + for idx, v in equity.items() if pd.notna(v) + ] + + # 交易记录 + try: + trades_df = pf.trades.records_readable + trades = trades_df.to_dict(orient="records") if not trades_df.empty else [] + # 字段名美化 + trades = [ + { + "symbol": t.get("Column", t.get("Symbol", "")), + "entry_date": str(t.get("Entry Timestamp", t.get("Entry Date", ""))), + "exit_date": str(t.get("Exit Timestamp", t.get("Exit Date", ""))), + "entry_price": float(t.get("Avg Entry Price", t.get("Avg. Entry Price", 0))), + "exit_price": float(t.get("Avg Exit Price", t.get("Avg. Exit Price", 0))), + "pnl_pct": float(t.get("Return", t.get("PnL %", 0))), + "duration": str(t.get("Duration", "")), + } + for t in trades + ] + except Exception: # noqa: BLE001 + trades = [] + + # 每标的统计 + per_symbol = [] + try: + total_ret = pf.total_return() + if isinstance(total_ret, pd.Series): + for sym, ret in total_ret.items(): + if pd.notna(ret): + per_symbol.append({"symbol": sym, "total_return": float(ret)}) + except Exception: # noqa: BLE001 + pass + + result = BacktestResult( + run_id=run_id, + config=_config_to_dict(config), + stats={k: _json_safe(v) for k, v in stats_dict.items()}, + equity_curve=equity_curve, + trades=trades, + per_symbol_stats=per_symbol, + ) + + # 落盘 + self._persist(result) + return result + + def _persist(self, result: BacktestResult) -> None: + out_dir = settings.data_dir / "backtest_results" + out_dir.mkdir(parents=True, exist_ok=True) + # 用 polars 写一份汇总 + summary = pl.DataFrame({ + "run_id": [result.run_id], + "stats_json": [str(result.stats)], + "n_trades": [len(result.trades)], + }) + summary.write_parquet(out_dir / f"run_id={result.run_id}.parquet") + + def get_result(self, run_id: str) -> BacktestResult | None: + # Phase 1:只保留近似落盘,完整结果保存在内存的近期 cache 中 + # 简化:重新 run 比缓存复杂结果代价小,暂不实现 get_result + return None + + +def _config_to_dict(c: BacktestConfig) -> dict: + return { + "symbols": c.symbols, + "start": str(c.start), + "end": str(c.end), + "entries": c.entries, + "exits": c.exits, + "stop_loss_pct": c.stop_loss_pct, + "max_hold_days": c.max_hold_days, + "fees_pct": c.fees_pct, + "slippage_bps": c.slippage_bps, + "matching": c.matching, + } + + +def _json_safe(v): + if isinstance(v, (int, float, str, bool)) or v is None: + return v + if isinstance(v, (np.floating, np.integer)): + return float(v) if not np.isnan(float(v)) else None + if hasattr(v, "isoformat"): + return v.isoformat() + return str(v) diff --git a/backend/app/services/depth_service.py b/backend/app/services/depth_service.py new file mode 100644 index 0000000..4978a92 --- /dev/null +++ b/backend/app/services/depth_service.py @@ -0,0 +1,575 @@ +"""五档盘口 sealed(真假涨停/跌停) 服务 — 独立旁路线。 + +架构(完全解耦): + - 只读 enriched(拿涨跌停名单), 不写回 enriched(14列不动) + - sealed 存独立 parquet(data/depth5/date=xxx/part.parquet) + - limit_ladder API 查询时 LEFT JOIN(同 ext_columns 机制) + - signal_limit_up 永远是"价格涨停", sealed 是叠加的真假判定层 + +数据流: + 盘中轮询线程(交易时段, 独立 sleep, 不绑行情轮询): + 读 enriched 内存缓存(线程安全) → 涨跌停名单 → tf.depth.batch + → 算 sealed → 更新内存缓存(不落盘) → sealed_ready=True + 盘后定版 job(可配置时间, 默认15:02): + 最后拉一次 → 落盘 depth5 parquet(定版) + +三层防护节流("设过大设上限, 设过小设最小值"): + ① 套餐范围 clamp: Pro 10~120s, Expert 3~300s + ② 限速安全 clamp: safe = 60/((rpm*0.8)/batches), 涨跌停多就自动放慢 + ③ 系统接管通知: 用户设置会超限时, 推 toast 告知已自动调整 +""" +from __future__ import annotations + +import logging +import math +import threading +import time +from datetime import date, datetime, time as dt_time +from pathlib import Path + +import polars as pl + +logger = logging.getLogger(__name__) + + +# 套餐 → (轮询间隔下限s, 上限s) +TIER_INTERVAL_RANGE: dict[str, tuple[float, float]] = { + "pro": (10.0, 120.0), + "expert": (3.0, 300.0), +} +# 兜底: 其他有 DEPTH5_BATCH 的套餐按 pro 范围 +DEFAULT_RANGE = (10.0, 120.0) + +# 限速余量: 只用 rpm 的 80%, 给系统其他 depth 调用留空间 +RPM_MARGIN = 0.8 +# 间隔硬下限/上限(任何套餐) +INTERVAL_HARD_MIN = 10.0 +INTERVAL_HARD_MAX = 300.0 + + +class DepthService: + """五档盘口 sealed 服务 — 单例。""" + + def __init__(self) -> None: + self._lock = threading.Lock() + self._running = False + self._thread: threading.Thread | None = None + self._repo = None # 延迟注入(KlineRepository) + self._app_state = None # 延迟注入(FastAPI app.state) + + # 内存缓存: {symbol: SealedEntry} + # SealedEntry = {sealed_up, sealed_down, ask1_vol, bid1_vol, status, fetched_ts} + self._sealed_cache: dict[str, dict] = {} + self._sealed_ready = False + self._sealed_date: date | None = None # sealed 数据对应的交易日(可能是昨天,如休市) + self._sealed_fetched_ts: float = 0.0 # 上次拉取的 perf_counter + self._sealed_fetched_at: float = 0.0 # 上次拉取的 wall-clock 时间戳 + self._persisted_date: date | None = None # 已落盘的日期 + + # 系统接管状态(防通知刷屏) + self._last_taken_over: bool | None = None + self._last_user_interval: float | None = None + + # ================================================================ + # 注入 + # ================================================================ + + def set_repo(self, repo) -> None: + self._repo = repo + + def set_app_state(self, app_state) -> None: + self._app_state = app_state + + # ================================================================ + # 生命周期 + # ================================================================ + + def boot_check(self) -> None: + """启动补跑: 当天 depth5 文件不存在则 finalize 一次; 已存在则恢复内存缓存。""" + if not self._has_capability(): + logger.info("depth sealed: 无 DEPTH5_BATCH 能力, 跳过启动补跑") + return + today = date.today() + if self._persisted_for_date(today): + # parquet 已存在: 恢复内存缓存(避免重启后每次查询都读 parquet) + self._restore_from_parquet(today) + return + logger.info("depth sealed: 启动补跑今天定版") + try: + self.finalize() + except Exception as e: # noqa: BLE001 + logger.warning("depth sealed 启动补跑失败: %s", e) + + def _restore_from_parquet(self, d: date) -> None: + """从 parquet 恢复内存缓存(服务重启后)。""" + if not self._repo: + return + out = self._repo.store.data_dir / "depth5" / f"date={d.isoformat()}" / "part.parquet" + if not out.exists(): + return + try: + df = pl.read_parquet(out) + cache: dict[str, dict] = {} + for row in df.to_dicts(): + sym = row.get("symbol") + if not sym: + continue + cache[sym] = { + "sealed_up": row.get("sealed_up"), + "sealed_down": row.get("sealed_down"), + "ask1_vol": row.get("ask1_vol"), + "bid1_vol": row.get("bid1_vol"), + "status": row.get("status"), + "fetched_ts": row.get("fetched_at"), + } + with self._lock: + self._sealed_cache = cache + self._sealed_ready = True + self._sealed_date = d + self._persisted_date = d + logger.info("depth sealed: 从 parquet 恢复 %d 只 (日期=%s)", len(cache), d) + except Exception as e: # noqa: BLE001 + logger.warning("depth sealed 从 parquet 恢复失败: %s", e) + + def start_polling(self) -> None: + """启动盘中轮询线程(连板梯队监控开启 + 有能力 + 交易时段)。""" + if self._running: + return + if not self._has_capability(): + return + from app.services import preferences + if not preferences.get_limit_ladder_monitor_enabled(): + return + self._running = True + self._thread = threading.Thread(target=self._poll_loop, daemon=True) + self._thread.start() + logger.info("depth sealed 盘中轮询已启动") + + def stop_polling(self) -> None: + """停止盘中轮询线程。""" + self._running = False + if self._thread: + self._thread.join(timeout=10) + self._thread = None + logger.info("depth sealed 盘中轮询已停止") + + def apply_monitor_toggle(self, enabled: bool) -> None: + """连板梯队监控开关切换时调用: 开启→启动轮询, 关闭→停止轮询。""" + if enabled: + self.start_polling() + else: + self.stop_polling() + + def run_once(self) -> dict: + """手动触发一次修正(立即拉取 depth + 更新内存缓存)。 + + 不受监控开关限制 — 用户可随时手动修正一次。 + 返回 {"ok": bool, "count": int, "msg": str} + """ + if not self._has_capability(): + return {"ok": False, "count": 0, "msg": "无五档盘口能力(需 Pro+)"} + try: + self._fetch_and_seal(persist=True) # 落盘, 刷新页面不丢 + with self._lock: + count = len(self._sealed_cache) + return {"ok": True, "count": count, "msg": f"已修正 {count} 只"} + except Exception as e: # noqa: BLE001 + logger.warning("depth run_once 失败: %s", e) + return {"ok": False, "count": 0, "msg": f"修正失败: {e}"} + + # ================================================================ + # 核心拉取 + # ================================================================ + + def _fetch_and_seal(self, persist: bool = False) -> None: + """拉一次 depth.batch, 算 sealed, 更新内存缓存(可选落盘)。 + + persist=True: 盘后定版, 写 depth5 parquet + persist=False: 盘中轮询, 只更新内存缓存 + """ + if not self._repo: + return + + # 只读 enriched 内存缓存(线程安全, 避免和 quote_service 写盘竞态) + enriched, enriched_date = self._repo.get_enriched_latest() + if enriched.is_empty(): + return + + # 筛涨跌停名单(用 fill_null 防止列缺失) + syms_up: list[str] = [] + syms_down: list[str] = [] + if "signal_limit_up" in enriched.columns: + syms_up = enriched.filter( + pl.col("signal_limit_up").fill_null(False) + )["symbol"].to_list() + if "signal_limit_down" in enriched.columns: + syms_down = enriched.filter( + pl.col("signal_limit_down").fill_null(False) + )["symbol"].to_list() + + all_syms = list(dict.fromkeys(syms_up + syms_down)) # 去重保序 + if not all_syms: + logger.debug("depth sealed: 当日无涨跌停股, 跳过") + return + + # 拉 depth(涨跌停一次拉, 按 capset batch 切片) + depth_data = self._call_depth_batch(all_syms) + if not depth_data: + logger.warning("depth sealed: depth.batch 返回空") + return + + up_set = set(syms_up) + down_set = set(syms_down) + now_perf = time.perf_counter() + now_wall = time.time() + + new_cache: dict[str, dict] = {} + for sym, d in depth_data.items(): + ask_vols = d.get("ask_volumes") or [] + bid_vols = d.get("bid_volumes") or [] + ask1 = ask_vols[0] if ask_vols else None + bid1 = bid_vols[0] if bid_vols else None + # depth 返回的 timestamp(毫秒 epoch), 回退到当前 wall-clock + depth_ts = d.get("timestamp") + fetched = (depth_ts / 1000.0) if isinstance(depth_ts, (int, float)) and depth_ts else now_wall + entry = { + # 涨停真封: 涨停价上卖一(主动卖压)为 0 + "sealed_up": (ask1 == 0) if sym in up_set and ask1 is not None else None, + # 跌停真封: 跌停价上买一为 0 + "sealed_down": (bid1 == 0) if sym in down_set and bid1 is not None else None, + "ask1_vol": ask1, + "bid1_vol": bid1, + "status": "limit_down" if sym in down_set and sym not in up_set else "limit_up", + "fetched_ts": fetched, + } + new_cache[sym] = entry + + with self._lock: + self._sealed_cache = new_cache + self._sealed_ready = True + self._sealed_date = enriched_date # 记录数据对应的交易日(可能是昨天,如休市) + self._sealed_fetched_ts = now_perf + self._sealed_fetched_at = now_wall + + logger.info("depth sealed: 拉取 %d 只 (涨停%d/跌停%d) 日期=%s%s", + len(new_cache), len(syms_up), len(syms_down), + enriched_date, " → 落盘" if persist else "") + + # 缓存已更新: 通知 SSE 推 depth_updated, 触发连板梯队刷新封单数据。 + self._notify_depth_updated(len(new_cache)) + + if persist and enriched_date: + self._persist(enriched_date) + + def _call_depth_batch(self, symbols: list[str]) -> dict: + """调 tf.depth.batch, 按 capset 的 batch 切片 + 节流。返回 {symbol: MarketDepth}。""" + from app.tickflow.client import get_client + tf = get_client() + + capset = self._get_capset() + lim = capset.limits(__import__("app.tickflow.capabilities", fromlist=["Cap"]).Cap.DEPTH5_BATCH) + batch_size = (lim.batch if lim and lim.batch else 100) + rpm = (lim.rpm if lim and lim.rpm else 30) + # 批间隔 = 60/rpm(匀速) + inter_batch = 60.0 / rpm if rpm > 0 else 2.0 + + result: dict = {} + chunks = [symbols[i:i + batch_size] for i in range(0, len(symbols), batch_size)] + for i, chunk in enumerate(chunks): + if i > 0: + time.sleep(inter_batch) + try: + # SDK 的 batch 内部已按 batch_size 切, 这里再切一层防单请求过大 + data = tf.depth.batch(chunk) + if isinstance(data, dict): + result.update(data) + except Exception as e: # noqa: BLE001 + logger.warning("depth.batch 第 %d 批失败(%d 只): %s", i + 1, len(chunk), e) + # 单批失败不影响其他批 + return result + + def finalize(self) -> None: + """盘后定版: 拉一次 + 落盘。""" + if not self._has_capability(): + return + self._fetch_and_seal(persist=True) + + # ================================================================ + # 落盘 + # ================================================================ + + def _persist(self, today: date) -> None: + """把内存缓存写 depth5/date=今天/part.parquet。""" + with self._lock: + cache = dict(self._sealed_cache) + if not cache: + return + + rows = [] + for sym, e in cache.items(): + rows.append({ + "symbol": sym, + "sealed_up": e.get("sealed_up"), + "sealed_down": e.get("sealed_down"), + "ask1_vol": e.get("ask1_vol"), + "bid1_vol": e.get("bid1_vol"), + "status": e.get("status"), + "fetched_at": e.get("fetched_ts"), + }) + df = pl.DataFrame(rows) + ds = today.isoformat() + out = self._repo.store.data_dir / "depth5" / f"date={ds}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + df.write_parquet(out) + self._persisted_date = today + logger.info("depth sealed 落盘: %d 行 → %s", df.height, out) + + def _persisted_for_date(self, d: date) -> bool: + """检查某日 depth5 文件是否已存在。""" + if not self._repo: + return False + out = self._repo.store.data_dir / "depth5" / f"date={d.isoformat()}" / "part.parquet" + return out.exists() + + # ================================================================ + # 查询(供 limit_ladder API 用) + # ================================================================ + + def get_sealed_map(self, target_date: date, is_down: bool) -> dict: + """返回 {symbol: {sealed, vol, ready, age}} 供 JOIN。 + + 优先内存缓存(盘中), 回退 parquet(历史/盘后)。 + sealed: bool | None (None=待确认或降级) + vol: 封单量(int) | None + ready: sealed 数据是否就绪(False→降级标识) + age: 距上次拉取秒数(盘后定版为 None) + """ + # 内存缓存(sealed 数据对应的交易日 = target_date 时才用) + if self._sealed_date and target_date == self._sealed_date and self._sealed_ready and self._sealed_cache: + return self._read_from_memory(is_down) + # parquet(历史或盘后定版) + return self._read_from_parquet(target_date, is_down) + + def _read_from_memory(self, is_down: bool) -> dict: + sealed_key = "sealed_down" if is_down else "sealed_up" + # 封单量: 涨停=买一量(涨停价买单堆积), 跌停=卖一量(跌停价卖单堆积) + vol_key = "ask1_vol" if is_down else "bid1_vol" + now = time.perf_counter() + with self._lock: + cache = dict(self._sealed_cache) + fetched_ts = self._sealed_fetched_ts + age = (now - fetched_ts) if fetched_ts else 0.0 + result = {} + for sym, e in cache.items(): + result[sym] = { + "sealed": e.get(sealed_key), + "vol": e.get(vol_key), + "ready": True, + "age": age, + } + return result + + def _read_from_parquet(self, target_date: date, is_down: bool) -> dict: + if not self._repo: + return {} + out = self._repo.store.data_dir / "depth5" / f"date={target_date.isoformat()}" / "part.parquet" + if not out.exists(): + return {} + try: + df = pl.read_parquet(out) + except Exception as e: # noqa: BLE001 + logger.warning("depth5 parquet 读取失败: %s", e) + return {} + sealed_key = "sealed_down" if is_down else "sealed_up" + # 封单量: 涨停=买一量, 跌停=卖一量 + vol_key = "ask1_vol" if is_down else "bid1_vol" + result = {} + for row in df.to_dicts(): + sym = row.get("symbol") + if not sym: + continue + result[sym] = { + "sealed": row.get(sealed_key), + "vol": row.get(vol_key), + "ready": True, + "age": None, # 盘后定版, 无 age + } + return result + + def is_sealed_ready(self, target_date: date) -> bool: + """sealed 数据是否就绪(供前端降级判定)。""" + # 内存缓存对应的数据日 == 查询日 → 看内存就绪状态 + if self._sealed_date and target_date == self._sealed_date: + return self._sealed_ready + # 其他日期: 有 parquet 就 ready + return self._persisted_for_date(target_date) + + def get_sealed_age(self, target_date: date) -> float | None: + """返回 sealed 数据 age(秒), 盘后定版为 None。""" + if self._sealed_date and target_date == self._sealed_date and self._sealed_ready and self._sealed_fetched_ts: + return time.perf_counter() - self._sealed_fetched_ts + return None + + # ================================================================ + # 盘中轮询线程 + # ================================================================ + + def _poll_loop(self) -> None: + """盘中轮询: 按 capset 自适应间隔拉 depth, 更新内存缓存。""" + while self._running: + try: + if self._is_trading_hours(): + self._poll_once() + else: + logger.debug("depth sealed: 非交易时段, 跳过") + except Exception as e: # noqa: BLE001 + logger.warning("depth sealed 轮询异常: %s", e) + + # 等待下一轮(用 _running 检查保证能及时退出) + interval = self._current_sleep_interval() + waited = 0.0 + while self._running and waited < interval: + time.sleep(0.5) + waited += 0.5 + + def _poll_once(self) -> None: + """单次轮询: 算间隔(三层防护) → 拉取 → 检测系统接管通知。""" + # 数当前涨跌停股 + n = self._count_limit_stocks() + if n == 0: + return + + interval, taken_over, user_interval = self._compute_interval(n) + + # 系统接管通知(状态切换时才推, 防刷屏) + if taken_over and (self._last_taken_over is False or self._last_user_interval != user_interval): + self._notify_takeover(n, user_interval, interval) + self._last_taken_over = taken_over + self._last_user_interval = user_interval + + self._fetch_and_seal(persist=False) + + def _current_sleep_interval(self) -> float: + """计算当前 sleep 间隔(供 _poll_loop 等待用)。""" + n = self._count_limit_stocks() + if n == 0: + return 30.0 # 无涨跌停, 慢轮询 + interval, _, _ = self._compute_interval(n) + return interval + + # ================================================================ + # 三层防护节流 + # ================================================================ + + def _compute_interval(self, n_symbols: int) -> tuple[float, bool, float]: + """三层防护计算实际轮询间隔。 + + 返回 (actual_interval, taken_over, user_interval) + - actual_interval: 实际使用的间隔(秒) + - taken_over: 是否被系统接管(用户设置会超限) + - user_interval: 用户设置(经套餐 clamp 后)的间隔 + """ + from app.services import preferences + from app.tickflow.policy import tier_label + + capset = self._get_capset() + lim = capset.limits(__import__("app.tickflow.capabilities", fromlist=["Cap"]).Cap.DEPTH5_BATCH) + batch_size = (lim.batch if lim and lim.batch else 100) + rpm = (lim.rpm if lim and lim.rpm else 30) + + # ① 套餐范围 clamp + tier = tier_label().split()[0].split("+")[0].strip().lower() + lo, hi = TIER_INTERVAL_RANGE.get(tier, DEFAULT_RANGE) + raw_user = preferences.get_depth_polling_interval() + user_interval = max(lo, min(hi, raw_user)) + + # ② 限速安全 clamp + batches = max(1, math.ceil(n_symbols / batch_size)) + usable_rpm = rpm * RPM_MARGIN + calls_per_min = usable_rpm / batches if batches > 0 else usable_rpm + safe_interval = 60.0 / calls_per_min if calls_per_min > 0 else INTERVAL_HARD_MAX + + # 实际: 取用户设置和安全的较大值 + actual = max(user_interval, safe_interval) + # 硬上下限 + actual = max(INTERVAL_HARD_MIN, min(actual, INTERVAL_HARD_MAX)) + taken_over = safe_interval > user_interval + + return actual, taken_over, user_interval + + def _count_limit_stocks(self) -> int: + """数当前涨跌停股总数(供节流计算)。""" + if not self._repo: + return 0 + enriched, _ = self._repo.get_enriched_latest() + if enriched.is_empty(): + return 0 + n = 0 + if "signal_limit_up" in enriched.columns: + n += enriched.filter(pl.col("signal_limit_up").fill_null(False)).height + if "signal_limit_down" in enriched.columns: + n += enriched.filter(pl.col("signal_limit_down").fill_null(False)).height + return n + + # ================================================================ + # 通知 + # ================================================================ + + def _notify_takeover(self, n_stocks: int, user_interval: float, actual_interval: float) -> None: + """系统接管通知: 复用 quote_service 的 _pending_alerts 通道。""" + if not self._app_state: + return + qs = getattr(self._app_state, "quote_service", None) + if not qs: + return + msg = (f"五档轮询: 当前涨跌停 {n_stocks} 只, 您设置的 {user_interval:.0f} 秒间隔会超限, " + f"系统已自动调整为 {actual_interval:.0f} 秒") + alert = { + "source": "depth", + "type": "takeover", + "message": msg, + } + try: + with qs._lock: + qs._pending_alerts.append(alert) + qs._alert_event.set() + except Exception as e: # noqa: BLE001 + logger.debug("depth 接管通知推送失败: %s", e) + + def _notify_depth_updated(self, count: int) -> None: + """修正完成通知: set quote_service._depth_update_event, SSE 推 depth_updated 刷新连板梯队。""" + if not self._app_state: + return + qs = getattr(self._app_state, "quote_service", None) + if not qs: + return + try: + qs.notify_depth_updated() + except Exception as e: # noqa: BLE001 + logger.debug("depth 更新通知推送失败: %s", e) + + # ================================================================ + # 工具 + # ================================================================ + + def _has_capability(self) -> bool: + capset = self._get_capset() + from app.tickflow.capabilities import Cap + return capset.has(Cap.DEPTH5_BATCH) + + def _get_capset(self): + """获取当前 capset(优先 app.state, 回退 detect)。""" + if self._app_state: + cs = getattr(self._app_state, "capabilities", None) + if cs: + return cs + from app.tickflow.policy import detect_capabilities + return detect_capabilities() + + @staticmethod + def _is_trading_hours() -> bool: + now = datetime.now() + t = now.time() + morning = dt_time(9, 25) <= t <= dt_time(11, 35) + afternoon = dt_time(12, 55) <= t <= dt_time(15, 5) + return now.weekday() < 5 and (morning or afternoon) diff --git a/backend/app/services/ext_data.py b/backend/app/services/ext_data.py new file mode 100644 index 0000000..63cd8be --- /dev/null +++ b/backend/app/services/ext_data.py @@ -0,0 +1,514 @@ +"""扩展数据服务 — 配置管理 + 文件解析 + Parquet 存储。""" +from __future__ import annotations + +import json +import logging +from datetime import date, datetime +from pathlib import Path +from typing import Literal + +import polars as pl + +logger = logging.getLogger(__name__) + +# --------------------------------------------------------------------------- +# 配置模型 +# --------------------------------------------------------------------------- + +class ExtField: + """扩展字段定义。""" + __slots__ = ("name", "dtype", "label") + + def __init__(self, name: str, dtype: str = "string", label: str = "") -> None: + self.name = name + self.dtype = dtype # string | int | float | bool + self.label = label or name + + def to_dict(self) -> dict: + return {"name": self.name, "dtype": self.dtype, "label": self.label} + + @classmethod + def from_dict(cls, d: dict) -> ExtField: + return cls(d["name"], d.get("dtype", "string"), d.get("label", "")) + + +class PullConfig: + """定时拉取配置。""" + __slots__ = ( + "url", "method", "headers", "body", "response_path", + "field_map", "schedule_minutes", "enabled", + "last_run", "last_status", "last_message", "last_rows", + ) + + def __init__( + self, + url: str = "", + method: str = "GET", + headers: dict[str, str] | None = None, + body: str | None = None, + response_path: str = "", + field_map: dict[str, str] | None = None, + schedule_minutes: int = 1440, + enabled: bool = False, + last_run: str | None = None, + last_status: str | None = None, + last_message: str | None = None, + last_rows: int | None = None, + ) -> None: + self.url = url + self.method = method # GET | POST + self.headers = headers or {} + self.body = body # JSON string (POST body template) + self.response_path = response_path # dot-path to rows array, e.g. "data.list" + self.field_map = field_map or {} # external_name → config_field_name + self.schedule_minutes = schedule_minutes + self.enabled = enabled + self.last_run = last_run + self.last_status = last_status # "success" | "error" + self.last_message = last_message + self.last_rows = last_rows + + def to_dict(self) -> dict: + return { + "url": self.url, + "method": self.method, + "headers": self.headers, + "body": self.body, + "response_path": self.response_path, + "field_map": self.field_map, + "schedule_minutes": self.schedule_minutes, + "enabled": self.enabled, + "last_run": self.last_run, + "last_status": self.last_status, + "last_message": self.last_message, + "last_rows": self.last_rows, + } + + @classmethod + def from_dict(cls, d: dict) -> PullConfig: + if not d: + return cls() + return cls( + url=d.get("url", ""), + method=d.get("method", "GET"), + headers=d.get("headers"), + body=d.get("body"), + response_path=d.get("response_path", ""), + field_map=d.get("field_map"), + schedule_minutes=d.get("schedule_minutes", 1440), + enabled=d.get("enabled", False), + last_run=d.get("last_run"), + last_status=d.get("last_status"), + last_message=d.get("last_message"), + last_rows=d.get("last_rows"), + ) + + +class ExtConfig: + """一个扩展数据源的完整配置。""" + __slots__ = ( + "id", "label", "mode", "fields", "description", + "symbol_map", "code_map", + "created_at", "updated_at", "pull", + ) + + def __init__( + self, + id: str, + label: str, + mode: Literal["snapshot", "timeseries"], + fields: list[ExtField], + description: str = "", + symbol_map: dict | None = None, + code_map: dict | None = None, + created_at: str | None = None, + updated_at: str | None = None, + pull: PullConfig | None = None, + ) -> None: + self.id = id + self.label = label + self.mode = mode + self.fields = fields + self.description = description + # 映射关系: {"type": "mapped", "col": "原始列名"} 或 {"type": "computed", "from": "symbol|code", "method": "strip_exchange|append_exchange"} + self.symbol_map = symbol_map or {} + self.code_map = code_map or {} + self.created_at = created_at or datetime.now().isoformat() + self.updated_at = updated_at or datetime.now().isoformat() + self.pull = pull + + def to_dict(self) -> dict: + d = { + "id": self.id, + "label": self.label, + "mode": self.mode, + "fields": [f.to_dict() for f in self.fields], + "description": self.description, + "symbol_map": self.symbol_map, + "code_map": self.code_map, + "created_at": self.created_at, + "updated_at": self.updated_at, + } + if self.pull: + d["pull"] = self.pull.to_dict() + return d + + @classmethod + def from_dict(cls, d: dict) -> ExtConfig: + return cls( + id=d["id"], + label=d["label"], + mode=d["mode"], + fields=[ExtField.from_dict(f) for f in d.get("fields", [])], + description=d.get("description", ""), + symbol_map=d.get("symbol_map"), + code_map=d.get("code_map"), + created_at=d.get("created_at"), + updated_at=d.get("updated_at"), + pull=PullConfig.from_dict(d["pull"]) if d.get("pull") else None, + ) + + +# --------------------------------------------------------------------------- +# 配置持久化 +# --------------------------------------------------------------------------- + +class ExtConfigStore: + """扩展数据配置文件读写 — 每个表独立目录 data/ext/{config_id}/config.json。""" + + def __init__(self, data_dir: Path) -> None: + self._base = data_dir / "ext_data" + + def _config_path(self, config_id: str) -> Path: + return self._base / config_id / "config.json" + + def load_all(self) -> list[ExtConfig]: + # 兼容旧版: 如果目录为空且旧配置文件存在则迁移 + if not self._base.exists() or not any(self._base.iterdir()): + old = self._base.parent / "ext_configs.json" + if not old.exists(): + old = self._base.parent / "ext_configs.json.bak" + if old.exists(): + self._migrate_legacy(old) + if not self._base.exists(): + return [] + configs = [] + for d in sorted(self._base.iterdir()): + cp = d / "config.json" + if d.is_dir() and cp.exists(): + try: + raw = json.loads(cp.read_text(encoding="utf-8")) + configs.append(ExtConfig.from_dict(raw)) + except Exception as e: + logger.warning("扩展表配置解析失败 %s: %s", cp, e) + return configs + + def get(self, config_id: str) -> ExtConfig | None: + cp = self._config_path(config_id) + if not cp.exists(): + return None + try: + raw = json.loads(cp.read_text(encoding="utf-8")) + return ExtConfig.from_dict(raw) + except Exception: + return None + + def upsert(self, config: ExtConfig) -> None: + config.updated_at = datetime.now().isoformat() + cp = self._config_path(config.id) + cp.parent.mkdir(parents=True, exist_ok=True) + cp.write_text( + json.dumps(config.to_dict(), ensure_ascii=False, indent=2), + encoding="utf-8", + ) + + def delete(self, config_id: str) -> bool: + import shutil + cp = self._config_path(config_id) + if not cp.exists(): + return False + shutil.rmtree(cp.parent, ignore_errors=True) + return True + + def _migrate_legacy(self, old_path: Path) -> None: + """一次性迁移旧版 ext_configs.json 到独立目录结构。""" + try: + raw = json.loads(old_path.read_text(encoding="utf-8")) + configs = [ExtConfig.from_dict(d) for d in raw] + for c in configs: + cp = self._config_path(c.id) + cp.parent.mkdir(parents=True, exist_ok=True) + cp.write_text( + json.dumps(c.to_dict(), ensure_ascii=False, indent=2), + encoding="utf-8", + ) + # 迁移完成后重命名旧文件作为备份 + backup = old_path.with_suffix(".json.bak") + old_path.rename(backup) + logger.info("ext_configs.json 已迁移至 ext/ (备份: %s)", backup.name) + except Exception as e: + logger.warning("ext_configs 迁移失败: %s", e) + + +# --------------------------------------------------------------------------- +# CSV / Excel 解析 → Parquet 写入 +# --------------------------------------------------------------------------- + +_POLARS_DTYPE_MAP = { + "string": pl.Utf8, + "int": pl.Int64, + "float": pl.Float64, + "bool": pl.Boolean, +} + + +def build_code_lookup(data_dir: Path) -> dict[str, str]: + """从 instruments 维表构建 code → symbol 映射。""" + path = data_dir / "instruments" / "instruments.parquet" + if not path.exists(): + return {} + try: + df = pl.read_parquet(path, columns=["code", "symbol"]) + return dict(zip(df["code"].to_list(), df["symbol"].to_list())) + except Exception: + return {} + + +def normalize_symbol(series: pl.Series, lookup: dict[str, str] | None = None) -> pl.Series: + """将 symbol 列标准化为 代码.交易所 格式。 + + 优先使用 instruments 维表查找 code → symbol,确保 100% 准确。 + 查不到时按规则兜底:6开头 → .SH,其余 → .SZ。 + """ + _lookup = lookup or {} + + def _fix_one(val: str) -> str: + if not val: + return val + val = val.strip() + # 已经是标准格式(含 .),直接返回 + if "." in val: + return val + # 纯6位数字代码 → 优先查维表 + if len(val) == 6 and val.isdigit(): + mapped = _lookup.get(val) + if mapped: + return mapped + # 兜底规则 + if val.startswith(("6",)): + return f"{val}.SH" + else: + return f"{val}.SZ" + return val + + return series.map_elements(_fix_one, return_dtype=pl.Utf8) + + +def ensure_utf8_csv(file_path: Path) -> Path: + """确保 CSV 文件以 UTF-8 编码可读,非 UTF-8(如 GBK/GB18030)则转换。 + + 国内行情软件(同花顺/东财/通达信)和 Windows 中文 Excel 导出的 CSV 多为 + GBK 系编码,Polars 的 read_csv 默认按 UTF-8 解析会抛 "invalid utf-8 sequence"。 + 这里在交给 Polars 前做一次编码规范化。 + + 返回值:若已是 UTF-8 则返回原路径;否则在同目录写一个 *.utf8 文件并返回它 + (调用方用临时目录,随目录一起清理)。 + """ + raw = file_path.read_bytes() + # BOM 处理:UTF-8-SIG 等带 BOM 文件直接交给 Polars(它认识 BOM) + try: + raw.decode("utf-8") + return file_path # 已是合法 UTF-8 + except UnicodeDecodeError: + pass + # 依次尝试常见中文编码,第一个能完整解码的即为命中 + for enc in ("gb18030", "gbk", "gb2312", "big5"): + try: + text = raw.decode(enc) + except UnicodeDecodeError: + continue + out_path = file_path.with_suffix(file_path.suffix + ".utf8") + out_path.write_text(text, encoding="utf-8") + logger.info("CSV 编码转换 %s → %s (%s)", file_path.name, out_path.name, enc) + return out_path + # 都无法解码:返回原路径,让 Polars 抛出更精确的原始错误 + return file_path + + +def parse_upload_file(file_path: Path, symbol_col: str = "symbol", data_dir: Path | None = None) -> pl.DataFrame: + """解析上传的 CSV / Excel 文件为 Polars DataFrame。""" + suffix = file_path.suffix.lower() + if suffix == ".csv": + df = pl.read_csv(ensure_utf8_csv(file_path), infer_schema_length=10000) + elif suffix in (".xlsx", ".xls"): + df = pl.read_excel(file_path) + else: + raise ValueError(f"不支持的文件格式: {suffix}") + + if symbol_col not in df.columns: + # 尝试模糊匹配 + candidates = [c for c in df.columns if c.lower() in ("symbol", "code", "代码", "标的")] + if candidates: + df = df.rename({candidates[0]: symbol_col}) + else: + raise ValueError(f"未找到标的代码列 (symbol),可选列: {df.columns}") + + # 确保 symbol 列为字符串并标准化 + lookup = build_code_lookup(data_dir) if data_dir else None + df = df.with_columns(normalize_symbol(df[symbol_col].cast(pl.Utf8), lookup)) + return df + + +def cast_df_to_schema(df: pl.DataFrame, fields: list[ExtField]) -> pl.DataFrame: + """按配置的字段类型转换 DataFrame 列类型。""" + for f in fields: + if f.name in df.columns: + target = _POLARS_DTYPE_MAP.get(f.dtype, pl.Utf8) + df = df.with_columns(pl.col(f.name).cast(target)) + return df + + +def _config_dir(config_id: str, data_dir: Path) -> Path: + """返回扩展配置的根目录 data/ext_data/{config_id}/。""" + return data_dir / "ext_data" / config_id + + +def write_ext_parquet( + df: pl.DataFrame, + config: ExtConfig, + data_dir: Path, + snapshot_date: date | None = None, +) -> int: + """将 DataFrame 写入扩展数据 Parquet。 + + 目录结构: + - snapshot: data/ext_data/{id}/part.parquet(与 config.json 同级,覆盖写) + - timeseries: data/ext_data/{id}/timeseries/date=xxx/part.parquet(按日分区) + + Returns: + 写入行数。 + """ + snap = snapshot_date or date.today() + cfg_dir = _config_dir(config.id, data_dir) + + # 标准化 symbol 列: 用维表查找 → 准确匹配交易所 + if "symbol" in df.columns: + lookup = build_code_lookup(data_dir) + df = df.with_columns(normalize_symbol(df["symbol"], lookup)) + + if config.mode == "snapshot": + # 快照: 与 config.json 同级,直接覆盖 + cfg_dir.mkdir(parents=True, exist_ok=True) + out_path = cfg_dir / "part.parquet" + + # 如果已有文件,合并去重后覆盖 + if out_path.exists(): + try: + existing = pl.read_parquet(out_path) + key = "symbol" if "symbol" in df.columns else df.columns[0] + df = pl.concat([existing, df]).unique(subset=[key], keep="last") + except Exception: + pass + else: + # 时序: timeseries/ 下按日期分区 + out_dir = cfg_dir / "timeseries" / f"date={snap}" + out_dir.mkdir(parents=True, exist_ok=True) + out_path = out_dir / "part.parquet" + + # 如果已有文件,合并去重 + if out_path.exists(): + try: + existing = pl.read_parquet(out_path) + key = "symbol" if "symbol" in df.columns else df.columns[0] + df = pl.concat([existing, df]).unique(subset=[key], keep="last") + except Exception: + pass + + df = cast_df_to_schema(df, config.fields) + df.write_parquet(out_path) + logger.info("扩展表写入: %s → %s (%d 行)", config.id, out_path, len(df)) + return len(df) + + +def delete_ext_parquet(config_id: str, data_dir: Path) -> None: + """删除扩展数据源关联的所有 Parquet 数据(保留 config.json)。 + + - snapshot: 删除 ext_data/{id}/part.parquet + - timeseries: 删除 ext_data/{id}/timeseries/ 目录 + """ + cfg_dir = _config_dir(config_id, data_dir) + # 删除快照文件 + snap = cfg_dir / "part.parquet" + if snap.exists(): + snap.unlink() + # 删除时序目录 + ts_dir = cfg_dir / "timeseries" + if ts_dir.exists(): + import shutil + shutil.rmtree(ts_dir, ignore_errors=True) + + +def fix_symbol_format(config: ExtConfig, data_dir: Path) -> int: + """扫描该扩展配置的所有 Parquet 文件,将 symbol 列标准化为 代码.交易所 格式。 + + - snapshot: 扫描 ext_data/{id}/part.parquet + - timeseries: 扫描 ext_data/{id}/timeseries/date=xxx/part.parquet + + Returns: + 修复的文件数。 + """ + cfg_dir = _config_dir(config.id, data_dir) + if not cfg_dir.exists(): + return 0 + + # 收集需要扫描的 parquet 文件列表 + parquet_files: list[Path] = [] + if config.mode == "snapshot": + p = cfg_dir / "part.parquet" + if p.exists(): + parquet_files.append(p) + else: + ts_dir = cfg_dir / "timeseries" + if ts_dir.exists(): + for part_dir in sorted(ts_dir.iterdir()): + if not part_dir.is_dir() or not part_dir.name.startswith("date="): + continue + p = part_dir / "part.parquet" + if p.exists(): + parquet_files.append(p) + + fixed = 0 + lookup = build_code_lookup(data_dir) + for parquet_path in parquet_files: + try: + df = pl.read_parquet(parquet_path) + if "symbol" not in df.columns: + continue + old = df["symbol"].to_list() + df = df.with_columns(normalize_symbol(df["symbol"], lookup)) + new = df["symbol"].to_list() + if old != new: + df.write_parquet(parquet_path) + fixed += 1 + logger.info("代码格式修复: %s/%s (%d 行)", config.id, parquet_path.parent.name, len(df)) + except Exception as e: + logger.warning("代码格式修复跳过 %s: %s", parquet_path, e) + + return fixed + + +def rows_to_parquet( + rows: list[dict], + config: ExtConfig, + data_dir: Path, + snapshot_date: date | None = None, +) -> int: + """将 JSON 行列表转为 DataFrame 写入 Parquet,复用 write_ext_parquet 的存储逻辑。 + + Returns: + 写入行数。 + """ + df = pl.DataFrame(rows) + if "symbol" in df.columns: + df = df.with_columns(pl.col("symbol").cast(pl.Utf8)) + return write_ext_parquet(df, config, data_dir, snapshot_date=snapshot_date) diff --git a/backend/app/services/ext_pull.py b/backend/app/services/ext_pull.py new file mode 100644 index 0000000..d15a638 --- /dev/null +++ b/backend/app/services/ext_pull.py @@ -0,0 +1,216 @@ +"""扩展数据定时拉取引擎 — 从外部 API 拉取数据写入 Parquet。""" +from __future__ import annotations + +import asyncio +import json +import logging +import threading +from datetime import date, datetime, timezone +from functools import reduce +from typing import Any + +import httpx + +from app.services.ext_data import ( + ExtConfig, + ExtConfigStore, + PullConfig, + rows_to_parquet, +) + +logger = logging.getLogger(__name__) + + +# --------------------------------------------------------------------------- +# 响应解析 +# --------------------------------------------------------------------------- + +def _extract_rows(data: Any, path: str) -> list[dict]: + """按 dot-path 从 JSON 响应中提取行数组。 + + 例: path="data.list" → response["data"]["list"] + 如果 path 为空,直接将 data 视为数组。 + """ + if not path: + if isinstance(data, list): + return data + raise ValueError("response_path 为空但响应不是数组") + + keys = path.split(".") + current = data + for key in keys: + if isinstance(current, dict): + if key not in current: + raise ValueError(f"响应中不存在路径 '{path}',缺失键 '{key}'") + current = current[key] + elif isinstance(current, list): + try: + current = current[int(key)] + except (ValueError, IndexError) as e: + raise ValueError(f"响应路径 '{path}' 解析失败: {e}") from e + else: + raise ValueError(f"响应路径 '{path}' 中间值不是 dict/list: {type(current)}") + + if not isinstance(current, list): + raise ValueError(f"路径 '{path}' 指向的不是数组,而是 {type(current)}") + + return current + + +def _apply_field_map(rows: list[dict], field_map: dict[str, str]) -> list[dict]: + """将外部字段名映射为内部配置字段名。field_map: {外部名: 内部名}。""" + if not field_map: + return rows + mapped = [] + for row in rows: + new_row: dict = {} + for k, v in row.items(): + mapped_key = field_map.get(k, k) + new_row[mapped_key] = v + mapped.append(new_row) + return mapped + + +# --------------------------------------------------------------------------- +# 拉取执行 +# --------------------------------------------------------------------------- + +async def fetch_and_ingest( + config: ExtConfig, + data_dir, +) -> tuple[int, str]: + """执行一次拉取: 请求外部 API → 解析响应 → 写入 Parquet。 + + Returns: + (rows_written, date_str) + """ + pull = config.pull + if not pull or not pull.url: + raise ValueError("拉取未配置或 URL 为空") + + async with httpx.AsyncClient(timeout=30) as client: + headers = pull.headers or {} + kwargs: dict[str, Any] = {"headers": headers} + + if pull.method.upper() == "POST" and pull.body: + kwargs["content"] = pull.body + if "content-type" not in {k.lower() for k in headers}: + kwargs["headers"]["Content-Type"] = "application/json" + + resp = await client.request(pull.method.upper(), pull.url, **kwargs) + resp.raise_for_status() + + # 解析 JSON + try: + data = resp.json() + except Exception as e: + raise ValueError(f"响应不是有效 JSON: {e}") from e + + # 提取行 + rows = _extract_rows(data, pull.response_path) + if not rows: + raise ValueError("提取到的行数为 0") + + # 字段映射 + rows = _apply_field_map(rows, pull.field_map) + + # 校验 symbol 列 + if rows and "symbol" not in rows[0]: + raise ValueError("数据行中缺少 symbol 字段,请配置 field_map 映射") + + # 写入 + snap = date.today() + n = rows_to_parquet(rows, config, data_dir, snapshot_date=snap) + return n, snap.isoformat() + + +# --------------------------------------------------------------------------- +# 调度器 +# --------------------------------------------------------------------------- + +class PullScheduler: + """后台调度器:为每个启用了 pull 的 ExtConfig 维护定时任务。""" + + def __init__(self) -> None: + self._tasks: dict[str, asyncio.Task] = {} + self._running = False + self._lock = threading.Lock() + + def start(self, data_dir) -> None: + """启动调度(在 lifespan startup 调用)。""" + self._running = True + self._data_dir = data_dir + logger.info("PullScheduler started") + + def stop(self) -> None: + """停止所有任务。""" + self._running = False + for task in self._tasks.values(): + task.cancel() + self._tasks.clear() + logger.info("PullScheduler stopped") + + def refresh(self, data_dir) -> None: + """重新加载配置,更新调度任务(增/删/改)。""" + self._data_dir = data_dir + store = ExtConfigStore(data_dir) + configs = store.load_all() + + active_ids: set[str] = set() + + for config in configs: + if not config.pull or not config.pull.enabled or not config.pull.url: + continue + active_ids.add(config.id) + if config.id not in self._tasks: + # 新增调度 + task = asyncio.create_task(self._run_loop(config)) + self._tasks[config.id] = task + logger.info("PullScheduler: scheduled %s (every %d min)", config.id, config.pull.schedule_minutes) + + # 移除不再活跃的 + for cid in list(self._tasks): + if cid not in active_ids: + self._tasks[cid].cancel() + del self._tasks[cid] + logger.info("PullScheduler: removed %s", cid) + + async def _run_loop(self, config: ExtConfig) -> None: + """单个配置的定时拉取循环。""" + try: + while self._running: + pull = config.pull + if not pull: + break + interval = max(pull.schedule_minutes * 60, 60) # 至少 60s + await asyncio.sleep(interval) + if not self._running: + break + try: + # 重新加载最新配置(用户可能中途修改) + store = ExtConfigStore(self._data_dir) + fresh = store.get(config.id) + if not fresh or not fresh.pull or not fresh.pull.enabled: + break + n, d = await fetch_and_ingest(fresh, self._data_dir) + fresh.pull.last_run = datetime.now(timezone.utc).isoformat() + fresh.pull.last_status = "success" + fresh.pull.last_message = f"{n} rows @ {d}" + fresh.pull.last_rows = n + store.upsert(fresh) + logger.info("PullScheduler: %s success, %d rows", config.id, n) + except Exception as e: + store = ExtConfigStore(self._data_dir) + fresh = store.get(config.id) + if fresh and fresh.pull: + fresh.pull.last_run = datetime.now(timezone.utc).isoformat() + fresh.pull.last_status = "error" + fresh.pull.last_message = str(e)[:200] + store.upsert(fresh) + logger.warning("PullScheduler: %s error: %s", config.id, e) + except asyncio.CancelledError: + pass + + +# 全局单例 +pull_scheduler = PullScheduler() diff --git a/backend/app/services/extend_history.py b/backend/app/services/extend_history.py new file mode 100644 index 0000000..1339a52 --- /dev/null +++ b/backend/app/services/extend_history.py @@ -0,0 +1,224 @@ +"""向前扩展历史数据 — 完全独立于 daily_pipeline 的盘后管道。 + +用户从日 K 卡片手动触发,指定往前补的时长 (x 天/月/年)。 +流程: + 1. 获取当前最早日期 + 2. 向前拉日 K batch (start = 最早日期 - offset, end = 最早日期) + 3. 向前拉除权因子 (同范围) + 4. 全量重算 enriched + 5. 刷新视图 + 缓存 + +⚠️ 本模块不导入 daily_pipeline 的任何函数,只复用基础设施: + - kline_sync.sync_and_persist_daily_batch / sync_adj_factor + - indicators.pipeline.run_pipeline + - pipeline_jobs.JobStore + - tickflow.repository.KlineRepository +""" +from __future__ import annotations + +import logging +from collections.abc import Callable +from datetime import date, datetime, timedelta + +from app.services import kline_sync +from app.services.pipeline_jobs import job_store +from app.tickflow.capabilities import Cap, CapabilitySet +from app.tickflow.repository import KlineRepository + +logger = logging.getLogger(__name__) + + +def _noop(stage: str, pct: int, msg: str, **kwargs) -> None: # noqa: ARG001 + pass + + +def _invalidate(table: str | None = None) -> None: + from app.api.data import invalidate_data_cache + invalidate_data_cache(table) + + +def _resolve_universe(capset: CapabilitySet) -> list[str]: + """解析标的池 — 与 daily_pipeline 独立的副本。""" + if capset.has(Cap.KLINE_DAILY_BATCH): + try: + from app.tickflow.pools import get_pool + all_a = get_pool("CN_Equity_A", refresh=True) + if all_a: + return sorted(all_a) + except Exception as e: + logger.warning("CN_Equity_A pool unavailable: %s", e) + + from app.tickflow.pools import DEMO_SYMBOLS, get_pool as _get_pool + from app.config import settings + from pathlib import Path + import polars as pl + base: set[str] = set(DEMO_SYMBOLS) + base.update(_get_pool("watchlist")) + d = Path(settings.data_dir) + inst_path = d / "instruments" / "instruments.parquet" + if inst_path.exists(): + try: + inst = pl.read_parquet(inst_path, columns=["symbol"]) + base.update(inst["symbol"].to_list()) + except Exception as e: + logger.warning("instruments supplement failed: %s", e) + return sorted(base) + + +def _refresh_single_view(repo: KlineRepository, name: str) -> None: + """刷新单个 DuckDB 视图。""" + d = repo.store.data_dir.as_posix() + paths = { + "kline_daily": f"{d}/kline_daily/**/*.parquet", + "kline_enriched": f"{d}/kline_daily_enriched/**/*.parquet", + "kline_minute": f"{d}/kline_minute/**/*.parquet", + "adj_factor": f"{d}/adj_factor/**/*.parquet", + "instruments": f"{d}/instruments/**/*.parquet", + } + path = paths.get(name) + if not path: + return + try: + repo.db.execute( + f"CREATE OR REPLACE VIEW {name} AS " + f"SELECT * FROM read_parquet('{path}', union_by_name=true)" + ) + except Exception as e: + logger.warning("refresh view %s failed: %s", name, e) + + +def compute_offset(value: int, unit: str) -> timedelta: + """将用户输入的 value + unit 转成 timedelta。""" + if unit == "day": + return timedelta(days=value) + elif unit == "month": + return timedelta(days=value * 30) + elif unit == "year": + return timedelta(days=value * 365) + else: + raise ValueError(f"不支持的单位: {unit}") + + +def run_extend_history( + repo: KlineRepository, + capset: CapabilitySet, + value: int, + unit: str, + on_progress: Callable | None = None, +) -> dict: + """向前扩展历史数据的主函数。 + + 完全独立于 daily_pipeline.run_now(),不调用其任何逻辑。 + 返回结果 dict 供 job_store 记录。 + """ + emit = on_progress or _noop + + # 0. 计算时间偏移 + offset = compute_offset(value, unit) + today = date.today() + + # 1. 获取当前最早日期 + emit("extend_history", 2, "检查当前数据范围…") + earliest = repo.earliest_daily_date() + + if not earliest: + return {"error": "本地无日K数据,请先执行一次完整同步"} + + new_start = earliest - offset + # 不能超过今天 + if new_start >= earliest: + return {"error": "扩展范围无效,请增大时间跨度"} + + # 2. 解析标的池 + emit("extend_history", 5, "解析标的池…") + universe = _resolve_universe(capset) + if not universe: + return {"error": "标的池为空"} + emit("extend_history", 8, f"标的池: {len(universe)} 只") + + start_str = new_start.strftime("%Y-%m-%d") + end_str = earliest.strftime("%Y-%m-%d") + + # 3. 拉日 K + emit("extend_history", 10, f"获取日K [{start_str} ~ {end_str}]…") + logger.info("extend_history: daily K [%s ~ %s], %d symbols", start_str, end_str, len(universe)) + + def _daily_chunk(cur: int, tot: int) -> None: + emit("extend_history", 10 + int(35 * cur / tot), + f"日K 批次 {cur}/{tot}", stage_pct=int(100 * cur / tot), skip_log=True) + + written_daily = kline_sync.sync_and_persist_daily_batch( + universe, repo, capset, + start_date=datetime.combine(new_start, datetime.min.time()), + end_date=datetime.combine(earliest, datetime.min.time()), + on_chunk_done=_daily_chunk, + ) + emit("extend_history", 45, f"日K 完成,写入 {written_daily} 行") + logger.info("extend_history: daily K done, %d rows", written_daily) + _refresh_single_view(repo, "kline_daily") + _invalidate("daily") + + # 4. 拉除权因子 (新范围) + written_adj = 0 + adj_start = datetime.combine(new_start, datetime.min.time()) + adj_end = datetime.combine(today, datetime.min.time()) + adj_start_str = new_start.strftime("%Y-%m-%d") + adj_end_str = today.strftime("%Y-%m-%d") + + if capset.has(Cap.ADJ_FACTOR): + emit("extend_history", 48, f"获取除权因子 [{adj_start_str} ~ {adj_end_str}]…") + logger.info("extend_history: adj_factor [%s ~ %s]", adj_start_str, adj_end_str) + + def _adj_chunk(cur: int, tot: int) -> None: + emit("extend_history", 48 + int(10 * cur / tot), + f"除权因子批次 {cur}/{tot}", stage_pct=int(100 * cur / tot), skip_log=True) + + written_adj, _affected = kline_sync.sync_adj_factor( + universe, repo, capset, + start_time=adj_start, end_time=adj_end, + on_chunk_done=_adj_chunk, + ) + emit("extend_history", 60, f"除权因子完成,{written_adj} 行") + logger.info("extend_history: adj_factor done, %d rows", written_adj) + _refresh_single_view(repo, "adj_factor") + _invalidate("adj_factor") + else: + emit("extend_history", 60, "除权因子跳过(无权限)") + logger.info("extend_history: adj_factor skipped, no ADJ_FACTOR capability") + + # 5. 全量重算 enriched + emit("extend_history", 65, "全量计算 enriched…") + logger.info("extend_history: full enriched rebuild start") + + from app.indicators.pipeline import run_pipeline + written_enriched = run_pipeline() + + enriched_dir = repo.store.data_dir / "kline_daily_enriched" + enriched_days = len(list(enriched_dir.glob("date=*"))) if enriched_dir.exists() else 0 + emit("extend_history", 92, f"enriched 完成,覆盖 {enriched_days} 天") + logger.info("extend_history: enriched done, %d days", enriched_days) + _refresh_single_view(repo, "kline_enriched") + _invalidate("enriched") + + # 6. 刷新视图 + emit("extend_history", 95, "刷新视图…") + _refresh_single_view(repo, "kline_daily") + _refresh_single_view(repo, "kline_enriched") + _refresh_single_view(repo, "adj_factor") + _invalidate(None) + + # 7. 统计结果 + daily_dir = repo.store.data_dir / "kline_daily" + daily_days = len(list(daily_dir.glob("date=*"))) if daily_dir.exists() else 0 + + emit("extend_history", 100, f"完成,已扩展至 {new_start}") + + return { + "earliest_before": earliest.isoformat(), + "earliest_after": new_start.isoformat(), + "daily_rows": written_daily, + "daily_days": daily_days, + "adj_factor_rows": written_adj, + "enriched_days": enriched_days, + "universe_size": len(universe), + } diff --git a/backend/app/services/financial_sync.py b/backend/app/services/financial_sync.py new file mode 100644 index 0000000..5c4f242 --- /dev/null +++ b/backend/app/services/financial_sync.py @@ -0,0 +1,314 @@ +"""财务数据独立同步服务。 + +解耦于 K-line 管道, 自有调度 + 自有存储。 +能力门控: Cap.FINANCIAL (Expert 套餐) +""" +from __future__ import annotations + +import asyncio +import logging +import threading +from datetime import date, datetime, timezone +from pathlib import Path +from typing import Any + +import polars as pl + +from app.tickflow.capabilities import Cap, CapabilitySet + +logger = logging.getLogger(__name__) + +# 每个 API 请求最多 100 个标的 +_BATCH_SIZE = 100 + +# 4 张财务表 +FINANCIAL_TABLES = ("metrics", "income", "balance_sheet", "cash_flow") + + +# ================================================================ +# 同步函数 +# ================================================================ + +def _get_symbols(data_dir: Path) -> list[str]: + """从 instruments 表获取标的列表。""" + inst_path = data_dir / "instruments" / "instruments.parquet" + if not inst_path.exists(): + return [] + try: + df = pl.read_parquet(inst_path, columns=["symbol"]) + return df["symbol"].to_list() + except Exception as e: + logger.warning("读取 instruments 失败: %s", e) + return [] + + +def _sync_table( + table: str, + symbols: list[str], + data_dir: Path, + capset: CapabilitySet, + latest_only: bool = True, +) -> int: + """同步单张财务表。返回写入的行数。""" + if not capset.has(Cap.FINANCIAL): + logger.info("sync_%s skipped: no FINANCIAL capability", table) + return 0 + if not symbols: + logger.warning("sync_%s skipped: no symbols", table) + return 0 + + from app.tickflow.client import get_client + tf = get_client() + + # 分批拉取 + api_method = { + "metrics": tf.financials.metrics, + "income": tf.financials.income, + "balance_sheet": tf.financials.balance_sheet, + "cash_flow": tf.financials.cash_flow, + }[table] + + all_records: list[dict] = [] + total_batches = (len(symbols) + _BATCH_SIZE - 1) // _BATCH_SIZE + + for i in range(0, len(symbols), _BATCH_SIZE): + chunk = symbols[i : i + _BATCH_SIZE] + batch_num = i // _BATCH_SIZE + 1 + try: + data = api_method(chunk, latest=latest_only) + # data 格式: { "600519.SH": [record, ...], ... } + if isinstance(data, dict): + for sym, records in data.items(): + if isinstance(records, list): + for rec in records: + if isinstance(rec, dict): + rec["symbol"] = sym + all_records.append(rec) + logger.debug("sync_%s batch %d/%d: %d records", table, batch_num, total_batches, len(data) if isinstance(data, dict) else 0) + except Exception as e: + logger.warning("sync_%s batch %d/%d failed: %s", table, batch_num, total_batches, e) + + if not all_records: + return 0 + + df = pl.DataFrame(all_records) + if df.is_empty(): + return 0 + + # 确保 symbol 列存在 + if "symbol" not in df.columns: + return 0 + + # 写入 Parquet (全量覆盖) + out_dir = data_dir / "financials" / table + out_dir.mkdir(parents=True, exist_ok=True) + out_file = out_dir / "part.parquet" + df.write_parquet(out_file) + + logger.info("sync_%s done: %d records written", table, len(df)) + return len(df) + + +def sync_metrics(data_dir: Path, capset: CapabilitySet) -> int: + """同步核心财务指标 (metrics)。""" + symbols = _get_symbols(data_dir) + return _sync_table("metrics", symbols, data_dir, capset, latest_only=True) + + +def sync_income(data_dir: Path, capset: CapabilitySet) -> int: + """同步利润表。""" + symbols = _get_symbols(data_dir) + return _sync_table("income", symbols, data_dir, capset, latest_only=True) + + +def sync_balance_sheet(data_dir: Path, capset: CapabilitySet) -> int: + """同步资产负债表。""" + symbols = _get_symbols(data_dir) + return _sync_table("balance_sheet", symbols, data_dir, capset, latest_only=True) + + +def sync_cash_flow(data_dir: Path, capset: CapabilitySet) -> int: + """同步现金流量表。""" + symbols = _get_symbols(data_dir) + return _sync_table("cash_flow", symbols, data_dir, capset, latest_only=True) + + +def sync_all(data_dir: Path, capset: CapabilitySet) -> dict[str, int]: + """同步所有财务表。返回 {table: rows}。""" + if not capset.has(Cap.FINANCIAL): + logger.info("sync_all financials skipped: no FINANCIAL capability") + return {} + + symbols = _get_symbols(data_dir) + results: dict[str, int] = {} + for table in FINANCIAL_TABLES: + results[table] = _sync_table(table, symbols, data_dir, capset, latest_only=True) + + # 同步完成后注册 DuckDB 视图 + _refresh_financials_views(data_dir) + + return results + + +# ================================================================ +# DuckDB 视图 +# ================================================================ + +def _refresh_financials_views(data_dir: Path) -> None: + """刷新财务表 DuckDB 视图 (在 DataStore.db 上注册)。""" + d = data_dir.as_posix() + views = { + "financials_metrics": f"{d}/financials/metrics/*.parquet", + "financials_income": f"{d}/financials/income/*.parquet", + "financials_balance_sheet": f"{d}/financials/balance_sheet/*.parquet", + "financials_cash_flow": f"{d}/financials/cash_flow/*.parquet", + } + for name, path in views.items(): + out = data_dir / "financials" / name.replace("financials_", "") / "part.parquet" + if not out.exists(): + continue + # 视图注册需要由 DataStore 完成,这里只做日志 + logger.debug("financial parquet ready: %s (%d rows)", name, out.stat().st_size) + + +def get_financial_df(data_dir: Path, table: str) -> pl.DataFrame: + """读取本地财务 Parquet。""" + path = data_dir / "financials" / table / "part.parquet" + if not path.exists(): + return pl.DataFrame() + try: + return pl.read_parquet(path) + except Exception as e: + logger.warning("读取 financials/%s 失败: %s", table, e) + return pl.DataFrame() + + +# ================================================================ +# 调度器 +# ================================================================ + +class FinancialScheduler: + """独立调度器: 每周同步 metrics, 每季度同步三张报表。""" + + def __init__(self) -> None: + self._task: asyncio.Task | None = None + self._running = False + self._data_dir: Path | None = None + self._capset: CapabilitySet | None = None + self._lock = threading.Lock() + self._last_sync: dict[str, str] = {} # {table: iso_timestamp} + # 手动同步(run_now)是否正在进行。前端据此显示"同步中"并防重复点击。 + self._is_syncing = False + + def start(self, data_dir: Path, capset: CapabilitySet) -> None: + if not capset.has(Cap.FINANCIAL): + logger.info("FinancialScheduler skipped: no FINANCIAL capability") + return + self._data_dir = data_dir + self._capset = capset + self._running = True + self._task = asyncio.create_task(self._run_loop()) + logger.info("FinancialScheduler started") + + def stop(self) -> None: + self._running = False + if self._task: + self._task.cancel() + self._task = None + logger.info("FinancialScheduler stopped") + + def update(self, data_dir: Path, capset: CapabilitySet) -> None: + """运行时更新数据目录和能力集。 + + 用户在设置页更换/清除 Key 后,能力集可能变化,无需重启服务即可让 + 财务调度器生效或失效。 + """ + had_financial = self._capset is not None and self._capset.has(Cap.FINANCIAL) + has_financial = capset.has(Cap.FINANCIAL) + self._data_dir = data_dir + self._capset = capset + + if has_financial and not self._running: + self.start(data_dir, capset) + elif had_financial and not has_financial and self._running: + self.stop() + + async def _run_loop(self) -> None: + """每周执行一次 metrics 同步。""" + try: + while self._running: + # 首次启动等 60s, 之后每 7 天执行一次 + await asyncio.sleep(60) + if not self._running: + break + + # 每周: 只同步 metrics + try: + rows = sync_metrics(self._data_dir, self._capset) + self._last_sync["metrics"] = datetime.now(timezone.utc).isoformat() + logger.info("FinancialScheduler: metrics synced, %d rows", rows) + except Exception as e: + logger.warning("FinancialScheduler: metrics sync failed: %s", e) + + # 等待下一次 (7天) + for _ in range(7 * 24 * 60): # 每分钟检查一次 _running + if not self._running: + break + await asyncio.sleep(60) + + except asyncio.CancelledError: + pass + + def run_now(self, table: str | None = None) -> dict[str, int]: + """手动触发同步。table=None 同步全部。 + + 用 _is_syncing 标志防并发:若已有同步在进行,本次直接跳过, + 避免重复请求拖慢服务端 / 触发上游限流。 + """ + if not self._capset or not self._capset.has(Cap.FINANCIAL): + return {} + with self._lock: + if self._is_syncing: + logger.info("financial sync skipped: already running") + return {"_skipped": 1} + self._is_syncing = True + try: + if table: + fn = { + "metrics": sync_metrics, + "income": sync_income, + "balance_sheet": sync_balance_sheet, + "cash_flow": sync_cash_flow, + }.get(table) + if not fn: + return {} + rows = fn(self._data_dir, self._capset) + self._last_sync[table] = datetime.now(timezone.utc).isoformat() + return {table: rows} + else: + # 全部同步: 逐表执行, 每张完成立即更新 last_sync, + # 让前端轮询 /status 能看到进度递增 (而非等全部完成才一次性更新)。 + symbols = _get_symbols(self._data_dir) + result: dict[str, int] = {} + for t in FINANCIAL_TABLES: + result[t] = _sync_table(t, symbols, self._data_dir, self._capset, latest_only=True) + self._last_sync[t] = datetime.now(timezone.utc).isoformat() + _refresh_financials_views(self._data_dir) + return result + finally: + with self._lock: + self._is_syncing = False + + @property + def is_syncing(self) -> bool: + """手动同步是否正在进行(供 /status 返回,前端据此显示"同步中")。""" + with self._lock: + return self._is_syncing + + @property + def last_sync(self) -> dict[str, str]: + return dict(self._last_sync) + + +# 全局单例 +financial_scheduler = FinancialScheduler() diff --git a/backend/app/services/index_sync.py b/backend/app/services/index_sync.py new file mode 100644 index 0000000..dab5db5 --- /dev/null +++ b/backend/app/services/index_sync.py @@ -0,0 +1,146 @@ +"""指数数据同步服务。""" +from __future__ import annotations + +import logging +import gc +from datetime import datetime, timedelta + +import polars as pl + +from app.indicators.pipeline import compute_enriched +from app.services import kline_sync, preferences +from app.tickflow.capabilities import Cap, CapabilitySet +from app.tickflow.client import get_client +from app.tickflow.repository import KlineRepository + +logger = logging.getLogger(__name__) + + +def _quotes_to_index_instruments(resp) -> pl.DataFrame: + """将数据源 quotes 响应规范为指数 instruments。""" + if resp is None: + return pl.DataFrame() + + if isinstance(resp, pl.DataFrame): + df = resp + elif hasattr(resp, "columns"): + df = pl.from_pandas(resp.reset_index() if hasattr(resp, "reset_index") else resp) + else: + rows: list[dict] = [] + for q in resp or []: + item = q if isinstance(q, dict) else {} + ext = item.get("ext") or {} + symbol = item.get("symbol") + if not symbol: + continue + rows.append({ + "symbol": str(symbol), + "name": ext.get("name") or item.get("name") or str(symbol), + }) + df = pl.DataFrame(rows) + + if df.is_empty() or "symbol" not in df.columns: + return pl.DataFrame() + + rename = {"ts_code": "symbol"} + df = df.rename({k: v for k, v in rename.items() if k in df.columns}) + + if "name" not in df.columns: + if "ext" in df.columns: + df = df.with_columns(pl.col("symbol").cast(pl.Utf8).alias("name")) + else: + df = df.with_columns(pl.col("symbol").cast(pl.Utf8).alias("name")) + + result = df.select([ + pl.col("symbol").cast(pl.Utf8), + pl.col("name").cast(pl.Utf8), + ]).with_columns([ + pl.col("symbol").str.split(".").list.first().alias("code"), + pl.lit("index").alias("asset_type"), + ]) + return result.unique(subset=["symbol"], keep="last").sort("symbol") + + +def sync_index_instruments(repo: KlineRepository) -> int: + """同步 CN_Index 指数标的维表,返回指数数量。""" + tf = get_client() + resp = None + errors: list[str] = [] + for kwargs in ( + {"universes": ["CN_Index"]}, + {"universes": ["CN_Index"], "as_dataframe": False}, + ): + try: + resp = tf.quotes.get_by_universes(**kwargs) + if resp is not None and len(resp) > 0: + break + except Exception as e: # noqa: BLE001 + errors.append(str(e)) + resp = None + + if resp is None or len(resp) == 0: + logger.warning("CN_Index universe returned empty: %s", "; ".join(errors)) + return 0 + + instruments = _quotes_to_index_instruments(resp) + if instruments.is_empty(): + return 0 + repo.save_index_instruments(instruments) + repo.refresh_index_views() + return instruments.height + + +def sync_and_persist_index_daily( + repo: KlineRepository, + capset: CapabilitySet, + count: int | None = None, + start_date: datetime | None = None, + end_date: datetime | None = None, +) -> int: + """同步指数日K到独立 parquet,并计算指数 enriched。""" + if not capset.has(Cap.KLINE_DAILY_BATCH): + return 0 + + instruments = repo.get_index_instruments() + if instruments.is_empty(): + sync_index_instruments(repo) + instruments = repo.get_index_instruments() + if instruments.is_empty() or "symbol" not in instruments.columns: + return 0 + + symbols = sorted(set(instruments["symbol"].to_list())) + lim = capset.limits(Cap.KLINE_DAILY_BATCH) + batch_size = preferences.get_index_daily_batch_size() + if lim and lim.batch: + batch_size = min(batch_size, lim.batch) + rpm = lim.rpm if lim else None + + end_time = end_date or datetime.now() + start_time = start_date or (end_time - timedelta(days=365)) + + total_rows = 0 + interval = (60.0 / rpm) if rpm else 0 + chunks = [symbols[i:i + batch_size] for i in range(0, len(symbols), batch_size)] + for i, chunk in enumerate(chunks): + if i > 0 and interval > 0 and len(chunks) > rpm: + import time + time.sleep(interval) + raw = kline_sync.sync_daily_batch( + chunk, + count=count, + batch_size=None, + start_time=start_time, + end_time=end_time, + ) + if raw.is_empty(): + continue + + repo.append_index_daily(raw) + enriched = compute_enriched(raw, factors=None, instruments=None) + repo.append_index_enriched(enriched) + total_rows += raw.height + logger.info("index daily synced: %d/%d chunks, +%d rows", i + 1, len(chunks), raw.height) + del raw, enriched + gc.collect() + repo.refresh_index_views() + return total_rows diff --git a/backend/app/services/instrument_sync.py b/backend/app/services/instrument_sync.py new file mode 100644 index 0000000..2abae49 --- /dev/null +++ b/backend/app/services/instrument_sync.py @@ -0,0 +1,122 @@ +"""标的维表同步服务。 + +盘前 9:10 调用 tf.exchanges.get_instruments("SH"/"SZ"/"BJ", type="stock") +获取全量标的元数据,flatten ext 字段,写入 instruments.parquet。 + +Starter+ 盘后可用 quotes.get(universes) 顺便补充 name。 +""" +from __future__ import annotations + +import logging +from datetime import date +from pathlib import Path + +import polars as pl + +from app.tickflow.client import get_client + +logger = logging.getLogger(__name__) + +_EXCHANGES = ["SH", "SZ", "BJ"] + + +def _flatten_instruments(items: list[dict]) -> list[dict]: + """把 SDK 返回的 Instrument 列表 flatten 成扁平行。""" + rows = [] + for item in items: + row = { + "symbol": item.get("symbol"), + "name": item.get("name"), + "code": item.get("code"), + "exchange": item.get("exchange"), + "region": item.get("region"), + "type": item.get("type"), + } + ext = item.get("ext") or {} + row["listing_date"] = ext.get("listing_date") + row["total_shares"] = ext.get("total_shares") + row["float_shares"] = ext.get("float_shares") + row["tick_size"] = ext.get("tick_size") + row["limit_up"] = ext.get("limit_up") + row["limit_down"] = ext.get("limit_down") + rows.append(row) + return rows + + +def sync_instruments(data_dir: Path) -> int: + """全量同步标的维表 → data/instruments/instruments.parquet。 + + 返回写入的行数。 + """ + tf = get_client() + all_rows: list[dict] = [] + + for ex in _EXCHANGES: + try: + items = tf.exchanges.get_instruments(ex, instrument_type="stock") + if items: + all_rows.extend(_flatten_instruments(items)) + logger.info("instruments %s: %d stocks", ex, len(items)) + except Exception as e: + logger.warning("get_instruments(%s) failed: %s", ex, e) + + if not all_rows: + return 0 + + df = pl.DataFrame(all_rows) + df = df.with_columns(pl.lit(date.today()).alias("as_of")) + + out = data_dir / "instruments" / "instruments.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + df.write_parquet(out) + + logger.info("instruments synced: %d rows → %s", df.height, out) + return df.height + + +def enrich_names_from_quotes( + data_dir: Path, + quotes_data: list[dict], +) -> int: + """从 quotes 响应中提取 name,更新 instruments 维表(兜底补充)。 + + 盘后 quotes.get(universes) 返回的数据中包含 ext.name, + 用来补充 instruments 中可能缺失的 name。 + """ + if not quotes_data: + return 0 + + # 构建 symbol → name 映射 + name_map: dict[str, str] = {} + for q in quotes_data: + symbol = q.get("symbol", "") + ext = q.get("ext") or {} + name = ext.get("name") or q.get("name", "") + if symbol and name: + name_map[symbol] = name + + if not name_map: + return 0 + + inst_path = data_dir / "instruments" / "instruments.parquet" + if not inst_path.exists(): + return 0 + + df = pl.read_parquet(inst_path) + + # 只更新空 name 的行 + updates = pl.DataFrame({ + "symbol": list(name_map.keys()), + "_new_name": list(name_map.values()), + }) + df = df.join(updates, on="symbol", how="left") + df = df.with_columns( + pl.when(pl.col("name").is_null() | (pl.col("name") == "")) + .then(pl.col("_new_name")) + .otherwise(pl.col("name")) + .alias("name"), + ).drop("_new_name") + + df.write_parquet(inst_path) + logger.info("instruments name enriched from quotes: %d names", len(name_map)) + return len(name_map) diff --git a/backend/app/services/kline_sync.py b/backend/app/services/kline_sync.py new file mode 100644 index 0000000..bab2295 --- /dev/null +++ b/backend/app/services/kline_sync.py @@ -0,0 +1,617 @@ +"""日 K 同步服务(§7.7 Step 1)。 + +调度器在 capability 允许下,把符号集合的日 K 批量同步到本地 Parquet。 +策略: + - 日 K 仅使用 `kline.daily.batch` + - 除权因子仅使用 `adj_factor` +""" +from __future__ import annotations + +import logging +import time +from collections.abc import Callable +from datetime import datetime, timedelta + +import polars as pl + +from app.indicators.pipeline import filter_halt_days +from app.tickflow.capabilities import Cap, CapabilitySet +from app.tickflow.client import get_client +from app.tickflow.repository import KlineRepository + +logger = logging.getLogger(__name__) + + +# 标准列(无论 SDK 返回什么形状,我们把它规范成这套) +CANONICAL_DAILY_COLS = [ + "symbol", "date", "open", "high", "low", "close", "volume", "amount", +] + + +def _normalize_daily(df_in, default_symbol: str | None = None) -> pl.DataFrame: + """把 SDK 返回的 pandas/任意 DataFrame 规范成 canonical 列。""" + if df_in is None or len(df_in) == 0: + return pl.DataFrame() + + if not isinstance(df_in, pl.DataFrame): + df = pl.from_pandas(df_in.reset_index() if hasattr(df_in, "reset_index") else df_in) + else: + df = df_in + + # 兼容字段名差异 + rename_map = { + "ts_code": "symbol", + "trade_date": "date", + "vol": "volume", + "amt": "amount", + "datetime": "date", + } + df = df.rename({k: v for k, v in rename_map.items() if k in df.columns}) + + if "symbol" not in df.columns and default_symbol is not None: + df = df.with_columns(pl.lit(default_symbol).alias("symbol")) + + # 类型规范 + if "date" in df.columns and df.schema["date"] != pl.Date: + df = df.with_columns(pl.col("date").cast(pl.Date, strict=False)) + + for col in ("open", "high", "low", "close"): + if col in df.columns: + df = df.with_columns(pl.col(col).cast(pl.Float64, strict=False)) + for col in ("volume", "amount"): + if col in df.columns: + df = df.with_columns(pl.col(col).cast(pl.Float64, strict=False)) + + # 过滤停牌日 (open/high 为 0; close 可能被填充为前收盘价, 不能用全零判断) + df = filter_halt_days(df) + + # 只保留 canonical 列 + keep = [c for c in CANONICAL_DAILY_COLS if c in df.columns] + return df.select(keep) + + +def sync_daily_batch(symbols: list[str], + count: int | None = None, + batch_size: int | None = None, + rpm: int | None = None, + start_time: datetime | None = None, + end_time: datetime | None = None, + on_chunk_done: Callable[[int, int], None] | None = None) -> pl.DataFrame: + """批量拉取多股日 K。 + + 优先使用 start_time / end_time 区间 + count=10000,确保覆盖完整时间段。 + 仅传 count 时按条数回溯。 + """ + tf = get_client() + out: list[pl.DataFrame] = [] + interval = (60.0 / rpm) if rpm else 0 + + if batch_size is None: + chunks = [symbols] + else: + chunks = [symbols[i:i + batch_size] for i in range(0, len(symbols), batch_size)] + + for i, chunk in enumerate(chunks): + if i > 0 and interval > 0 and len(chunks) > rpm: + time.sleep(interval) + try: + if start_time and end_time: + raw = tf.klines.batch( + chunk, period="1d", adjust="none", + start_time=_datetime_to_ms(start_time), + end_time=_datetime_to_ms(end_time), + count=10000, + as_dataframe=True, show_progress=False, + ) + else: + raw = tf.klines.batch(chunk, period="1d", count=count or 250, adjust="none", + as_dataframe=True, show_progress=False) + except Exception as e: # noqa: BLE001 + logger.warning("batch fetch failed for %d symbols: %s", len(chunk), e) + continue + + # 兼容两种形态:dict[sym → df] 和扁平 df + if isinstance(raw, dict): + for sym, sub in raw.items(): + if sub is None or len(sub) == 0: + continue + out.append(_normalize_daily(sub, default_symbol=sym)) + elif raw is not None and len(raw) > 0: + out.append(_normalize_daily(raw)) + + if on_chunk_done: + on_chunk_done(i + 1, len(chunks)) + + if not out: + return pl.DataFrame() + return pl.concat(out, how="diagonal_relaxed") + + +def sync_and_persist_daily_batch( + symbols: list[str], + repo: KlineRepository, + capset: CapabilitySet, + count: int | None = None, + start_date: datetime | None = None, + end_date: datetime | None = None, + on_chunk_done: Callable[[int, int], None] | None = None, +) -> int: + """批量同步日 K 并落到 Parquet。返回写入的行数。 + + start_date/end_date: 外部传入的时间范围(由 pipeline 根据已有数据计算)。 + 未传入时默认拉最近 1 年。 + """ + if not symbols or not capset.has(Cap.KLINE_DAILY_BATCH): + return 0 + + lim = capset.limits(Cap.KLINE_DAILY_BATCH) + batch_size = lim.batch if lim and lim.batch else 100 + rpm = lim.rpm if lim else None + + end_time = end_date or datetime.now() + start_time = start_date or (end_time - timedelta(days=365)) + + df = sync_daily_batch( + symbols, count=count, batch_size=batch_size, rpm=rpm, + start_time=start_time, end_time=end_time, + on_chunk_done=on_chunk_done, + ) + + if df.is_empty(): + return 0 + + repo.append_daily(df) + + try: + d = repo.store.data_dir.as_posix() + repo.db.execute( + f"""CREATE OR REPLACE VIEW kline_daily AS + SELECT * FROM read_parquet('{d}/kline_daily/**/*.parquet', union_by_name=true)""" + ) + except Exception as e: # noqa: BLE001 + logger.warning("refresh view failed: %s", e) + + return df.height + + +def sync_daily_by_quotes(repo: KlineRepository) -> int: + """用实时行情接口拉全市场当日数据,覆写 kline_daily 今天分区。 + + 一个请求覆盖 ~5500 只股票,比 batch K-line 快几个数量级。 + 返回写入的行数。 + """ + from datetime import date as _date + + from app.tickflow.client import get_client + + tf = get_client() + try: + resp = tf.quotes.get_by_universes(universes=["CN_Equity_A"]) + except Exception as e: + logger.warning("get_by_universes failed: %s", e) + return 0 + + if not resp: + logger.warning("get_by_universes returned empty") + return 0 + + records = [] + for q in resp: + ext = q.get("ext") or {} + records.append({ + "symbol": q.get("symbol"), + "open": q.get("open"), + "high": q.get("high"), + "low": q.get("low"), + "close": q.get("last_price"), + "volume": q.get("volume"), + "amount": q.get("amount"), + }) + + df = pl.DataFrame(records) + if df.is_empty(): + return 0 + + today = _date.today() + daily_df = df.with_columns(pl.lit(today).cast(pl.Date).alias("date")) + + # 过滤停牌 (open/high 为 0; close 可能被填充为前收盘价, 不能用全零判断) + daily_df = filter_halt_days(daily_df) + + repo.flush_live_daily(daily_df) + logger.info("sync_daily_by_quotes: %d symbols flushed for %s", daily_df.height, today) + return daily_df.height + + +def sync_adj_factor(symbols: list[str], repo: KlineRepository, + capset: CapabilitySet, + start_time: datetime | None = None, + end_time: datetime | None = None, + on_chunk_done: Callable[[int, int], None] | None = None) -> tuple[int, list[str]]: + """同步除权因子(Starter+)。SDK 接口:`tf.klines.ex_factors(symbols=...)`。 + + 支持增量: 传 start_time/end_time 只拉取该时间范围内的新除权事件。 + 返回 (写入行数, 受影响的 symbol 列表) — 供 enriched 局部重算使用。 + """ + if not capset.has(Cap.ADJ_FACTOR) or not symbols: + return 0, [] + + tf = get_client() + lim = capset.limits(Cap.ADJ_FACTOR) + batch_size = lim.batch if lim and lim.batch else 50 + rpm = lim.rpm if lim else 30 + interval = 60.0 / rpm if rpm else 0 + + # 构建 SDK 参数 + sdk_kwargs: dict = {"as_dataframe": True, "batch_size": batch_size, "show_progress": False} + if start_time: + sdk_kwargs["start_time"] = _datetime_to_ms(start_time) + if end_time: + sdk_kwargs["end_time"] = _datetime_to_ms(end_time) + + chunks = [symbols[i:i + batch_size] for i in range(0, len(symbols), batch_size)] + all_dfs: list[pl.DataFrame] = [] + + for i, chunk in enumerate(chunks): + if i > 0 and interval > 0 and len(chunks) > rpm: + time.sleep(interval) + try: + raw = tf.klines.ex_factors(chunk, **sdk_kwargs) + if raw is not None and len(raw) > 0: + all_dfs.append(pl.from_pandas( + raw.reset_index() if hasattr(raw, "reset_index") else raw + )) + logger.debug("adj_factor chunk %d/%d: %d symbols", i + 1, len(chunks), len(chunk)) + except Exception as e: # noqa: BLE001 + logger.warning("adj_factor chunk %d failed: %s", i + 1, e) + + if on_chunk_done: + on_chunk_done(i + 1, len(chunks)) + + if not all_dfs: + return 0, [] + + new_data = pl.concat(all_dfs, how="diagonal_relaxed") if len(all_dfs) > 1 else all_dfs[0] + + # 提取受影响的 symbol 列表(合并前) + affected = new_data["symbol"].unique().to_list() + + out = repo.store.data_dir / "adj_factor" / "all.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + + if out.exists(): + existing = pl.read_parquet(out) + before = existing.height + merged = pl.concat([existing, new_data]).unique( + subset=["symbol", "trade_date"], keep="last", + ).sort(["symbol", "trade_date"]) + merged.write_parquet(out) + added = merged.height - before + logger.info("adj_factor merged: %d total (+%d new), %d/%d symbols", + merged.height, added, new_data.height, len(symbols)) + return added, affected + else: + new_data.sort(["symbol", "trade_date"]).write_parquet(out) + logger.info("adj_factor synced: %d rows (%d symbols)", new_data.height, len(symbols)) + return new_data.height, affected + + +# ===== 分钟 K 同步 ===== + +CANONICAL_MINUTE_COLS = [ + "symbol", "datetime", "open", "high", "low", "close", "volume", "amount", +] + + +def _normalize_minute(df_in, default_symbol: str | None = None) -> pl.DataFrame: + """把 SDK 返回的分钟 K 数据规范成 canonical 列。""" + if df_in is None or len(df_in) == 0: + return pl.DataFrame() + + if not isinstance(df_in, pl.DataFrame): + df = pl.from_pandas(df_in.reset_index() if hasattr(df_in, "reset_index") else df_in) + else: + df = df_in + + rename_map = { + "ts_code": "symbol", + "vol": "volume", + "amt": "amount", + } + df = df.rename({k: v for k, v in rename_map.items() if k in df.columns}) + + # datetime 列:优先用 timestamp(毫秒精度),其次 trade_time + if "timestamp" in df.columns: + df = df.with_columns( + pl.from_epoch("timestamp", time_unit="ms").alias("datetime"), + ).drop("timestamp") + for drop_col in ("trade_time", "trade_date"): + if drop_col in df.columns: + df = df.drop(drop_col) + elif "trade_time" in df.columns: + df = df.rename({"trade_time": "datetime"}) + if "trade_date" in df.columns: + df = df.drop("trade_date") + elif "trade_date" in df.columns: + df = df.rename({"trade_date": "datetime"}) + + if "symbol" not in df.columns and default_symbol is not None: + df = df.with_columns(pl.lit(default_symbol).alias("symbol")) + + # 类型规范:统一转 Datetime('us') + if "datetime" in df.columns: + dt_type = df.schema["datetime"] + if not isinstance(dt_type, pl.Datetime) or dt_type.time_unit != "us": + df = df.with_columns(pl.col("datetime").cast(pl.Datetime("us"), strict=False)) + + for col in ("open", "high", "low", "close"): + if col in df.columns: + df = df.with_columns(pl.col(col).cast(pl.Float64, strict=False)) + for col in ("volume", "amount"): + if col in df.columns: + df = df.with_columns(pl.col(col).cast(pl.Float64, strict=False)) + + keep = [c for c in CANONICAL_MINUTE_COLS if c in df.columns] + return df.select(keep) + + +def _datetime_to_ms(dt: datetime) -> int: + """datetime → 毫秒时间戳 (供 SDK start_time / end_time 使用)。""" + return int(dt.timestamp() * 1000) + + +def sync_minute_batch( + symbols: list[str], + start_time: datetime | None = None, + end_time: datetime | None = None, + count: int | None = None, + batch_size: int | None = None, + rpm: int | None = None, + on_chunk_done: Callable[[int, int], None] | None = None, +) -> pl.DataFrame: + """批量拉取多股分钟 K。 + + 优先使用 start_time / end_time 区间, 确保所有标的覆盖同一时间段。 + count 仅作为 fallback 保留。 + on_chunk_done(current, total) 每个 chunk 完成后回调。 + """ + tf = get_client() + out: list[pl.DataFrame] = [] + interval = (60.0 / rpm) if rpm else 0 + + if batch_size is None: + chunks = [symbols] + else: + chunks = [symbols[i:i + batch_size] for i in range(0, len(symbols), batch_size)] + + for i, chunk in enumerate(chunks): + if i > 0 and interval > 0 and len(chunks) > rpm: + time.sleep(interval) + try: + if start_time and end_time: + raw = tf.klines.batch( + chunk, period="1m", + start_time=_datetime_to_ms(start_time), + end_time=_datetime_to_ms(end_time), + count=10000, + as_dataframe=True, show_progress=False, + ) + else: + raw = tf.klines.batch(chunk, period="1m", count=count or 1200, + as_dataframe=True, show_progress=False) + except Exception as e: # noqa: BLE001 + logger.warning("minute batch fetch failed for %d symbols: %s", len(chunk), e) + continue + + if isinstance(raw, dict): + for sym, sub in raw.items(): + if sub is None or len(sub) == 0: + continue + out.append(_normalize_minute(sub, default_symbol=sym)) + elif raw is not None and len(raw) > 0: + out.append(_normalize_minute(raw)) + + if on_chunk_done: + on_chunk_done(i + 1, len(chunks)) + + if not out: + return pl.DataFrame() + return pl.concat(out, how="diagonal_relaxed") + + +def fetch_minute_single(symbol: str, trade_date: date) -> pl.DataFrame: + """从数据源实时拉取单股单日分钟 K(不写入本地)。""" + from datetime import datetime + start_time = datetime(trade_date.year, trade_date.month, trade_date.day, 9, 25, 0) + end_time = datetime(trade_date.year, trade_date.month, trade_date.day, 15, 5, 0) + tf = get_client() + try: + raw = tf.klines.batch( + [symbol], period="1m", + start_time=_datetime_to_ms(start_time), + end_time=_datetime_to_ms(end_time), + count=10000, + as_dataframe=True, show_progress=False, + ) + except Exception as e: + logger.warning("fetch_minute_single(%s, %s) failed: %s", symbol, trade_date, e) + return pl.DataFrame() + + if isinstance(raw, dict): + sub = raw.get(symbol) + return _normalize_minute(sub) if sub is not None and len(sub) > 0 else pl.DataFrame() + if raw is not None and len(raw) > 0: + return _normalize_minute(raw) + return pl.DataFrame() + + +def _latest_minute_datetime(repo: KlineRepository) -> datetime | None: + """本地分钟 K 数据的最新时间。""" + try: + res = repo.execute_one("SELECT max(datetime) FROM kline_minute") + if res and res[0]: + d = res[0] + if isinstance(d, datetime): + return d + return datetime.fromisoformat(str(d)) + except Exception: # noqa: BLE001 + pass + return None + + +def _cleanup_null_datetime_minute(repo: KlineRepository) -> None: + """检测并清除 datetime 全为 null 的旧版分钟 K 数据(迁移用)。""" + minute_dir = repo.store.data_dir / "kline_minute" + if not minute_dir.exists(): + return + try: + row = repo.execute_one( + "SELECT count(*) AS total, count(datetime) AS non_null FROM kline_minute" + ) + if row and row[0] > 0 and (row[1] is None or row[1] == 0): + # 全部 datetime 为 null — 清除所有分钟 K parquet + n = 0 + for f in minute_dir.rglob("*.parquet"): + f.unlink() + n += 1 + logger.info("cleaned %d corrupted minute-K parquet files (null datetime)", n) + except Exception as e: # noqa: BLE001 + logger.debug("minute cleanup check failed: %s", e) + + +def _migrate_symbol_to_date_partition(repo: KlineRepository) -> None: + """将旧版 symbol= 分区迁移为 date= 分区。迁移完成后删除旧目录。""" + minute_dir = repo.store.data_dir / "kline_minute" + if not minute_dir.exists(): + return + + old_dirs = [d for d in minute_dir.iterdir() if d.is_dir() and d.name.startswith("symbol=")] + if not old_dirs: + return + + logger.info("migrating %d symbol-partitioned minute-K dirs to date partition…", len(old_dirs)) + + all_frames: list[pl.DataFrame] = [] + for sym_dir in old_dirs: + for pq in sym_dir.glob("*.parquet"): + try: + df = pl.read_parquet(pq) + if "datetime" in df.columns: + df = df.filter(pl.col("datetime").is_not_null()) + if not df.is_empty(): + all_frames.append(df) + except Exception: # noqa: BLE001 + pass + + if not all_frames: + # 数据全部不可用,直接删旧目录 + for d in old_dirs: + d.mkdir(parents=True, exist_ok=True) + for f in d.rglob("*"): + if f.is_file(): + f.unlink() + d.rmdir() + return + + combined = pl.concat(all_frames, how="diagonal_relaxed") + combined = combined.unique(subset=["symbol", "datetime"], keep="last") + + # 按日期写新分区 + combined = combined.with_columns(pl.col("datetime").dt.date().alias("_trade_date")) + for day_df in combined.partition_by("_trade_date"): + trade_date = day_df["_trade_date"][0] + out = minute_dir / f"date={trade_date}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + day_df = day_df.drop("_trade_date").sort("symbol", "datetime") + day_df.write_parquet(out) + + # 删旧目录 + for d in old_dirs: + for f in d.rglob("*"): + if f.is_file(): + f.unlink() + # 移除空目录 + try: + d.rmdir() + except OSError: + pass + + logger.info("minute-K migration done: %d rows migrated", combined.height) + + +def sync_and_persist_minute( + symbols: list[str], + repo: KlineRepository, + capset: CapabilitySet, + days: int = 5, + on_chunk_done: Callable[[int, int], None] | None = None, +) -> int: + """同步分钟 K 并存到 Parquet(仅 raw,不前复权)。返回写入行数。 + + 使用 start_time / end_time 区间拉取, 确保所有标的覆盖同一时间段。 + on_chunk_done(current, total) 每个 chunk 完成后回调。 + """ + if not symbols or not capset.has(Cap.KLINE_MINUTE_BATCH): + return 0 + + # 迁移:旧版 _normalize_minute 未转换 timestamp→datetime,导致全部 datetime 为 null + # 检测到后直接清除(这些数据无法使用) + _cleanup_null_datetime_minute(repo) + + # 迁移:旧版按 symbol= 分区转为 date= 分区 + _migrate_symbol_to_date_partition(repo) + + now = datetime.now() + + # 计算时间区间: 首次拉取回溯 N 天, 增量从最后数据时间开始 + last_dt = _latest_minute_datetime(repo) + if last_dt: + start_time = last_dt + else: + start_time = now - timedelta(days=days) + end_time = now + + lim = capset.limits(Cap.KLINE_MINUTE_BATCH) + batch_size = lim.batch if lim and lim.batch else 100 + rpm = lim.rpm if lim else 30 + + df = sync_minute_batch(symbols, start_time=start_time, end_time=end_time, + batch_size=batch_size, rpm=rpm, + on_chunk_done=on_chunk_done) + if df.is_empty(): + return 0 + + # 按日期分区写: data/kline_minute/date={YYYY-MM-DD}/part.parquet + df = df.with_columns( + pl.col("datetime").dt.date().alias("_trade_date") + ) + written = 0 + for day_df in df.partition_by("_trade_date"): + trade_date = day_df["_trade_date"][0] + out = repo.store.data_dir / "kline_minute" / f"date={trade_date}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + if out.exists(): + existing = pl.read_parquet(out) + if "datetime" in existing.columns: + existing = existing.filter(pl.col("datetime").is_not_null()) + day_df = pl.concat([existing, day_df.drop("_trade_date")]).unique( + subset=["symbol", "datetime"], keep="last", + ) + else: + day_df = day_df.drop("_trade_date") + day_df = day_df.sort("symbol", "datetime") + day_df.write_parquet(out) + written += day_df.height + + # 刷新视图 + try: + d = repo.store.data_dir.as_posix() + repo.db.execute( + f"""CREATE OR REPLACE VIEW kline_minute AS + SELECT * FROM read_parquet('{d}/kline_minute/**/*.parquet', union_by_name=true)""" + ) + except Exception as e: # noqa: BLE001 + logger.warning("refresh kline_minute view failed: %s", e) + + logger.info("minute K synced: %d rows (%d symbols)", written, len(symbols)) + return written diff --git a/backend/app/services/notify_adapter.py b/backend/app/services/notify_adapter.py new file mode 100644 index 0000000..ea3e0fe --- /dev/null +++ b/backend/app/services/notify_adapter.py @@ -0,0 +1,112 @@ +"""系统通知适配器 — 调用操作系统原生通知命令。 + +职责: 把后端产生的告警事件推送到操作系统通知中心。 + 窗口最小化 / 被遮挡 / 后台运行时都能弹通知。 + +平台实现: + - macOS: osascript (系统已内置) + - Linux: notify-send (系统已内置) + - Windows: 暂不支持原生通知中心 (无额外依赖实现) + +设计: 失败静默降级, 绝不因通知失败阻断告警主流程 (落盘 / SSE 推送)。 + 通知去重不在本层做, 复用 MonitorRuleEngine 的 cooldown 逻辑。 +""" +from __future__ import annotations + +import logging +import subprocess +import sys +from pathlib import Path + +logger = logging.getLogger(__name__) + +# 单次通知最长字符 (避免某些平台截断报错) +_MAX_LEN = 200 + +# 避免重复探测平台能力, 缓存一次 +_backend_cache: str | None = None + + +def _detect_backend() -> str | None: + """探测当前平台可用的通知后端。""" + global _backend_cache + if _backend_cache is not None: + return _backend_cache if _backend_cache != "none" else None + + backend = None + if sys.platform == "darwin": + backend = "osascript" + elif sys.platform.startswith("linux"): + backend = "notify-send" + + _backend_cache = backend or "none" + return backend + + +def _truncate(text: str) -> str: + """截断超长文本, 避免平台通知上限报错。""" + text = (text or "").strip() + return text[:_MAX_LEN] + ("…" if len(text) > _MAX_LEN else "") + + +def notify(title: str, message: str, icon: Path | None = None) -> bool: + """推送一条系统通知。 + + Args: + title: 通知标题 + message: 通知正文 + icon: 可选图标路径 (部分平台支持) + + Returns: + True=成功送达, False=失败或无可用后端。 + 失败静默, 不抛异常 (通知是辅助通道, 不能阻断告警主流程)。 + """ + title = _truncate(title) + message = _truncate(message) + if not title: + return False + + backend = _detect_backend() + if backend is None: + return False + + try: + if backend == "osascript": + return _notify_osascript(title, message) + if backend == "notify-send": + return _notify_notify_send(title, message, icon) + except Exception as e: # noqa: BLE001 + logger.debug("系统通知失败 (%s): %s", backend, e) + return False + + return False + + +def _notify_osascript(title: str, message: str) -> bool: + """macOS 通知 (osascript) — 调用系统 AppleScript。""" + # 转义双引号, 避免 AppleScript 注入 + safe_title = title.replace('"', '\\"') + safe_msg = message.replace('"', '\\"') + script = ( + f'display notification "{safe_msg}" with title "{safe_title}"' + ) + result = subprocess.run( # noqa: S603, S607 + ["osascript", "-e", script], + capture_output=True, + timeout=5, + ) + return result.returncode == 0 + + +def _notify_notify_send(title: str, message: str, icon: Path | None) -> bool: + """Linux 通知 (notify-send) — freedesktop.org 标准。""" + args = ["notify-send", title] + if icon and Path(icon).exists(): + args.extend(["--icon", str(icon)]) + args.append(message) + result = subprocess.run( # noqa: S603 + args, + capture_output=True, + timeout=5, + ) + return result.returncode == 0 diff --git a/backend/app/services/pipeline_jobs.py b/backend/app/services/pipeline_jobs.py new file mode 100644 index 0000000..979eddb --- /dev/null +++ b/backend/app/services/pipeline_jobs.py @@ -0,0 +1,250 @@ +"""异步盘后管道任务注册表 — 每个 job 独立 JSON 文件。 + +设计: + - job_store/ 文件夹,每个 job 一个 {id}.json,最多保留 max_jobs 个文件 + - running/pending 状态的 job 仅存内存(高频读写) + - succeeded/failed 后写入独立文件并从内存释放 + - 列表查询 = 内存中的活跃 job + 磁盘文件扫描,按时间排序 + - 单个查询 = 内存优先,没有则读磁盘 + - 创建新 job 前检查文件数量,>= max_jobs 时删除最老的文件 +""" +from __future__ import annotations + +import json +import logging +import os +import threading +import uuid +from datetime import datetime +from pathlib import Path +from typing import Any, Literal + +logger = logging.getLogger(__name__) + +JobStatus = Literal["pending", "running", "succeeded", "failed"] + + +def _default_store_dir() -> Path: + from app.config import settings + return settings.data_dir / "job_store" + + +_STORE_DIR = _default_store_dir() + + +class JobStore: + def __init__(self, max_jobs: int = 50, store_dir: Path = _STORE_DIR) -> None: + self._max_jobs = max_jobs + self._store_dir = store_dir + self._active_jobs: dict[str, dict[str, Any]] = {} # running/pending + self._active_id: str | None = None + self._lock = threading.Lock() + self._store_dir.mkdir(parents=True, exist_ok=True) + + # ===== persistence ===== + + def _write_file(self, job: dict[str, Any]) -> None: + """将终态 job 写入独立 JSON 文件。""" + path = self._store_dir / f"{job['id']}.json" + try: + path.write_text( + json.dumps(job, ensure_ascii=False, indent=None), + encoding="utf-8", + ) + except Exception: + logger.warning("failed to write job file %s", path) + + def _read_file(self, job_id: str) -> dict[str, Any] | None: + """从磁盘读取单个 job 文件。""" + path = self._store_dir / f"{job_id}.json" + if not path.exists(): + return None + try: + return json.loads(path.read_text("utf-8")) + except Exception: + logger.warning("failed to read job file %s", path) + return None + + def _delete_oldest(self) -> None: + """删除最老的 job 文件,保持文件数量 < max_jobs。""" + try: + files = sorted(self._store_dir.glob("*.json"), key=lambda f: f.stat().st_mtime) + except Exception: + return + while len(files) >= self._max_jobs: + oldest = files.pop(0) + try: + oldest.unlink() + except Exception: + logger.warning("failed to delete old job file %s", oldest) + + def _job_files_sorted(self) -> list[dict[str, Any]]: + """扫描磁盘上所有 job 文件,按 started_at 从新到旧排序。""" + jobs: list[dict[str, Any]] = [] + for f in self._store_dir.glob("*.json"): + try: + jobs.append(json.loads(f.read_text("utf-8"))) + except Exception: + continue + jobs.sort(key=lambda j: j.get("started_at") or "", reverse=True) + return jobs + + # ===== lifecycle ===== + + def create(self) -> str: + with self._lock: + if self._active_id and self._active_jobs.get(self._active_id, {}).get("status") == "running": + return self._active_id + + job_id = uuid.uuid4().hex[:10] + self._active_jobs[job_id] = { + "id": job_id, + "status": "pending", + "stage": "init", + "progress": 0, + "stage_pct": 0, + "log": [], + "started_at": None, + "finished_at": None, + "duration_s": None, + "result": None, + "error": None, + } + self._active_id = job_id + return job_id + + def start(self, job_id: str) -> None: + with self._lock: + j = self._active_jobs.get(job_id) + if not j: + return + j["status"] = "running" + j["started_at"] = datetime.utcnow().isoformat(timespec="seconds") + "Z" + + def succeed(self, job_id: str, result: Any) -> None: + with self._lock: + j = self._active_jobs.pop(job_id, None) + if not j: + return + j["status"] = "succeeded" + j["finished_at"] = datetime.utcnow().isoformat(timespec="seconds") + "Z" + j["progress"] = 100 + j["result"] = result + j["duration_s"] = _duration_s(j) + if self._active_id == job_id: + self._active_id = None + self._delete_oldest() + self._write_file(j) + + def fail(self, job_id: str, error: str) -> None: + with self._lock: + j = self._active_jobs.pop(job_id, None) + if not j: + return + j["status"] = "failed" + j["finished_at"] = datetime.utcnow().isoformat(timespec="seconds") + "Z" + j["error"] = error + j["duration_s"] = _duration_s(j) + if self._active_id == job_id: + self._active_id = None + self._delete_oldest() + self._write_file(j) + + # ===== progress ===== + + def progress(self, job_id: str, stage: str, pct: int, msg: str, + stage_pct: int | None = None, skip_log: bool = False) -> None: + with self._lock: + j = self._active_jobs.get(job_id) + if not j: + return + j["stage"] = stage + j["progress"] = max(0, min(100, int(pct))) + if stage_pct is not None: + j["stage_pct"] = max(0, min(100, int(stage_pct))) + elif j["stage"] != stage: + j["stage_pct"] = 0 + entry = { + "ts": datetime.utcnow().isoformat(timespec="seconds") + "Z", + "stage": stage, + "msg": msg, + } + if skip_log: + entry["_skip"] = True + if skip_log and j["log"] and j["log"][-1].get("stage") == stage and j["log"][-1].get("_skip"): + j["log"][-1] = entry + else: + j["log"].append(entry) + if len(j["log"]) > 200: + j["log"] = j["log"][-200:] + + # ===== query ===== + + def get(self, job_id: str) -> dict[str, Any] | None: + # 内存中的活跃 job 优先 + j = self._active_jobs.get(job_id) + if j: + return j + # 否则从磁盘读 + return self._read_file(job_id) + + def list_recent(self, limit: int = 20) -> list[dict[str, Any]]: + # 合并: 内存中的活跃 job + 磁盘文件 + all_jobs: list[dict[str, Any]] = list(self._active_jobs.values()) + all_jobs.extend(self._job_files_sorted()) + # 按 started_at 从新到旧排序,去重(理论上不会有重复) + seen: set[str] = set() + result: list[dict[str, Any]] = [] + for j in sorted(all_jobs, key=lambda x: x.get("started_at") or "", reverse=True): + jid = j["id"] + if jid in seen: + continue + seen.add(jid) + result.append(_summary(j)) + if len(result) >= limit: + break + return result + + def active_id(self) -> str | None: + return self._active_id + + def clear(self) -> None: + """清空所有任务(内存 + 磁盘文件)。""" + with self._lock: + self._active_jobs.clear() + self._active_id = None + for f in self._store_dir.glob("*.json"): + try: + f.unlink() + except Exception: + pass + + +def _summary(j: dict[str, Any]) -> dict[str, Any]: + return { + "id": j["id"], + "status": j["status"], + "stage": j["stage"], + "progress": j["progress"], + "stage_pct": j.get("stage_pct", 0), + "started_at": j["started_at"], + "finished_at": j["finished_at"], + "duration_s": j["duration_s"], + "result": j["result"], + "error": j["error"], + } + + +def _duration_s(j: dict[str, Any]) -> float | None: + if not j.get("started_at") or not j.get("finished_at"): + return None + try: + s = datetime.fromisoformat(j["started_at"]) + e = datetime.fromisoformat(j["finished_at"]) + return round((e - s).total_seconds(), 2) + except Exception: # noqa: BLE001 + return None + + +# 进程内单例 +job_store = JobStore() diff --git a/backend/app/services/preferences.py b/backend/app/services/preferences.py new file mode 100644 index 0000000..a7e88d9 --- /dev/null +++ b/backend/app/services/preferences.py @@ -0,0 +1,313 @@ +"""用户偏好设置持久化。 + +存储位置: data/user_data/preferences.json +沿用 secrets_store 的 merge-write 模式,但不做 chmod 0600 (非敏感数据)。 +""" +from __future__ import annotations + +import json +import logging +from pathlib import Path + +logger = logging.getLogger(__name__) + + +def _path() -> Path: + from app.config import settings + p = settings.data_dir / "user_data" / "preferences.json" + p.parent.mkdir(parents=True, exist_ok=True) + return p + + +def load() -> dict: + p = _path() + if p.exists(): + try: + return json.loads(p.read_text(encoding="utf-8")) + except Exception as e: # noqa: BLE001 + logger.warning("preferences.json malformed: %s", e) + return {} + + +def save(updates: dict) -> dict: + """合并写入。返回新内容。""" + current = load() + current.update(updates) + _path().write_text( + json.dumps(current, indent=2, ensure_ascii=False), encoding="utf-8", + ) + return current + + +def get_realtime_quotes_enabled() -> bool: + return load().get("realtime_quotes_enabled", False) + + +def get_indices_nav_pinned() -> bool: + """侧栏指数报价卡片是否固定显示。默认 True(常驻)。 + 关闭后,卡片跟随实时行情开关(仅实时开时显示)。""" + return load().get("indices_nav_pinned", True) + + +def get_realtime_quote_interval() -> float: + return load().get("realtime_quote_interval", 10.0) + + +def set_realtime_quote_interval(interval: float) -> float: + """保存行情轮询间隔(不在此做 min/max 校验,由调用方按档位限制)。""" + current = load() + current["realtime_quote_interval"] = interval + _path().write_text( + json.dumps(current, indent=2, ensure_ascii=False), encoding="utf-8", + ) + return interval + + +def get_minute_sync_enabled() -> bool: + return load().get("minute_sync_enabled", False) + + +def get_minute_sync_days() -> int: + return max(1, min(30, load().get("minute_sync_days", 5))) + + +def get_pipeline_schedule() -> dict: + """返回盘后管道调度时间 {"hour": 15, "minute": 30}。""" + d = load().get("pipeline_schedule", {"hour": 15, "minute": 30}) + return {"hour": d.get("hour", 15), "minute": d.get("minute", 30)} + + +def set_pipeline_schedule(hour: int, minute: int) -> dict: + h = max(0, min(23, hour)) + m = max(0, min(59, minute)) + # 盘后不早于 15:00 + if h * 60 + m < 15 * 60: + h, m = 15, 0 + save({"pipeline_schedule": {"hour": h, "minute": m}}) + return {"hour": h, "minute": m} + + +def get_instruments_schedule() -> dict: + """返回盘前标的维表调度时间 {"hour": 9, "minute": 10}。""" + d = load().get("instruments_schedule", {"hour": 9, "minute": 10}) + return {"hour": d.get("hour", 9), "minute": d.get("minute", 10)} + + +def set_instruments_schedule(hour: int, minute: int) -> dict: + h = max(0, min(23, hour)) + m = max(0, min(59, minute)) + # 盘前不晚于 09:15 + if h * 60 + m > 9 * 60 + 15: + h, m = 9, 15 + save({"instruments_schedule": {"hour": h, "minute": m}}) + return {"hour": h, "minute": m} + + +def get_enriched_batch_size() -> int: + """返回 enriched 全量计算每批 symbol 数量。""" + return max(1, min(10000, load().get("enriched_batch_size", 1000))) + + +def set_enriched_batch_size(size: int) -> int: + """保存 enriched 全量计算批次大小。""" + size = max(10, min(6000, size)) + save({"enriched_batch_size": size}) + return size + + +def get_index_daily_batch_size() -> int: + """返回指数日 K 同步每批 symbol 数量。""" + return max(1, min(10000, load().get("index_daily_batch_size", 100))) + + +def set_index_daily_batch_size(size: int) -> int: + """保存指数日 K 同步批次大小。""" + size = max(1, min(10000, size)) + save({"index_daily_batch_size": size}) + return size + + +# ── 五档盘口 sealed(真假涨停) 配置 ────────────────────── + +def get_limit_ladder_monitor_enabled() -> bool: + """连板梯队 5 档监控开关。关闭时 depth 不轮询(连板梯队降级显示)。""" + return load().get("limit_ladder_monitor_enabled", False) + + +def get_depth_polling_interval() -> float: + """depth 盘中轮询间隔(秒)。默认 20(Pro/Expert 都适用)。""" + return float(load().get("depth_polling_interval", 20.0)) + + +def set_depth_polling_interval(interval: float) -> float: + """保存 depth 轮询间隔。套餐范围 clamp 由 depth_service 按档位做。""" + interval = max(1.0, min(600.0, float(interval))) + save({"depth_polling_interval": interval}) + return interval + + +def get_depth_finalize_time() -> dict: + """盘后 sealed 定版时间 {"hour": 15, "minute": 2}。范围 15:01~18:00。""" + d = load().get("depth_finalize_time", {"hour": 15, "minute": 2}) + return {"hour": d.get("hour", 15), "minute": d.get("minute", 2)} + + +def set_depth_finalize_time(hour: int, minute: int) -> dict: + """保存盘后 sealed 定版时间,强制范围 15:01~18:00。""" + h = max(0, min(23, hour)) + m = max(0, min(59, minute)) + # 下限 15:01, 上限 18:00 + if h * 60 + m < 15 * 60 + 1: + h, m = 15, 1 + if h * 60 + m > 18 * 60: + h, m = 18, 0 + save({"depth_finalize_time": {"hour": h, "minute": m}}) + return {"hour": h, "minute": m} + + + +# ===== 实时监控 ===== + +# 页面 SSE 刷新配置: { "watchlist": true, "monitor": true, ... } +# 可刷新的页面列表及其默认值 +SSE_REFRESH_PAGES_DEFAULT = { + "watchlist": True, + "limit-ladder": False, +} + +SIDEBAR_INDEX_SYMBOLS_DEFAULT = ["000001.SH", "399001.SZ", "399006.SZ", "000680.SH"] + + +def get_sse_refresh_pages() -> dict[str, bool]: + """返回每个页面的 SSE 刷新开关。""" + stored = load().get("sse_refresh_pages", {}) + # 合并默认值 (新增页面自动出现) + result = dict(SSE_REFRESH_PAGES_DEFAULT) + result.update(stored) + return result + + +def set_sse_refresh_pages(pages: dict[str, bool]) -> dict[str, bool]: + """保存页面 SSE 刷新配置。""" + save({"sse_refresh_pages": pages}) + return get_sse_refresh_pages() + + +def get_sidebar_index_symbols() -> list[str]: + """返回左侧菜单显示的指数代码。""" + stored = load().get("sidebar_index_symbols", SIDEBAR_INDEX_SYMBOLS_DEFAULT) + allowed = set(SIDEBAR_INDEX_SYMBOLS_DEFAULT) + return [s for s in stored if s in allowed] + + +def get_strategy_monitor_enabled() -> bool: + """策略告警评估总开关。""" + return load().get("strategy_monitor_enabled", False) + + +def get_system_notify_enabled() -> bool: + """系统通知开关 — 开启后监控告警同时推送到操作系统通知中心。""" + return load().get("system_notify_enabled", False) + + +def set_system_notify_enabled(enabled: bool) -> bool: + """保存系统通知开关。""" + save({"system_notify_enabled": bool(enabled)}) + return bool(enabled) + + +def get_screener_auto_run() -> bool: + """选股页进入时是否自动运行所有策略 (获取命中数)。默认开。""" + return load().get("screener_auto_run", True) + + +def get_strategy_monitor_ids() -> list[str]: + """返回监控池中的策略 ID。""" + return load().get("strategy_monitor_ids", []) + + +def set_realtime_monitor_config(cfg: dict) -> dict: + """批量更新实时监控配置。""" + updates = {} + if "sse_refresh_pages" in cfg: + updates["sse_refresh_pages"] = cfg["sse_refresh_pages"] + if "strategy_monitor_enabled" in cfg: + updates["strategy_monitor_enabled"] = cfg["strategy_monitor_enabled"] + if "strategy_monitor_ids" in cfg: + updates["strategy_monitor_ids"] = cfg["strategy_monitor_ids"] + if "sidebar_index_symbols" in cfg: + allowed = set(SIDEBAR_INDEX_SYMBOLS_DEFAULT) + updates["sidebar_index_symbols"] = [s for s in cfg["sidebar_index_symbols"] if s in allowed] + if "screener_auto_run" in cfg: + updates["screener_auto_run"] = bool(cfg["screener_auto_run"]) + if updates: + save(updates) + return get_realtime_monitor_config() + + +def get_realtime_monitor_config() -> dict: + """返回完整的实时监控配置。""" + return { + "sse_refresh_pages": get_sse_refresh_pages(), + "strategy_monitor_enabled": get_strategy_monitor_enabled(), + "strategy_monitor_ids": get_strategy_monitor_ids(), + "sidebar_index_symbols": get_sidebar_index_symbols(), + "screener_auto_run": get_screener_auto_run(), + } + + +def get_nav_order() -> list[str]: + """返回左侧菜单的自定义排序(内置页面 path + 扩展分析菜单 id)。""" + return load().get("nav_order", []) + + +def set_nav_order(order: list[str]) -> list[str]: + """保存左侧菜单排序。""" + save({"nav_order": order}) + return get_nav_order() + + +def get_nav_hidden() -> list[str]: + """返回左侧菜单中隐藏的项 id 列表。""" + return load().get("nav_hidden", []) + + +def set_nav_hidden(hidden: list[str]) -> list[str]: + """保存左侧菜单隐藏项。""" + save({"nav_hidden": hidden}) + return get_nav_hidden() + + +def get_watchlist_columns() -> list[dict] | None: + """返回自选列表列配置。""" + return load().get("watchlist_columns") + + +def set_watchlist_columns(columns: list[dict]) -> list[dict]: + """保存自选列表列配置。""" + save({"watchlist_columns": columns}) + return columns + + +def get_screener_result_columns() -> list[dict] | None: + """返回策略结果列表列配置。""" + return load().get("screener_result_columns") + + +def set_screener_result_columns(columns: list[dict]) -> list[dict]: + """保存策略结果列表列配置。""" + save({"screener_result_columns": columns}) + return columns + + +# ===== 首次使用引导 ===== + +def get_onboarding_completed() -> bool: + """是否已完成首次使用向导。默认 False(新用户)。""" + return bool(load().get("onboarding_completed", False)) + + +def set_onboarding_completed(done: bool = True) -> bool: + """标记首次使用向导完成状态。""" + save({"onboarding_completed": bool(done)}) + return bool(done) diff --git a/backend/app/services/quote_service.py b/backend/app/services/quote_service.py new file mode 100644 index 0000000..9c2bfc6 --- /dev/null +++ b/backend/app/services/quote_service.py @@ -0,0 +1,779 @@ +"""全局实时行情服务。 + +集中管理全市场行情拉取 + enriched 缓存,供盘中选股、自选股等所有模块复用。 + +架构: + - 后台线程轮询数据源 get_by_universes(["CN_Equity_A", "CN_Index"]) + - 拉取行情 → 写 kline_daily (不复权) + 增量计算 enriched → 写盘 + 更新缓存 + - _enriched_cache 是唯一的盘中数据源 (OHLCV + 全套技术指标) + - _live_agg_cache 是递推状态 (只加载一次, 盘中不变) + +数据流 (每轮 ~15s): + 1. API 拉取 → raw_records (临时变量) + 2. raw_records → 写 kline_daily (不复权原始价格) + 3. raw_records → 更新 _enriched_cache 的 OHLCV + 4. 增量计算 enriched 指标 (~50ms) + 5. 写 kline_daily_enriched + 替换 _enriched_cache + 6. 通知 SSE + +生命周期: + - 服务启动时读取 preferences,若 enabled 则自动启动线程 + - 运行中可通过 API 切换开关 + - 关闭时停止线程 +""" +from __future__ import annotations + +import logging +import threading +import time +from datetime import date, datetime, time as dt_time + +import polars as pl + +logger = logging.getLogger(__name__) + + +class QuoteService: + """全局实时行情服务 — 单例。""" + + CORE_INDEX_SYMBOLS = ("000001.SH", "399001.SZ", "399006.SZ", "000680.SH") + + # 档位 → 最小轮询间隔 (秒) + TIER_MIN_INTERVAL = { + "expert": 1.0, + "pro": 2.0, + "starter": 3.0, + } + DEFAULT_INTERVAL = 10.0 + MAX_INTERVAL = 60.0 + + def __init__(self) -> None: + self._lock = threading.Lock() + self._running = False + self._enabled = False # 全局开关 (持久化到 preferences) + self._interval = self.DEFAULT_INTERVAL + self._thread: threading.Thread | None = None + self._repo = None # 延迟注入, 避免循环导入 + self._update_event = threading.Event() # SSE 通知: 行情更新后 set + self._alert_event = threading.Event() # SSE 通知: 有告警时 set + self._depth_update_event = threading.Event() # SSE 通知: depth 五档修正后 set (刷新连板梯队) + self._pending_alerts: list[dict] = [] # 待推送的告警 + self._max_pending_alerts: int = 1000 # 背压上限: 超出丢弃最旧 + self._strategy_monitor = None # 延迟注入 + self._app_state = None # 延迟注入 (FastAPI app.state) + + # 拉取元信息 (给 SSE / status 用) + self._fetch_time: float = 0.0 # perf_counter (用于计算 quote_age_ms) + self._fetch_ms: float = 0.0 # 拉取耗时 (毫秒) + self._fetched_at: float = 0.0 # 拉取完成的 Unix 时间戳 (毫秒) + self._symbol_count: int = 0 + self._index_symbol_count: int = 0 + self._index_quotes_cache: pl.DataFrame | None = None + + # ================================================================ + # 生命周期 + # ================================================================ + + def start(self, interval: float = 0.0) -> None: + """启动后台行情轮询线程。""" + if self._running: + return + if interval <= 0: + from app.services import preferences + interval = preferences.get_realtime_quote_interval() + self._interval = self._clamp_interval(interval) + self._running = True + self._enabled = True + self._thread = threading.Thread(target=self._poll_loop, daemon=True) + self._thread.start() + self._save_enabled(True) + logger.info("行情服务已启动, 轮询间隔 %.1fs", self._interval) + + def stop(self) -> None: + """停止后台行情轮询线程。""" + self._running = False + self._enabled = False + if self._thread: + self._thread.join(timeout=10) + self._thread = None + self._save_enabled(False) + logger.info("行情服务已停止") + + def enable(self) -> bool: + """开启自动行情 (不立即启动线程,等下一个交易时段)。 + + none/free 档无实时行情权限,拒绝开启并返回 False; + starter+ 正常启动。返回值表示是否真正开启。 + """ + if not self.is_realtime_allowed(): + logger.warning("实时行情开启被拒:当前档位(none/free)无实时行情权限") + return False + self._enabled = True + self._save_enabled(True) + if not self._running: + from app.services import preferences + self._interval = self._clamp_interval(preferences.get_realtime_quote_interval()) + self._running = True + self._thread = threading.Thread(target=self._poll_loop, daemon=True) + self._thread.start() + logger.info("行情服务已启用, 轮询间隔 %.1fs", self._interval) + + def disable(self) -> None: + """关闭自动行情。""" + self.stop() + logger.info("行情服务已关闭") + + def boot_check(self) -> None: + """启动时检查 preferences,若 enabled 则自动启动。 + + none/free 档无实时行情权限:即使 preferences 标记为 enabled, + 也不启动,并同步 preferences 为关闭(避免 UI 误显示已开启)。 + """ + from app.services import preferences + if not self.is_realtime_allowed(): + if preferences.get_realtime_quotes_enabled(): + self._save_enabled(False) + logger.info("实时行情未启动:当前档位(none/free)无实时行情权限") + return + if preferences.get_realtime_quotes_enabled(): + self.start() + + def set_repo(self, repo) -> None: + """注入 KlineRepository, 用于实时落盘。""" + self._repo = repo + + def set_app_state(self, app_state) -> None: + """注入 FastAPI app.state, 用于获取 strategy_monitor 等单例。""" + self._app_state = app_state + + def set_interval(self, interval: float) -> float: + """运行时更新轮询间隔(立即生效)。""" + clamped = self._clamp_interval(interval) + self._interval = clamped + from app.services import preferences + preferences.set_realtime_quote_interval(clamped) + logger.info("轮询间隔已更新为 %.1fs", clamped) + return clamped + + def get_min_interval(self) -> float: + """返回当前档位允许的最小间隔。""" + return self._tier_min_interval() + + def wait_for_update(self, timeout: float = 30.0) -> bool: + """阻塞等待下一次行情更新 (供 SSE 线程使用)。""" + self._update_event.clear() + return self._update_event.wait(timeout=timeout) + + def wait_for_alert(self, timeout: float = 30.0) -> bool: + """阻塞等待告警 (供 SSE 线程使用)。""" + self._alert_event.clear() + return self._alert_event.wait(timeout=timeout) + + def notify_depth_updated(self) -> None: + """五档盘口修正完成后调用: 通知 SSE 推送 depth_updated, 触发连板梯队刷新。 + + 与行情/告警通道独立 — 只刷新连板梯队, 不连带刷新 watchlist 等。 + """ + self._depth_update_event.set() + + def wait_for_depth_update(self, timeout: float = 30.0) -> bool: + """阻塞等待 depth 修正 (供 SSE 线程使用)。""" + self._depth_update_event.clear() + return self._depth_update_event.wait(timeout=timeout) + + def pop_alerts(self) -> list[dict]: + """取走所有待推送的告警 (线程安全)。""" + with self._lock: + alerts = self._pending_alerts + self._pending_alerts = [] + return alerts + + # ================================================================ + # 档位感知间隔限制 + # ================================================================ + + @staticmethod + def _current_tier() -> str: + """获取当前档位名(小写)。""" + from app.tickflow.policy import tier_label + return tier_label().split()[0].split("+")[0].strip().lower() + + @classmethod + def is_realtime_allowed(cls) -> bool: + """当前档位是否允许使用实时行情。 + + none/free 档走 free-api 服务器,无实时行情权限 → 不允许; + starter+ 付费档走付费端点,有实时行情 → 允许。 + """ + return cls._current_tier() not in ("none", "free") + + @classmethod + def _tier_min_interval(cls) -> float: + tier = cls._current_tier() + return cls.TIER_MIN_INTERVAL.get(tier, cls.DEFAULT_INTERVAL) + + def _clamp_interval(self, interval: float) -> float: + return max(self._tier_min_interval(), min(self.MAX_INTERVAL, interval)) + + # ================================================================ + # 行情数据访问 + # ================================================================ + + def get_enriched_today(self) -> tuple[pl.DataFrame, date | None]: + """返回今天 enriched 数据 + 日期 (线程安全)。 + + 所有页面统一通过此方法获取实时行情 + 技术指标。 + """ + if not self._repo: + return pl.DataFrame(), None + return self._repo.get_enriched_latest() + + def get_quotes_compat(self) -> pl.DataFrame: + """兼容接口: 返回行情 DataFrame (用于盘中选股等需要 last_price/prev_close 的场景)。 + + 从 _enriched_cache 取 today 的数据, 只选行情基础列, 补上 last_price 别名。 + 不返回指标列, 避免 JOIN live_agg 时列名冲突。 + """ + df, _ = self.get_enriched_today() + if df.is_empty(): + return df + + # 只取盘中选股需要的行情基础列 + keep = [c for c in [ + "symbol", "close", "open", "high", "low", "volume", "amount", + "prev_close", "change_pct", "change_amount", "amplitude", "turnover_rate", + ] if c in df.columns] + df = df.select(keep) + + # enriched 的 close 等价于 last_price + if "close" in df.columns and "last_price" not in df.columns: + df = df.with_columns(pl.col("close").alias("last_price")) + return df + + def get_index_quotes(self, symbols: list[str] | None = None) -> pl.DataFrame: + """返回实时指数行情缓存。不会触发数据源请求。""" + with self._lock: + df = self._index_quotes_cache.clone() if self._index_quotes_cache is not None else pl.DataFrame() + if df.is_empty(): + return df + if symbols: + return df.filter(pl.col("symbol").is_in(symbols)) + return df + + def status(self) -> dict: + """返回行情服务状态。""" + age = (time.perf_counter() - self._fetch_time) * 1000 if self._fetch_time else -1 + return { + "enabled": self._enabled, + "running": self._running, + "interval_s": self._interval, + "symbol_count": self._symbol_count, + "index_symbol_count": self._index_symbol_count, + "quote_age_ms": round(age, 0) if age >= 0 else None, + "is_trading_hours": self._is_trading_hours(), + "last_fetch_ms": round(self._fetched_at, 0) if self._fetched_at else None, + } + + def refresh(self) -> dict: + """手动触发一次行情拉取。""" + self._fetch_quotes() + return self.status() + + # ================================================================ + # 后台轮询 + # ================================================================ + + def _poll_loop(self) -> None: + while self._running and self._enabled: + try: + if self._is_trading_hours(): + self._fetch_quotes() + else: + logger.debug("非交易时段, 跳过行情轮询") + except Exception as e: # noqa: BLE001 + logger.warning("行情轮询异常: %s", e) + + waited = 0.0 + while self._running and self._enabled and waited < self._interval: + time.sleep(0.5) + waited += 0.5 + + def _fetch_quotes(self) -> None: + """拉取全市场行情 → 写 daily + 计算 enriched + 更新缓存。""" + from app.tickflow.client import get_client + + tf = get_client() + t0 = time.perf_counter() + now_ts = time.perf_counter() + + try: + all_index_symbols = set(self._repo.get_index_symbol_set()) if self._repo else set() + all_index_symbols.update(self.CORE_INDEX_SYMBOLS) + resp = tf.quotes.get_by_universes(universes=["CN_Equity_A", "CN_Index"]) + except Exception as e: # noqa: BLE001 + logger.warning("行情拉取失败: %s", e) + return + + if not resp: + logger.warning("行情数据为空") + return + + # ---- 解析 API 响应 (临时变量, 用完丢弃) ---- + records = [] + for q in resp: + ext = q.get("ext") or {} + last_price = q.get("last_price") + prev_close = q.get("prev_close") + change_amount = ext.get("change_amount") + change_pct = ext.get("change_pct") + if change_amount is None and last_price is not None and prev_close is not None: + change_amount = float(last_price) - float(prev_close) + if change_pct is None and change_amount is not None and prev_close not in (None, 0): + change_pct = float(change_amount) / float(prev_close) * 100 + records.append({ + "symbol": q.get("symbol"), + "name": q.get("name") or ext.get("name"), + "last_price": last_price, + "prev_close": prev_close, + "open": q.get("open"), + "high": q.get("high"), + "low": q.get("low"), + "volume": q.get("volume"), + "amount": q.get("amount"), + "change_pct": change_pct, + "change_amount": change_amount, + "amplitude": ext.get("amplitude"), + "turnover_rate": ext.get("turnover_rate"), + "timestamp": q.get("timestamp"), + "session": q.get("session"), + }) + + index_records = [r for r in records if r.get("symbol") in all_index_symbols] + stock_records = [r for r in records if r.get("symbol") not in all_index_symbols] + + fetch_ms = (time.perf_counter() - t0) * 1000 + fetched_at = time.time() * 1000 + + # ---- 更新元信息 ---- + with self._lock: + self._fetch_time = now_ts + self._fetch_ms = fetch_ms + self._fetched_at = fetched_at + self._symbol_count = len(stock_records) + self._index_symbol_count = len(index_records) + self._index_quotes_cache = self._build_index_quotes(index_records) + + logger.info("行情刷新: %d 只股票, %d 只指数, 耗时 %.0fms", len(stock_records), len(index_records), fetch_ms) + + # ---- 写 kline_daily (不复权原始价格, 只有 OHLCV) ---- + daily_df = self._build_daily(stock_records) + if not daily_df.is_empty() and self._repo: + try: + self._repo.flush_live_daily(daily_df) + except Exception as e: # noqa: BLE001 + logger.warning("日K写盘失败: %s", e) + + # ---- 构建 API 直接值的补充表 (不写 daily, 只用于 enriched 计算) ---- + quote_extra = self._build_quote_extra(stock_records) + + # ---- 增量计算 enriched + 写盘 + 更新缓存 ---- + if not daily_df.is_empty() and self._repo: + self._flush_live_enriched(daily_df, quote_extra) + + # ---- 通知 SSE ---- + self._update_event.set() + + # ---- 策略监控 + 告警评估 ---- + self._evaluate_monitors(daily_df, quote_extra) + + # ================================================================ + # 工具 + # ================================================================ + + @staticmethod + def _build_daily(records: list[dict]) -> pl.DataFrame: + """将 API records 转为日K格式 DataFrame (只有 OHLCV, 写 kline_daily 用)。""" + if not records: + return pl.DataFrame() + df = pl.DataFrame(records) + cols_map = { + "symbol": "symbol", + "last_price": "close", + "open": "open", + "high": "high", + "low": "low", + "volume": "volume", + "amount": "amount", + } + select_exprs = [] + for src, dst in cols_map.items(): + if src in df.columns: + select_exprs.append(pl.col(src).alias(dst)) + if not select_exprs: + return pl.DataFrame() + result = df.select(select_exprs).with_columns( + pl.lit(date.today()).cast(pl.Date).alias("date"), + ) + # 修复: API 在非交易时段可能返回 open/high/low=0 或 null, + # 导致蜡烛从 0 开始。用 close 填充这些异常值。 + for col in ("open", "high", "low"): + if col in result.columns: + result = result.with_columns( + pl.when((pl.col(col) == 0) | pl.col(col).is_null()) + .then(pl.col("close")) + .otherwise(pl.col(col)) + .alias(col) + ) + return result + + @staticmethod + def _build_quote_extra(records: list[dict]) -> pl.DataFrame: + """构建 API 直接提供的补充字段 (不写 daily, 只传给 enriched 计算)。 + + 包含: prev_close, change_pct, change_amount, amplitude, turnover_rate。 + """ + if not records: + return pl.DataFrame() + df = pl.DataFrame(records) + keep = [c for c in [ + "symbol", "prev_close", "change_pct", "change_amount", + "amplitude", "turnover_rate", + ] if c in df.columns] + if not keep or "symbol" not in keep: + return pl.DataFrame() + return df.select(keep) + + @staticmethod + def _build_index_quotes(records: list[dict]) -> pl.DataFrame: + """构建指数实时行情缓存,不落股票 parquet。 + + 注意: API 返回的 change_pct/amplitude 是小数 (0.0366 = 3.66%), + 统一转成百分比输出, 与 _fallback_index_quotes_from_daily 口径一致 + (前端指数侧不×100, 直接 toFixed(2)% 展示)。 + """ + if not records: + return pl.DataFrame() + df = pl.DataFrame(records) + keep = [c for c in [ + "symbol", "name", "last_price", "prev_close", "open", "high", "low", + "volume", "amount", "change_pct", "change_amount", "amplitude", "timestamp", "session", + ] if c in df.columns] + if not keep or "symbol" not in keep: + return pl.DataFrame() + df = df.select(keep) + # change_pct / amplitude: 小数 → 百分比 (统一指数展示口径) + for col in ("change_pct", "amplitude"): + if col in df.columns: + df = df.with_columns((pl.col(col).cast(pl.Float64) * 100).alias(col)) + if "last_price" in df.columns and "close" not in df.columns: + df = df.with_columns(pl.col("last_price").alias("close")) + return df + + @staticmethod + def _is_trading_hours() -> bool: + now = datetime.now() + t = now.time() + morning = dt_time(9, 15) <= t <= dt_time(11, 35) + afternoon = dt_time(12, 55) <= t <= dt_time(15, 5) + return now.weekday() < 5 and (morning or afternoon) + + @staticmethod + def _save_enabled(enabled: bool) -> None: + from app.services import preferences + preferences.save({"realtime_quotes_enabled": enabled}) + + # ================================================================ + # 策略监控 + # ================================================================ + + def _evaluate_monitors(self, daily_df: pl.DataFrame, quote_extra: pl.DataFrame | None) -> None: + """行情更新后评估统一监控规则引擎,并刷新策略结果缓存。""" + try: + # 获取 enriched 数据 (刚算好的) + enriched_today, enriched_date = self.get_enriched_today() + if enriched_today.is_empty(): + return + + all_alerts: list[dict] = [] + + # 通用监控规则评估 (统一引擎: signal/price/market/strategy) + if self._app_state: + engine = getattr(self._app_state, "monitor_engine", None) + if engine and engine.rule_count > 0: + # 预构建 symbol → name 映射 (enriched 已 drop name 列, 引擎触发时回填用) + try: + inst_df = self._app_state.repo.get_instruments() + if not inst_df.is_empty() and "symbol" in inst_df.columns and "name" in inst_df.columns: + engine.set_name_map({ + row["symbol"]: row["name"] + for row in inst_df.select(["symbol", "name"]).iter_rows(named=True) + if row.get("name") + }) + except Exception as e: # noqa: BLE001 + logger.debug("name_map 构建失败 (不影响监控): %s", e) + rule_events = engine.evaluate(enriched_today) + if rule_events: + # 落盘到 alerts.jsonl + try: + from app.services import alert_store + alert_store.append_many( + self._app_state.repo.store.data_dir, rule_events, + ) + except Exception as e: # noqa: BLE001 + logger.warning("告警落盘失败: %s", e) + # 转为 SSE 推送格式 (兼容旧 alert schema) + for ev in rule_events: + all_alerts.append({ + "source": ev["source"], + "type": ev["type"], + "rule_id": ev.get("rule_id"), + "strategy_id": ev.get("rule_id") if ev["source"] == "strategy" else None, + "symbol": ev["symbol"], + "name": ev["name"], + "message": ev["message"], + "price": ev["price"], + "change_pct": ev["change_pct"], + "signals": ev["signals"], + "severity": ev.get("severity", "info"), + }) + + # 刷新策略结果缓存 (实时行情开启时,每轮行情更新后自动重算) + if self._enabled and self._app_state: + self._refresh_strategy_cache(enriched_today, enriched_date) + + # 推入待推送队列 + 通知 SSE (含背压保护) + if all_alerts: + with self._lock: + self._pending_alerts.extend(all_alerts) + # 背压: 超出上限丢弃最旧 + if len(self._pending_alerts) > self._max_pending_alerts: + overflow = len(self._pending_alerts) - self._max_pending_alerts + self._pending_alerts = self._pending_alerts[overflow:] + self._alert_event.set() + logger.info("监控评估完成: %d 条通知", len(all_alerts)) + + # 系统通知 (可选通道, 由 preferences 开关控制)。 + # cooldown 去重已在 MonitorRuleEngine 做过, 这里只负责转发。 + self._maybe_send_system_notifications(all_alerts) + + except Exception as e: # noqa: BLE001 + logger.warning("监控评估失败: %s", e) + + def _maybe_send_system_notifications(self, all_alerts: list[dict]) -> None: + """把告警转发到操作系统通知中心 (由 preferences 开关控制)。 + + - 开关关闭: 直接返回 + - 开关开启: 逐条发系统通知; 失败静默, 不阻断主流程 + - 去重: 复用 MonitorRuleEngine 的 cooldown, 此处不重复去重 + - 批量策略事件 (symbol="") 聚合为一条通知, 避免刷屏 + """ + try: + from app.services import preferences + from app.services import notify_adapter + + if not preferences.get_system_notify_enabled(): + return + + for ev in all_alerts: + # 通知标题: 用 source 分类 (策略/信号/价格/异动) + source = ev.get("source", "") + source_label = { + "strategy": "策略", "signal": "信号", + "price": "价格", "market": "异动", + }.get(source, source or "通知") + + name = ev.get("name") or "" + symbol = ev.get("symbol") or "" + message = ev.get("message") or "" + + # 正文: 优先用现成 message, 拼上 symbol/name 让用户一眼定位 + if symbol: + body = f"{symbol} {name} {message}".strip() + else: + body = message or name + + title = f"Stock Panel · {source_label}" + notify_adapter.notify(title, body) + except Exception as e: # noqa: BLE001 + logger.debug("系统通知发送异常 (不影响告警主流程): %s", e) + + def _refresh_strategy_cache(self, enriched_today: pl.DataFrame, enriched_date: date | None) -> None: + """利用已计算好的 enriched 数据,运行策略池并写入缓存。""" + import math + from dataclasses import asdict + from app.services import strategy_cache + from app.services.screener import PRESET_STRATEGIES, ScreenerService + from app.strategy import config as strategy_config + + try: + if enriched_date is None: + return + as_of = enriched_date + data_dir = self._repo.store.data_dir + svc = ScreenerService(self._repo) + engine = getattr(self._app_state, "strategy_engine", None) + + # 确定要运行的策略: 策略监控池中的策略 + monitor_ids = self._get_monitor_pool_ids() + if not monitor_ids: + return + + # 一次加载所有 override + all_overrides = strategy_config.list_overrides(data_dir) + + # 历史策略: 只在需要时加载 + shared_history = None + history_strats = [] + if engine: + id_set = set(monitor_ids) + history_strats = [ + (sid, s) for sid, s in engine._strategies.items() + if s.filter_history_fn and sid in id_set + ] + if history_strats: + max_lb = max(s.lookback_days for _, s in history_strats) + shared_history = svc._load_enriched_history(as_of, max(1, max_lb)) + + results: dict[str, dict] = {} + for sid in monitor_ids: + try: + overrides = all_overrides.get(sid, {}) + bf = overrides.get("basic_filter") if overrides else None + dl = overrides.get("display_limit") if overrides else None + if dl is None and overrides and "display_limit" in overrides: + dl = 0 + + if sid in PRESET_STRATEGIES: + r = svc.run_preset(sid, as_of=as_of, precomputed=enriched_today, basic_filter=bf, display_limit=dl) + elif engine: + r = engine.run( + sid, as_of, overrides=overrides or None, + precomputed=enriched_today, precomputed_history=shared_history, + ) + if dl is not None and dl > 0: + r.rows = r.rows[:dl] + r.total = min(r.total, dl) + else: + continue + + # sanitize NaN/Inf + rows = [] + for row_dict in asdict(r).get("rows", []): + for k, v in list(row_dict.items()): + if isinstance(v, float) and not math.isfinite(v): + row_dict[k] = None + rows.append(row_dict) + results[sid] = {"total": r.total, "as_of": str(as_of), "rows": rows} + except Exception: # noqa: BLE001 + continue + + if results: + strategy_cache.write_cache(data_dir, str(as_of), results) + + except Exception as e: # noqa: BLE001 + logger.warning("策略缓存刷新失败: %s", e) + + def _get_monitor_pool_ids(self) -> list[str]: + """获取策略监控池中的策略 ID 列表。""" + from app.services import preferences + ids = preferences.get_strategy_monitor_ids() + if not ids: + return [] + return [sid for sid in ids if sid] + + @staticmethod + def _get_strategy_monitor(): + """获取 StrategyMonitorService — 不再使用, 改用 _app_state 注入。""" + return None + + # ================================================================ + # enriched 增量计算 + # ================================================================ + + def _flush_live_enriched(self, daily_df: pl.DataFrame, quote_extra: pl.DataFrame = None) -> None: + """增量计算今天的 enriched: 用昨天的递推状态 + 今天 OHLCV → 只算今天 5500 行。 + + quote_extra: API 直接提供的补充字段 (prev_close, change_pct 等), + 不写 daily, 直接传给 compute_enriched_today 避免重复计算。 + """ + try: + today = date.today() + t0 = time.perf_counter() + + # ---- 尝试增量路径 ---- + live_agg = self._repo.get_live_agg() + prev_enriched, prev_date = self._repo.get_enriched_latest() + + use_incremental = ( + not live_agg.is_empty() + and not prev_enriched.is_empty() + and prev_date is not None + ) + + if use_incremental: + from app.indicators.pipeline import compute_enriched_today + instruments = self._repo.get_instruments() + # 将 API 直接提供的补充字段 JOIN 到 daily_df + today_ohlcv = daily_df + if quote_extra is not None and not quote_extra.is_empty(): + today_ohlcv = daily_df.join(quote_extra, on="symbol", how="left") + enriched_today = compute_enriched_today( + live_agg=live_agg, + prev_enriched=prev_enriched, + today_ohlcv=today_ohlcv, + instruments=instruments, + ) + if enriched_today.is_empty(): + logger.warning("增量计算结果为空, 回退到全量计算") + use_incremental = False + + # ---- 全量回退路径 ---- + if not use_incremental: + from datetime import timedelta + from app.indicators.pipeline import compute_enriched + + logger.info("enriched 全量计算 (live_agg=%s, 上次日期=%s)", + "ok" if not live_agg.is_empty() else "空", prev_date) + + cutoff = today - timedelta(days=90) + daily_glob = str(self._repo.store.data_dir / "kline_daily" / "**" / "*.parquet") + ohlcv_cols = ["symbol", "date", "open", "high", "low", "close", "volume", "amount"] + hist_df = ( + pl.scan_parquet(daily_glob) + .filter(pl.col("date") >= cutoff) + .sort(["symbol", "date"]) + .collect() + ) + if hist_df.is_empty(): + return + + hist_cols = [c for c in ohlcv_cols if c in hist_df.columns] + hist_df = hist_df.select(hist_cols).filter(pl.col("date") != today) + daily_ohlcv = daily_df.select([c for c in ohlcv_cols if c in daily_df.columns]) + full_df = pl.concat([hist_df, daily_ohlcv], how="diagonal_relaxed") + full_df = full_df.sort(["symbol", "date"]) + + factor_path = self._repo.store.data_dir / "adj_factor" / "all.parquet" + factors = pl.DataFrame() + if factor_path.exists(): + try: + factors = pl.read_parquet(factor_path) + except Exception: + pass + instruments = self._repo.get_instruments() + + enriched_full = compute_enriched(full_df, factors=factors, instruments=instruments) + enriched_today = enriched_full.filter(pl.col("date") == today) + + if enriched_today.is_empty(): + return + + # ---- 写盘 + 更新缓存 ---- + self._repo.flush_live_enriched(enriched_today) + + elapsed = time.perf_counter() - t0 + mode_label = "增量" if use_incremental else "全量" + logger.info("enriched %s: %d 只, %s, 耗时 %.0fms", + mode_label, len(enriched_today), today, elapsed * 1000) + except Exception as e: # noqa: BLE001 + logger.warning("enriched 计算失败: %s", e) diff --git a/backend/app/services/screener.py b/backend/app/services/screener.py new file mode 100644 index 0000000..b4c46b0 --- /dev/null +++ b/backend/app/services/screener.py @@ -0,0 +1,593 @@ +"""Screener 服务(§6.3)。 + +性能优化: + - enriched parquet 仅存 14 列基础数据, 指标和信号即时计算 + - preset 策略: 从内存缓存或即时计算获取完整指标, ~10-50ms + - custom SQL: DuckDB (用户传 SQL WHERE 字符串), ~10-50ms +""" +from __future__ import annotations + +import logging +import time +from dataclasses import dataclass, field +from datetime import date, timedelta + +import polars as pl + +from app.tickflow.repository import KlineRepository + +logger = logging.getLogger(__name__) + +# ── 进程级历史数据缓存 (避免 run_all 每次重新扫描 parquet + 计算指标) ── +_history_cache: dict[tuple[date, int], tuple[float, pl.DataFrame]] = {} +_HISTORY_CACHE_TTL = 120.0 # 秒 + + +# 内置预设策略 — Polars 表达式方式 +PRESET_STRATEGIES: dict[str, dict] = { + "trend_breakout": { + "name": "趋势突破", + "description": "MA60 上方 + 60 日新高 + 量能 ≥ 2 倍均量", + "filter": ( + (pl.col("close") > pl.col("ma60")) + & pl.col("signal_n_day_high").fill_null(False) + & (pl.col("vol_ratio_5d") >= 2.0) + ), + "order_by": "momentum_60d", + "descending": True, + "limit": 100, + }, + "ma_golden_cross": { + "name": "MA 金叉", + "description": "MA5 上穿 MA20 当日触发,量能配合", + "filter": ( + pl.col("signal_ma_golden_5_20").fill_null(False) + & (pl.col("vol_ratio_5d") >= 1.2) + & (pl.col("close") > pl.col("ma60")) + ), + "order_by": "momentum_20d", + "descending": True, + "limit": 100, + }, + "macd_golden": { + "name": "MACD 金叉放量", + "description": "MACD 金叉当日 + 量能放大", + "filter": ( + pl.col("signal_macd_golden").fill_null(False) + & (pl.col("vol_ratio_5d") >= 1.5) + ), + "order_by": "momentum_60d", + "descending": True, + "limit": 100, + }, + "volume_price_surge": { + "name": "量价齐升", + "description": "突破 MA20 + 放量 + 收阳", + "filter": ( + pl.col("signal_ma20_breakout").fill_null(False) + & (pl.col("vol_ratio_5d") >= 2.0) + & (pl.col("close") > pl.col("open")) + ), + "order_by": "vol_ratio_5d", + "descending": True, + "limit": 100, + }, + "low_volatility_leader": { + "name": "低波动龙头", + "description": "20 日动量为正 + 年化波动 < 30% + MA20 上方", + "filter": ( + (pl.col("momentum_20d") > 0) + & (pl.col("annual_vol_20d") < 0.30) + & (pl.col("close") > pl.col("ma20")) + ), + "order_by": "momentum_60d", + "descending": True, + "limit": 100, + }, + "broken_board_recovery": { + "name": "断板反包", + "description": "连板 ≥2 后断板 1-2 天,出现放量反包信号", + "filter": ( + pl.col("signal_limit_up").fill_null(False) + & (pl.col("vol_ratio_5d") >= 1.5) + & (pl.col("change_pct") > 0.03) + ), + "order_by": "change_pct", + "descending": True, + "limit": 100, + }, + "oversold_bounce": { + "name": "超跌反弹", + "description": "RSI14 < 30 超卖区 + 当日收阳 + 放量,抄底信号", + "filter": ( + (pl.col("rsi_14") < 30) + & (pl.col("close") > pl.col("open")) + & (pl.col("vol_ratio_5d") >= 1.2) + ), + "order_by": "rsi_14", + "descending": False, + "limit": 100, + }, + "boll_breakout": { + "name": "布林突破", + "description": "突破布林上轨 + 放量,强势加速信号", + "filter": ( + pl.col("signal_boll_breakout_upper").fill_null(False) + & (pl.col("vol_ratio_5d") >= 1.5) + ), + "order_by": "vol_ratio_5d", + "descending": True, + "limit": 100, + }, + "bullish_alignment": { + "name": "均线多头", + "description": "MA5 > MA10 > MA20 > MA60 多头排列 + 短期动量为正", + "filter": ( + (pl.col("ma5") > pl.col("ma10")) + & (pl.col("ma10") > pl.col("ma20")) + & (pl.col("ma20") > pl.col("ma60")) + & (pl.col("momentum_20d") > 0) + ), + "order_by": "momentum_60d", + "descending": True, + "limit": 100, + }, + "consecutive_limit_ups": { + "name": "连板股", + "description": "当日涨停且连续涨停 ≥ 2 天,强势追涨", + "filter": ( + pl.col("signal_limit_up").fill_null(False) + & (pl.col("consecutive_limit_ups") >= 2) + ), + "order_by": "consecutive_limit_ups", + "descending": True, + "limit": 100, + }, + "pullback_to_support": { + "name": "缩量回踩", + "description": "回踩 MA20 附近 + 缩量 + 中期趋势向上", + "filter": ( + (pl.col("close") > pl.col("ma20") * 0.98) + & (pl.col("close") < pl.col("ma20") * 1.02) + & (pl.col("vol_ratio_5d") < 0.8) + & (pl.col("close") > pl.col("ma60")) + & (pl.col("momentum_20d") > 0) + ), + "order_by": "momentum_60d", + "descending": True, + "limit": 100, + }, + "n_day_low_reversal": { + "name": "新低反转", + "description": "触及 60 日新低后当日收阳放量,反转信号", + "filter": ( + pl.col("signal_n_day_low").fill_null(False) + & (pl.col("close") > pl.col("open")) + & (pl.col("vol_ratio_5d") >= 1.5) + ), + "order_by": "change_pct", + "descending": True, + "limit": 100, + }, +} + + +@dataclass +class ScreenerResult: + as_of: date + strategy: str | None + rows: list[dict] = field(default_factory=list) + total: int = 0 + elapsed_ms: float = 0.0 + + +class ScreenerService: + def __init__(self, repo: KlineRepository) -> None: + self.repo = repo + + @staticmethod + def clear_history_cache() -> None: + """清空进程级 _history_cache (TTL 缓存)。 + + 清除数据后调用, 避免内存里的旧历史窗口残留导致策略/看板仍命中旧数据。 + """ + _history_cache.clear() + + def _load_enriched_for_date(self, target_date: date) -> pl.DataFrame: + """从 enriched parquet 读取指定日期的基础数据并即时计算完整指标+信号。 + + enriched parquet 仅存 14 列。读取后需要即时计算 ma/ema/macd/kdj/rsi/boll/momentum/signal 等列。 + 对于最新日, 优先使用内存缓存 (已包含完整指标)。 + """ + # 优先使用 repo 最新日缓存 + cache, cache_date = self.repo.get_enriched_latest() + if cache is not None and not cache.is_empty() and cache_date == target_date: + df = cache + # JOIN instruments + df_i = self.repo.get_instruments() + if not df_i.is_empty(): + inst_cols = [c for c in ["symbol", "name", "total_shares", "float_shares"] if c in df_i.columns] + if "name" not in df.columns: + df = df.join(df_i.select(inst_cols), on="symbol", how="left") + return df + + # 尝试从 repo 级预计算历史缓存中提取目标日期 + cached_hist = self.repo.get_enriched_history(target_date, 1) + if cached_hist is not None and not cached_hist.is_empty() and "date" in cached_hist.columns: + df = cached_hist.filter(pl.col("date") == target_date) + if not df.is_empty(): + logger.debug("_load_enriched_for_date: repo history cache for %s", target_date) + # JOIN instruments + df_i = self.repo.get_instruments() + if not df_i.is_empty(): + inst_cols = [c for c in ["symbol", "name", "total_shares", "float_shares"] if c in df_i.columns] + if "name" not in df.columns: + df = df.join(df_i.select(inst_cols), on="symbol", how="left") + return df + + # 历史日期: 从 parquet 读取 14 列, 即时计算指标 (慢路径) + enriched_dir = self.repo.store.data_dir / "kline_daily_enriched" + ds = target_date.isoformat() + target_parquet = enriched_dir / f"date={ds}" / "part.parquet" + + if not target_parquet.exists(): + return pl.DataFrame() + + try: + df = pl.read_parquet(target_parquet) + except Exception as e: # noqa: BLE001 + logger.warning("load_enriched_for_date failed: %s", e) + return pl.DataFrame() + + if df.is_empty(): + return df + + # 即时计算指标: 需要加载历史窗口作 warmup + df_full = self._compute_enriched_full(df, target_date) + return df_full + + def _compute_enriched_full(self, df_target: pl.DataFrame, target_date: date) -> pl.DataFrame: + """从 14 列基础数据即时计算完整 enriched (含全部指标和信号)。 + + 读取历史数据作为指标计算的 warmup, 计算完成后只返回目标日期的行。 + """ + from app.indicators.pipeline import compute_indicators, compute_signals, compute_limit_signals + + # 加载 warmup 历史 (目标日期前 ~120 天) + enriched_dir = self.repo.store.data_dir / "kline_daily_enriched" + start = target_date - timedelta(days=150) + read_cols = ["symbol", "date", "open", "high", "low", "close", "volume", + "amount", "raw_close", "raw_high", "raw_low"] + + try: + lf = ( + pl.scan_parquet(str(enriched_dir / "**" / "*.parquet")) + .filter( + (pl.col("date") >= start) + & (pl.col("date") <= target_date) + ) + .sort(["symbol", "date"]) + ) + available = [c for c in read_cols if c in lf.schema] + df_hist = lf.select(available).collect() + except Exception as e: # noqa: BLE001 + logger.warning("warmup history load failed: %s", e) + df_hist = df_target + + if df_hist.is_empty(): + df_hist = df_target + + # 计算指标 + df_full = compute_indicators(df_hist) + df_full = compute_signals(df_full) + + # 计算涨跌停信号 (需要 instruments) + instruments = self.repo.get_instruments() + if instruments is not None and not instruments.is_empty(): + df_full = compute_limit_signals(df_full, instruments) + + # 只保留目标日期 + df_result = df_full.filter(pl.col("date") == target_date) + + # JOIN instruments (name, total_shares, float_shares) + if not instruments.is_empty(): + inst_cols = [c for c in ["symbol", "name", "total_shares", "float_shares"] if c in instruments.columns] + if "name" not in df_result.columns: + df_result = df_result.join(instruments.select(inst_cols), on="symbol", how="left") + + return df_result + + def _load_enriched_history(self, target_date: date, lookback_days: int) -> pl.DataFrame: + """读取目标日期之前的基础行情数据, 供历史窗口策略使用。 + + 优先从 repo 内存缓存获取 (启动时已预计算), 命中时 0ms。 + 缓存 miss 时走 scan_parquet + compute_indicators 慢路径。 + """ + # 优先级 1: repo 级预计算缓存 (启动时 _refresh_enriched 已计算完整历史) + t0 = time.perf_counter() + cached = self.repo.get_enriched_history(target_date, lookback_days) + if cached is not None and not cached.is_empty(): + # JOIN instruments (repo 缓存不含 name 等列) + instruments = self.repo.get_instruments() + if instruments is not None and not instruments.is_empty() and "name" not in cached.columns: + inst_cols = [c for c in ["symbol", "name", "total_shares", "float_shares"] + if c in instruments.columns] + cached = cached.join(instruments.select(inst_cols), on="symbol", how="left") + elapsed = (time.perf_counter() - t0) * 1000 + logger.info("_load_enriched_history(%s, %d): repo cache hit, %.1fms, %d rows", + target_date, lookback_days, elapsed, len(cached)) + return cached + + # 优先级 2: 进程级 history_cache (之前的 TTL 缓存) + cache_key = (target_date, lookback_days) + now = time.monotonic() + ttl_cached = _history_cache.get(cache_key) + if ttl_cached is not None: + ts, cached_df = ttl_cached + if now - ts < _HISTORY_CACHE_TTL: + logger.debug("history TTL cache hit: %s lookback=%d", target_date, lookback_days) + return cached_df + del _history_cache[cache_key] + + # 优先级 3: scan_parquet + compute_indicators (慢路径, ~5s) + logger.warning("_load_enriched_history cache miss, computing indicators (%s, %d)...", + target_date, lookback_days) + from app.indicators.pipeline import compute_indicators, compute_signals, compute_limit_signals + + warmup = 60 + start = target_date - timedelta(days=min((lookback_days + warmup) * 2, 180)) + + enriched_dir = self.repo.store.data_dir / "kline_daily_enriched" + read_cols = ["symbol", "date", "open", "high", "low", "close", "volume", + "amount", "raw_close", "raw_high", "raw_low"] + + try: + lf = ( + pl.scan_parquet(str(enriched_dir / "**" / "*.parquet")) + .filter((pl.col("date") >= start) & (pl.col("date") <= target_date)) + .sort(["symbol", "date"]) + ) + available = [c for c in read_cols if c in lf.collect_schema().names()] + df_hist = lf.select(available).collect() + except Exception as e: # noqa: BLE001 + logger.warning("load_enriched_history failed: %s", e) + return pl.DataFrame() + + if df_hist.is_empty(): + return pl.DataFrame() + + df_full = compute_indicators(df_hist) + df_full = compute_signals(df_full) + + instruments = self.repo.get_instruments() + if instruments is not None and not instruments.is_empty(): + df_full = compute_limit_signals(df_full, instruments) + + if instruments is not None and not instruments.is_empty(): + inst_cols = [c for c in ["symbol", "name", "total_shares", "float_shares"] if c in instruments.columns] + if "name" not in df_full.columns: + df_full = df_full.join(instruments.select(inst_cols), on="symbol", how="left") + + # 裁剪掉 warmup 部分, 只保留 lookback 范围 (减少 group_by 开销) + lookback_start = target_date - timedelta(days=lookback_days) + if "date" in df_full.columns: + df_full = df_full.filter(pl.col("date") >= lookback_start) + + df_full = df_full.sort(["symbol", "date"]) + + elapsed = (time.perf_counter() - t0) * 1000 + logger.info("_load_enriched_history(%s, %d): computed in %.1fms, %d rows", + target_date, lookback_days, elapsed, len(df_full)) + + _history_cache[cache_key] = (now, df_full) + if len(_history_cache) > 10: + expired = [k for k, (ts, _) in _history_cache.items() if now - ts > _HISTORY_CACHE_TTL] + for k in expired: + del _history_cache[k] + + return df_full + + def run( + self, + as_of: date, + conditions: list[str], + order_by: str | None = None, + limit: int = 30, + pool: list[str] | None = None, + ) -> ScreenerResult: + """自定义 SQL 条件选股。 + + 先通过 Polars 即时计算完整指标, 再用 DuckDB 做 SQL WHERE 过滤。 + kline_enriched DuckDB 视图只有 14 列, 不能直接用于指标过滤。 + """ + t0 = time.perf_counter() + + if not conditions: + return ScreenerResult(as_of=as_of, strategy=None) + + # 从即时计算获取完整 enriched 数据 + df = self._load_enriched_for_date(as_of) + if df.is_empty(): + return ScreenerResult(as_of=as_of, strategy=None) + + # Pool 过滤 + if pool: + df = df.filter(pl.col("symbol").is_in(pool)) + + # 用 DuckDB 做 SQL 过滤 (注册临时视图) + try: + import duckdb + con = duckdb.connect(database=":memory:") + con.register("enriched", df.to_arrow()) + where = " AND ".join(f"({c})" for c in conditions) + sql = f"SELECT * FROM enriched WHERE {where}" + if order_by: + sql += f" ORDER BY {order_by}" + if limit: + sql += f" LIMIT {limit}" + df_result = con.execute(sql).pl() + con.close() + except Exception as e: # noqa: BLE001 + logger.warning("screener SQL query failed: %s", e) + df_result = pl.DataFrame() + + rows = df_result.to_dicts() if not df_result.is_empty() else [] + elapsed = (time.perf_counter() - t0) * 1000 + + return ScreenerResult( + as_of=as_of, + strategy=None, + rows=rows, + total=len(rows), + elapsed_ms=elapsed, + ) + + def run_preset( + self, + strategy_id: str, + as_of: date, + pool: list[str] | None = None, + precomputed: pl.DataFrame | None = None, + basic_filter: dict | None = None, + display_limit: int | None = None, + ) -> ScreenerResult: + """预设策略选股 — 从 enriched 读取预计算好的指标列后过滤。 + + - precomputed 不为空: 直接复用(run_all 场景) + - precomputed 为空: 从 enriched 读目标日期 + - basic_filter: 用户保存的基础参数过滤(boards、价格等) + """ + t0 = time.perf_counter() + + strat = PRESET_STRATEGIES.get(strategy_id) + if not strat: + raise ValueError(f"unknown strategy: {strategy_id}") + + if precomputed is not None and not precomputed.is_empty(): + df = precomputed + else: + df = self._load_enriched_for_date(as_of) + if df.is_empty(): + return ScreenerResult(as_of=as_of, strategy=strategy_id) + + # 应用用户基础参数过滤(boards、价格区间等) + if basic_filter and basic_filter.get("enabled", True): + df = self._apply_basic_filter(df, basic_filter) + + # 应用策略过滤 + df = df.filter(strat["filter"]) + + # 应用 pool + if pool: + df = df.filter(pl.col("symbol").is_in(pool)) + + # 排序 + 限制 + order_col = strat["order_by"] + if order_col in df.columns: + df = df.sort(order_col, descending=strat.get("descending", True)) + + # display_limit: None=不限制, 0=全部, N=前N个 + if display_limit == 0: + limit = None # 不限制 + elif display_limit is not None: + limit = display_limit + else: + limit = None # 未配置时默认不限制 + if limit is not None and limit > 0: + df = df.head(limit) + + # 基于排序列生成 0-100 评分 (与 StrategyEngine 统一) + if order_col in df.columns and not df.is_empty(): + col_vals = df[order_col].cast(pl.Float64) + col_min = col_vals.min() + col_max = col_vals.max() + col_range = col_max - col_min + if col_range and col_range > 0: + normalized = (col_vals - col_min) / col_range + else: + normalized = pl.Series("norm", [0.5] * len(df)) + if not strat.get("descending", True): + normalized = 1.0 - normalized + df = df.with_columns((normalized * 100).alias("score")) + + rows = df.to_dicts() + elapsed = (time.perf_counter() - t0) * 1000 + + # sanitize + for r in rows: + for k, v in list(r.items()): + if isinstance(v, float) and (v != v or abs(v) == float("inf")): + r[k] = None + + return ScreenerResult( + as_of=as_of, + strategy=strategy_id, + rows=rows, + total=len(rows), + elapsed_ms=elapsed, + ) + + @staticmethod + def _apply_basic_filter(df: pl.DataFrame, bf: dict) -> pl.DataFrame: + """应用用户基础参数过滤(boards、价格区间、市值等)""" + exprs: list[pl.Expr] = [] + if bf.get("price_min") is not None: + exprs.append(pl.col("close") >= bf["price_min"]) + if bf.get("price_max") is not None: + exprs.append(pl.col("close") <= bf["price_max"]) + if bf.get("float_cap_min") is not None and "float_shares" in df.columns: + exprs.append(pl.col("close") * pl.col("float_shares") >= bf["float_cap_min"]) + if bf.get("float_cap_max") is not None and "float_shares" in df.columns: + exprs.append(pl.col("close") * pl.col("float_shares") <= bf["float_cap_max"]) + if bf.get("amount_min") is not None: + exprs.append(pl.col("amount") >= bf["amount_min"]) + if bf.get("amount_max") is not None: + exprs.append(pl.col("amount") <= bf["amount_max"]) + if bf.get("turnover_min") is not None and "turnover_rate" in df.columns: + exprs.append(pl.col("turnover_rate") >= bf["turnover_min"]) + if bf.get("turnover_max") is not None and "turnover_rate" in df.columns: + exprs.append(pl.col("turnover_rate") <= bf["turnover_max"]) + if bf.get("exclude_st") and "name" in df.columns: + exprs.append(~pl.col("name").str.contains("(?i)ST|\\*ST|退")) + # 板块过滤 + boards = bf.get("boards") + if boards and isinstance(boards, list) and len(boards) > 0: + board_exprs: list[pl.Expr] = [] + for b in boards: + if b == "沪主板": + board_exprs.append(pl.col("symbol").str.starts_with("60")) + elif b == "深主板": + board_exprs.append( + pl.col("symbol").str.starts_with("00") + | pl.col("symbol").str.starts_with("001") + ) + elif b == "创业板": + board_exprs.append( + pl.col("symbol").str.starts_with("300") + | pl.col("symbol").str.starts_with("301") + ) + elif b == "科创板": + board_exprs.append(pl.col("symbol").str.starts_with("688")) + elif b == "北交所": + board_exprs.append(pl.col("symbol").str.contains(r"\.BJ$")) + if board_exprs: + exprs.append(pl.any_horizontal(board_exprs)) + if exprs: + return df.filter(pl.all_horizontal(exprs)) + return df + + def latest_date(self) -> date | None: + d = self.repo.enriched_latest_date() + if d: + return d + # 回退 DuckDB + try: + res = self.repo.execute_one( + "SELECT max(date) FROM kline_enriched", + ) + if res and res[0]: + d = res[0] + return d if isinstance(d, date) else date.fromisoformat(str(d)) + except Exception: # noqa: BLE001 + return None + return None diff --git a/backend/app/services/strategy_cache.py b/backend/app/services/strategy_cache.py new file mode 100644 index 0000000..7dc700f --- /dev/null +++ b/backend/app/services/strategy_cache.py @@ -0,0 +1,150 @@ +"""策略结果缓存 — 写入本地文件,供策略页面秒加载。 + +缓存结构: + { + "as_of": "2024-01-15", + "results": { strategy_id: { total, as_of, rows } }, + "today_ever_matched": { strategy_id: [symbol, ...] }, // 今日曾命中 symbol 并集 + "today_ever_rows": { strategy_id: { symbol: row_data } },// 今日曾命中的完整行数据 + "updated_at": 1705324800000 # Unix ms + } + +文件路径: data/user_data/strategy_cache.json +""" +from __future__ import annotations + +import json +import logging +import time +from datetime import date, datetime +from pathlib import Path +from typing import Any + + +def _json_default(obj: Any) -> Any: + """处理 date/datetime 等 JSON 不认识的类型。""" + if isinstance(obj, date): + return obj.isoformat() + if isinstance(obj, datetime): + return obj.isoformat() + raise TypeError(f"Object of type {type(obj).__name__} is not JSON serializable") + + +logger = logging.getLogger(__name__) + +_CACHE_FILENAME = "strategy_cache.json" + + +def _cache_path(data_dir: Path) -> Path: + return data_dir / "user_data" / _CACHE_FILENAME + + +def _enriched_parquet_path(data_dir: Path, as_of: str) -> Path: + """返回 enriched parquet 文件路径。""" + return data_dir / "kline_daily_enriched" / f"date={as_of}" / "part.parquet" + + +def _get_enriched_mtime(data_dir: Path, as_of: str) -> float | None: + """返回 enriched parquet 文件的 mtime (秒)。文件不存在返回 None。""" + p = _enriched_parquet_path(data_dir, as_of) + try: + return p.stat().st_mtime + except FileNotFoundError: + return None + + +def read_cache(data_dir: Path) -> dict | None: + """读取策略缓存文件。返回 None 表示无缓存、读取失败或 enriched 数据已更新导致缓存过期。""" + path = _cache_path(data_dir) + if not path.exists(): + return None + try: + text = path.read_text(encoding="utf-8") + if not text.strip(): + return None + cached = json.loads(text) + except Exception as e: # noqa: BLE001 + logger.warning("读取策略缓存失败: %s", e) + return None + + # 校验 enriched mtime: 数据文件变化 → 缓存过期 + as_of = cached.get("as_of") + stored_mtime = cached.get("enriched_mtime") + if as_of and stored_mtime: + current_mtime = _get_enriched_mtime(data_dir, as_of) + if current_mtime is not None and current_mtime != stored_mtime: + logger.info("策略缓存过期: enriched 数据已更新 (as_of=%s)", as_of) + return None + + return cached + + +def _rows_to_symbol_map(rows: list[dict]) -> dict[str, dict]: + """将 rows 列表转为 {symbol: row_data} 映射。""" + result: dict[str, dict] = {} + for row in rows: + sym = row.get("symbol") + if sym: + result[sym] = row + return result + + +def write_cache( + data_dir: Path, + as_of: str, + results: dict[str, Any], +) -> None: + """将策略结果写入缓存文件,同时更新今日曾命中集合。 + + - 日期变更时重置 today_ever_matched 和 today_ever_rows + - 同一天内合并 (并集) 之前曾命中的 symbol,并用最新行数据更新 + """ + path = _cache_path(data_dir) + path.parent.mkdir(parents=True, exist_ok=True) + + # 读取旧缓存 + old = read_cache(data_dir) + old_as_of = old.get("as_of") if old else None + old_ever_rows: dict[str, dict[str, dict]] = old.get("today_ever_rows", {}) if old else {} + + # 当前命中的行数据 → symbol 映射 + current_row_maps: dict[str, dict[str, dict]] = {} + for sid, r in results.items(): + current_row_maps[sid] = _rows_to_symbol_map(r.get("rows", [])) + + if old_as_of and old_as_of == as_of and old_ever_rows: + # 同一天: 合并 — 用当前行数据更新旧数据 (保持最新价格等) + merged_rows: dict[str, dict[str, dict]] = {} + all_keys = set(old_ever_rows.keys()) | set(current_row_maps.keys()) + for sid in all_keys: + old_map = old_ever_rows.get(sid, {}) + cur_map = current_row_maps.get(sid, {}) + # 以旧数据为基础,用当前数据覆盖 (当前数据更新鲜) + combined = {**old_map, **cur_map} + merged_rows[sid] = combined + today_ever_rows = merged_rows + else: + # 新的一天或首次写入 + today_ever_rows = current_row_maps + + # 从 ever_rows 提取 symbol 列表 (用于快速计数) + today_ever_matched = {sid: sorted(maps.keys()) for sid, maps in today_ever_rows.items()} + + # 记录 enriched parquet 文件的 mtime,用于后续校验缓存是否过期 + enriched_mtime = _get_enriched_mtime(data_dir, as_of) + + payload = { + "as_of": as_of, + "results": results, + "today_ever_matched": today_ever_matched, + "today_ever_rows": today_ever_rows, + "enriched_mtime": enriched_mtime, + "updated_at": int(time.time() * 1000), + } + try: + path.write_text(json.dumps(payload, ensure_ascii=False, default=_json_default), encoding="utf-8") + total_rows = sum(len(r.get("rows", [])) for r in results.values()) + total_ever = sum(len(v) for v in today_ever_matched.values()) + logger.info("策略缓存已写入: %s, %d 策略, %d 命中, %d 曾命中", as_of, len(results), total_rows, total_ever) + except Exception as e: # noqa: BLE001 + logger.warning("写入策略缓存失败: %s", e) diff --git a/backend/app/services/watchlist.py b/backend/app/services/watchlist.py new file mode 100644 index 0000000..879e6bd --- /dev/null +++ b/backend/app/services/watchlist.py @@ -0,0 +1,130 @@ +"""自选股服务(§6.1)。 + +存储:`data/user_data/watchlist.parquet`,字段 symbol + added_at + note。 +""" +from __future__ import annotations + +import logging +from datetime import datetime +from pathlib import Path + +import polars as pl + +from app.config import settings +from app.tickflow.capabilities import Cap, CapabilitySet +from app.tickflow.client import get_client + +logger = logging.getLogger(__name__) + + +def _path() -> Path: + p = settings.data_dir / "user_data" / "watchlist.parquet" + p.parent.mkdir(parents=True, exist_ok=True) + return p + + +def list_symbols() -> list[dict]: + p = _path() + if not p.exists(): + return [] + df = pl.read_parquet(p) + if df.is_empty(): + return [] + return df.to_dicts() + + +def add(symbol: str, note: str = "") -> list[dict]: + p = _path() + if p.exists(): + df = pl.read_parquet(p) + # 已存在则先移除,后面重新插入到最前面 + if symbol in df["symbol"].to_list(): + df = df.filter(pl.col("symbol") != symbol) + else: + df = pl.DataFrame(schema={"symbol": pl.Utf8, "added_at": pl.Utf8, "note": pl.Utf8}) + + new_row = pl.DataFrame({ + "symbol": [symbol], + "added_at": [datetime.utcnow().isoformat(timespec="seconds")], + "note": [note], + }) + out = pl.concat([new_row, df], how="diagonal_relaxed") + out.write_parquet(p) + return out.to_dicts() + + +def remove(symbol: str) -> list[dict]: + p = _path() + if not p.exists(): + return [] + df = pl.read_parquet(p) + df = df.filter(pl.col("symbol") != symbol) + df.write_parquet(p) + return df.to_dicts() + + +def clear() -> int: + """清空自选列表。返回移除的数量。""" + p = _path() + if not p.exists(): + return 0 + df = pl.read_parquet(p) + count = df.height + if count > 0: + pl.DataFrame(schema={"symbol": pl.Utf8, "added_at": pl.Utf8, "note": pl.Utf8}).write_parquet(p) + return count + + +def fetch_quotes(symbols: list[str], capset: CapabilitySet, timeout_s: float = 8.0) -> list[dict]: + """拉取实时行情。 + + 优先用 quote.batch;否则降级为 quote.by_symbol 单股请求。 + timeout_s: 单批次请求超时(秒),防止 API 卡死阻塞整个请求。 + """ + from concurrent.futures import ThreadPoolExecutor, TimeoutError as FuturesTimeout + + if not symbols: + return [] + + tf = get_client() + quotes: list[dict] = [] + + # 走 batch + batch_size = 5 + if capset.has(Cap.QUOTE_BATCH): + lim = capset.limits(Cap.QUOTE_BATCH) + batch_size = lim.batch if lim and lim.batch else 50 + elif capset.has(Cap.QUOTE_BY_SYMBOL): + lim = capset.limits(Cap.QUOTE_BY_SYMBOL) + batch_size = lim.batch if lim and lim.batch else 5 + else: + # 无任何实时行情能力(none/free 档走 free-api 服务器,不提供实时行情) + # 提前返回空,避免发起注定失败的请求 + return [] + + chunks = [symbols[i:i + batch_size] for i in range(0, len(symbols), batch_size)] + + # 用线程池为每个批次加超时保护 + pool = ThreadPoolExecutor(max_workers=1) + for chunk in chunks: + try: + future = pool.submit(tf.quotes.get, symbols=chunk, as_dataframe=True) + raw = future.result(timeout=timeout_s) + if raw is None or len(raw) == 0: + continue + df = pl.from_pandas(raw) + rename_map = { + "last_price": "price", + "ext.change_pct": "pct", + "ext.name": "name", + } + df = df.rename({k: v for k, v in rename_map.items() if k in df.columns}) + quotes.extend(df.to_dicts()) + except FuturesTimeout: + logger.warning("quote fetch timeout (%.1fs) for %d symbols", timeout_s, len(chunk)) + break # 超时后不再尝试后续批次 + except Exception as e: # noqa: BLE001 + logger.warning("quote fetch failed for %d symbols: %s", len(chunk), e) + pool.shutdown(wait=False) + + return quotes diff --git a/backend/app/strategy/__init__.py b/backend/app/strategy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/strategy/ai_generator.py b/backend/app/strategy/ai_generator.py new file mode 100644 index 0000000..38fa054 --- /dev/null +++ b/backend/app/strategy/ai_generator.py @@ -0,0 +1,154 @@ +"""AI 策略生成器 — 读取策略开发文档 + 调用 LLM 生成策略代码。 + +职责: 接收用户自然语言描述 → 读取 docs/strategy-guide.md → 调用 LLM → 返回策略代码。 +不知道: 引擎内部、API、前端、配置持久化、回测。 +""" +from __future__ import annotations + +import ast +import logging +import re +import tempfile +from pathlib import Path + +logger = logging.getLogger(__name__) + +# 策略开发文档路径 +GUIDE_PATH = Path(__file__).resolve().parent.parent.parent.parent / "docs" / "strategy-guide.md" + +_SYSTEM_PREFIX = """你是A股量化策略设计专家。根据用户描述的需求,参考下方的《策略开发指南》生成一个完整的策略Python文件。 + +核心约束: +- 只创建这一个 .py 文件,不要修改任何现有文件,不要跨文件引用 +- 只 import polars as pl,不 import 其他模块 + +要求: +1. 用户可能调整的策略阈值通过 META["params"] 暴露;公式常数、固定窗口边界、布尔开关不必强行参数化 +2. 遵循指南中的文件结构,但优先贴合用户规则,不要为了套模板歪曲策略含义 +3. ENTRY_SIGNALS/EXIT_SIGNALS 根据策略逻辑自行选择匹配的信号列,不要照搬示例 +4. scoring 权重根据策略核心逻辑定制,总和 = 1.0 +5. 优先使用 Polars 表达式、窗口函数、聚合和 with_columns/filter 实现,避免逐行/逐股 Python 循环;只有表达式难以描述的复杂状态机才使用 partition_by/to_dicts +6. 直接输出Python代码,不要输出其他内容 + +--- 策略开发指南 --- + +""" + + +class AIStrategyGenerator: + """AI 策略生成器""" + + def __init__(self) -> None: + self._guide_cache: str | None = None + + def _get_guide(self) -> str: + if self._guide_cache is None: + if GUIDE_PATH.exists(): + self._guide_cache = GUIDE_PATH.read_text(encoding="utf-8") + else: + logger.warning("strategy-guide.md not found at %s", GUIDE_PATH) + self._guide_cache = "" + return self._guide_cache + + async def generate(self, user_prompt: str) -> dict: + """根据用户描述生成策略代码 + + Returns: {"code": str, "meta": dict, "valid": bool, "error": str | None} + """ + guide = self._get_guide() + + # 调用 LLM + code = await self._call_llm(user_prompt, guide) + + # 验证 + try: + self._validate_safety(code) + except ValueError as e: + return {"code": code, "meta": {}, "valid": False, "error": str(e)} + + # 试加载获取 META + try: + meta = self._extract_meta(code) + except Exception as e: + return {"code": code, "meta": {}, "valid": False, "error": f"解析META失败: {e}"} + + return {"code": code, "meta": meta, "valid": True, "error": None} + + async def _call_llm(self, user_prompt: str, guide: str) -> str: + """调用 OpenAI 兼容 API(流式,避免 CDN 长连接超时)""" + from openai import AsyncOpenAI + from app import secrets_store + + ai_key = secrets_store.get_ai_key() + if not ai_key: + raise RuntimeError("AI API Key 未配置,请在设置页面配置") + + client = AsyncOpenAI( + api_key=ai_key, + base_url=secrets_store.get_ai_config("ai_base_url", "https://api.alysc.top"), + timeout=180.0, + max_retries=2, + ) + # 使用流式请求:CDN 收到首个 token 后会持续转发,不会因等待超时 + stream = await client.chat.completions.create( + model=secrets_store.get_ai_config("ai_model", "gpt-5.5"), + messages=[ + {"role": "system", "content": _SYSTEM_PREFIX + guide}, + {"role": "user", "content": user_prompt}, + ], + temperature=0.3, + max_tokens=3000, + stream=True, + ) + chunks: list[str] = [] + async for chunk in stream: + delta = chunk.choices[0].delta if chunk.choices else None + if delta and delta.content: + chunks.append(delta.content) + content = "".join(chunks).strip() + # 提取代码块 + if "```python" in content: + content = content.split("```python", 1)[1].split("```", 1)[0].strip() + elif "```" in content: + content = content.split("```", 1)[1].split("```", 1)[0].strip() + return content + + @staticmethod + def _validate_safety(code: str) -> None: + """AST 级安全检查""" + tree = ast.parse(code) + + forbidden_modules = {"os", "sys", "subprocess", "socket", "shutil", + "pathlib", "http", "urllib", "requests", "httpx"} + forbidden_calls = {"open", "exec", "eval", "compile", "__import__", + "globals", "locals", "vars", "dir", "getattr", + "setattr", "delattr", "type", "input"} + + for node in ast.walk(tree): + if isinstance(node, ast.Import): + for alias in node.names: + if alias.name.split(".")[0] not in ("polars",): + if alias.name.split(".")[0] in forbidden_modules: + raise ValueError(f"禁止 import {alias.name}") + if isinstance(node, ast.ImportFrom): + if node.module and node.module.split(".")[0] not in ("polars",): + if node.module.split(".")[0] in forbidden_modules: + raise ValueError(f"禁止 from {node.module} import") + if isinstance(node, ast.Call): + if isinstance(node.func, ast.Name) and node.func.id in forbidden_calls: + raise ValueError(f"禁止调用 {node.func.id}()") + + @staticmethod + def _extract_meta(code: str) -> dict: + """从代码字符串中提取 META 字典(不执行代码)""" + tree = ast.parse(code) + for node in ast.walk(tree): + if isinstance(node, ast.Assign): + for target in node.targets: + if isinstance(target, ast.Name) and target.id == "META": + # 找到 META 赋值,用 compile+eval 安全提取 + # 只允许字面量 + meta_node = node.value + code_obj = compile(ast.Expression(meta_node), "", "eval") + return eval(code_obj, {"__builtins__": {}}) # noqa: S307 + return {} diff --git a/backend/app/strategy/builtin/__init__.py b/backend/app/strategy/builtin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/strategy/builtin/boll_breakout.py b/backend/app/strategy/builtin/boll_breakout.py new file mode 100644 index 0000000..cb86588 --- /dev/null +++ b/backend/app/strategy/builtin/boll_breakout.py @@ -0,0 +1,31 @@ +"""布林突破 — 突破布林上轨 + 放量""" +import polars as pl + +META = { + "id": "boll_breakout", + "name": "布林突破", + "description": "突破布林上轨 + 放量, 强势加速信号", + "tags": ["布林", "突破"], + "params": [ + {"id": "vol_ratio_min", "label": "最低量比", "type": "float", + "default": 1.5, "min": 0.5, "max": 5.0, "step": 0.1}, + ], + "scoring": {"vol_ratio_5d": 0.4, "change_pct": 0.3, "momentum_20d": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_boll_breakout_upper"] +EXIT_SIGNALS = ["signal_boll_breakdown_lower"] +STOP_LOSS = -0.06 +MAX_HOLD_DAYS = 15 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + vol_min = params.get("vol_ratio_min", 1.5) + return ( + pl.col("signal_boll_breakout_upper").fill_null(False) + & (pl.col("vol_ratio_5d") >= vol_min) + ) diff --git a/backend/app/strategy/builtin/broken_board_recovery.py b/backend/app/strategy/builtin/broken_board_recovery.py new file mode 100644 index 0000000..4fd9b5e --- /dev/null +++ b/backend/app/strategy/builtin/broken_board_recovery.py @@ -0,0 +1,35 @@ +"""断板反包 — 涨停 + 放量 + 涨幅 >3%""" +import polars as pl + +META = { + "id": "broken_board_recovery", + "name": "断板反包", + "description": "连板≥2后断板1-2天, 出现放量反包信号", + "tags": ["涨停", "反包"], + "params": [ + {"id": "vol_ratio_min", "label": "最低量比", "type": "float", + "default": 1.5, "min": 0.5, "max": 5.0, "step": 0.1}, + {"id": "change_pct_min", "label": "最低涨幅", "type": "float", + "default": 0.03, "min": 0.01, "max": 0.10, "step": 0.01}, + ], + "scoring": {"change_pct": 0.4, "vol_ratio_5d": 0.3, "momentum_5d": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_limit_up"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.06 +MAX_HOLD_DAYS = 10 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + vol_min = params.get("vol_ratio_min", 1.5) + chg_min = params.get("change_pct_min", 0.03) + return ( + pl.col("signal_limit_up").fill_null(False) + & (pl.col("vol_ratio_5d") >= vol_min) + & (pl.col("change_pct") > chg_min) + ) diff --git a/backend/app/strategy/builtin/bullish_alignment.py b/backend/app/strategy/builtin/bullish_alignment.py new file mode 100644 index 0000000..8dc3fc1 --- /dev/null +++ b/backend/app/strategy/builtin/bullish_alignment.py @@ -0,0 +1,29 @@ +"""均线多头 — MA5>MA10>MA20>MA60 + 短期动量为正""" +import polars as pl + +META = { + "id": "bullish_alignment", + "name": "均线多头", + "description": "MA5>MA10>MA20>MA60多头排列 + 短期动量为正", + "tags": ["均线", "多头"], + "params": [], + "scoring": {"momentum_60d": 0.4, "momentum_20d": 0.3, "turnover_rate": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_ma_golden_5_20", "signal_ma_golden_20_60"] +EXIT_SIGNALS = ["signal_ma_dead_5_20", "signal_ma20_breakdown"] +STOP_LOSS = -0.06 +MAX_HOLD_DAYS = 20 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + return ( + (pl.col("ma5") > pl.col("ma10")) + & (pl.col("ma10") > pl.col("ma20")) + & (pl.col("ma20") > pl.col("ma60")) + & (pl.col("momentum_20d") > 0) + ) diff --git a/backend/app/strategy/builtin/consecutive_limit_ups.py b/backend/app/strategy/builtin/consecutive_limit_ups.py new file mode 100644 index 0000000..4e864ac --- /dev/null +++ b/backend/app/strategy/builtin/consecutive_limit_ups.py @@ -0,0 +1,31 @@ +"""连板股 — 涨停且连续涨停≥2天""" +import polars as pl + +META = { + "id": "consecutive_limit_ups", + "name": "连板股", + "description": "当日涨停且连续涨停≥2天, 强势追涨", + "tags": ["涨停", "连板"], + "params": [ + {"id": "min_boards", "label": "最少连板数", "type": "int", + "default": 2, "min": 1, "max": 20, "step": 1}, + ], + "scoring": {"consecutive_limit_ups": 0.5, "change_pct": 0.3, "amount": 0.2}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_limit_up"] +EXIT_SIGNALS = [] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 5 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + min_boards = params.get("min_boards", 2) + return ( + pl.col("signal_limit_up").fill_null(False) + & (pl.col("consecutive_limit_ups") >= min_boards) + ) diff --git a/backend/app/strategy/builtin/high_turnover_surge.py b/backend/app/strategy/builtin/high_turnover_surge.py new file mode 100644 index 0000000..53b8276 --- /dev/null +++ b/backend/app/strategy/builtin/high_turnover_surge.py @@ -0,0 +1,34 @@ +"""高换手拉升 — 换手率 > 5% 且涨幅 > 3%, 资金活跃""" +import polars as pl + +META = { + "id": "high_turnover_surge", + "name": "高换手拉升", + "description": "换手率 > 5% 且涨幅 > 3%, 资金活跃", + "tags": ["换手率", "放量", "资金"], + "params": [ + {"id": "min_turnover", "label": "最低换手率%", "type": "float", + "default": 5.0, "min": 1.0, "max": 20.0, "step": 0.5}, + {"id": "min_change", "label": "最低涨幅%", "type": "float", + "default": 3.0, "min": 1.0, "max": 10.0, "step": 0.5}, + ], + "scoring": {"turnover_rate": 0.4, "change_pct": 0.3, "momentum_5d": 0.3}, + "order_by": "score", + "descending": True, + "limit": 50, +} + +ENTRY_SIGNALS = ["signal_volume_surge"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 10 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + min_to = params.get("min_turnover", 5.0) / 100.0 + min_chg = params.get("min_change", 3.0) / 100.0 + return ( + (pl.col("turnover_rate") > min_to) + & (pl.col("change_pct") > min_chg) + ) diff --git a/backend/app/strategy/builtin/limit_up_momentum.py b/backend/app/strategy/builtin/limit_up_momentum.py new file mode 100644 index 0000000..65afe29 --- /dev/null +++ b/backend/app/strategy/builtin/limit_up_momentum.py @@ -0,0 +1,34 @@ +"""连板接力 — 近2日涨停且今日涨幅 > 5%, 连板股追踪""" +import polars as pl + +META = { + "id": "limit_up_momentum", + "name": "连板接力", + "description": "连板股 + 今日涨幅 > 5%, 连板接力追踪", + "tags": ["涨停", "连板", "接力"], + "params": [ + {"id": "min_change", "label": "最低涨幅%", "type": "float", + "default": 5.0, "min": 2.0, "max": 15.0, "step": 0.5}, + {"id": "min_boards", "label": "最少连板", "type": "int", + "default": 1, "min": 1, "max": 10, "step": 1}, + ], + "scoring": {"consecutive_limit_ups": 0.4, "change_pct": 0.3, "amount": 0.3}, + "order_by": "score", + "descending": True, + "limit": 50, +} + +ENTRY_SIGNALS = ["signal_limit_up"] +EXIT_SIGNALS = [] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 5 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + min_chg = params.get("min_change", 5.0) / 100.0 + min_boards = params.get("min_boards", 1) + return ( + (pl.col("change_pct") > min_chg) + & (pl.col("consecutive_limit_ups") >= min_boards) + ) diff --git a/backend/app/strategy/builtin/low_volatility_leader.py b/backend/app/strategy/builtin/low_volatility_leader.py new file mode 100644 index 0000000..f32a3a8 --- /dev/null +++ b/backend/app/strategy/builtin/low_volatility_leader.py @@ -0,0 +1,32 @@ +"""低波动龙头 — 正动量 + 低波动 + MA20上方""" +import polars as pl + +META = { + "id": "low_volatility_leader", + "name": "低波动龙头", + "description": "20日动量为正 + 年化波动 < 30% + MA20上方", + "tags": ["低波动", "龙头"], + "params": [ + {"id": "vol_max", "label": "最大年化波动", "type": "float", + "default": 0.30, "min": 0.05, "max": 1.0, "step": 0.01}, + ], + "scoring": {"momentum_60d": 0.4, "momentum_20d": 0.3, "turnover_rate": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_ma20_breakout"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 30 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + vol_max = params.get("vol_max", 0.30) + return ( + (pl.col("momentum_20d") > 0) + & (pl.col("annual_vol_20d") < vol_max) + & (pl.col("close") > pl.col("ma20")) + ) diff --git a/backend/app/strategy/builtin/ma_golden_cross.py b/backend/app/strategy/builtin/ma_golden_cross.py new file mode 100644 index 0000000..81b81fb --- /dev/null +++ b/backend/app/strategy/builtin/ma_golden_cross.py @@ -0,0 +1,32 @@ +"""MA金叉 — MA5上穿MA20 + 量能配合 + MA60上方""" +import polars as pl + +META = { + "id": "ma_golden_cross", + "name": "MA 金叉", + "description": "MA5上穿MA20当日触发, 量能配合", + "tags": ["均线", "金叉"], + "params": [ + {"id": "vol_ratio_min", "label": "最低量比", "type": "float", + "default": 1.2, "min": 0.5, "max": 5.0, "step": 0.1}, + ], + "scoring": {"momentum_20d": 0.5, "vol_ratio_5d": 0.3, "change_pct": 0.2}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_ma_golden_5_20"] +EXIT_SIGNALS = ["signal_ma_dead_5_20"] +STOP_LOSS = -0.06 +MAX_HOLD_DAYS = 15 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + vol_min = params.get("vol_ratio_min", 1.2) + return ( + pl.col("signal_ma_golden_5_20").fill_null(False) + & (pl.col("vol_ratio_5d") >= vol_min) + & (pl.col("close") > pl.col("ma60")) + ) diff --git a/backend/app/strategy/builtin/macd_golden.py b/backend/app/strategy/builtin/macd_golden.py new file mode 100644 index 0000000..2ea8006 --- /dev/null +++ b/backend/app/strategy/builtin/macd_golden.py @@ -0,0 +1,31 @@ +"""MACD金叉放量 — MACD金叉当日 + 量能放大""" +import polars as pl + +META = { + "id": "macd_golden", + "name": "MACD 金叉放量", + "description": "MACD金叉当日 + 量能放大", + "tags": ["MACD", "金叉", "放量"], + "params": [ + {"id": "vol_ratio_min", "label": "最低量比", "type": "float", + "default": 1.5, "min": 0.5, "max": 5.0, "step": 0.1}, + ], + "scoring": {"momentum_60d": 0.4, "vol_ratio_5d": 0.3, "change_pct": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_macd_golden"] +EXIT_SIGNALS = ["signal_macd_dead"] +STOP_LOSS = -0.07 +MAX_HOLD_DAYS = 20 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + vol_min = params.get("vol_ratio_min", 1.5) + return ( + pl.col("signal_macd_golden").fill_null(False) + & (pl.col("vol_ratio_5d") >= vol_min) + ) diff --git a/backend/app/strategy/builtin/n_day_low_reversal.py b/backend/app/strategy/builtin/n_day_low_reversal.py new file mode 100644 index 0000000..11219c2 --- /dev/null +++ b/backend/app/strategy/builtin/n_day_low_reversal.py @@ -0,0 +1,32 @@ +"""新低反转 — 60日新低后收阳放量""" +import polars as pl + +META = { + "id": "n_day_low_reversal", + "name": "新低反转", + "description": "触及60日新低后当日收阳放量, 反转信号", + "tags": ["反转", "新低"], + "params": [ + {"id": "vol_ratio_min", "label": "最低量比", "type": "float", + "default": 1.5, "min": 0.5, "max": 5.0, "step": 0.1}, + ], + "scoring": {"change_pct": 0.4, "vol_ratio_5d": 0.3, "momentum_5d": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_n_day_low"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.06 +MAX_HOLD_DAYS = 15 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + vol_min = params.get("vol_ratio_min", 1.5) + return ( + pl.col("signal_n_day_low").fill_null(False) + & (pl.col("close") > pl.col("open")) + & (pl.col("vol_ratio_5d") >= vol_min) + ) diff --git a/backend/app/strategy/builtin/near_limit_up.py b/backend/app/strategy/builtin/near_limit_up.py new file mode 100644 index 0000000..4442e06 --- /dev/null +++ b/backend/app/strategy/builtin/near_limit_up.py @@ -0,0 +1,55 @@ +"""逼近涨停 — 涨幅 > 7% 且距涨停 < 3%, 盘后选股""" +import polars as pl + + +def _limit_pct() -> pl.Expr: + """根据板块和 ST 动态计算涨跌幅限制 (小数)。 + 创业板(300/301)/科创板(688): 20% + 北交所(.BJ): 30% + ST: 5% + 主板: 10% + """ + is_st = pl.col("name").str.contains("(?i)ST").fill_null(False) + is_cyb = pl.col("symbol").str.starts_with("300") | pl.col("symbol").str.starts_with("301") + is_kcb = pl.col("symbol").str.starts_with("688") + is_bj = pl.col("symbol").str.contains(r"\.BJ$") + return ( + pl.when(is_st).then(0.05) + .when(is_cyb | is_kcb).then(0.20) + .when(is_bj).then(0.30) + .otherwise(0.10) + ) + + +META = { + "id": "near_limit_up", + "name": "逼近涨停", + "description": "涨幅 > 7% 且距涨停 < 3%, 追涨信号", + "tags": ["涨停", "追涨"], + "params": [ + {"id": "min_change", "label": "最低涨幅%", "type": "float", + "default": 7.0, "min": 3.0, "max": 15.0, "step": 1.0}, + {"id": "limit_gap", "label": "距涨停空间%", "type": "float", + "default": 3.0, "min": 1.0, "max": 10.0, "step": 0.5}, + ], + "scoring": {"change_pct": 0.5, "amount": 0.3, "momentum_5d": 0.2}, + "order_by": "score", + "descending": True, + "limit": 50, +} + +ENTRY_SIGNALS = [] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 5 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + min_chg = params.get("min_change", 7.0) / 100.0 + gap = params.get("limit_gap", 3.0) / 100.0 + lp = _limit_pct() + return ( + (pl.col("change_pct") > min_chg) + & (pl.col("change_pct") < lp - gap) + ) diff --git a/backend/app/strategy/builtin/oversold_bounce.py b/backend/app/strategy/builtin/oversold_bounce.py new file mode 100644 index 0000000..8adc124 --- /dev/null +++ b/backend/app/strategy/builtin/oversold_bounce.py @@ -0,0 +1,37 @@ +"""超跌反弹 — RSI14 < 30 + 收阳 + 放量""" +import polars as pl + +META = { + "id": "oversold_bounce", + "name": "超跌反弹", + "description": "RSI14 < 30超卖区 + 当日收阳 + 放量, 抄底信号", + "tags": ["超跌", "反弹", "RSI"], + "params": [ + {"id": "rsi_max", "label": "RSI上限", "type": "float", + "default": 30.0, "min": 10.0, "max": 50.0, "step": 1.0}, + {"id": "vol_ratio_min", "label": "最低量比", "type": "float", + "default": 1.2, "min": 0.5, "max": 5.0, "step": 0.1}, + ], + "scoring": {"change_pct": 0.3, "vol_ratio_5d": 0.3, "momentum_5d": 0.2, "rsi_14": 0.2}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = [] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 15 +ALERTS = [ + {"field": "rsi_14", "op": "<", "value": 25, "message": "RSI极度超卖"}, +] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + rsi_max = params.get("rsi_max", 30.0) + vol_min = params.get("vol_ratio_min", 1.2) + return ( + (pl.col("rsi_14") < rsi_max) + & (pl.col("close") > pl.col("open")) + & (pl.col("vol_ratio_5d") >= vol_min) + ) diff --git a/backend/app/strategy/builtin/oversold_reversal.py b/backend/app/strategy/builtin/oversold_reversal.py new file mode 100644 index 0000000..ba31a6b --- /dev/null +++ b/backend/app/strategy/builtin/oversold_reversal.py @@ -0,0 +1,37 @@ +"""超跌反弹 — RSI14 < 30 + 涨幅 > 1% + 站上 MA5, 超卖反弹信号""" +import polars as pl + +META = { + "id": "oversold_reversal", + "name": "超跌反转", + "description": "RSI14 < 30超卖 + 涨幅 > 1% + 站上MA5, 超卖反转信号", + "tags": ["超跌", "反弹", "RSI"], + "params": [ + {"id": "rsi_max", "label": "RSI上限", "type": "float", + "default": 30.0, "min": 10.0, "max": 50.0, "step": 1.0}, + {"id": "min_change", "label": "最低涨幅%", "type": "float", + "default": 1.0, "min": 0.5, "max": 5.0, "step": 0.5}, + ], + "scoring": {"change_pct": 0.4, "rsi_14": 0.3, "vol_ratio_5d": 0.3}, + "order_by": "score", + "descending": True, + "limit": 50, +} + +ENTRY_SIGNALS = [] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 15 +ALERTS = [ + {"field": "rsi_14", "op": "<", "value": 25, "message": "RSI极度超卖"}, +] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + rsi_max = params.get("rsi_max", 30.0) + min_chg = params.get("min_change", 1.0) / 100.0 + return ( + (pl.col("rsi_14") < rsi_max) + & (pl.col("change_pct") > min_chg) + & (pl.col("close") > pl.col("ma5")) + ) diff --git a/backend/app/strategy/builtin/pullback_ma20_bounce.py b/backend/app/strategy/builtin/pullback_ma20_bounce.py new file mode 100644 index 0000000..9c56adb --- /dev/null +++ b/backend/app/strategy/builtin/pullback_ma20_bounce.py @@ -0,0 +1,34 @@ +"""均线回踩反弹 — 价格在 MA20 附近(±2%)且 MA 多头排列, 回踩买入""" +import polars as pl + +META = { + "id": "pullback_ma20_bounce", + "name": "均线回踩反弹", + "description": "价格在MA20附近(±2%)且MA5>MA20>MA60多头排列, 回踩买入", + "tags": ["回踩", "均线", "反弹"], + "params": [ + {"id": "ma_proximity", "label": "MA偏离度%", "type": "float", + "default": 2.0, "min": 0.5, "max": 5.0, "step": 0.5}, + ], + "scoring": {"momentum_60d": 0.4, "change_pct": 0.3, "momentum_20d": 0.3}, + "order_by": "score", + "descending": True, + "limit": 50, +} + +ENTRY_SIGNALS = ["signal_ma_golden_5_20"] +EXIT_SIGNALS = ["signal_ma20_breakdown", "signal_ma_dead_5_20"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 15 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + proximity = params.get("ma_proximity", 2.0) / 100.0 + return ( + (pl.col("close") > pl.col("ma20") * (1 - proximity)) + & (pl.col("close") < pl.col("ma20") * (1 + proximity)) + & (pl.col("ma5") > pl.col("ma20")) + & (pl.col("ma20") > pl.col("ma60")) + & (pl.col("change_pct") > 0) + ) diff --git a/backend/app/strategy/builtin/pullback_to_support.py b/backend/app/strategy/builtin/pullback_to_support.py new file mode 100644 index 0000000..36fc51a --- /dev/null +++ b/backend/app/strategy/builtin/pullback_to_support.py @@ -0,0 +1,37 @@ +"""缩量回踩 — 回踩MA20附近 + 缩量 + 中期趋势向上""" +import polars as pl + +META = { + "id": "pullback_to_support", + "name": "缩量回踩", + "description": "回踩MA20附近 + 缩量 + 中期趋势向上", + "tags": ["回踩", "支撑"], + "params": [ + {"id": "ma_proximity", "label": "均线偏离度", "type": "float", + "default": 0.02, "min": 0.01, "max": 0.05, "step": 0.005}, + {"id": "vol_ratio_max", "label": "最大量比", "type": "float", + "default": 0.8, "min": 0.2, "max": 1.5, "step": 0.1}, + ], + "scoring": {"momentum_60d": 0.4, "momentum_20d": 0.3, "turnover_rate": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_ma_golden_5_20"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 20 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + proximity = params.get("ma_proximity", 0.02) + vol_max = params.get("vol_ratio_max", 0.8) + return ( + (pl.col("close") > pl.col("ma20") * (1 - proximity)) + & (pl.col("close") < pl.col("ma20") * (1 + proximity)) + & (pl.col("vol_ratio_5d") < vol_max) + & (pl.col("close") > pl.col("ma60")) + & (pl.col("momentum_20d") > 0) + ) diff --git a/backend/app/strategy/builtin/strong_open.py b/backend/app/strategy/builtin/strong_open.py new file mode 100644 index 0000000..918842b --- /dev/null +++ b/backend/app/strategy/builtin/strong_open.py @@ -0,0 +1,35 @@ +"""强势高开 — 高开 > 3% 且保持上涨, 集合竞价强势""" +import polars as pl + +META = { + "id": "strong_open", + "name": "强势高开", + "description": "高开 > 3% 且收盘高于开盘价, 集合竞价强势", + "tags": ["高开", "强势"], + "params": [ + {"id": "min_open_gap", "label": "最低高开%", "type": "float", + "default": 3.0, "min": 1.0, "max": 10.0, "step": 0.5}, + {"id": "min_change", "label": "最低涨幅%", "type": "float", + "default": 3.0, "min": 1.0, "max": 10.0, "step": 0.5}, + ], + "scoring": {"change_pct": 0.4, "amplitude": 0.2, "amount": 0.4}, + "order_by": "score", + "descending": True, + "limit": 50, +} + +ENTRY_SIGNALS = [] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 10 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + min_gap = params.get("min_open_gap", 3.0) / 100.0 + min_chg = params.get("min_change", 3.0) / 100.0 + return ( + (pl.col("open") > pl.col("prev_close") * (1 + min_gap)) + & (pl.col("close") > pl.col("open")) + & (pl.col("change_pct") > min_chg) + ) diff --git a/backend/app/strategy/builtin/trend_breakout.py b/backend/app/strategy/builtin/trend_breakout.py new file mode 100644 index 0000000..eb95cca --- /dev/null +++ b/backend/app/strategy/builtin/trend_breakout.py @@ -0,0 +1,42 @@ +"""趋势突破 — MA60上方 + 60日新高 + 放量""" +import polars as pl + +META = { + "id": "trend_breakout", + "name": "趋势突破", + "description": "MA60上方 + 60日新高 + 量能 ≥ 2倍均量", + "tags": ["趋势", "突破", "放量"], + "basic_filter": { + "price_min": 5, + "price_max": 200, + "market_cap_min": 20e8, + "amount_min": 1e8, + "exclude_st": True, + "exclude_new_days": 60, + }, + "params": [ + {"id": "vol_ratio_min", "label": "最低量比", "type": "float", + "default": 2.0, "min": 0.5, "max": 10.0, "step": 0.1}, + ], + "scoring": {"momentum_60d": 0.4, "vol_ratio_5d": 0.3, "change_pct": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_n_day_high"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.08 +MAX_HOLD_DAYS = 20 +ALERTS = [ + {"field": "signal_volume_surge", "message": "放量异动"}, +] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + vol_min = params.get("vol_ratio_min", 2.0) + return ( + (pl.col("close") > pl.col("ma60")) + & pl.col("signal_n_day_high").fill_null(False) + & (pl.col("vol_ratio_5d") >= vol_min) + ) diff --git a/backend/app/strategy/builtin/volume_price_surge.py b/backend/app/strategy/builtin/volume_price_surge.py new file mode 100644 index 0000000..c3573e4 --- /dev/null +++ b/backend/app/strategy/builtin/volume_price_surge.py @@ -0,0 +1,32 @@ +"""量价齐升 — 突破MA20 + 放量 + 收阳""" +import polars as pl + +META = { + "id": "volume_price_surge", + "name": "量价齐升", + "description": "突破MA20 + 放量 + 收阳", + "tags": ["量价", "突破"], + "params": [ + {"id": "vol_ratio_min", "label": "最低量比", "type": "float", + "default": 2.0, "min": 0.5, "max": 10.0, "step": 0.1}, + ], + "scoring": {"vol_ratio_5d": 0.4, "change_pct": 0.3, "momentum_20d": 0.3}, + "order_by": "score", + "descending": True, + "limit": 100, +} + +ENTRY_SIGNALS = ["signal_ma20_breakout"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.06 +MAX_HOLD_DAYS = 15 +ALERTS = [] + + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + vol_min = params.get("vol_ratio_min", 2.0) + return ( + pl.col("signal_ma20_breakout").fill_null(False) + & (pl.col("vol_ratio_5d") >= vol_min) + & (pl.col("close") > pl.col("open")) + ) diff --git a/backend/app/strategy/config.py b/backend/app/strategy/config.py new file mode 100644 index 0000000..3c594f7 --- /dev/null +++ b/backend/app/strategy/config.py @@ -0,0 +1,71 @@ +"""策略配置持久化 — 读写用户覆盖值。 + +职责: 将每个策略的用户定制设置(基础参数、策略参数、评分、买卖信号)持久化到 JSON。 +不知道: 引擎、AI、前端、回测。 +存储: data/user_data/strategy_overrides/{strategy_id}.json +""" +from __future__ import annotations + +import json +import logging +from pathlib import Path + +logger = logging.getLogger(__name__) + + +def _overrides_dir(data_dir: Path) -> Path: + d = data_dir / "user_data" / "strategy_overrides" + d.mkdir(parents=True, exist_ok=True) + return d + + +def _path(data_dir: Path, strategy_id: str) -> Path: + return _overrides_dir(data_dir) / f"{strategy_id}.json" + + +def load_override(data_dir: Path, strategy_id: str) -> dict: + """读取策略的用户覆盖配置,不存在返回空 dict""" + p = _path(data_dir, strategy_id) + if not p.exists(): + return {} + try: + data = json.loads(p.read_text(encoding="utf-8")) + # 清理 basic_filter 中值为 None/空的键(避免固化无意义的空值) + bf = data.get("basic_filter") + if isinstance(bf, dict): + cleaned = {k: v for k, v in bf.items() if v is not None} + if cleaned: + data["basic_filter"] = cleaned + else: + del data["basic_filter"] + return data + except Exception as e: + logger.warning("load override %s failed: %s", strategy_id, e) + return {} + + +def save_override(data_dir: Path, strategy_id: str, overrides: dict) -> None: + """保存策略的用户覆盖配置(全量覆盖写)""" + p = _path(data_dir, strategy_id) + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(json.dumps(overrides, ensure_ascii=False, indent=2), encoding="utf-8") + + +def delete_override(data_dir: Path, strategy_id: str) -> None: + """删除策略的用户覆盖配置(重置为默认值)""" + p = _path(data_dir, strategy_id) + if p.exists(): + p.unlink() + + +def list_overrides(data_dir: Path) -> dict[str, dict]: + """返回所有策略的覆盖配置 {strategy_id: overrides}""" + d = _overrides_dir(data_dir) + result: dict[str, dict] = {} + for f in d.glob("*.json"): + try: + sid = f.stem + result[sid] = json.loads(f.read_text(encoding="utf-8")) + except Exception: + continue + return result diff --git a/backend/app/strategy/custom_signals.py b/backend/app/strategy/custom_signals.py new file mode 100644 index 0000000..cc05a83 --- /dev/null +++ b/backend/app/strategy/custom_signals.py @@ -0,0 +1,207 @@ +"""自定义信号 — 用户用「字段 + 运算符 + 值」组合出的布尔信号。 + +职责: + - 从 data/user_data/custom_signals/*.json 加载信号定义 + - 把每个信号的 conditions 编译成一条 Polars 布尔表达式(AND 组合) + - 供 pipeline 在 compute_signals / compute_enriched_today 末尾注入为列 + +不知道: 引擎、AI、API、回测、监控。纯函数 + 模块级缓存。 + +设计: + - 信号列名加前缀 ``csg_`` 避免与内置 ``signal_`` 列冲突。 + - 回测/选股/监控都按列名找信号,因此注入列后零特殊处理即可三处生效。 + - 字段白名单 + 固定运算符集,杜绝任意表达式注入。 + - 第一版只支持 AND(多条件同时满足)。 +""" +from __future__ import annotations + +import json +import logging +import re +from pathlib import Path + +import polars as pl + +logger = logging.getLogger(__name__) + +# ── 常量 ──────────────────────────────────────────────── +PREFIX = "csg_" # 自定义信号列名前缀 +ID_RE = re.compile(r"^[a-z0-9_]{1,40}$") +OPS = {">", ">=", "<", "<=", "==", "!="} + +# 字段白名单:只允许这些列出现在条件里(防注入)。均为数值型。 +# 与 ENRICHED_COLUMNS 的数值列保持一致,排除 symbol/date/name 等非数值列。 +ALLOWED_FIELDS: frozenset[str] = frozenset({ + # 行情 + "open", "high", "low", "close", "volume", "amount", "turnover_rate", + "consecutive_limit_ups", "consecutive_limit_downs", + # 基础 + "prev_close", "change_pct", "change_amount", "amplitude", + # 均线 / 指数均线 + "ma5", "ma10", "ma20", "ma30", "ma60", + "ema5", "ema10", "ema20", "ema30", "ema60", + # MACD / BOLL / KDJ / ATR + "macd_dif", "macd_dea", "macd_hist", + "boll_upper", "boll_lower", + "kdj_k", "kdj_d", "kdj_j", + "atr_14", + # 量价 / 极值 / 动量 / 波动率 / RSI + "vol_ma5", "vol_ma10", "vol_ratio_5d", + "high_60d", "low_60d", + "momentum_5d", "momentum_10d", "momentum_20d", "momentum_30d", "momentum_60d", + "annual_vol_20d", + "rsi_6", "rsi_14", "rsi_24", +}) + +# 运算符 → Polars 表达式构造器(输入 col_expr, value) +_OP_BUILDERS = { + ">": lambda c, v: c > v, + ">=": lambda c, v: c >= v, + "<": lambda c, v: c < v, + "<=": lambda c, v: c <= v, + "==": lambda c, v: c == v, + "!=": lambda c, v: c != v, +} + + +# ── 持久化(镜像 strategy/config.py 的写法)────────────── +def _dir(data_dir: Path) -> Path: + d = data_dir / "user_data" / "custom_signals" + d.mkdir(parents=True, exist_ok=True) + return d + + +def _path(data_dir: Path, signal_id: str) -> Path: + return _dir(data_dir) / f"{signal_id}.json" + + +def load_all(data_dir: Path) -> list[dict]: + """读取全部自定义信号定义。损坏的文件被跳过。""" + d = _dir(data_dir) + out: list[dict] = [] + for f in sorted(d.glob("*.json")): + try: + out.append(json.loads(f.read_text(encoding="utf-8"))) + except Exception as e: + logger.warning("custom signal load failed %s: %s", f.name, e) + return out + + +def save_one(data_dir: Path, sig: dict) -> None: + p = _path(data_dir, sig["id"]) + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(json.dumps(sig, ensure_ascii=False, indent=2), encoding="utf-8") + + +def delete_one(data_dir: Path, signal_id: str) -> bool: + p = _path(data_dir, signal_id) + if p.exists(): + p.unlink() + return True + return False + + +# ── 校验 ──────────────────────────────────────────────── +def _parse_right(right: str) -> tuple[str, object]: + """解析右值。返回 ('field', colname) 或 ('const', float)。""" + if isinstance(right, (int, float)): + return ("const", float(right)) + if not isinstance(right, str): + raise ValueError(f"非法右值: {right!r}") + if right.startswith("field:"): + col = right[len("field:"):] + if col not in ALLOWED_FIELDS: + raise ValueError(f"右值字段不在白名单: {col}") + return ("field", col) + # 纯数字 + try: + return ("const", float(right)) + except ValueError: + raise ValueError(f"非法右值(应为 field:xxx 或数字): {right!r}") + + +def validate(sig: dict) -> None: + """校验一个信号定义,非法则抛 ValueError(含中文信息)。""" + sid = sig.get("id", "") + if not isinstance(sid, str) or not ID_RE.match(sid): + raise ValueError(f"信号 id 非法(仅小写字母数字下划线,1-40字符): {sid!r}") + if not isinstance(sig.get("name"), str) or not sig["name"].strip(): + raise ValueError("信号 name 不能为空") + if sig.get("kind") not in ("entry", "exit", "both"): + raise ValueError("kind 必须是 entry / exit / both") + conds = sig.get("conditions") + if not isinstance(conds, list) or len(conds) == 0: + raise ValueError("conditions 不能为空") + if len(conds) > 8: + raise ValueError("conditions 最多 8 条") + for i, c in enumerate(conds): + if not isinstance(c, dict): + raise ValueError(f"第 {i+1} 个条件格式错误") + left = c.get("left", "") + if left not in ALLOWED_FIELDS: + raise ValueError(f"第 {i+1} 个条件: 字段 {left!r} 不在白名单") + if c.get("op") not in OPS: + raise ValueError(f"第 {i+1} 个条件: 运算符 {c.get('op')!r} 非法") + _parse_right(c.get("right")) # 会校验右值字段/数字 + + +# ── 编译为 Polars 表达式 ───────────────────────────────── +def column_name(signal_id: str) -> str: + """信号 id → DataFrame 列名(加前缀)。""" + return f"{PREFIX}{signal_id}" + + +def build_expressions(signals: list[dict]) -> dict[str, pl.Expr]: + """把多个自定义信号编译成 {column_name: pl.Expr}。 + + - 只处理 enabled != False 的信号。 + - 单个信号内多条件用 ``&`` 串联(AND)。 + - 编译失败的信号被跳过并告警(不影响其它信号)。 + """ + out: dict[str, pl.Expr] = {} + for sig in signals: + if sig.get("enabled") is False: + continue + try: + conds = sig["conditions"] + col_name = column_name(sig["id"]) + parts: list[pl.Expr] = [] + for c in conds: + left = c["left"] + op = c["op"] + kind, val = _parse_right(c["right"]) + right_expr = pl.col(val) if kind == "field" else val + parts.append(_OP_BUILDERS[op](pl.col(left), right_expr)) + combined = parts[0] + for p in parts[1:]: + combined = combined & p + out[col_name] = combined + except Exception as e: + logger.warning("custom signal compile failed %s: %s", sig.get("id"), e) + return out + + +def inject(df: pl.DataFrame, exprs: dict[str, pl.Expr]) -> pl.DataFrame: + """把编译好的信号表达式作为列加入 df。仅添加 df 已含其依赖列的信号。""" + if df.is_empty() or not exprs: + return df + cols = set(df.columns) + add: dict[str, pl.Expr] = {} + for name, expr in exprs.items(): + # 提取该表达式引用的所有字段列,缺失则跳过(避免运行时报错) + needed = _expr_root_columns(expr) + if needed.issubset(cols): + add[name] = expr + if add: + df = df.with_columns([e.alias(n) for n, e in add.items()]) + return df + + +def _expr_root_columns(expr: pl.Expr) -> set[str]: + """尽力提取表达式里出现的列名。失败则返回空集(保守跳过)。""" + try: + # Polars 的 meta.root_names() 返回表达式引用的根列名 + names = expr.meta.root_names() + return set(names) + except Exception: + return set() diff --git a/backend/app/strategy/engine.py b/backend/app/strategy/engine.py new file mode 100644 index 0000000..67ef2ad --- /dev/null +++ b/backend/app/strategy/engine.py @@ -0,0 +1,453 @@ +"""策略引擎 — 加载、执行、评分。 + +职责: 从文件系统加载策略 Python 模块,执行两阶段过滤(基础+策略), + 通用评分排序。 +不知道: AI、API、前端、配置持久化、回测。 +""" +from __future__ import annotations + +import importlib.util +import logging +import time +from dataclasses import dataclass, field +from datetime import date +from pathlib import Path +from typing import Any, Callable + +import polars as pl + +logger = logging.getLogger(__name__) + +# 引擎级默认基础过滤 — 策略未定义 BASIC_FILTER 时兜底 +DEFAULT_BASIC_FILTER: dict = { + "price_min": 3, + "price_max": 300, + "market_cap_min": 10e8, + "float_cap_min": None, + "float_cap_max": None, + "amount_min": 0.2e8, + "amount_max": None, + "turnover_min": None, + "turnover_max": None, + "exclude_st": True, + "exclude_new_days": 30, + "boards": ["沪主板", "深主板", "创业板", "科创板", "北交所"], +} + + +@dataclass +class StrategyDef: + """加载后的策略定义(只读数据 + filter 函数引用)""" + meta: dict + basic_filter: dict + entry_signals: list[str] + exit_signals: list[str] + stop_loss: float | None + trailing_stop: float | None + trailing_take_profit_activate: float | None + trailing_take_profit_drawdown: float | None + max_hold_days: int | None + alerts: list[dict] + filter_fn: Callable[[pl.DataFrame, dict], pl.Expr] | None + filter_history_fn: Callable[[pl.DataFrame, dict], pl.DataFrame] | None + lookback_days: int + source: str # "builtin" | "custom" | "ai" + file_path: Path | None = None + + +@dataclass +class StrategyResult: + """策略执行结果""" + as_of: date + strategy_id: str + rows: list[dict] = field(default_factory=list) + total: int = 0 + elapsed_ms: float = 0.0 + scores: dict[str, float] = field(default_factory=dict) + + +class StrategyEngine: + """策略引擎 — 策略加载 + 执行 + 评分""" + + def __init__(self, enriched_loader: Callable[[date], pl.DataFrame], + enriched_history_loader: Callable[[date, int], pl.DataFrame] | None = None, + strategy_dirs: list[Path] | None = None): + """ + Args: + enriched_loader: (date) -> pl.DataFrame, 加载指定日期的 enriched 数据 + strategy_dirs: 策略文件搜索目录列表 + """ + self._loader = enriched_loader + self._history_loader = enriched_history_loader + self._strategies: dict[str, StrategyDef] = {} + self._strategy_dirs = strategy_dirs or [] + self._load_all() + + # ================================================================ + # 加载 + # ================================================================ + + def _load_all(self) -> None: + self._strategies.clear() + for d in self._strategy_dirs: + if not d.exists(): + continue + for f in sorted(d.glob("*.py")): + if f.name.startswith("_"): + continue + try: + s = self._load_file(f) + self._strategies[s.meta["id"]] = s + logger.debug("loaded strategy: %s (%s)", s.meta["id"], s.source) + except Exception as e: + logger.warning("load strategy %s failed: %s", f.name, e) + + @staticmethod + def _load_file(path: Path) -> StrategyDef: + """从 Python 文件加载策略定义""" + spec = importlib.util.spec_from_file_location(path.stem, path) + if spec is None or spec.loader is None: + raise ValueError(f"cannot load module from {path}") + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + + meta = getattr(mod, "META", {}) + meta.setdefault("id", path.stem) + meta.setdefault("name", path.stem) + meta.setdefault("description", "") + meta.setdefault("tags", []) + meta.setdefault("params", []) + meta.setdefault("scoring", {}) + meta.setdefault("order_by", "score") + meta.setdefault("descending", True) + meta.setdefault("limit", 100) + + # 合并默认基础过滤 + bf = {**DEFAULT_BASIC_FILTER} + strat_bf = getattr(mod, "BASIC_FILTER", None) + if strat_bf: + bf.update(strat_bf) + # meta 里的 basic_filter 也合并(优先级最高) + meta_bf = meta.get("basic_filter") + if meta_bf: + bf.update(meta_bf) + + source = "custom" + if "builtin" in str(path).replace("\\", "/"): + source = "builtin" + elif "/ai/" in str(path).replace("\\", "/") or "\\ai\\" in str(path): + source = "ai" + + return StrategyDef( + meta=meta, + basic_filter=bf, + entry_signals=getattr(mod, "ENTRY_SIGNALS", []), + exit_signals=getattr(mod, "EXIT_SIGNALS", []), + stop_loss=getattr(mod, "STOP_LOSS", None), + trailing_stop=getattr(mod, "TRAILING_STOP", None), + trailing_take_profit_activate=getattr(mod, "TRAILING_TAKE_PROFIT_ACTIVATE", None), + trailing_take_profit_drawdown=getattr(mod, "TRAILING_TAKE_PROFIT_DRAWDOWN", None), + max_hold_days=getattr(mod, "MAX_HOLD_DAYS", None), + alerts=getattr(mod, "ALERTS", []), + filter_fn=getattr(mod, "filter", None), + filter_history_fn=getattr(mod, "filter_history", None), + lookback_days=int(getattr(mod, "LOOKBACK_DAYS", meta.get("lookback_days", 1)) or 1), + source=source, + file_path=path, + ) + + def reload(self) -> None: + """热重载所有策略""" + self._load_all() + + # ================================================================ + # 查询 + # ================================================================ + + def list_strategies(self) -> list[dict]: + """返回所有策略的元信息""" + result = [] + for s in self._strategies.values(): + result.append({**s.meta, "source": s.source}) + return result + + def get(self, strategy_id: str) -> StrategyDef: + s = self._strategies.get(strategy_id) + if not s: + raise ValueError(f"unknown strategy: {strategy_id}") + return s + + def has(self, strategy_id: str) -> bool: + return strategy_id in self._strategies + + # ================================================================ + # 执行 + # ================================================================ + + def run( + self, + strategy_id: str, + as_of: date, + pool: list[str] | None = None, + params: dict | None = None, + overrides: dict | None = None, + precomputed: pl.DataFrame | None = None, + precomputed_history: pl.DataFrame | None = None, + ) -> StrategyResult: + """执行策略: 基础过滤 → 策略过滤 → 评分排序 + + Args: + strategy_id: 策略 ID + as_of: 选股日期 + pool: 限定股票池 + params: 策略参数 (用户在设置面板调的值) + overrides: 用户覆盖配置 (basic_filter/scoring/stop_loss 等) + precomputed: 已加载的 enriched 数据 (run_all 场景复用) + precomputed_history: 已加载的历史窗口数据 (run_all 场景复用) + """ + t0 = time.perf_counter() + + s = self.get(strategy_id) + params = params or {} + overrides = overrides or {} + + # 加载数据。普通策略只读目标日期;声明 filter_history 的策略读取历史窗口。 + if s.filter_history_fn: + if precomputed_history is not None and not precomputed_history.is_empty(): + df = precomputed_history + elif self._history_loader: + df = self._history_loader(as_of, max(1, s.lookback_days)) + else: + logger.warning("strategy %s requires history loader", strategy_id) + return StrategyResult(as_of=as_of, strategy_id=strategy_id) + if df.is_empty(): + return StrategyResult(as_of=as_of, strategy_id=strategy_id) + df = s.filter_history_fn(df, params) + if df.is_empty(): + return StrategyResult(as_of=as_of, strategy_id=strategy_id) + if "date" in df.columns: + df = df.filter(pl.col("date") == as_of) + elif precomputed is not None and not precomputed.is_empty(): + df = precomputed + else: + df = self._loader(as_of) + if df.is_empty(): + return StrategyResult(as_of=as_of, strategy_id=strategy_id) + + # 基础过滤: 策略默认 basic_filter 兜底, 用户 override 优先覆盖。 + # 这样策略文件里写的 exclude_st/price_min 等默认值即使前端没保存也能生效。 + bf = dict(s.basic_filter) if s.basic_filter else {} + if overrides and overrides.get("basic_filter"): + bf.update(overrides["basic_filter"]) + + # Stage 1: 基础过滤(enabled 默认开启; 显式 enabled=false 才跳过) + if bf and bf.get("enabled", True): + df = self._apply_basic_filter(df, bf) + + # Pool 过滤 + if pool: + df = df.filter(pl.col("symbol").is_in(pool)) + + # Stage 2: 策略过滤 + if s.filter_fn: + expr = s.filter_fn(df, params) + df = df.filter(expr) + + # Stage 3: 评分 + scoring = s.meta.get("scoring", {}) + scoring_overrides = overrides.get("scoring") + if scoring_overrides: + scoring = {**scoring, **scoring_overrides} + df = self._apply_scoring(df, scoring) + + # 排序 + 限制 + limit = s.meta.get("limit", 100) + order_desc = s.meta.get("descending", True) + if "score" in df.columns: + df = df.sort("score", descending=order_desc) + elif s.meta.get("order_by") and s.meta["order_by"] != "score": + ob = s.meta["order_by"] + if ob in df.columns: + df = df.sort(ob, descending=order_desc) + df = df.head(limit) + + # 输出 + rows = _sanitize(df.to_dicts()) + elapsed = (time.perf_counter() - t0) * 1000 + + scores: dict[str, float] = {} + if "score" in df.columns: + for r in df.iter_rows(named=True): + scores[r["symbol"]] = float(r.get("score") or 0) + + return StrategyResult( + as_of=as_of, + strategy_id=strategy_id, + rows=rows, + total=len(rows), + elapsed_ms=elapsed, + scores=scores, + ) + + def run_all(self, as_of: date, params_map: dict | None = None, + overrides_map: dict | None = None) -> dict[str, StrategyResult]: + """批量执行所有策略 (enriched 只加载一次,基础过滤按策略分组缓存,历史数据共享)""" + df = self._loader(as_of) + params_map = params_map or {} + overrides_map = overrides_map or {} + + # 历史策略: 找最大 lookback,一次加载共享 + history_strats = [(sid, s) for sid, s in self._strategies.items() if s.filter_history_fn] + if history_strats and self._history_loader: + max_lookback = max(s.lookback_days for _, s in history_strats) + shared_history = self._history_loader(as_of, max(1, max_lookback)) + else: + shared_history = None + + # 按 basic_filter hash 分组,避免重复过滤 + bf_cache: dict[str, pl.DataFrame] = {} + results: dict[str, StrategyResult] = {} + + for sid, strat in self._strategies.items(): + try: + bf_key = _dict_hash(strat.basic_filter) + if bf_key not in bf_cache: + if strat.basic_filter.get("enabled", True): + bf_cache[bf_key] = self._apply_basic_filter(df, strat.basic_filter) + else: + bf_cache[bf_key] = df + base = bf_cache[bf_key] + + # 从已过滤的 base 执行 (filter_history 策略使用共享历史) + results[sid] = self.run( + sid, as_of, + params=params_map.get(sid), + overrides=overrides_map.get(sid), + precomputed=base, + precomputed_history=shared_history, + ) + except Exception as e: + logger.warning("run strategy %s failed: %s", sid, e) + + return results + + # ================================================================ + # 内部: 基础过滤 + # ================================================================ + + @staticmethod + def _basic_filter_expr(df: pl.DataFrame, bf: dict) -> pl.Expr | None: + """构建基础过滤表达式。回测可复用为买入候选 mask,不删除行情行。""" + exprs: list[pl.Expr] = [] + if bf.get("price_min") is not None: + exprs.append(pl.col("close") >= bf["price_min"]) + if bf.get("price_max") is not None: + exprs.append(pl.col("close") <= bf["price_max"]) + if bf.get("market_cap_min") is not None and "total_shares" in df.columns: + exprs.append( + pl.col("close") * pl.col("total_shares") >= bf["market_cap_min"] + ) + if bf.get("market_cap_max") is not None and "total_shares" in df.columns: + exprs.append( + pl.col("close") * pl.col("total_shares") <= bf["market_cap_max"] + ) + # 流通市值 + if bf.get("float_cap_min") is not None and "float_shares" in df.columns: + exprs.append( + pl.col("close") * pl.col("float_shares") >= bf["float_cap_min"] + ) + if bf.get("float_cap_max") is not None and "float_shares" in df.columns: + exprs.append( + pl.col("close") * pl.col("float_shares") <= bf["float_cap_max"] + ) + if bf.get("amount_min") is not None: + exprs.append(pl.col("amount") >= bf["amount_min"]) + if bf.get("amount_max") is not None: + exprs.append(pl.col("amount") <= bf["amount_max"]) + # 换手率 + if bf.get("turnover_min") is not None and "turnover_rate" in df.columns: + exprs.append(pl.col("turnover_rate") >= bf["turnover_min"]) + if bf.get("turnover_max") is not None and "turnover_rate" in df.columns: + exprs.append(pl.col("turnover_rate") <= bf["turnover_max"]) + if bf.get("exclude_st") and "name" in df.columns: + exprs.append(~pl.col("name").str.contains("(?i)ST|\\*ST|退")) + # 板块过滤 + boards = bf.get("boards") + if boards and isinstance(boards, list) and len(boards) > 0: + board_exprs: list[pl.Expr] = [] + for b in boards: + if b == "沪主板": + board_exprs.append(pl.col("symbol").str.starts_with("60")) + elif b == "深主板": + board_exprs.append( + pl.col("symbol").str.starts_with("00") + | pl.col("symbol").str.starts_with("001") + ) + elif b == "创业板": + board_exprs.append( + pl.col("symbol").str.starts_with("300") + | pl.col("symbol").str.starts_with("301") + ) + elif b == "科创板": + board_exprs.append(pl.col("symbol").str.starts_with("688")) + elif b == "北交所": + board_exprs.append(pl.col("symbol").str.contains(r"\.BJ$")) + if board_exprs: + exprs.append(pl.any_horizontal(board_exprs)) + if exprs: + return pl.all_horizontal(exprs) + return None + + @staticmethod + def _apply_basic_filter(df: pl.DataFrame, bf: dict) -> pl.DataFrame: + """Stage 1: 基础参数过滤""" + expr = StrategyEngine._basic_filter_expr(df, bf) + if expr is not None: + return df.filter(expr) + return df + + # ================================================================ + # 内部: 评分 + # ================================================================ + + @staticmethod + def _apply_scoring(df: pl.DataFrame, weights: dict) -> pl.DataFrame: + """通用评分: min-max 归一化 → 加权求和 → 0~100 分""" + if not weights: + return df + total_weight = sum(weights.values()) + if total_weight <= 0: + return df + + score_parts: list[pl.Expr] = [] + for col, weight in weights.items(): + if col not in df.columns: + continue + w = weight / total_weight + col_min = pl.col(col).min() + col_range = pl.col(col).max() - col_min + normalized = pl.when(col_range > 0).then( + (pl.col(col) - col_min) / col_range + ).otherwise(pl.lit(0.5)) + score_parts.append(normalized * w) + + if not score_parts: + return df + + score_expr = score_parts[0] + for part in score_parts[1:]: + score_expr = score_expr + part + return df.with_columns((score_expr * 100).alias("score")) + + +def _sanitize(rows: list[dict]) -> list[dict]: + for r in rows: + for k, v in list(r.items()): + if isinstance(v, float) and (v != v or abs(v) == float("inf")): + r[k] = None + return rows + + +def _dict_hash(d: dict) -> str: + """用于 basic_filter 分组缓存""" + return str(sorted(d.items())) diff --git a/backend/app/strategy/monitor.py b/backend/app/strategy/monitor.py new file mode 100644 index 0000000..41cf219 --- /dev/null +++ b/backend/app/strategy/monitor.py @@ -0,0 +1,613 @@ +"""策略实时监控 — 订阅行情更新,检查策略买卖信号和提醒条件。 + +职责: 接收实时行情 DataFrame → 检查监控中策略的信号/提醒 → 推送告警。 +不知道: 策略加载逻辑、AI、API、配置持久化、回测。 +依赖: 外部调用 on_quote_update() 传入实时数据。 + +本模块含两个评估器: + 1. StrategyMonitorService — 旧的策略监控 (type=strategy),第二步迁移到 MonitorRuleEngine + 2. MonitorRuleEngine — 通用规则引擎,覆盖 signal/price/market/strategy 四类, + 支持 scope (symbols/all/sector) + 多条件 AND/OR + cooldown 去重 +""" +from __future__ import annotations + +import datetime as _dt +import logging +import time +from dataclasses import dataclass, field +from typing import Any, Callable + +import polars as pl + +from app.strategy.custom_signals import _OP_BUILDERS # type: ignore # 复用运算符构造器 +from app.strategy import config as _strategy_config + +logger = logging.getLogger(__name__) + + +@dataclass +class StrategyAlert: + """策略告警""" + type: str # "entry" | "exit" | "alert" + strategy_id: str + symbol: str + name: str | None + message: str + price: float | None = None + change_pct: float | None = None + signals: list[str] = field(default_factory=list) + + +class StrategyMonitorService: + """策略实时监控服务""" + + def __init__(self, alert_handler: Callable[[StrategyAlert], None] | None = None): + """ + Args: + alert_handler: 告警回调 (如推 SSE) + """ + self._alert_handler = alert_handler + # strategy_id → 监控配置 + self._watching: dict[str, dict] = {} + + def start(self, strategy_id: str, config: dict) -> None: + """开始监控一个策略 + + config: { + "entry_signals": ["signal_n_day_high", ...], + "exit_signals": ["signal_ma20_breakdown", ...], + "alerts": [{"field": "rsi_14", "op": ">", "value": 80, "message": "..."}], + } + """ + self._watching[strategy_id] = config + logger.info("strategy monitor started: %s", strategy_id) + + def stop(self, strategy_id: str) -> None: + self._watching.pop(strategy_id, None) + logger.info("strategy monitor stopped: %s", strategy_id) + + def stop_all(self) -> None: + self._watching.clear() + + @property + def watching(self) -> dict[str, dict]: + return dict(self._watching) + + def on_quote_update(self, df: pl.DataFrame) -> list[StrategyAlert]: + """行情更新后调用。向量化检查所有监控策略。 + + Args: + df: 实时 enriched 数据 (~5500行) + Returns: + 触发的告警列表 + """ + if not self._watching or df.is_empty(): + return [] + + all_alerts: list[StrategyAlert] = [] + + for strategy_id, cfg in self._watching.items(): + # 买入信号 + entry_sigs = cfg.get("entry_signals", []) + if entry_sigs: + for sym, name, price, pct, hit_sigs in self._check_signals(df, entry_sigs): + alert = StrategyAlert( + type="entry", + strategy_id=strategy_id, + symbol=sym, + name=name, + message=f"买入信号触发", + price=price, + change_pct=pct, + signals=hit_sigs, + ) + all_alerts.append(alert) + self._emit(alert) + + # 卖出信号 + exit_sigs = cfg.get("exit_signals", []) + if exit_sigs: + for sym, name, price, pct, hit_sigs in self._check_signals(df, exit_sigs): + alert = StrategyAlert( + type="exit", + strategy_id=strategy_id, + symbol=sym, + name=name, + message=f"卖出信号触发", + price=price, + change_pct=pct, + signals=hit_sigs, + ) + all_alerts.append(alert) + self._emit(alert) + + # 提醒条件 + for alert_cfg in cfg.get("alerts", []): + for sym, name, price, pct in self._check_alert(df, alert_cfg): + alert = StrategyAlert( + type="alert", + strategy_id=strategy_id, + symbol=sym, + name=name, + message=alert_cfg.get("message", "提醒"), + price=price, + change_pct=pct, + ) + all_alerts.append(alert) + self._emit(alert) + + return all_alerts + + def _emit(self, alert: StrategyAlert) -> None: + if self._alert_handler: + try: + self._alert_handler(alert) + except Exception as e: + logger.warning("alert handler failed: %s", e) + + @staticmethod + def _check_signals( + df: pl.DataFrame, + signals: list[str], + ) -> list[tuple[str, str | None, float | None, float | None, list[str]]]: + """检查信号列,返回 [(symbol, name, price, change_pct, [hit_signals])]。 + 支持内置 signal_ 与自定义 csg_ 前缀。""" + cols = set(df.columns) + resolved: list[tuple[str, str]] = [] # (原值, 列名) + for s in signals: + col = s if (s.startswith("signal_") or s.startswith("csg_")) else f"signal_{s}" + if col in cols: + resolved.append((s, col)) + if not resolved: + return [] + + mask = pl.any_horizontal(pl.col(c).fill_null(False) for _, c in resolved) + hit_df = df.filter(mask) + + results = [] + for row in hit_df.iter_rows(named=True): + sym = row.get("symbol", "") + name = row.get("name") + price = row.get("close") + pct = row.get("change_pct") + hit_sigs = [orig for orig, col in resolved if row.get(col)] + results.append((sym, name, price, pct, hit_sigs)) + return results + + @staticmethod + def _check_alert( + df: pl.DataFrame, + alert: dict, + ) -> list[tuple[str, str | None, float | None, float | None]]: + """检查阈值型提醒条件""" + field = alert.get("field", "") + if field not in df.columns: + return [] + + if "op" in alert: + # 阈值比较 + op = alert["op"] + value = alert["value"] + col = pl.col(field) + ops = { + ">": col > value, + ">=": col >= value, + "<": col < value, + "<=": col <= value, + } + expr = ops.get(op) + if expr is None: + return [] + else: + # 信号列 (布尔) + expr = pl.col(field).fill_null(False) + + hit_df = df.filter(expr) + results = [] + for row in hit_df.iter_rows(named=True): + results.append(( + row.get("symbol", ""), + row.get("name"), + row.get("close"), + row.get("change_pct"), + )) + return results + + +# ================================================================ +# 通用监控规则引擎 MonitorRuleEngine +# ================================================================ + +_SIGNAL_PREFIXES = ("signal_", "csg_") + + +def _is_signal_field(field: str) -> bool: + return any(field.startswith(p) for p in _SIGNAL_PREFIXES) + + +def _build_condition_mask(df: pl.DataFrame, conditions: list[dict], logic: str) -> pl.DataFrame: + """根据 conditions + logic 构建过滤后的命中 DataFrame。 + + conditions: [{"field","op","value"?}] — op=truth 为布尔信号, 否则阈值比较 + logic: "and" | "or" + 返回命中行 (含 symbol/name/close/change_pct + 各信号列) + """ + cols = set(df.columns) + parts: list[pl.Expr] = [] + for c in conditions: + field = c["field"] + if field not in cols: + return df.head(0) # 字段缺失,无法判定 → 空结果 + op = c["op"] + if op == "truth": + parts.append(pl.col(field).fill_null(False)) + elif op in _OP_BUILDERS: + parts.append(_OP_BUILDERS[op](pl.col(field), c["value"])) + else: + return df.head(0) + if not parts: + return df.head(0) + if logic == "or": + mask = pl.any_horizontal(parts) + else: + mask = pl.all_horizontal(parts) + return df.filter(mask) + + +class MonitorRuleEngine: + """通用监控规则引擎 — 接收实时行情 DataFrame,评估所有规则,返回 AlertEvent。 + + 与 StrategyMonitorService 的区别: + - 规则来自 monitor_rules 存储 (用户可配), 而非写死的 strategy config + - 支持 scope (symbols/all/sector) 过滤作用域 + - 支持 conditions + logic (AND/OR) 任意组合 + - ★ cooldown 去重: 同一 (rule_id, symbol) 在冷却期内不重复触发 + """ + + def __init__(self, alert_handler: Callable[[dict], None] | None = None): + self._alert_handler = alert_handler + self._rules: dict[str, dict] = {} # rule_id → rule + # (rule_id, symbol) → 上次触发时间戳(秒)。用于 cooldown 去重。 + self._last_fire: dict[tuple[str, str], float] = {} + self._strategy_engine = None # 延迟注入, type=strategy 规则用它跑选股 + # symbol → 股票名 (enriched DataFrame 已 drop name 列, 触发时从此映射回填) + self._name_map: dict[str, str] = {} + # 策略选股池状态: strategy_id → 上期选股符号集合 (用于 diff 变更) + self._strategy_pools: dict[str, set[str]] = {} + # 数据目录 (用于加载策略 overrides) + self._data_dir = None + + def set_strategy_engine(self, engine) -> None: + """注入 StrategyEngine, type=strategy 规则据此跑选股。""" + self._strategy_engine = engine + + def set_data_dir(self, data_dir) -> None: + """注入数据目录, 用于加载策略的用户覆盖配置。""" + self._data_dir = data_dir + + def set_name_map(self, name_map: dict[str, str]) -> None: + """注入 symbol → 股票名 映射, 用于在告警事件里回填 name 字段。 + + enriched DataFrame 在 pipeline 计算后不含 name 列 (见 indicators/pipeline.py), + 触发时从 instruments 表预构建此映射, 保证 AlertEvent.name 有值。 + """ + self._name_map = name_map or {} + + # ── 规则管理 ─────────────────────────────────────── + def set_rules(self, rules: list[dict]) -> None: + """批量设置规则 (覆盖)。用于启动时 reload。""" + self._rules = {} + for r in rules: + if r.get("enabled") is not False: + self._rules[r["id"]] = r + logger.info("MonitorRuleEngine: 装载 %d 条规则", len(self._rules)) + + def add_rule(self, rule: dict) -> None: + if rule.get("enabled") is not False: + self._rules[rule["id"]] = rule + else: + self._rules.pop(rule["id"], None) + + def remove_rule(self, rule_id: str) -> None: + self._rules.pop(rule_id, None) + # 清理对应的 cooldown 记录 + self._last_fire = {k: v for k, v in self._last_fire.items() if k[0] != rule_id} + + def clear(self) -> None: + self._rules.clear() + self._last_fire.clear() + + @property + def rules(self) -> dict[str, dict]: + return dict(self._rules) + + @property + def rule_count(self) -> int: + return len(self._rules) + + # ── 评估 ─────────────────────────────────────────── + def evaluate(self, df: pl.DataFrame) -> list[dict]: + """行情更新后评估所有规则。 + + Args: + df: 实时 enriched 数据 (~5500行, 含 signal_/csg_/指标列) + Returns: + 触发的 AlertEvent dict 列表 (含 ts/rule_id/source/type/symbol/...) + """ + if not self._rules or df.is_empty(): + return [] + + now = time.time() + events: list[dict] = [] + + for rule_id, rule in self._rules.items(): + try: + events.extend(self._evaluate_rule(df, rule, now)) + except Exception as e: + logger.warning("规则评估失败 %s: %s", rule_id, e) + + return events + + def _evaluate_rule(self, df: pl.DataFrame, rule: dict, now: float) -> list[dict]: + """评估单条规则,返回触发的 events。""" + # 1. 按 scope 过滤作用域 + scoped = self._apply_scope(df, rule) + if scoped.is_empty(): + return [] + + # 2. 根据 type 构建命中集 + # 元组格式: (event_type, symbol, name, price, pct, signals) + hit_rows: list[tuple[str, str, Any, Any, Any, list[str]]] = [] + + rtype = rule.get("type", "signal") + if rtype == "strategy": + # 策略类型: 跑策略选股 → 对比上期选股池 → 产出 new_entry/dropped 事件 + hit_rows = self._match_strategy(scoped, rule) + else: + # signal / price / market: 通用条件匹配 + for sym, name, price, pct, hit_sigs in self._match_conditions(scoped, rule): + hit_rows.append((rtype, sym, name, price, pct, hit_sigs)) + + if not hit_rows: + return [] + + # 3. cooldown 去重 + 生成 events + cooldown = rule.get("cooldown_seconds", 3600) + severity = rule.get("severity", "info") + source = rtype + + events: list[dict] = [] + for ev_type, sym, name, price, pct, hit_sigs in hit_rows: + # cooldown 键: 批量事件用特殊键, 单只事件用 (rule_id, symbol) + is_batch = sym == "_batch" + if is_batch: + key = (rule["id"], f"_{ev_type}_batch") + else: + key = (rule["id"], sym) + last = self._last_fire.get(key) + if last is not None and (now - last) < cooldown: + continue # 冷却期内, 跳过 + self._last_fire[key] = now + + # 批量事件: name 存放预构建的消息文本 + if is_batch: + resolved_name = "" + message = name # name 字段即批量消息 + else: + resolved_name = name if name else self._name_map.get(sym) + message = rule.get("message", "") or self._default_message(rule, ev_type=ev_type, sym=sym, name=resolved_name, pct=pct) + + ev = { + "ts": int(now * 1000), + "rule_id": rule["id"], + "rule_name": rule.get("name", ""), + "source": source, + "type": ev_type, + "symbol": "" if is_batch else sym, + "name": resolved_name, + "message": message, + "price": price, + "change_pct": pct, + "signals": hit_sigs, + "severity": severity, + } + events.append(ev) + if self._alert_handler: + try: + self._alert_handler(ev) + except Exception as e: + logger.warning("alert handler failed: %s", e) + + return events + + @staticmethod + def _apply_scope(df: pl.DataFrame, rule: dict) -> pl.DataFrame: + """按 scope 过滤 DataFrame。""" + scope = rule.get("scope", "symbols") + if scope == "all": + return df + if scope == "symbols": + syms = rule.get("symbols", []) + if not syms: + return df.head(0) + return df.filter(pl.col("symbol").is_in(syms)) + if scope == "sector": + # sector 过滤: 需 df 含板块列 (后续接入 ext_data JOIN) + # 当前先返回全量, sector 精确过滤第二步完善 + return df + return df + + def _match_strategy( + self, df: pl.DataFrame, rule: dict, + ) -> list[tuple[str, str, Any, Any, Any, list[str]]]: + """策略类型评估: 跑策略选股 → 对比上期选股池 → 产出变更事件。 + + 返回 [(event_type, symbol, name, price, pct, signals)] + event_type: "new_entry" (新入选) | "dropped" (已移出) + 单只变更逐只返回; 同一策略 >5 只合并为一条批量事件 (symbol="_batch") + """ + if self._strategy_engine is None: + return [] + sid = rule.get("strategy_id") + if not sid: + return [] + try: + s = self._strategy_engine.get(sid) + except Exception: + return [] + if s is None: + return [] + + # 需要历史数据的策略跳过 (实时监控不支持 history loader) + if s.filter_history_fn: + logger.debug("策略 %s 需要历史数据, 跳过实时监控", sid) + return [] + + # 运行策略选股: 复用当前 enriched DataFrame 跳过数据加载 + overrides = {} + if self._data_dir: + try: + overrides = _strategy_config.load_override(self._data_dir, sid) + except Exception: + pass + + try: + result = self._strategy_engine.run( + sid, + as_of=_dt.date.today(), + precomputed=df, + overrides=overrides, + ) + except Exception as e: + logger.warning("策略 %s 选股执行失败: %s", sid, e) + return [] + + current_pool: set[str] = {r["symbol"] for r in result.rows} + prev_pool = self._strategy_pools.get(sid) + + # 首次运行: 仅记录当前选股池, 不产生事件 + if prev_pool is None: + self._strategy_pools[sid] = current_pool + return [] + + new_entries = current_pool - prev_pool + dropped = prev_pool - current_pool + + # 无变更 + if not new_entries and not dropped: + return [] + + # 更新存储 + self._strategy_pools[sid] = current_pool + + sname = s.meta.get("name", "") or s.meta.get("id", sid) + + # 构建查找表 (新入选股票可在 result.rows 中找到; 移出股票需从 df 找) + row_map: dict[str, dict] = {r["symbol"]: r for r in result.rows} + dropped_map: dict[str, dict] = {} + if dropped: + try: + _dd = df.filter(pl.col("symbol").is_in(list(dropped))) + for row in _dd.iter_rows(named=True): + dropped_map[row["symbol"]] = row + except Exception: + pass + + results: list[tuple[str, str, Any, Any, Any, list[str]]] = [] + + # ── 新入选 ── + new_list = sorted(new_entries) + if len(new_list) > 5: + names: list[str] = [] + for sym in new_list: + row = row_map.get(sym, {}) + name = row.get("name") or self._name_map.get(sym, sym) + names.append(str(name)) + message = f"策略「{sname}」进入 {len(new_entries)} 只:{'、'.join(names)}" + results.append(("new_entry", "_batch", message, None, None, [])) + else: + for sym in new_list: + row = row_map.get(sym, {}) + name = row.get("name") or self._name_map.get(sym, sym) + price = row.get("close") + pct = row.get("change_pct") + results.append(("new_entry", sym, name, price, pct, [])) + + # ── 已移出 ── + dropped_list = sorted(dropped) + if len(dropped_list) > 5: + names = [] + for sym in dropped_list: + row = dropped_map.get(sym, {}) + name = row.get("name") or self._name_map.get(sym, sym) + names.append(str(name)) + message = f"策略「{sname}」移出 {len(dropped)} 只:{'、'.join(names)}" + results.append(("dropped", "_batch", message, None, None, [])) + else: + for sym in dropped_list: + row = dropped_map.get(sym, {}) + name = row.get("name") or self._name_map.get(sym, sym) + price = row.get("close") + pct = row.get("change_pct") + results.append(("dropped", sym, name, price, pct, [])) + + return results + + @staticmethod + def _match_conditions( + df: pl.DataFrame, rule: dict, + ) -> list[tuple[str, Any, Any, Any, list[str]]]: + """按 conditions + logic 匹配,返回命中行 [(symbol,name,price,pct,signals)]。""" + conditions = rule.get("conditions", []) + logic = rule.get("logic", "and") + if not conditions: + return [] + hit_df = _build_condition_mask(df, conditions, logic) + results = [] + for row in hit_df.iter_rows(named=True): + sym = row.get("symbol", "") + name = row.get("name") + price = row.get("close") + pct = row.get("change_pct") + # 收集命中的信号列名 (仅 op=truth 且为真的) + hit_sigs = [ + c["field"] for c in conditions + if c.get("op") == "truth" and row.get(c["field"]) + ] + results.append((sym, name, price, pct, hit_sigs)) + return results + + def _default_message(self, rule: dict, ev_type: str = "", sym: str = "", + name: str = "", pct: Any = None) -> str: + """生成默认 message。策略类型按变更方向生成。""" + rtype = rule.get("type", "signal") + if rtype == "strategy": + # 从 StrategyEngine 取策略名; 失败则退化为 rule_name 里截取的部分 + sname = "" + sid = rule.get("strategy_id") + if sid and self._strategy_engine is not None: + try: + s = self._strategy_engine.get(sid) + sname = s.meta.get("name", "") or s.meta.get("id", "") + except Exception: # noqa: BLE001 + sname = "" + if not sname: + rn = rule.get("name", "") + sname = rn.split(" · ", 1)[1] if " · " in rn else (rn or "策略") + + if ev_type == "new_entry": + pct_text = "" + if pct is not None: + sign = "+" if pct >= 0 else "" + pct_text = f" {sign}{pct * 100:.1f}%" + return f"策略「{sname}」进入 {name}{pct_text}" + elif ev_type == "dropped": + pct_text = "" + if pct is not None: + sign = "+" if pct >= 0 else "" + pct_text = f" {sign}{pct * 100:.1f}%" + return f"策略「{sname}」移出 {name}{pct_text}" + return f"策略「{sname}」变更" + + name_map = {"signal": "信号触发", "price": "价格触发", "market": "市场异动"} + return name_map.get(rtype, "监控触发") diff --git a/backend/app/strategy/monitor_rules.py b/backend/app/strategy/monitor_rules.py new file mode 100644 index 0000000..08392fb --- /dev/null +++ b/backend/app/strategy/monitor_rules.py @@ -0,0 +1,241 @@ +"""监控规则 — 统一的 MonitorRule 模型,覆盖策略/个股信号/个股价格/市场异动四类。 + +职责: + - 从 data/user_data/monitor_rules/*.json 加载规则定义 + - 校验规则字段合法性 + - 提供 CRUD (load_all / save_one / delete_one) + +不知道: 行情评估引擎、API、告警落盘。纯函数 + 文件存储。 + +设计 (镜像 custom_signals.py 的写法): + - 一对象一文件 + glob 全扫 + 全量重写 + - 字段白名单复用 custom_signals.ALLOWED_FIELDS (阈值条件) + 信号列清单 (布尔条件) + - id 正则与 custom_signals 一致,保证可纳入同一索引体系 +""" +from __future__ import annotations + +import json +import logging +import re +from datetime import datetime, timezone +from pathlib import Path + +from app.strategy.custom_signals import ALLOWED_FIELDS + +logger = logging.getLogger(__name__) + +# ── 常量 ──────────────────────────────────────────────── +ID_RE = re.compile(r"^[a-z0-9_]{1,40}$") +RULE_TYPES = {"strategy", "signal", "price", "market"} +SCOPES = {"symbols", "all", "sector"} +LOGICS = {"and", "or"} +DIRECTIONS = {"entry", "exit", "both"} +SEVERITIES = {"info", "warn", "critical"} +OPS = {">", ">=", "<", "<=", "==", "!="} + +# 布尔信号列前缀 (op=truth 时 field 取这些) +_SIGNAL_PREFIXES = ("signal_", "csg_") + + +# ── 持久化 (镜像 custom_signals.py) ───────────────────── +def _dir(data_dir: Path) -> Path: + d = data_dir / "user_data" / "monitor_rules" + d.mkdir(parents=True, exist_ok=True) + return d + + +def _path(data_dir: Path, rule_id: str) -> Path: + return _dir(data_dir) / f"{rule_id}.json" + + +def load_all(data_dir: Path) -> list[dict]: + """读取全部监控规则。损坏的文件被跳过。""" + d = _dir(data_dir) + out: list[dict] = [] + for f in sorted(d.glob("*.json")): + try: + out.append(json.loads(f.read_text(encoding="utf-8"))) + except Exception as e: + logger.warning("monitor rule load failed %s: %s", f.name, e) + return out + + +def load_one(data_dir: Path, rule_id: str) -> dict | None: + p = _path(data_dir, rule_id) + if not p.exists(): + return None + try: + return json.loads(p.read_text(encoding="utf-8")) + except Exception as e: + logger.warning("monitor rule load failed %s: %s", rule_id, e) + return None + + +def save_one(data_dir: Path, rule: dict) -> None: + p = _path(data_dir, rule["id"]) + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(json.dumps(rule, ensure_ascii=False, indent=2), encoding="utf-8") + + +def delete_one(data_dir: Path, rule_id: str) -> bool: + p = _path(data_dir, rule_id) + if p.exists(): + p.unlink() + return True + return False + + +# ── 校验 ──────────────────────────────────────────────── +def _is_signal_field(field: str) -> bool: + """判断 field 是否为布尔信号列 (signal_ / csg_ 前缀)。""" + return any(field.startswith(p) for p in _SIGNAL_PREFIXES) + + +def validate(rule: dict) -> None: + """校验一条监控规则,非法则抛 ValueError (含中文信息)。""" + rid = rule.get("id", "") + if not isinstance(rid, str) or not ID_RE.match(rid): + raise ValueError(f"规则 id 非法 (仅小写字母数字下划线, 1-40字符): {rid!r}") + if not isinstance(rule.get("name"), str) or not rule["name"].strip(): + raise ValueError("规则 name 不能为空") + if rule.get("type") not in RULE_TYPES: + raise ValueError(f"type 必须是 {RULE_TYPES} 之一") + + # 策略类型: 需要 strategy_id + direction,conditions 可空 + if rule.get("type") == "strategy": + if not rule.get("strategy_id"): + raise ValueError("策略类型规则必须指定 strategy_id") + if rule.get("direction", "entry") not in DIRECTIONS: + raise ValueError(f"direction 必须是 {DIRECTIONS} 之一") + else: + # 信号/价格/市场类型: 需要 conditions + conds = rule.get("conditions") + if not isinstance(conds, list) or len(conds) == 0: + raise ValueError("conditions 不能为空") + if len(conds) > 8: + raise ValueError("conditions 最多 8 条") + if rule.get("logic", "and") not in LOGICS: + raise ValueError(f"logic 必须是 {LOGICS} 之一") + for i, c in enumerate(conds): + if not isinstance(c, dict): + raise ValueError(f"第 {i+1} 个条件格式错误") + field = c.get("field", "") + op = c.get("op", "") + if op == "truth": + # 布尔信号: field 必须是 signal_/csg_ 前缀 + if not _is_signal_field(field): + raise ValueError(f"第 {i+1} 个条件: op=truth 时 field 必须是信号列 (signal_/csg_ 前缀): {field!r}") + elif op in OPS: + # 阈值比较: field 必须在白名单, 需要 value + if field not in ALLOWED_FIELDS: + raise ValueError(f"第 {i+1} 个条件: 阈值字段 {field!r} 不在白名单") + if not isinstance(c.get("value"), (int, float)): + raise ValueError(f"第 {i+1} 个条件: value 必须是数字") + else: + raise ValueError(f"第 {i+1} 个条件: op {op!r} 非法 (应为 truth 或 {OPS})") + + # scope 校验 + if rule.get("scope", "symbols") not in SCOPES: + raise ValueError(f"scope 必须是 {SCOPES} 之一") + if rule.get("scope") == "symbols": + syms = rule.get("symbols") + if not isinstance(syms, list) or len(syms) == 0: + raise ValueError("scope=symbols 时 symbols 不能为空") + + # 其余枚举 + if rule.get("severity", "info") not in SEVERITIES: + raise ValueError(f"severity 必须是 {SEVERITIES} 之一") + cd = rule.get("cooldown_seconds", 3600) + if not isinstance(cd, int) or cd < 0: + raise ValueError("cooldown_seconds 必须是非负整数") + + +def normalize(rule: dict) -> dict: + """补全默认字段,返回规范化后的规则 (不校验)。""" + r = dict(rule) + r.setdefault("enabled", True) + r.setdefault("scope", "symbols") + r.setdefault("symbols", []) + r.setdefault("sector", None) + r.setdefault("strategy_id", None) + r.setdefault("direction", "entry") + r.setdefault("conditions", []) + r.setdefault("logic", "and") + r.setdefault("cooldown_seconds", 3600) + r.setdefault("severity", "info") + r.setdefault("message", "") + r.setdefault("webhook_url", "") + r.setdefault("webhook_enabled", False) + r.setdefault("created_at", datetime.now(timezone.utc).isoformat()) + return r + + +# 策略监控自动迁移的规则 id 前缀 (固定, 保证幂等) +STRATEGY_RULE_PREFIX = "mr_strategy_" + + +def strategy_rule_id(strategy_id: str) -> str: + """策略监控规则 id = mr_strategy_{strategy_id}。""" + return f"{STRATEGY_RULE_PREFIX}{strategy_id}" + + +def migrate_strategy_monitors(data_dir: Path, strategy_ids: list[str], strategy_names: dict[str, str]) -> list[dict]: + """把 preferences.strategy_monitor_ids 里的策略,同步生成/更新 type=strategy 规则。 + + 幂等: 已存在的策略规则会被更新 (方向/名称),不会重复创建。 + 已从 strategy_ids 移除的策略, 其规则会被停用 (enabled=False) 而非删除 (保留历史触发记录的关联)。 + + Args: + data_dir: 数据目录 + strategy_ids: 当前监控池中的策略 id 列表 + strategy_names: {strategy_id: 策略名} 用于规则显示名 + Returns: + 本次生成/更新的规则列表 + """ + desired = set(strategy_ids) + existing = load_all(data_dir) + # 已存在的策略规则 {strategy_id: rule} + existing_strategy_rules: dict[str, dict] = {} + for r in existing: + rid = r.get("id", "") + if rid.startswith(STRATEGY_RULE_PREFIX): + sid = rid[len(STRATEGY_RULE_PREFIX):] + if sid: + existing_strategy_rules[sid] = r + + touched: list[dict] = [] + # 1. 为当前监控池的策略 upsert 规则 + for sid in desired: + rule_id = strategy_rule_id(sid) + name = strategy_names.get(sid, sid) + rule = existing_strategy_rules.get(sid) + if rule is None: + rule = normalize({ + "id": rule_id, + "name": f"策略监控 · {name}", + "type": "strategy", + "scope": "all", + "strategy_id": sid, + "direction": "entry", + "conditions": [], + "cooldown_seconds": 3600, + "enabled": True, + }) + else: + rule = dict(rule) + rule["enabled"] = True + rule["strategy_id"] = sid + rule["name"] = f"策略监控 · {name}" + rule.setdefault("scope", "all") + rule.setdefault("direction", "entry") + save_one(data_dir, rule) + touched.append(rule) + + # 2. 不在监控池的策略 → 停用其规则 (不删除) + for sid, rule in existing_strategy_rules.items(): + if sid not in desired and rule.get("enabled") is not False: + rule = dict(rule) + rule["enabled"] = False + save_one(data_dir, rule) + + return touched diff --git a/backend/app/strategy/prompt_builder.py b/backend/app/strategy/prompt_builder.py new file mode 100644 index 0000000..896e3ec --- /dev/null +++ b/backend/app/strategy/prompt_builder.py @@ -0,0 +1,65 @@ +"""策略提示词组装器 — 两步定制流程的提示词生成。 + +职责: 加载对应步骤的 Markdown 指南,拼接用户输入,组装 LLM 提示词。 +不知道: LLM 调用、API、前端、引擎执行。 +""" +from __future__ import annotations + +from pathlib import Path + +_DOCS_DIR = Path(__file__).resolve().parent.parent.parent.parent / "docs" +_cache: dict[str, str] = {} + + +def _load_doc(name: str) -> str: + if name not in _cache: + path = _DOCS_DIR / name + _cache[name] = path.read_text(encoding="utf-8") if path.exists() else "" + return _cache[name] + + +DIRECTION_CN = {"long": "做多", "short": "做空", "monitor": "监控"} + + +def build_step1(name: str, description: str, direction: str, rules: str, strategy_id: str = "") -> str: + """步骤1:规则 → 完整策略代码(参数 + 信号 + 评分 + 告警) + + 注意: strategy-guide.md 已在 ai_generator.py 的 system prompt 中加载, + 此处不再重复加载以节省 token。 + """ + guide = _load_doc("strategy-builder-step1.md") + + id_line = f"\n策略ID(必须使用此ID):{strategy_id}" if strategy_id else "" + + return f"""{guide} + +--- + +请根据以下用户输入生成完整策略代码: + +策略名称:{name}{id_line} +策略描述:{description} +选股方向:{DIRECTION_CN.get(direction, direction)} +策略规则: +{rules} + +只输出 Python 代码。""" + + +def build_step2(current_code: str, instruction: str) -> str: + """步骤2:修改策略任意部分""" + guide = _load_doc("strategy-builder-step2.md") + + return f"""{guide} + +--- + +当前策略代码: +```python +{current_code} +``` + +用户修改指令: +{instruction} + +只输出修改后的完整 Python 代码。""" diff --git a/backend/app/tickflow/__init__.py b/backend/app/tickflow/__init__.py new file mode 100644 index 0000000..ad866df --- /dev/null +++ b/backend/app/tickflow/__init__.py @@ -0,0 +1 @@ +"""数据源适配层 — 能力探测 / 调度 / Repository。""" diff --git a/backend/app/tickflow/capabilities.py b/backend/app/tickflow/capabilities.py new file mode 100644 index 0000000..633cd46 --- /dev/null +++ b/backend/app/tickflow/capabilities.py @@ -0,0 +1,76 @@ +"""Capability 定义(§5.1)。 + +业务代码只依赖 CapabilitySet,不读 tiers.yaml,不感知"档位"。 +""" +from __future__ import annotations + +from dataclasses import dataclass +from enum import StrEnum + + +class Cap(StrEnum): + """所有 capability 的命名常量。新增能力时只在这里加一行。""" + + QUOTE_BY_SYMBOL = "quote.by_symbol" + QUOTE_BATCH = "quote.batch" + QUOTE_POOL = "quote.pool" + KLINE_DAILY_BY_SYMBOL = "kline.daily.by_symbol" + KLINE_DAILY_BATCH = "kline.daily.batch" + KLINE_MINUTE_BY_SYMBOL = "kline.minute.by_symbol" + KLINE_MINUTE_BATCH = "kline.minute.batch" + INTRADAY = "intraday" + INTRADAY_BATCH = "intraday.batch" + DEPTH5 = "depth5" + DEPTH5_BATCH = "depth5.batch" + WEBSOCKET = "websocket" + FINANCIAL = "financial" + ADJ_FACTOR = "adj_factor" + + +@dataclass(slots=True, frozen=True) +class CapabilityLimits: + """单个 capability 的运行时限制。""" + rpm: int | None = None # 次/分钟,None 表示未知或不限 + batch: int | None = None # 标的/次 + subscribe: int | None = None # WS 订阅上限 + + +class CapabilitySet: + """探测得到的"用户当前可用能力"。业务代码的唯一真理源。""" + + def __init__(self, caps: dict[Cap, CapabilityLimits] | None = None) -> None: + self._caps: dict[Cap, CapabilityLimits] = dict(caps or {}) + + def has(self, cap: Cap) -> bool: + return cap in self._caps + + def limits(self, cap: Cap) -> CapabilityLimits | None: + return self._caps.get(cap) + + def require(self, cap: Cap) -> CapabilityLimits: + """断言可用,否则抛 CapabilityDenied。""" + if cap not in self._caps: + raise CapabilityDenied(cap) + return self._caps[cap] + + def all(self) -> dict[Cap, CapabilityLimits]: + return dict(self._caps) + + def to_dict(self) -> dict[str, dict]: + return { + str(cap): { + "rpm": lim.rpm, + "batch": lim.batch, + "subscribe": lim.subscribe, + } + for cap, lim in self._caps.items() + } + + +class CapabilityDenied(Exception): + """请求的 capability 当前不可用。""" + + def __init__(self, cap: Cap, suggestion: str | None = None) -> None: + self.cap = cap + self.suggestion = suggestion or f"加购『{cap}』能力可解锁" + super().__init__(f"capability not available: {cap}; {self.suggestion}") diff --git a/backend/app/tickflow/client.py b/backend/app/tickflow/client.py new file mode 100644 index 0000000..dd8172f --- /dev/null +++ b/backend/app/tickflow/client.py @@ -0,0 +1,109 @@ +"""数据源 SDK 封装(§5)。 + +进程内单例;Key 来源(优先级):secrets.json > .env。 +用户改 Key 后需要 `reset_clients()`,然后 `get_client()` 会拿新的。 + +5 档体系下服务器归属: + - none 档(无 key / 无效 key) → 数据源 SDK .free()(free-api 服务器) + - free 档(免费有效 key) → 数据源 SDK .free()(key 被 SDK 忽略,运行时走 free-api) + - starter/pro/expert(付费 key) → 数据源 SDK (api_key=key, base_url) +""" +from __future__ import annotations + +import os + +from tickflow import AsyncTickFlow, TickFlow + +from app import secrets_store + +_sync_client: TickFlow | None = None +_async_client: AsyncTickFlow | None = None + + +# ===== 服务器归属判定 ===== + +# free-api 服务器默认节点(SDK 默认值),none/free 档运行时走这里。 +FREE_ENDPOINT = "https://free-api.tickflow.org" +# 付费端点默认节点(starter+ 运行时走这里,也是端点切换的默认值)。 +PAID_ENDPOINT = "https://api.tickflow.org" + + +def _should_use_free_server() -> bool: + """是否应走 free-api 服务器。 + + 判定依据:无 key,或当前档位为 none/free。 + 付费档(starter+)走付费端点。 + """ + if not secrets_store.get_tickflow_key(): + return True + # 有 key 时按探测出的档位判定(避免读 capabilities.json 在首次启动前未生成的边界) + from app.tickflow.policy import base_tier_name + return base_tier_name() in ("none", "free") + + +def _base_url() -> str | None: + """从 secrets.json 读取用户自定义端点,没有则返回 None(用 SDK 默认)。""" + return secrets_store.load().get("tickflow_base_url") or None + + +def get_client() -> TickFlow: + """同步客户端。能力探测、盘后管道用。""" + global _sync_client + if _sync_client is None: + key = secrets_store.get_tickflow_key() + if _should_use_free_server(): + # none/free 档:走 free-api 服务器(无 key 或免费 key 被 SDK 忽略) + _sync_client = TickFlow.free() + else: + _sync_client = TickFlow(api_key=key, base_url=_base_url()) + return _sync_client + + +def get_async_client() -> AsyncTickFlow: + """异步客户端。FastAPI 请求路径上用。""" + global _async_client + if _async_client is None: + key = secrets_store.get_tickflow_key() + if _should_use_free_server(): + _async_client = AsyncTickFlow.free() + else: + _async_client = AsyncTickFlow(api_key=key, base_url=_base_url()) + return _async_client + + +def reset_clients() -> None: + """Key 变化后调用 — 让下一次 get_client() 拿新实例。""" + global _sync_client, _async_client + _sync_client = None + _async_client = None + + +def current_mode() -> str: + """供 UI 显示当前模式。三态: + + - "none" : 无 key / 无效 key(走 free-api,仅历史日K) + - "free" : 免费有效 key(走 free-api,仅历史日K) + - "api_key" : 付费 key(starter+,走付费端点,有实时行情) + """ + if not secrets_store.get_tickflow_key(): + return "none" + from app.tickflow.policy import base_tier_name + tier = base_tier_name() + if tier in ("none", "free"): + return "free" if tier == "free" else "none" + return "api_key" + + +def current_endpoint() -> str: + """返回当前显示用的端点 URL(对应 endpoints.json 列表项)。 + + - none/free 档:显示 free-api 服务器节点 + - 付费档:显示用户自定义端点(测速切换后)或默认付费节点 api.tickflow.org + """ + if _should_use_free_server(): + return FREE_ENDPOINT + # 自定义端点(付费模式测速切换后):优先返回 + base = _base_url() + if base: + return base.rstrip("/") + return PAID_ENDPOINT diff --git a/backend/app/tickflow/policy.py b/backend/app/tickflow/policy.py new file mode 100644 index 0000000..8bf7490 --- /dev/null +++ b/backend/app/tickflow/policy.py @@ -0,0 +1,550 @@ +"""能力探测 + CapabilitySet 持久化(§5.3)。 + +探测策略:逐 capability 用最小代价请求试探。 + - 成功 → 记录可用,优先取响应头 X-RateLimit-* 否则用 tiers.yaml 默认 + - 抛权限错 → 不可用 + - 抛其他错 → 不可用(谨慎,保留日志) + +Tier Label 算法见 §5.3:基线档 + 补丁能力。 +""" +from __future__ import annotations + +import json +import logging +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +import yaml + +from app.config import settings +from app import secrets_store + +from .capabilities import Cap, CapabilityLimits, CapabilitySet + +logger = logging.getLogger(__name__) + +_CAPSET_CACHE_FILE = "capabilities.json" + +# 缓存 schema 版本。capabilities 模型有结构性变更时 bump(如新增/拆分 Cap), +# 旧缓存(无此字段或版本更低)会被判定过期,触发重新探测。 +# v2: 拆分 depth5 → depth5(单只) + depth5.batch(批量) +# v3: 探测补全 quote.batch(此前 tiers.yaml 声明了但 _probe_real 漏探测) +# v4: 5 档重构 —— 新增 none 档(无key/无效key),free 档重定义(走 free-api 服务器, +# 仅历史日K)。判定改为复权因子分水岭:_classify_tier 接管档位判定。 +_CACHE_SCHEMA_VERSION = 4 + +# 探测用最小代价请求:挑流通性最好的 1 只标的试 +_PROBE_SYMBOL = "600000.SH" # 浦发银行,长期不会退市 + + +def _load_tiers_yaml() -> dict[str, dict[str, dict[str, Any]]]: + for path in [settings.tiers_yaml, Path("/app/tiers.yaml"), Path("../tiers.yaml")]: + if path.exists(): + with path.open(encoding="utf-8") as f: + return yaml.safe_load(f) + raise FileNotFoundError("tiers.yaml not found") + + +def _tier_to_capset(tier_def: dict[str, dict[str, Any]]) -> CapabilitySet: + caps: dict[Cap, CapabilityLimits] = {} + for cap_name, limits_dict in tier_def.items(): + try: + cap = Cap(cap_name) + except ValueError: + logger.warning("unknown cap in tiers.yaml: %s", cap_name) + continue + caps[cap] = CapabilityLimits( + rpm=limits_dict.get("rpm"), + batch=limits_dict.get("batch"), + subscribe=limits_dict.get("subscribe"), + ) + return CapabilitySet(caps) + + +def _is_transient(e: Exception) -> bool: + """是否为"可重试的瞬时错误"——网络抖动 / 限流 / 服务端 5xx。 + + 与权限/参数错误(403/401/400/404)区分:后者重试也无用,不重试。 + 用类名匹配而非 import SDK 异常,避免探测期对 SDK 内部耦合。 + """ + cls = e.__class__.__name__ + if cls in { + "RateLimitError", "InternalServerError", "APIError", + "ConnectionError", "TimeoutError", "ConnectError", + "ConnectTimeout", "ReadTimeout", "RemoteProtocolError", + "httpx.ConnectError", "httpx.TimeoutException", + }: + return True + # APIError 体系下,status_code 5xx/429 视为瞬时 + status = getattr(e, "status_code", None) + if isinstance(status, int) and (status == 429 or status >= 500): + return True + return False + + +def _call_with_retry(fn, attempts: int = 3, backoff: float = 0.6) -> None: + """调用 fn();对瞬时错误退避重试,权限/参数错误立即抛出。 + + attempts=总尝试次数(含首次)。返回 None,异常由调用方分类。 + """ + last_exc: Exception | None = None + for i in range(attempts): + try: + fn() + return + except Exception as e: # noqa: BLE001 + last_exc = e + # 权限/参数类错误:重试无意义,立即抛出交给 try_call 归类 + if not _is_transient(e): + raise + # 瞬时错误:最后一轮不再 sleep + if i < attempts - 1: + time.sleep(backoff * (i + 1)) + # 重试耗尽,抛出最后一次异常 + assert last_exc is not None + raise last_exc + + +def _probe_real(tiers: dict) -> tuple[CapabilitySet, list[str]]: + """逐 capability 试探。需要 API key。 + + **关键**:探测始终在付费端点上进行,用 key 鉴权验证有效性。 + 绝不能读旧 capabilities 缓存的档位来选服务器 —— 否则首次保存 key 时, + 旧缓存是 none 档 → get_client() 返回 free 服务器 → free 服务器忽略 key → + 乱填 key 也能拿到日K → 误判成 free 档(鸡生蛋蛋生鸡的循环依赖 bug)。 + + 返回 (capset, probe_log)。 + """ + from tickflow import TickFlow + from .client import _base_url, PAID_ENDPOINT + + key = secrets_store.get_tickflow_key() + # 探测专用客户端:强制走付费端点验证 key。 + # base_url 用用户自定义端点(若已配置测速切换),否则默认付费端点。 + probe_base = _base_url() or PAID_ENDPOINT + tf = TickFlow(api_key=key, base_url=probe_base) + available: dict[Cap, CapabilityLimits] = {} + log: list[str] = [] + + def try_call(cap: Cap, fn, default_limits: dict[str, Any]) -> None: + try: + _call_with_retry(fn) + available[cap] = CapabilityLimits( + rpm=default_limits.get("rpm"), + batch=default_limits.get("batch"), + subscribe=default_limits.get("subscribe"), + ) + log.append(f"✓ {cap}") + except Exception as e: # noqa: BLE001 + msg = str(e).lower() + cls = e.__class__.__name__ + # PermissionError 类名 / HTTP 403 / 中英文权限关键词都算"明确无权限" + is_perm_denied = ( + cls in {"PermissionError", "AuthorizationError"} + or "permission" in msg or "unauthorized" in msg + or "403" in msg or "forbidden" in msg + or "套餐" in msg or "权限" in msg or "需要" in msg + ) + if is_perm_denied: + log.append(f"✗ {cap}(无权限)") + else: + # 重试耗尽仍失败的瞬时错误 — 标记为疑似,而非直接判定"无此能力" + log.append(f"? {cap} ({cls}: {e})") + + # 用各档默认上限作为占位(无 X-RateLimit-* 头时) + # 取所有档的并集,逐 cap 试探 + all_caps_defaults: dict[str, dict[str, Any]] = {} + for tier in ("free", "starter", "pro", "expert"): + for cap_name, lim in tiers.get(tier, {}).items(): + all_caps_defaults.setdefault(cap_name, lim) + + def defaults(cap: Cap) -> dict[str, Any]: + return all_caps_defaults.get(str(cap), {}) + + # 全部用 keyword-only 形式调用,符合 SDK 真实签名 + # quote.by_symbol + try_call(Cap.QUOTE_BY_SYMBOL, + lambda: tf.quotes.get(symbols=[_PROBE_SYMBOL], as_dataframe=False), + defaults(Cap.QUOTE_BY_SYMBOL)) + + # quote.batch — 批量行情(POST /v1/quotes)。用 get_by_symbols 试探。 + try_call(Cap.QUOTE_BATCH, + lambda: tf.quotes.get_by_symbols([_PROBE_SYMBOL], as_dataframe=False), + defaults(Cap.QUOTE_BATCH)) + + # quote.pool — 用一个真实存在的 universe id 试探。 + # universes.list() 在 Free 也开放,先拿任意一个 universe id 再用 get_by_universes 试。 + def _probe_pool(): + unis = tf.universes.list() + if not unis: + raise RuntimeError("no universes available") + first_id = unis[0]["id"] if isinstance(unis[0], dict) else getattr(unis[0], "id") + return tf.quotes.get_by_universes([first_id], as_dataframe=False) + + try_call(Cap.QUOTE_POOL, _probe_pool, defaults(Cap.QUOTE_POOL)) + + # kline.daily.by_symbol — Free 也有 + try_call(Cap.KLINE_DAILY_BY_SYMBOL, + lambda: tf.klines.get(_PROBE_SYMBOL, period="1d", count=1, as_dataframe=False), + defaults(Cap.KLINE_DAILY_BY_SYMBOL)) + + # kline.daily.batch + try_call(Cap.KLINE_DAILY_BATCH, + lambda: tf.klines.batch([_PROBE_SYMBOL], period="1d", count=1, as_dataframe=False), + defaults(Cap.KLINE_DAILY_BATCH)) + + # kline.minute.by_symbol + try_call(Cap.KLINE_MINUTE_BY_SYMBOL, + lambda: tf.klines.get(_PROBE_SYMBOL, period="1m", count=1, as_dataframe=False), + defaults(Cap.KLINE_MINUTE_BY_SYMBOL)) + + # kline.minute.batch + try_call(Cap.KLINE_MINUTE_BATCH, + lambda: tf.klines.batch([_PROBE_SYMBOL], period="1m", count=1, as_dataframe=False), + defaults(Cap.KLINE_MINUTE_BATCH)) + + # intraday + try_call(Cap.INTRADAY, + lambda: tf.klines.intraday(_PROBE_SYMBOL, count=1, as_dataframe=False), + defaults(Cap.INTRADAY)) + + # intraday.batch + try_call(Cap.INTRADAY_BATCH, + lambda: tf.klines.intraday_batch([_PROBE_SYMBOL], count=1, as_dataframe=False), + defaults(Cap.INTRADAY_BATCH)) + + # depth5 — 按标的查(单只) + try_call(Cap.DEPTH5, + lambda: tf.depth.get(_PROBE_SYMBOL), + defaults(Cap.DEPTH5)) + + # depth5.batch — 批量查(SDK 0.1.23+ 提供 depth.batch,对应官方 /v1/depth/batch 端点) + try_call(Cap.DEPTH5_BATCH, + lambda: tf.depth.batch([_PROBE_SYMBOL]), + defaults(Cap.DEPTH5_BATCH)) + + # financial — SDK 提供 income / balance_sheet / cash_flow / metrics / shares + # 用 metrics 探测(单据最小) + try_call(Cap.FINANCIAL, + lambda: tf.financials.metrics([_PROBE_SYMBOL], latest=True, as_dataframe=False), + defaults(Cap.FINANCIAL)) + + # adj_factor — 实际在 klines.ex_factors + try_call(Cap.ADJ_FACTOR, + lambda: tf.klines.ex_factors([_PROBE_SYMBOL], as_dataframe=False), + defaults(Cap.ADJ_FACTOR)) + + # websocket 不在探测期试连接(成本太高且阻塞),按档位默认推断 + # 若 expert 的其他 cap 都通,则推断 websocket 也可用 + if (Cap.FINANCIAL in available and Cap.INTRADAY_BATCH in available): + available[Cap.WEBSOCKET] = CapabilityLimits( + subscribe=defaults(Cap.WEBSOCKET).get("subscribe", 100), + ) + log.append("✓ websocket (inferred from expert tier)") + + return CapabilitySet(available), log + + +def detect_capabilities(force: bool = False) -> CapabilitySet: + """探测当前 API Key 的能力集。""" + cache_path = settings.data_dir / _CAPSET_CACHE_FILE + if not force and cache_path.exists(): + with cache_path.open(encoding="utf-8") as f: + cached = json.load(f) + # schema 版本校验:旧缓存或缺版本号 → 过期,丢弃后重新探测 + if cached.get("schema_version") == _CACHE_SCHEMA_VERSION: + return _capset_from_json(cached) + logger.info("capabilities 缓存 schema 版本过期(缓存=%s, 当前=%d), 重新探测", + cached.get("schema_version"), _CACHE_SCHEMA_VERSION) + + tiers = _load_tiers_yaml() + if settings.use_free_mode: + # 无 key —— 归 none 档(走 free-api 服务器,仅历史日K) + capset = _tier_to_capset(tiers["none"]) + _persist(capset, "None", log=["无 API Key(无档 · free-api 服务器)"], missing=[], extras=[]) + return capset + + # 有 API key — 真实探测 + try: + capset, probe_log = _probe_real(tiers) + # 判定档位:无效 key → none,免费 key → free,付费 → starter/pro/expert + classified = _classify_tier(capset, tiers) + if classified.is_invalid: + # 无效 key(连单只日K都拿不到):归 none 档,标记要求清除 key + capset = _tier_to_capset(tiers["none"]) + probe_log.append("⚠ Key 无效(单只日K也无法获取),判定为无档") + _persist(capset, "None", log=probe_log, missing=[], extras=[], invalid_key=True) + return capset + if classified.is_free: + # 免费有效 key:能力按 free 档(= none 档能力,走 free-api 服务器) + capset = _tier_to_capset(tiers["free"]) + _persist(capset, "Free", log=probe_log + ["✓ 免费有效 key(运行时走 free-api 服务器)"], missing=[], extras=[]) + return capset + # 付费档(starter+) — 探测出的能力即为真实可用 + label, missing, extras = _compute_label_and_missing(capset, tiers) + capset = _override_limits_with_detected_tier(capset, label, tiers) + _persist(capset, label, log=probe_log, missing=missing, extras=extras) + return capset + except Exception as e: + logger.exception("detect_capabilities failed; using none baseline: %s", e) + capset = _tier_to_capset(tiers["none"]) + _persist(capset, "None(探测失败)", log=[f"探测失败:{e}"], missing=[], extras=[]) + return capset + + +# ===== Tier 代表性 capability(signature caps)===== +# 拥有**任意一个**即认作该档及以上。自上而下匹配。 +# 这套设计的好处:单个 capability 探测的 transient 失败不会把整体档位"误降"。 +TIER_SIGNATURES: dict[str, set[Cap]] = { + "expert": {Cap.FINANCIAL, Cap.INTRADAY_BATCH, Cap.WEBSOCKET}, + "pro": {Cap.KLINE_MINUTE_BATCH, Cap.KLINE_MINUTE_BY_SYMBOL, + Cap.INTRADAY, Cap.DEPTH5, Cap.DEPTH5_BATCH}, + "starter": {Cap.QUOTE_BATCH, Cap.KLINE_DAILY_BATCH, + Cap.ADJ_FACTOR, Cap.QUOTE_POOL}, + # free / none 不需 signature — 由 _classify_tier 的分水岭逻辑判定 +} + + +@dataclass(slots=True, frozen=True) +class TierClassification: + """档位判定结果。 + + 判定依据是"复权因子分水岭": + - 连单只日K都没有 → 无效 key(is_invalid),归 none 档 + - 有单只日K、无复权因子 → 免费 key(is_free) + - 有复权因子 → 付费档(starter+),具体档位由 signature 决定 + """ + + tier: str # "none" / "free" / "starter" / "pro" / "expert" + is_invalid: bool # 无效 key(连单只日K都拿不到) + is_free: bool # 免费有效 key(有日K、无复权因子) + + +def _classify_tier(capset: CapabilitySet, tiers: dict) -> TierClassification: + """根据探测出的能力集判定档位。 + + 分水岭是 KLINE_DAILY_BY_SYMBOL(单只日K)与 ADJ_FACTOR(复权因子): + - 无单只日K → none(无效 key) + - 有日K无复权 → free(免费 key) + - 有复权因子 → 走 signature 判定 starter/pro/expert + """ + held = set(capset.all().keys()) + + # 1) 连单只日K都没有 → 无效 key + if Cap.KLINE_DAILY_BY_SYMBOL not in held: + return TierClassification(tier="none", is_invalid=True, is_free=False) + + # 2) 有日K但无复权因子 → 免费 key + if Cap.ADJ_FACTOR not in held: + return TierClassification(tier="free", is_invalid=False, is_free=True) + + # 3) 有复权因子 → 付费档,按 signature 自上而下判定 + if held & TIER_SIGNATURES["expert"]: + base = "expert" + elif held & TIER_SIGNATURES["pro"]: + base = "pro" + elif held & TIER_SIGNATURES["starter"]: + base = "starter" + else: + # 有复权因子但无任何代表能力 — 兜底为 starter(复权本身是 starter 特征) + base = "starter" + return TierClassification(tier=base, is_invalid=False, is_free=False) + +# 补丁友好命名(label 后缀用) +_CAP_ALIASES: dict[Cap, str] = { + Cap.KLINE_MINUTE_BATCH: "分钟K", + Cap.KLINE_MINUTE_BY_SYMBOL: "分钟K", + Cap.INTRADAY: "分时", + Cap.INTRADAY_BATCH: "批量分时", + Cap.DEPTH5: "五档", + Cap.DEPTH5_BATCH: "批量五档", + Cap.WEBSOCKET: "WS", + Cap.FINANCIAL: "财务", + Cap.ADJ_FACTOR: "复权", + Cap.QUOTE_BATCH: "批量行情", + Cap.QUOTE_POOL: "标的池", + Cap.KLINE_DAILY_BATCH: "日K批量", +} + + +def _override_limits_with_detected_tier( + capset: CapabilitySet, label: str, tiers: dict, +) -> CapabilitySet: + """探测完成后,用判档对应的 limits 覆盖每个 cap 的速率/批量。 + + 判档前每个 cap 用的是"所有档默认值的并集"(为了不漏数据), + 判档后才知道用户真实档位,limits 用该档的实际值更准。 + label 可能是 "Pro" / "Pro + 分钟K" / "Pro+" 等组合形式 — 取第一个词当作基线档名。 + """ + base_name = label.split()[0].split("+")[0].strip().lower() # "Pro + 分钟K" → "pro" + tier_limits = tiers.get(base_name, {}) + new_caps: dict[Cap, CapabilityLimits] = {} + for cap, _old_lim in capset.all().items(): + spec = tier_limits.get(cap.value) + if spec: + new_caps[cap] = CapabilityLimits( + rpm=spec.get("rpm"), + batch=spec.get("batch"), + subscribe=spec.get("subscribe"), + ) + else: + # 不在该档定义里(extras),用 expert 档兜底(最宽松) + expert_spec = tiers.get("expert", {}).get(cap.value, {}) + new_caps[cap] = CapabilityLimits( + rpm=expert_spec.get("rpm"), + batch=expert_spec.get("batch"), + subscribe=expert_spec.get("subscribe"), + ) + return CapabilitySet(new_caps) + + +def _tier_caps_set(tiers: dict, tier_name: str) -> set[Cap]: + """读 tiers.yaml 的某档定义,转为 Cap 集合。""" + return {Cap(c) for c in tiers.get(tier_name, {}).keys() if c in {x.value for x in Cap}} + + +def _compute_label_and_missing( + capset: CapabilitySet, tiers: dict, +) -> tuple[str, list[str], list[str]]: + """返回 (label, missing_caps, extra_caps)。 + + label:档位标签。 + missing_caps:本档**应有但未探测到**的 capability(用于诊断:可能是探测 bug 或权限丢失)。 + extra_caps:超出本档的额外 capability(自定义组合)。 + """ + held = set(capset.all().keys()) + + # 1) 完全匹配 — 干净命中某档 + for tier_name in ["free", "starter", "pro", "expert"]: + if held == _tier_caps_set(tiers, tier_name): + return tier_name.capitalize(), [], [] + + # 2) 按 signature 自上而下判档 + if held & TIER_SIGNATURES["expert"]: + base = "expert" + elif held & TIER_SIGNATURES["pro"]: + base = "pro" + elif held & TIER_SIGNATURES["starter"]: + base = "starter" + else: + base = "free" + + base_caps = _tier_caps_set(tiers, base) + missing = sorted(c.value for c in (base_caps - held)) + extras = base_caps and (held - base_caps) or set() # extras 是超出该档的部分 + + # 实际超出 = held 中"既不属于本档、也不属于本档下方任何档"的 cap + # 简化:extras = held - base_caps + extras_set = held - base_caps + + # 3) 拼 label + if not extras_set: + # 完全在本档内(可能缺一两项 — 由 missing 反映) + return base.capitalize(), missing, [] + + # 补丁过多 → 用 "≈" 形式 + if len(extras_set) > 3: + return f"{base.capitalize()}+", missing, sorted(c.value for c in extras_set) + + suffix = sorted({_CAP_ALIASES.get(e, str(e)) for e in extras_set}) + return f"{base.capitalize()} + " + " + ".join(suffix), missing, sorted(c.value for c in extras_set) + + +def _compute_label(capset: CapabilitySet, tiers: dict) -> str: + """对外简化签名 — 只要 label。""" + label, _missing, _extras = _compute_label_and_missing(capset, tiers) + return label + + +def _persist( + capset: CapabilitySet, + label: str, + log: list[str] | None = None, + missing: list[str] | None = None, + extras: list[str] | None = None, + invalid_key: bool = False, +) -> None: + settings.data_dir.mkdir(parents=True, exist_ok=True) + cache_path = settings.data_dir / _CAPSET_CACHE_FILE + payload = { + "schema_version": _CACHE_SCHEMA_VERSION, + "label": label, + "capabilities": capset.to_dict(), + "probe_log": log or [], + "missing_caps": missing or [], # 本档应有但未探测到 + "extras_caps": extras or [], # 超出本档的额外能力 + "invalid_key": invalid_key, # 探测出的 key 无效(连单只日K都拿不到) + } + with cache_path.open("w", encoding="utf-8") as f: + json.dump(payload, f, ensure_ascii=False, indent=2) + + +def _capset_from_json(data: dict[str, Any]) -> CapabilitySet: + caps: dict[Cap, CapabilityLimits] = {} + for cap_name, lim in data.get("capabilities", {}).items(): + try: + cap = Cap(cap_name) + except ValueError: + continue + caps[cap] = CapabilityLimits( + rpm=lim.get("rpm"), + batch=lim.get("batch"), + subscribe=lim.get("subscribe"), + ) + return CapabilitySet(caps) + + +def tier_label() -> str: + cache_path = settings.data_dir / _CAPSET_CACHE_FILE + if cache_path.exists(): + with cache_path.open(encoding="utf-8") as f: + return json.load(f).get("label", "Unknown") + return "Unknown" + + +def probe_log() -> list[str]: + cache_path = settings.data_dir / _CAPSET_CACHE_FILE + if cache_path.exists(): + with cache_path.open(encoding="utf-8") as f: + return json.load(f).get("probe_log", []) + return [] + + +def missing_caps() -> list[str]: + """本档应有但未探测到的 capability — 通常意味着探测有 bug 或权限边界。""" + cache_path = settings.data_dir / _CAPSET_CACHE_FILE + if cache_path.exists(): + with cache_path.open(encoding="utf-8") as f: + return json.load(f).get("missing_caps", []) + return [] + + +def extras_caps() -> list[str]: + cache_path = settings.data_dir / _CAPSET_CACHE_FILE + if cache_path.exists(): + with cache_path.open(encoding="utf-8") as f: + return json.load(f).get("extras_caps", []) + return [] + + +def is_invalid_key() -> bool: + """最近一次探测是否判定 key 无效(连单只日K都拿不到)。 + + settings 层据此清除已存的 key,避免乱填的 key 被持久化。 + """ + cache_path = settings.data_dir / _CAPSET_CACHE_FILE + if cache_path.exists(): + with cache_path.open(encoding="utf-8") as f: + return bool(json.load(f).get("invalid_key", False)) + return False + + +def base_tier_name() -> str: + """当前档位的基础名(小写): none / free / starter / pro / expert。 + + 供 client 层判断"是否走 free-api 服务器"(none/free → free 服务器)。 + """ + label = tier_label() + return label.split()[0].split("+")[0].strip().lower() diff --git a/backend/app/tickflow/pools.py b/backend/app/tickflow/pools.py new file mode 100644 index 0000000..313f3a0 --- /dev/null +++ b/backend/app/tickflow/pools.py @@ -0,0 +1,158 @@ +"""标的池(Universe)定义(§6.3)。 + +Phase 1 实现: + - 常用指数成份(沪深 300 / 中证 500 / 上证 50)用数据源 `quote.pool` 端点拉取并缓存 + - 全 A 通过 instruments.batch 获取 + - 自选池 = 用户的 watchlist +""" +from __future__ import annotations + +import logging +from datetime import date +from pathlib import Path +from typing import Literal + +import polars as pl + +from app.config import settings +from app.tickflow.client import get_client + +logger = logging.getLogger(__name__) + +PoolId = Literal["CSI300", "CSI500", "SSE50", "CN_Equity_A", "CN_Index", "watchlist"] + +# 数据源 universe id 是内部命名(见 tf.universes.list())。 +# 没有官方对照表,启动时按名称模糊匹配从 universes.list() 里找。 +# 常见名:沪深300 / 中证500 / 上证50 / 全 A +_POOL_NAME_HINTS = { + "CSI300": ["沪深300", "HS300", "CSI300"], + "CSI500": ["中证500", "ZZ500", "CSI500"], + "SSE50": ["上证50", "SH50", "SSE50"], +} + + +def _find_universe_id(hints: list[str]) -> str | None: + """从 universes.list() 里按 name/id 子串匹配找一个 universe id。""" + try: + tf = get_client() + unis = tf.universes.list() + except Exception as e: # noqa: BLE001 + logger.warning("universes.list failed: %s", e) + return None + for u in unis or []: + item = u if isinstance(u, dict) else {"id": getattr(u, "id", ""), "name": getattr(u, "name", "")} + haystack = (item.get("id", "") + " " + item.get("name", "")).lower() + for h in hints: + if h.lower() in haystack: + return item["id"] + return None + + +def _pool_cache_path(pool_id: str) -> Path: + return settings.data_dir / "pools" / f"{pool_id}.parquet" + + +def get_pool(pool_id: PoolId, refresh: bool = False) -> list[str]: + """返回标的池里的 symbol 列表。""" + if pool_id == "watchlist": + return _load_watchlist() + + cache = _pool_cache_path(pool_id) + if cache.exists() and not refresh: + df = pl.read_parquet(cache) + return df["symbol"].to_list() + + symbols = _fetch_pool(pool_id) + if symbols: + cache.parent.mkdir(parents=True, exist_ok=True) + pl.DataFrame({"symbol": symbols, "as_of": [date.today()] * len(symbols)}).write_parquet(cache) + return symbols + + +def _fetch_pool(pool_id: PoolId) -> list[str]: + """从数据源拉取池成份。 + + 实现:先用 universes.list 找到 universe id,再 quotes.get_by_universes 拉成份。 + """ + tf = get_client() + + if pool_id in _POOL_NAME_HINTS: + uid = _find_universe_id(_POOL_NAME_HINTS[pool_id]) + if not uid: + logger.warning("无法在数据源 universes 列表里匹配到 %s", pool_id) + return [] + try: + df = tf.quotes.get_by_universes([uid], as_dataframe=True) + if df is not None and len(df) > 0 and "symbol" in df.columns: + return df["symbol"].astype(str).tolist() + except Exception as e: # noqa: BLE001 + logger.warning("fetch pool %s via universe %s failed: %s", pool_id, uid, e) + + if pool_id == "CN_Equity_A": + # 全 A — 优先直接用 CN_Equity_A universe (包含沪深京三市) + uid = _find_universe_id(["CN_Equity_A", "沪深京A股", "全A"]) + if uid: + try: + df = tf.quotes.get_by_universes([uid], as_dataframe=True) + if df is not None and len(df) > 0 and "symbol" in df.columns: + return sorted(set(df["symbol"].astype(str).tolist())) + except Exception as e: # noqa: BLE001 + logger.warning("fetch CN_Equity_A via universe %s failed: %s", uid, e) + + # fallback: 聚合申万一级行业 (覆盖度较低, 缺北交所/新股) + try: + unis = tf.universes.list() + except Exception as e: # noqa: BLE001 + logger.warning("universes.list failed: %s", e) + unis = [] + sw1_ids = [] + for u in unis or []: + item = u if isinstance(u, dict) else {"id": getattr(u, "id", "")} + uid = item.get("id", "") + if "SW1_" in uid: + sw1_ids.append(uid) + if sw1_ids: + try: + df = tf.quotes.get_by_universes(sw1_ids, as_dataframe=True) + if df is not None and "symbol" in df.columns: + return sorted(set(df["symbol"].astype(str).tolist())) + except Exception as e: # noqa: BLE001 + logger.warning("aggregate SW1 fetch failed: %s", e) + + if pool_id == "CN_Index": + uid = _find_universe_id(["CN_Index", "沪深指数", "指数"]) + ids = [uid] if uid else ["CN_Index"] + try: + df = tf.quotes.get_by_universes(ids, as_dataframe=True) + if df is not None and len(df) > 0 and "symbol" in df.columns: + return sorted(set(df["symbol"].astype(str).tolist())) + except Exception as e: # noqa: BLE001 + logger.warning("fetch CN_Index via universe %s failed: %s", ids, e) + + return [] + + +def _load_watchlist() -> list[str]: + """读取用户自选(由 watchlist service 维护)。""" + path = settings.data_dir / "user_data" / "watchlist.parquet" + if not path.exists(): + return [] + df = pl.read_parquet(path) + if df.is_empty() or "symbol" not in df.columns: + return [] + return df["symbol"].to_list() + + +# 兜底:Free 用户/无 API 时给一个小型可用集合,让 UI 不至于空白 +DEMO_SYMBOLS = [ + "600000.SH", # 浦发银行 + "600036.SH", # 招商银行 + "600519.SH", # 贵州茅台 + "601318.SH", # 中国平安 + "601398.SH", # 工商银行 + "000001.SZ", # 平安银行 + "000333.SZ", # 美的集团 + "000651.SZ", # 格力电器 + "000858.SZ", # 五粮液 + "002594.SZ", # 比亚迪 +] diff --git a/backend/app/tickflow/repository.py b/backend/app/tickflow/repository.py new file mode 100644 index 0000000..a247316 --- /dev/null +++ b/backend/app/tickflow/repository.py @@ -0,0 +1,988 @@ +"""Repository 层(§7.4)。 + +数据分层: + - DuckDB 视图: 冷查询(统计、元数据、用户自定义SQL) + - Polars 缓存: 热路径(enriched 最新日 ~5500行 + instruments ~5500行) + - Polars scan_parquet: 分钟K/历史日K (predicate pushdown) + +缓存生命周期: + - startup 时不加载(数据可能为空) + - pipeline 完成后调用 refresh_cache() + - 服务层通过 get_enriched_latest() / get_instruments() 获取缓存 +""" +from __future__ import annotations + +import logging +import threading +from datetime import date +from pathlib import Path + +import duckdb +import polars as pl + +from app.config import settings + +logger = logging.getLogger(__name__) + + +class DataStore: + """唯一的存储入口 — 进程启动时创建。""" + + def __init__(self, data_dir: Path | None = None) -> None: + self.data_dir = Path(data_dir or settings.data_dir) + self.data_dir.mkdir(parents=True, exist_ok=True) + + # 关键子目录(§7.2) + for sub in ( + "kline_daily", + "kline_daily_enriched", + "kline_index_daily", + "kline_index_enriched", + "kline_minute", + "adj_factor", + "financials", + "instruments", + "instruments_index", + "instruments_ext", + "kline_ext", + "pools", + "backtest_results", + "screener_results", + "ai_cache", + "user_data", + "depth5", + ): + (self.data_dir / sub).mkdir(parents=True, exist_ok=True) + + # 财务数据子目录 + for sub in ("metrics", "income", "balance_sheet", "cash_flow"): + (self.data_dir / "financials" / sub).mkdir(parents=True, exist_ok=True) + + # DuckDB 内存模式 — 不建 .db 文件(§7.1) + self.db = duckdb.connect(database=":memory:") + self._register_views() + + def _register_views(self) -> None: + """把 Parquet 目录挂载为 DuckDB 视图(§7.3)。""" + d = self.data_dir.as_posix() + statements = [ + f"""CREATE OR REPLACE VIEW kline_daily AS + SELECT * FROM read_parquet('{d}/kline_daily/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW kline_enriched AS + SELECT * FROM read_parquet('{d}/kline_daily_enriched/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW kline_index_daily AS + SELECT * FROM read_parquet('{d}/kline_index_daily/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW kline_index_enriched AS + SELECT * FROM read_parquet('{d}/kline_index_enriched/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW kline_minute AS + SELECT * FROM read_parquet('{d}/kline_minute/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW adj_factor AS + SELECT * FROM read_parquet('{d}/adj_factor/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW instruments AS + SELECT * FROM read_parquet('{d}/instruments/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW instruments_index AS + SELECT * FROM read_parquet('{d}/instruments_index/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW instruments_ext AS + SELECT * FROM read_parquet('{d}/instruments_ext/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW kline_ext AS + SELECT * FROM read_parquet('{d}/kline_ext/**/*.parquet', union_by_name=true)""", + # 财务数据视图 + f"""CREATE OR REPLACE VIEW financials_metrics AS + SELECT * FROM read_parquet('{d}/financials/metrics/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW financials_income AS + SELECT * FROM read_parquet('{d}/financials/income/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW financials_balance_sheet AS + SELECT * FROM read_parquet('{d}/financials/balance_sheet/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW financials_cash_flow AS + SELECT * FROM read_parquet('{d}/financials/cash_flow/*.parquet', union_by_name=true)""", + # 五档盘口 sealed 真假涨停(独立旁路存储,不进 enriched) + f"""CREATE OR REPLACE VIEW depth5 AS + SELECT * FROM read_parquet('{d}/depth5/**/*.parquet', union_by_name=true)""", + ] + for sql in statements: + try: + self.db.execute(sql) + except duckdb.IOException: + logger.debug("view registration skipped (no parquet yet): %s", sql[:60]) + + +class KlineRepository: + """日 K / 分钟 K 的读写入口。""" + + def __init__(self, store: DataStore) -> None: + self.store = store + self.db = store.db + self._lock = threading.Lock() + + # ---- Polars 缓存 ---- + self._enriched_cache: pl.DataFrame | None = None # 最新一天 (~5500行) + self._enriched_cache_date: date | None = None + self._live_agg_cache: pl.DataFrame | None = None # 预计算聚合表 (~5500行) + self._live_agg_cache_date: date | None = None + self._instruments_cache: pl.DataFrame | None = None + # 完整 enriched 历史 (含所有指标, 供 filter_history 策略使用) + self._enriched_history_cache: pl.DataFrame | None = None # ~100万行 + self._enriched_history_start: date | None = None + self._index_instruments_cache: pl.DataFrame | None = None + + # parquet glob 路径 + self._enriched_glob = str(store.data_dir / "kline_daily_enriched" / "**" / "*.parquet") + self._index_enriched_glob = str(store.data_dir / "kline_index_enriched" / "**" / "*.parquet") + self._minute_glob = str(store.data_dir / "kline_minute" / "**" / "*.parquet") + self._inst_glob = str(store.data_dir / "instruments" / "**" / "*.parquet") + self._index_inst_glob = str(store.data_dir / "instruments_index" / "**" / "*.parquet") + + def execute_all(self, sql: str, params: list | None = None) -> list[tuple]: + """线程安全的 SELECT → fetchall。DuckDB 单 connection 非线程安全,所有读路径须走此方法。""" + with self._lock: + return self.db.execute(sql, params or []).fetchall() + + def execute_one(self, sql: str, params: list | None = None) -> tuple | None: + """线程安全的 SELECT → fetchone。""" + with self._lock: + return self.db.execute(sql, params or []).fetchone() + + # ================================================================ + # Polars 缓存管理 + # ================================================================ + + def refresh_cache(self) -> None: + """刷新 Polars 缓存。在 pipeline 完成后、服务启动时调用。""" + self._refresh_instruments() + self._refresh_index_instruments() + self._refresh_enriched() + + def clear_cache(self) -> None: + """清空所有 Polars 内存缓存。 + + 与 refresh_cache 的区别: refresh_cache 在磁盘无数据时会提前 return, + 导致内存里的旧缓存残留 (clear 数据后看板仍显示旧数据的根因)。 + 本方法无条件清空, 供清除数据/重置场景调用。 + """ + self._enriched_cache = None + self._enriched_cache_date = None + self._enriched_history_cache = None + self._enriched_history_start = None + self._live_agg_cache = None + self._live_agg_cache_date = None + self._instruments_cache = None + self._index_instruments_cache = None + + def _refresh_enriched(self) -> None: + """从 parquet 加载 enriched 最新日到内存 + 构建聚合表。 + + enriched parquet 仅存 14 列基础数据。启动时读入历史数据并即时计算完整指标, + 将结果缓存在内存中供各服务使用。 + + 优化: 扩大历史读取范围, 同时缓存完整历史 (含指标), 供 filter_history 策略直接复用。 + """ + try: + latest = self._latest_enriched_date_duckdb() + if not latest: + # 磁盘已无数据: 必须清空内存缓存, 否则旧数据会残留 + # (清数据后看板仍显示旧数据的根因) + self.clear_cache() + return + + # Step 1: 直接读最新日期的分区文件 (仅 14 列) + enriched_dir = self.store.data_dir / "kline_daily_enriched" + ds = latest.isoformat() if hasattr(latest, "isoformat") else str(latest) + target_parquet = enriched_dir / f"date={ds}" / "part.parquet" + + if not target_parquet.exists(): + return + + df_latest = pl.read_parquet(target_parquet) + if df_latest.is_empty(): + return + + # Step 2: 读近 300 天 14 列数据 → compute → filter(latest) → 缓存 + # 300 日历天 ≈ 210 交易日, 覆盖 filter_history 最大 lookback(90) + warmup(60) + try: + from datetime import timedelta + from app.indicators.pipeline import compute_indicators, compute_signals, compute_limit_signals + start_full = latest - timedelta(days=300) + read_cols = [c for c in ["symbol", "date", "open", "high", "low", "close", + "volume", "amount", "raw_close", "raw_high", "raw_low"] + if c in df_latest.columns] + lf = ( + pl.scan_parquet(self._enriched_glob) + .filter(pl.col("date") >= start_full) + .sort(["symbol", "date"]) + ) + df_hist = lf.select(read_cols).collect() + if not df_hist.is_empty(): + instruments = self._instruments_cache if self._instruments_cache is not None else pl.DataFrame() + df_full = compute_indicators(df_hist) + df_full = compute_signals(df_full) + if instruments is not None and not instruments.is_empty(): + df_full = compute_limit_signals(df_full, instruments) + + # JOIN instruments 到完整历史 (filter_history/basic_filter 需要 name/股本等列) + if instruments is not None and not instruments.is_empty(): + inst_cols = [c for c in ["name", "total_shares", "float_shares"] + if c in instruments.columns and c not in df_full.columns] + if inst_cols: + df_full = df_full.join( + instruments.select(["symbol", *inst_cols]).unique(subset=["symbol"]), + on="symbol", + how="left", + ) + + # 缓存完整历史 (含指标+必要基础信息) 供 filter_history/backtest 直接复用 + self._enriched_history_cache = df_full + self._enriched_history_start = df_full["date"].min() + logger.info("enriched 历史缓存: %d rows, %s ~ %s", + len(df_full), self._enriched_history_start, latest) + + # 只取最新一天作为 enriched_cache + df_today = df_full.filter(pl.col("date") == latest) + if not df_today.is_empty(): + self._enriched_cache = df_today + self._enriched_cache_date = latest + # 构建盘中递推基准: 若最新分区是今天的实时盘中数据, + # 递推状态必须停在上一交易日, 不能把今天作为“昨日”。 + self._build_live_agg(self._live_agg_baseline_date(latest)) + logger.info("enriched 缓存已计算: %d 只, 日期 %s (即时计算)", len(df_today), latest) + return + except Exception as e: # noqa: BLE001 + logger.warning("enriched 即时计算失败, 使用原始 14 列缓存: %s", e) + + # 降级: 直接使用 14 列数据 + 构建 live_agg + self._enriched_cache = df_latest + self._enriched_cache_date = latest + self._build_live_agg(self._live_agg_baseline_date(latest)) + + logger.info("enriched 缓存已加载: %d 只, 日期 %s", len(df_latest), latest) + except Exception as e: # noqa: BLE001 + logger.warning("enriched 缓存刷新失败: %s", e) + + def _build_live_agg(self, latest: date) -> None: + """从 OHLCV 即时计算递推状态 + 窗口聚合, 构建盘中实时聚合表。 + + 优化: 优先使用 _enriched_history_cache (启动时已计算), 避免重复 compute_indicators。 + """ + from datetime import timedelta + from app.indicators.pipeline import _ema_alpha + + start_60d = latest - timedelta(days=90) # 日历90天 ≈ 60个交易日 + + # 优先使用已有的历史缓存 (避免重复 scan_parquet + compute_indicators) + if self._enriched_history_cache is not None and not self._enriched_history_cache.is_empty(): + hist_all = self._enriched_history_cache + if "date" in hist_all.columns and hist_all["date"].min() <= start_60d: + # 从历史缓存中提取所需列 (历史缓存已有指标列) + base_cols = ["symbol", "date", "open", "high", "low", "close", "volume", + "raw_close", "raw_high", "raw_low"] + needed = [c for c in base_cols if c in hist_all.columns] + df_hist = hist_all.filter( + (pl.col("date") >= start_60d) & (pl.col("date") <= latest) + ).select(needed).sort(["symbol", "date"]) + + # 用历史缓存的指标列提取最新日状态 (无需再次 compute_indicators) + state_source = hist_all.filter(pl.col("date") == latest) + + state_cols = [ + "symbol", + "ema5", "ema10", "ema20", "ema30", "ema60", + "macd_dea", + "kdj_k", "kdj_d", + "atr_14", + "close", "high", "low", + "annual_vol_20d", + ] + existing_state = [c for c in state_cols if c in state_source.columns] + agg_a = state_source.select(existing_state) + else: + df_hist = pl.DataFrame() + agg_a = pl.DataFrame() + else: + # 降级: 读 parquet + compute_indicators + df_hist, agg_a = self._build_live_agg_from_parquet(latest, start_60d) + + if df_hist.is_empty(): + self._live_agg_cache = pl.DataFrame() + self._live_agg_cache_date = None + return + + if agg_a.is_empty(): + self._live_agg_cache = pl.DataFrame() + self._live_agg_cache_date = None + return + + # 单独计算 _ema12 / _ema26 (compute_indicators 内部会 drop 掉) + df_ema = df_hist.sort(["symbol", "date"]).with_columns([ + pl.col("close").ewm_mean(alpha=_ema_alpha(12), adjust=False).over("symbol").alias("_ema12"), + pl.col("close").ewm_mean(alpha=_ema_alpha(26), adjust=False).over("symbol").alias("_ema26"), + ]).filter(pl.col("date") == latest).select("symbol", "_ema12", "_ema26") + + agg_a = agg_a.join(df_ema, on="symbol", how="inner") + + # 单独计算 RSI 状态列 (compute_indicators 内部会 drop 掉) + df_rsi_base = df_hist.sort(["symbol", "date"]).with_columns( + pl.col("close").diff().over("symbol").alias("_daily_delta") + ) + gain = pl.when(pl.col("_daily_delta") > 0).then(pl.col("_daily_delta")).otherwise(0.0) + loss = pl.when(pl.col("_daily_delta") < 0).then(-pl.col("_daily_delta")).otherwise(0.0) + rsi_exprs = [] + for n in (6, 14, 24): + a = 1.0 / n + rsi_exprs.append(gain.ewm_mean(alpha=a, adjust=False).over("symbol").alias(f"_rsi_avg_gain_{n}")) + rsi_exprs.append(loss.ewm_mean(alpha=a, adjust=False).over("symbol").alias(f"_rsi_avg_loss_{n}")) + df_rsi = ( + df_rsi_base + .with_columns(rsi_exprs) + .filter(pl.col("date") == latest) + .select("symbol", *[f"_rsi_avg_gain_{n}" for n in (6, 14, 24)], + *[f"_rsi_avg_loss_{n}" for n in (6, 14, 24)]) + ) + agg_a = agg_a.join(df_rsi, on="symbol", how="inner") + + # 前复权因子: adj_factor = close(复权) / raw_close(原始) + if "raw_close" in df_hist.columns: + adj_factor_df = ( + df_hist.filter(pl.col("date") == latest) + .select("symbol", (pl.col("close") / pl.col("raw_close")).alias("_adj_factor")) + ) + agg_a = agg_a.join(adj_factor_df, on="symbol", how="left") + if "_adj_factor" in agg_a.columns: + agg_a = agg_a.with_columns(pl.col("_adj_factor").fill_null(1.0)) + + # annual_vol_20d 递推状态: 最近 19 天日收益率的部分和 / 平方和 + df_daily_pct = ( + df_hist.sort(["symbol", "date"]) + .with_columns( + pl.col("close").pct_change().over("symbol").alias("_daily_pct") + ) + ) + df_vol = df_daily_pct.group_by("symbol").agg([ + pl.col("_daily_pct").tail(19).sum().alias("_vol_19d_pct_sum"), + (pl.col("_daily_pct") ** 2).tail(19).sum().alias("_vol_19d_pct_sq_sum"), + ]) + agg_a = agg_a.join(df_vol, on="symbol", how="left") + + # 昨日连板数: 从 enriched parquet 取 (用于增量计算同向 +1) + lf = pl.scan_parquet(self._enriched_glob).filter(pl.col("date") == latest) + consec_cols = [c for c in ["symbol", "consecutive_limit_ups", "consecutive_limit_downs"] + if c in lf.collect_schema().names()] + if len(consec_cols) == 3: + consec_df = lf.select(consec_cols).collect() + if not consec_df.is_empty(): + consec = consec_df.select( + "symbol", + pl.col("consecutive_limit_ups").alias("_prev_consec_up"), + pl.col("consecutive_limit_downs").alias("_prev_consec_down"), + ) + agg_a = agg_a.join(consec, on="symbol", how="left") + + # B类: 按 symbol 分组聚合 — 窗口统计 + agg_b = ( + df_hist.sort(["symbol", "date"]) + .group_by("symbol") + .agg([ + pl.col("close").tail(4).sum().alias("_ma5_partial_sum"), + pl.col("close").tail(9).sum().alias("_ma10_partial_sum"), + pl.col("close").tail(19).sum().alias("_ma20_partial_sum"), + pl.col("close").tail(29).sum().alias("_ma30_partial_sum"), + pl.col("close").tail(59).sum().alias("_ma60_partial_sum"), + + pl.col("close").tail(19).sum().alias("_boll_partial_sum"), + (pl.col("close").tail(19) ** 2).sum().alias("_boll_partial_sq_sum"), + + pl.col("high").tail(59).max().alias("_high_59d"), + pl.col("low").tail(59).min().alias("_low_59d"), + + pl.col("close").tail(5).first().alias("_close_5d_ago"), + pl.col("close").tail(10).first().alias("_close_10d_ago"), + pl.col("close").tail(20).first().alias("_close_20d_ago"), + pl.col("close").tail(30).first().alias("_close_30d_ago"), + pl.col("close").tail(60).first().alias("_close_60d_ago"), + + pl.col("volume").tail(4).sum().alias("_vol_ma5_partial_sum"), + pl.col("volume").tail(9).sum().alias("_vol_ma10_partial_sum"), + + pl.col("low").tail(8).min().alias("_kdj_8d_low"), + pl.col("high").tail(8).max().alias("_kdj_8d_high"), + + pl.col("close").tail(59).len().alias("_window_len"), + ]) + ) + + self._live_agg_cache = agg_a.join(agg_b, on="symbol", how="inner") + self._live_agg_cache_date = latest + + def _live_agg_baseline_date(self, latest: date) -> date: + """盘中递推基准日期。当天实时分区存在时使用上一可用交易日。""" + if latest != date.today(): + return latest + try: + row = self.execute_one( + "SELECT max(date) FROM kline_enriched WHERE date < ?", + [latest], + ) + if row and row[0]: + d = row[0] + return d if isinstance(d, date) else date.fromisoformat(str(d)) + except Exception: # noqa: BLE001 + pass + return latest + + def _build_live_agg_from_parquet(self, latest: date, start_60d: date) -> tuple[pl.DataFrame, pl.DataFrame]: + """降级路径: 从 parquet 读取数据并计算指标 (当 _enriched_history_cache 不可用时)。""" + from app.indicators.pipeline import compute_indicators + + lf = ( + pl.scan_parquet(self._enriched_glob) + .filter(pl.col("date") >= start_60d) + .filter(pl.col("date") <= latest) + .sort(["symbol", "date"]) + ) + + read_cols = [c for c in ["symbol", "date", "open", "high", "low", "close", "volume", + "raw_close", "raw_high", "raw_low"] + if c in lf.collect_schema().names()] + df_hist = lf.select(read_cols).collect() + + if df_hist.is_empty(): + return df_hist, pl.DataFrame() + + df_with_indicators = compute_indicators(df_hist) + + state_cols = [ + "symbol", + "ema5", "ema10", "ema20", "ema30", "ema60", + "macd_dea", + "kdj_k", "kdj_d", + "atr_14", + "close", "high", "low", + "annual_vol_20d", + ] + existing_state = [c for c in state_cols if c in df_with_indicators.columns] + agg_a = df_with_indicators.filter(pl.col("date") == latest).select(existing_state) + + return df_hist, agg_a + + def _refresh_instruments(self) -> None: + """加载 instruments 到内存。""" + try: + df = pl.scan_parquet(self._inst_glob).collect() + if not df.is_empty(): + self._instruments_cache = df + logger.info("instruments 缓存已加载: %d 只", len(df)) + except Exception as e: # noqa: BLE001 + logger.warning("instruments 缓存刷新失败: %s", e) + + def _refresh_index_instruments(self) -> None: + """加载指数 instruments 到内存。""" + try: + df = pl.scan_parquet(self._index_inst_glob).collect() + if not df.is_empty(): + self._index_instruments_cache = df + logger.info("index instruments 缓存已加载: %d 只", len(df)) + except Exception as e: # noqa: BLE001 + logger.debug("index instruments 缓存刷新跳过: %s", e) + + def get_enriched_latest(self) -> tuple[pl.DataFrame, date | None]: + """返回缓存的 enriched 最新日 DataFrame + 日期。如无缓存则懒加载。""" + if self._enriched_cache is None: + self._refresh_enriched() + if self._enriched_cache is None: + return pl.DataFrame(), self._enriched_cache_date + return self._enriched_cache, self._enriched_cache_date + + def get_enriched_history(self, target_date: date, lookback_days: int) -> pl.DataFrame | None: + """返回预计算的 enriched 历史数据 (仅 lookback 范围, 不含 warmup)。 + + warmup 部分在 _refresh_enriched 计算指标时已使用, 策略只需要最终的 lookback 窗口。 + 返回 ~33万行 (90日历天) 而非 ~107万行, filter_history 策略的 group_by 快 20x+。 + """ + cache = self._enriched_history_cache + if cache is None or cache.is_empty(): + return None + if "date" not in cache.columns: + return None + cache_max = cache["date"].max() + cache_min = cache["date"].min() + from datetime import timedelta + # 验证缓存覆盖完整范围 (含 warmup) + warmup_start = target_date - timedelta(days=(lookback_days + 60) * 2) + if cache_min > warmup_start or cache_max < target_date: + return None + # 只返回 lookback 范围 (日历天数 ≈ 2/3 交易日, 足够覆盖) + lookback_start = target_date - timedelta(days=lookback_days) + return cache.filter((pl.col("date") >= lookback_start) & (pl.col("date") <= target_date)) + + def get_enriched_range( + self, + start: date, + end: date, + symbols: list[str] | None = None, + columns: list[str] | None = None, + ) -> pl.DataFrame | None: + """从预计算 enriched 历史缓存返回完整区间;缓存不覆盖时返回 None。""" + if self._enriched_history_cache is None: + self._refresh_enriched() + cache = self._enriched_history_cache + if cache is None or cache.is_empty() or "date" not in cache.columns: + return None + + cache_min = cache["date"].min() + cache_max = cache["date"].max() + if cache_min > start or cache_max < end: + return None + + df = cache.filter((pl.col("date") >= start) & (pl.col("date") <= end)) + if symbols is not None: + df = df.filter(pl.col("symbol").is_in(symbols)) + if columns and not df.is_empty(): + existing = [c for c in columns if c in df.columns] + if "symbol" not in existing and "symbol" in df.columns: + existing.insert(0, "symbol") + if "date" not in existing and "date" in df.columns: + existing.insert(1, "date") + df = df.select(existing) + return df.sort(["symbol", "date"]) + + def get_live_agg(self) -> pl.DataFrame: + """返回盘中实时指标预计算聚合表。如无缓存则懒加载。""" + if self._live_agg_cache is None: + self._refresh_enriched() + if self._live_agg_cache is None: + return pl.DataFrame() + return self._live_agg_cache + + def get_instruments(self) -> pl.DataFrame: + """返回缓存的 instruments DataFrame。如无缓存则懒加载。""" + if self._instruments_cache is None: + self._refresh_instruments() + if self._instruments_cache is None: + return pl.DataFrame() + return self._instruments_cache + + def get_index_instruments(self) -> pl.DataFrame: + """返回缓存的指数 instruments DataFrame。如无缓存则懒加载。""" + if self._index_instruments_cache is None: + self._refresh_index_instruments() + if self._index_instruments_cache is None: + return pl.DataFrame() + return self._index_instruments_cache + + def get_index_symbol_set(self) -> set[str]: + """返回已缓存指数 symbol 集合。""" + df = self.get_index_instruments() + if df.is_empty() or "symbol" not in df.columns: + return set() + return set(df["symbol"].cast(pl.Utf8).to_list()) + + def enriched_latest_date(self) -> date | None: + """返回缓存中的 enriched 最新日期。""" + return self._enriched_cache_date + + # ================================================================ + # 热路径: Polars 查询 (Chart / Screener / Signals / Intraday) + # ================================================================ + + def get_daily( + self, + symbol: str, + start: date, + end: date, + columns: list[str] | None = None, + ) -> pl.DataFrame: + """单股日K查询 — 从14列parquet读取后即时计算指标。""" + from datetime import timedelta + + # 扩展范围用于指标预热 (MA60 需要 ~60 交易日 ≈ 120 日历日) + warmup_start = start - timedelta(days=150) + + # 扫描14列 parquet + df = self._scan_daily_symbol(symbol, warmup_start, end, None) + if not df.is_empty(): + df = self._compute_enriched_range(df) + + # 尝试用缓存数据覆盖最新日 (盘中更准确) + cached, cache_date = self.get_enriched_latest() + if not df.is_empty() and cached is not None and not cached.is_empty() and cache_date: + if start <= cache_date <= end: + cached_part = self._filter_cached(cached, symbol, None) + if not cached_part.is_empty(): + df = df.filter(pl.col("date") != cache_date) + common_cols = [c for c in df.columns if c in cached_part.columns] + df = pl.concat([df.select(common_cols), cached_part.select(common_cols)]) + + # 裁剪到请求范围 + if not df.is_empty(): + df = df.filter((pl.col("date") >= start) & (pl.col("date") <= end)) + + if columns and not df.is_empty(): + existing = [c for c in columns if c in df.columns] + df = df.select(existing) + + return df + + def get_daily_batch( + self, + symbols: list[str], + start: date, + end: date, + columns: list[str] | None = None, + ) -> pl.DataFrame: + """批量日K查询。""" + cached, cache_date = self.get_enriched_latest() + if cached is not None and not cached.is_empty() and cache_date: + if start >= cache_date: + return self._filter_cached_batch(cached, symbols, columns) + + # 回退 scan_parquet + return self._scan_daily_batch(symbols, start, end, columns) + + def get_index_daily( + self, + symbol: str, + start: date, + end: date, + columns: list[str] | None = None, + ) -> pl.DataFrame: + """指数日K查询 — 从独立指数 enriched parquet 读取后即时计算通用指标。""" + from datetime import timedelta + + warmup_start = start - timedelta(days=150) + df = self._scan_index_daily_symbol(symbol, warmup_start, end, None) + if not df.is_empty(): + df = self._compute_index_enriched_range(df) + df = df.filter((pl.col("date") >= start) & (pl.col("date") <= end)) + if columns and not df.is_empty(): + existing = [c for c in columns if c in df.columns] + df = df.select(existing) + return df + + def get_minute( + self, + symbol: str, + trade_date: date, + ) -> pl.DataFrame: + """分钟K查询 — Polars scan_parquet + predicate pushdown。""" + try: + return pl.scan_parquet(self._minute_glob).filter( + (pl.col("symbol") == symbol) + & (pl.col("datetime").dt.date() == trade_date) + ).sort("datetime").collect() + except Exception as e: # noqa: BLE001 + logger.warning("分钟K查询失败: %s", e) + return pl.DataFrame() + + # ================================================================ + # Polars 查询内部方法 + # ================================================================ + + def _compute_enriched_range(self, df: pl.DataFrame) -> pl.DataFrame: + """对14列enriched数据即时计算完整指标+信号。输入应含足够预热行数。""" + from app.indicators.pipeline import compute_indicators, compute_signals, compute_limit_signals, filter_halt_days + if df.is_empty() or df.height < 2: + return df + # 兜底过滤历史脏数据中的停牌日 (close 可能被填充为前收盘价) + df = filter_halt_days(df) + if df.is_empty() or df.height < 2: + return df + try: + df = compute_indicators(df) + df = compute_signals(df) + instruments = self.get_instruments() + df = compute_limit_signals(df, instruments) + except Exception as e: # noqa: BLE001 + logger.warning("on-demand compute failed: %s", e) + return df + + def _compute_index_enriched_range(self, df: pl.DataFrame) -> pl.DataFrame: + """指数只计算通用技术指标和通用信号,跳过涨跌停/股本/市值逻辑。""" + from app.indicators.pipeline import compute_indicators, compute_signals + if df.is_empty() or df.height < 2: + return df + try: + df = compute_indicators(df) + df = compute_signals(df) + except Exception as e: # noqa: BLE001 + logger.warning("index on-demand compute failed: %s", e) + return df + + def _filter_cached(self, cached: pl.DataFrame, symbol: str, columns: list[str] | None) -> pl.DataFrame: + df = cached.filter(pl.col("symbol") == symbol) + if columns and not df.is_empty(): + existing = [c for c in columns if c in df.columns] + df = df.select(existing) + return df + + def _filter_cached_batch(self, cached: pl.DataFrame, symbols: list[str], columns: list[str] | None) -> pl.DataFrame: + df = cached.filter(pl.col("symbol").is_in(symbols)) + if columns and not df.is_empty(): + existing = [c for c in columns if c in df.columns] + df = df.select(existing) + return df.sort(["symbol", "date"]) + + def _scan_daily_symbol(self, symbol: str, start: date, end: date, columns: list[str] | None) -> pl.DataFrame: + try: + lf = pl.scan_parquet(self._enriched_glob, + cast_options=pl.ScanCastOptions(integer_cast="allow-float")).filter( + (pl.col("symbol") == symbol) + & (pl.col("date") >= start) + & (pl.col("date") <= end) + ).sort("date") + if columns: + schema_names = lf.collect_schema().names() + existing = [c for c in columns if c in schema_names] + lf = lf.select(existing) + return lf.collect() + except Exception as e: # noqa: BLE001 + logger.warning("日K查询失败: %s", e) + return pl.DataFrame() + + def _scan_daily_batch(self, symbols: list[str], start: date, end: date, columns: list[str] | None) -> pl.DataFrame: + try: + lf = pl.scan_parquet(self._enriched_glob, + cast_options=pl.ScanCastOptions(integer_cast="allow-float")).filter( + (pl.col("symbol").is_in(symbols)) + & (pl.col("date") >= start) + & (pl.col("date") <= end) + ).sort(["symbol", "date"]) + if columns: + schema_names = lf.collect_schema().names() + existing = [c for c in columns if c in schema_names] + lf = lf.select(existing) + return lf.collect() + except Exception as e: # noqa: BLE001 + logger.warning("日K批量查询失败: %s", e) + return pl.DataFrame() + + def _scan_index_daily_symbol(self, symbol: str, start: date, end: date, columns: list[str] | None) -> pl.DataFrame: + try: + lf = pl.scan_parquet(self._index_enriched_glob, + cast_options=pl.ScanCastOptions(integer_cast="allow-float")).filter( + (pl.col("symbol") == symbol) + & (pl.col("date") >= start) + & (pl.col("date") <= end) + ).sort("date") + if columns: + schema_names = lf.collect_schema().names() + existing = [c for c in columns if c in schema_names] + lf = lf.select(existing) + return lf.collect() + except Exception as e: # noqa: BLE001 + logger.warning("指数日K查询失败: %s", e) + return pl.DataFrame() + + def _merge_cached_and_scan( + self, + cached: pl.DataFrame, + cache_date: date, + symbol: str, + start: date, + end: date, + columns: list[str] | None, + ) -> pl.DataFrame: + """合并缓存部分 + scan 历史部分。 + + 历史部分用 strict < cache_date, 避免与缓存重复。 + 两部分 schema 可能不一致 (增量 vs 全量), concat 前对齐列。 + """ + hist = self._scan_daily_symbol(symbol, start, cache_date, columns) + cached_part = self._filter_cached(cached, symbol, columns) + if hist.is_empty(): + return cached_part + if cached_part.is_empty(): + return hist + # 去重: 历史部分可能包含 cache_date, 去掉后再合并 + hist = hist.filter(pl.col("date") < cache_date) + # 对齐列: 取交集, 统一类型 + common_cols = [c for c in hist.columns if c in cached_part.columns] + hist = hist.select(common_cols) + cached_part = cached_part.select(common_cols) + # 统一类型: 历史可能是 Float64, 缓存可能是 Int64, 统一为 cast + for c in common_cols: + if hist[c].dtype != cached_part[c].dtype: + # 统一到更宽的类型 + target = hist[c].dtype if hist.height > cached_part.height else cached_part[c].dtype + hist = hist.with_columns(pl.col(c).cast(target)) + cached_part = cached_part.with_columns(pl.col(c).cast(target)) + return pl.concat([hist, cached_part]) + + # ================================================================ + # DuckDB 查询 (冷路径: 统计/元数据/自定义SQL) + # ================================================================ + + def latest_minute_date(self, symbol: str) -> date | None: + try: + with self._lock: + row = self.db.execute( + "SELECT max(CAST(datetime AS DATE)) FROM kline_minute WHERE symbol = ?", + [symbol], + ).fetchone() + if row and row[0]: + return row[0] if isinstance(row[0], date) else date.fromisoformat(str(row[0])) + except duckdb.CatalogException: + pass + return None + + def earliest_daily_date(self) -> date | None: + """本地日K数据的最早日期。""" + try: + with self._lock: + res = self.db.execute( + "SELECT min(date) FROM kline_daily", + ).fetchone() + if res and res[0]: + d = res[0] + return d if isinstance(d, date) else date.fromisoformat(str(d)) + except Exception: + return None + return None + + def earliest_minute_date(self) -> date | None: + """本地分钟K数据的最早日期。""" + try: + with self._lock: + res = self.db.execute( + "SELECT min(CAST(datetime AS DATE)) FROM kline_minute", + ).fetchone() + if res and res[0]: + d = res[0] + return d if isinstance(d, date) else date.fromisoformat(str(d)) + except Exception: + return None + return None + + def latest_daily_date(self) -> date | None: + """本地日K数据的最新日期。""" + try: + with self._lock: + res = self.db.execute( + "SELECT max(date) FROM kline_daily", + ).fetchone() + if res and res[0]: + d = res[0] + return d if isinstance(d, date) else date.fromisoformat(str(d)) + except Exception: + return None + return None + + def _latest_enriched_date_duckdb(self) -> date | None: + try: + with self._lock: + res = self.db.execute( + "SELECT max(date) FROM kline_enriched", + ).fetchone() + if res and res[0]: + d = res[0] + return d if isinstance(d, date) else date.fromisoformat(str(d)) + except Exception: # noqa: BLE001 + return None + return None + + # ================================================================ + # 写入 (Pipeline / Sync) + # ================================================================ + + def append_daily(self, df: pl.DataFrame) -> None: + """按日分区写入日K数据 (merge-upsert)。""" + if df.is_empty(): + return + self._write_daily_partition(df, "kline_daily") + + def append_enriched(self, df: pl.DataFrame) -> None: + """按日分区写入 enriched 数据 (merge-upsert)。磁盘仅写入 14 列存储列。""" + if df.is_empty(): + return + from app.indicators.pipeline import ENRICHED_STORAGE_COLS + storage_cols = [c for c in ENRICHED_STORAGE_COLS if c in df.columns] + df_storage = df.select(storage_cols) + self._write_daily_partition(df_storage, "kline_daily_enriched") + + def append_index_daily(self, df: pl.DataFrame) -> None: + """按日分区写入指数日K数据 (merge-upsert)。""" + if df.is_empty(): + return + self._write_daily_partition(df, "kline_index_daily") + + def append_index_enriched(self, df: pl.DataFrame) -> None: + """按日分区写入指数 enriched 数据。磁盘仅写入通用基础行情窄表。""" + if df.is_empty(): + return + from app.indicators.pipeline import ENRICHED_STORAGE_COLS + storage_cols = [c for c in ENRICHED_STORAGE_COLS if c in df.columns] + df_storage = df.select(storage_cols) + self._write_daily_partition(df_storage, "kline_index_enriched") + + def save_index_instruments(self, df: pl.DataFrame) -> None: + """保存指数标的维表。""" + if df.is_empty() or "symbol" not in df.columns: + return + out = self.store.data_dir / "instruments_index" / "instruments_index.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + df.unique(subset=["symbol"], keep="last").sort("symbol").write_parquet(out) + self._index_instruments_cache = None + self._refresh_index_instruments() + + def refresh_index_views(self) -> None: + """刷新指数相关 DuckDB 视图。""" + d = self.store.data_dir.as_posix() + statements = [ + f"""CREATE OR REPLACE VIEW kline_index_daily AS + SELECT * FROM read_parquet('{d}/kline_index_daily/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW kline_index_enriched AS + SELECT * FROM read_parquet('{d}/kline_index_enriched/**/*.parquet', union_by_name=true)""", + f"""CREATE OR REPLACE VIEW instruments_index AS + SELECT * FROM read_parquet('{d}/instruments_index/**/*.parquet', union_by_name=true)""", + ] + for sql in statements: + try: + with self._lock: + self.db.execute(sql) + except Exception as e: # noqa: BLE001 + logger.debug("index view refresh skipped: %s", e) + + def _write_daily_partition(self, df: pl.DataFrame, table: str) -> None: + """按 date 分区写入 parquet,每个日期一个文件,支持 merge-upsert。""" + base = self.store.data_dir / table + for date_df in df.partition_by("date"): + dt = date_df["date"][0] + ds = dt.isoformat() if hasattr(dt, "isoformat") else str(dt) + out = base / f"date={ds}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + if out.exists(): + existing = pl.read_parquet(out) + date_df = pl.concat([existing, date_df], how="diagonal_relaxed").unique( + subset=["symbol", "date"], keep="last" + ) + date_df = date_df.sort(["symbol", "date"]) + date_df.write_parquet(out) + + def flush_live_daily(self, df: pl.DataFrame) -> None: + """覆写当天 kline_daily 分区 (实时行情落盘, 非merge)。""" + if df.is_empty() or "date" not in df.columns: + return + base = self.store.data_dir / "kline_daily" + dt = df["date"][0] + ds = dt.isoformat() if hasattr(dt, "isoformat") else str(dt) + out = base / f"date={ds}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + df.sort(["symbol", "date"]).write_parquet(out) + + def flush_live_enriched(self, df: pl.DataFrame) -> None: + """覆写当天 kline_daily_enriched 分区 (实时 enriched 落盘, 非merge)。 + + 内存缓存保留完整指标列供各服务使用,磁盘仅写入 14 列存储列。 + """ + if df.is_empty() or "date" not in df.columns: + return + # 内存缓存: 保留完整 66 列 + self._enriched_cache = df.sort(["symbol"]) + dt = df["date"][0] + self._enriched_cache_date = dt + # 磁盘写入: 仅 14 列存储列 + from app.indicators.pipeline import ENRICHED_STORAGE_COLS + storage_cols = [c for c in ENRICHED_STORAGE_COLS if c in df.columns] + df_storage = df.select(storage_cols).sort(["symbol"]) + base = self.store.data_dir / "kline_daily_enriched" + ds = dt.isoformat() if hasattr(dt, "isoformat") else str(dt) + out = base / f"date={ds}" / "part.parquet" + out.parent.mkdir(parents=True, exist_ok=True) + df_storage.write_parquet(out) diff --git a/backend/app/tickflow/scheduler.py b/backend/app/tickflow/scheduler.py new file mode 100644 index 0000000..588b67c --- /dev/null +++ b/backend/app/tickflow/scheduler.py @@ -0,0 +1,66 @@ +"""请求调度器(§5.6)。 + +按 capability 分别维护令牌桶。Phase 0:基础实现;Phase 1 接入批量合并、优先级队列。 +""" +from __future__ import annotations + +import asyncio +import time +from dataclasses import dataclass + +from .capabilities import Cap, CapabilitySet + + +@dataclass +class _Bucket: + capacity: int # 每分钟令牌数 + tokens: float + last_refill: float # 单位:秒 + + def consume(self, n: int = 1) -> float: + """尝试消费 n 个令牌,返回需要等待的秒数(0 表示无需等待)。""" + now = time.monotonic() + elapsed = now - self.last_refill + # 60s 内补满 capacity,匀速补 + refill = elapsed * (self.capacity / 60.0) + self.tokens = min(self.capacity, self.tokens + refill) + self.last_refill = now + + if self.tokens >= n: + self.tokens -= n + return 0.0 + deficit = n - self.tokens + # 还需多少秒才能补齐 + wait = deficit / (self.capacity / 60.0) + # 不预扣,留给下一次再竞争(避免饿死优先级高的请求) + return wait + + +class Scheduler: + """每个 capability 一个桶。""" + + def __init__(self, capset: CapabilitySet) -> None: + self._capset = capset + self._buckets: dict[Cap, _Bucket] = {} + self._locks: dict[Cap, asyncio.Lock] = {} + for cap, lim in capset.all().items(): + if lim.rpm: + self._buckets[cap] = _Bucket( + capacity=lim.rpm, + tokens=lim.rpm, + last_refill=time.monotonic(), + ) + self._locks[cap] = asyncio.Lock() + + async def acquire(self, cap: Cap, n: int = 1) -> None: + """阻塞直到拿到 n 个令牌。无桶 = 不限流(由调用方保证)。""" + bucket = self._buckets.get(cap) + if bucket is None: + return + lock = self._locks[cap] + async with lock: + while True: + wait = bucket.consume(n) + if wait == 0: + return + await asyncio.sleep(wait) diff --git a/backend/app/uuid_store.py b/backend/app/uuid_store.py new file mode 100644 index 0000000..18ec2ff --- /dev/null +++ b/backend/app/uuid_store.py @@ -0,0 +1,98 @@ +"""管理员创建的访问 UUID 持久化存储。 + +位置:`data/user_data/access_uuids.json`,权限 0600。 +与 secrets.json 分离,避免凭据文件过大且便于独立管理。 +""" +from __future__ import annotations + +import json +import logging +import os +import time +import uuid +from pathlib import Path + +logger = logging.getLogger(__name__) + + +def _path() -> Path: + from app.config import settings + p = settings.data_dir / "user_data" / "access_uuids.json" + p.parent.mkdir(parents=True, exist_ok=True) + return p + + +def _load() -> list[dict]: + p = _path() + if p.exists(): + try: + data = json.loads(p.read_text(encoding="utf-8")) + if isinstance(data, list): + return data + except Exception as e: # noqa: BLE001 + logger.warning("access_uuids.json malformed: %s", e) + return [] + + +def _save(records: list[dict]) -> list[dict]: + p = _path() + p.write_text(json.dumps(records, indent=2, ensure_ascii=False), encoding="utf-8") + try: + os.chmod(p, 0o600) + except OSError: + pass + return records + + +def list_uuids() -> list[dict]: + """返回所有 UUID 记录(按创建时间倒序)。""" + records = _load() + records.sort(key=lambda r: r.get("created_at", 0), reverse=True) + return records + + +def exists(uuid: str) -> bool: + """检查 UUID 是否存在且启用。""" + normalized = uuid.strip() + return any(r.get("uuid") == normalized and r.get("enabled", True) for r in _load()) + + +def create(label: str = "") -> dict: + """创建一个新的访问 UUID。""" + records = _load() + new_uuid = str(uuid.uuid4()) + record = { + "uuid": new_uuid, + "label": (label or "").strip(), + "enabled": True, + "created_at": int(time.time()), + } + records.append(record) + _save(records) + return record + + +def delete(uuid: str) -> bool: + """删除指定 UUID。""" + records = _load() + original_len = len(records) + records = [r for r in records if r.get("uuid") != uuid.strip()] + if len(records) == original_len: + return False + _save(records) + return True + + +def toggle(uuid: str, enabled: bool) -> bool: + """启用/禁用指定 UUID。""" + records = _load() + found = False + for r in records: + if r.get("uuid") == uuid.strip(): + r["enabled"] = enabled + found = True + break + if not found: + return False + _save(records) + return True diff --git a/backend/pyproject.toml b/backend/pyproject.toml new file mode 100644 index 0000000..1d2af09 --- /dev/null +++ b/backend/pyproject.toml @@ -0,0 +1,65 @@ +[project] +name = "stock-panel-backend" +version = "0.1.44" +description = "A 股选股 + 监控 + 回测面板" +readme = "../README.md" +requires-python = ">=3.11" +license = { text = "MIT" } +dependencies = [ + # Web + "fastapi>=0.115", + "uvicorn[standard]>=0.30", + "pydantic>=2.7", + "pydantic-settings>=2.4", + "python-multipart>=0.0.6", + "sse-starlette>=2.0", + # Data + "polars>=1.0", + "duckdb>=1.0", + "pyarrow>=16.0", + "pandas>=2.2", # 仅在 BacktestService 边界使用,见 §7.4 / ADR-19 + "fastexcel>=0.10", # Polars 读取 xlsx/xls + # A 股数据源 SDK + "tickflow[all]>=0.1.23", + # Scheduling + "apscheduler>=3.10", + # Config + "pyyaml>=6.0", + "python-dotenv>=1.0", + # AI(可选,但默认装上) + "openai>=1.40", # OpenAI 兼容适配器复用 openai SDK + "httpx>=0.27", +] + +[project.optional-dependencies] +# 回测依赖 vectorbt → numba → llvmlite,体积大且 macOS/Intel 上无预构建 wheel 时 +# 需要 brew install cmake 现场编译。挪到可选 extras,主依赖瘦身。 +# 启用:`uv sync --extra backtest` +backtest = [ + "vectorbt>=0.26", +] + +dev = [ + "pytest>=8.0", + "pytest-asyncio>=0.23", + "ruff>=0.5", + "mypy>=1.10", +] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["app"] + +[tool.ruff] +line-length = 100 +target-version = "py311" + +[tool.ruff.lint] +select = ["E", "F", "I", "N", "UP", "B", "SIM", "RUF"] +ignore = ["E501"] # 长行交给 fmt + +[tool.pytest.ini_options] +asyncio_mode = "auto" diff --git a/backend/scripts/__init__.py b/backend/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/scripts/cleanup_halt_days.py b/backend/scripts/cleanup_halt_days.py new file mode 100644 index 0000000..43174f8 --- /dev/null +++ b/backend/scripts/cleanup_halt_days.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +"""一次性清理脚本:移除已入库的停牌脏数据。 + +背景:历史停牌过滤条件为 "OHLC 全零",会漏过 close 被数据源填充为 +前收盘价的停牌记录(如 *ST 撤销风险警示的停牌日),导致日 K 图出现 +开盘价为 0 的异常蜡烛。停牌过滤已改用 "open==0 且 high==0",本脚本 +负责清理既有脏数据,可重复执行(幂等)。 + +用法(从 backend/ 目录运行): + .venv/bin/python -m scripts.cleanup_halt_days # 清理 + dry-run 关闭 + .venv/bin/python -m scripts.cleanup_halt_days --dry-run # 仅扫描,不写盘 +""" +from __future__ import annotations + +import argparse +import logging +from pathlib import Path + +import polars as pl + +logger = logging.getLogger(__name__) + +# kline_daily 原始表与 enriched 表的脏数据都在这些分区里 +HALT_TABLES = ["kline_daily", "kline_daily_enriched"] +DATA_DIR = Path(__file__).resolve().parent.parent.parent / "data" +HALT_PRED = (pl.col("open") == 0) & (pl.col("high") == 0) + + +def _scan_dirty(table: str) -> pl.DataFrame: + glob = str(DATA_DIR / table / "**" / "*.parquet") + cast = pl.ScanCastOptions(integer_cast="allow-float") + return ( + pl.scan_parquet(glob, hive_partitioning=True, cast_options=cast) + .filter(HALT_PRED) + .select("symbol", "date") + .collect() + ) + + +def _clean_table(table: str, dry_run: bool) -> int: + """清理单张表所有脏分区,返回被删除的行数。""" + dirty = _scan_dirty(table) + if dirty.is_empty(): + logger.info("[%s] 无脏数据", table) + return 0 + + removed = 0 + base = DATA_DIR / table + for dt in dirty["date"].unique().sort(): + part = base / f"date={dt}" / "part.parquet" + if not part.exists(): + logger.warning("[%s] 分区文件不存在: %s", table, part) + continue + df = pl.read_parquet(part) + before = df.height + cleaned = df.filter(~HALT_PRED) + after = cleaned.height + diff = before - after + if diff == 0: + continue + removed += diff + if dry_run: + logger.info("[%s %s] 将删除 %d 行 (停牌), 剩余 %d 行 [dry-run]", + table, dt, diff, after) + continue + if after == 0: + part.unlink() + logger.info("[%s %s] 删除 %d 行后分区为空, 已移除文件", table, dt, diff) + else: + cleaned.write_parquet(part) + logger.info("[%s %s] 删除 %d 行 (停牌), 剩余 %d 行已重写", + table, dt, diff, after) + return removed + + +def main() -> None: + ap = argparse.ArgumentParser(description="清理已入库的停牌脏数据") + ap.add_argument("--dry-run", action="store_true", help="仅扫描不写盘") + args = ap.parse_args() + + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s %(levelname)s %(message)s", + datefmt="%H:%M:%S", + ) + + total = 0 + for table in HALT_TABLES: + total += _clean_table(table, args.dry_run) + + mode = "dry-run 扫描" if args.dry_run else "已清理" + logger.info("完成: 共 %s %d 行停牌脏数据", mode, total) + + +if __name__ == "__main__": + main() diff --git a/backend/tests/backtest/test_engine_portfolio.py b/backend/tests/backtest/test_engine_portfolio.py new file mode 100644 index 0000000..2c0ede5 --- /dev/null +++ b/backend/tests/backtest/test_engine_portfolio.py @@ -0,0 +1,422 @@ +from __future__ import annotations + +from datetime import date, timedelta + +import polars as pl + +from app.backtest.engine import BacktestEngine, MatcherConfig + + +def _panel(symbols: list[str], days: int = 4, price: float = 10.0, overrides: dict[tuple[str, int], dict] | None = None) -> pl.DataFrame: + overrides = overrides or {} + start = date(2024, 1, 1) + rows = [] + for sym in symbols: + for i in range(days): + patch = overrides.get((sym, i), {}) + rows.append({ + "symbol": sym, + "name": sym, + "date": start + timedelta(days=i), + "open": patch.get("open", price), + "high": patch.get("high", price), + "low": patch.get("low", price), + "close": patch.get("close", price), + "volume": patch.get("volume", 100_000), + "score": patch.get("score", {"A": 4, "B": 3, "C": 2, "D": 1}.get(sym, 0)), + "signal_limit_up": patch.get("signal_limit_up", False), + "signal_limit_down": patch.get("signal_limit_down", False), + }) + return pl.DataFrame(rows).sort(["symbol", "date"]) + + +def _mask(panel: pl.DataFrame, marks: set[tuple[str, int]]) -> pl.Series: + values = [] + base = date(2024, 1, 1) + for row in panel.select(["symbol", "date"]).iter_rows(named=True): + day = (row["date"] - base).days + values.append((row["symbol"], day) in marks) + return pl.Series(values, dtype=pl.Boolean) + + +def _engine() -> BacktestEngine: + return BacktestEngine(repo=None) # simulate_portfolio 不访问 repo + + +def test_max_exposure_sets_target_position_and_caps_count(): + panel = _panel(["A", "B", "C", "D"], days=3) + entries = _mask(panel, {("A", 0), ("B", 0), ("C", 0), ("D", 0)}) + exits = _mask(panel, set()) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + max_positions=3, + max_exposure_pct=0.6, + initial_capital=100_000, + ), + ) + + assert len(result.trades) == 3 + assert {t.symbol for t in result.trades} == {"A", "B", "C"} + assert all(abs(t.position_pct - 0.2) < 0.001 for t in result.trades) + assert result.stats["max_exposure"] <= 0.61 + + +def test_one_price_limit_up_blocks_buy(): + panel = _panel( + ["A"], + days=3, + overrides={ + ("A", 1): {"open": 11, "high": 11, "low": 11, "close": 11, "signal_limit_up": True}, + }, + ) + entries = _mask(panel, {("A", 0)}) + exits = _mask(panel, set()) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig(matching="open_t+1", fees_pct=0, slippage_bps=0, max_positions=1, initial_capital=100_000), + ) + + assert result.trades == [] + assert result.stats["execution"]["buy_limit_up"] == 1 + + +def test_failed_open_exit_keeps_slot_and_blocks_replacement_buy(): + panel = _panel( + ["A", "B", "C", "D"], + days=4, + overrides={ + ("A", 2): {"open": 9, "high": 9, "low": 9, "close": 9, "signal_limit_down": True}, + }, + ) + entries = _mask(panel, { + ("A", 0), ("B", 0), ("C", 0), + ("D", 1), + }) + exits = _mask(panel, {("A", 1)}) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + max_positions=3, + max_exposure_pct=0.6, + initial_capital=100_000, + ), + ) + + assert "D" not in {t.symbol for t in result.trades} + assert result.stats["execution"]["sell_limit_down"] == 1 + assert result.stats["execution"]["pending_exit"] == 1 + assert result.stats["execution"]["buy_no_slot"] >= 1 + a_trade = next(t for t in result.trades if t.symbol == "A") + assert a_trade.blocked_exit_days == 1 + assert a_trade.exit_reason == "signal" + + +def test_trailing_stop_uses_high_water_mark(): + panel = _panel( + ["A"], + days=5, + overrides={ + ("A", 2): {"open": 10, "high": 12, "low": 11.8, "close": 12}, + ("A", 3): {"open": 12, "high": 12, "low": 11.3, "close": 11.3}, + }, + ) + entries = _mask(panel, {("A", 0)}) + exits = _mask(panel, set()) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + max_positions=1, + initial_capital=100_000, + trailing_stop_pct=0.05, + ), + ) + + assert len(result.trades) == 1 + trade = result.trades[0] + assert trade.exit_reason == "trailing_stop" + assert trade.exit_price == 11.4 + + +def test_trailing_take_profit_requires_activation(): + panel = _panel( + ["A"], + days=5, + overrides={ + ("A", 2): {"open": 10, "high": 10.8, "low": 10.4, "close": 10.8}, + ("A", 3): {"open": 10.8, "high": 10.8, "low": 10.4, "close": 10.4}, + }, + ) + entries = _mask(panel, {("A", 0)}) + exits = _mask(panel, set()) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + max_positions=1, + initial_capital=100_000, + trailing_take_profit_activate_pct=0.10, + trailing_take_profit_drawdown_pct=0.03, + ), + ) + + assert result.trades[0].exit_reason == "end" + + +def test_trailing_take_profit_exits_after_activation(): + panel = _panel( + ["A"], + days=5, + overrides={ + ("A", 2): {"open": 10, "high": 12, "low": 11.8, "close": 12}, + ("A", 3): {"open": 12, "high": 12, "low": 11.5, "close": 11.5}, + }, + ) + entries = _mask(panel, {("A", 0)}) + exits = _mask(panel, set()) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + max_positions=1, + initial_capital=100_000, + trailing_take_profit_activate_pct=0.10, + trailing_take_profit_drawdown_pct=0.03, + ), + ) + + assert len(result.trades) == 1 + trade = result.trades[0] + assert trade.exit_reason == "trailing_take_profit" + assert trade.exit_price == 11.7 + + +def test_score_filter_uses_signal_day_score_range(): + panel = _panel( + ["A", "B", "C"], + days=3, + overrides={ + ("A", 0): {"score": 70}, + ("B", 0): {"score": 80}, + ("C", 0): {"score": 90}, + ("A", 1): {"score": 100}, + ("B", 1): {"score": 1}, + ("C", 1): {"score": 1}, + }, + ) + entries = _mask(panel, {("A", 0), ("B", 0), ("C", 0)}) + exits = _mask(panel, set()) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + max_positions=3, + initial_capital=100_000, + score_min=71, + score_max=85, + ), + ) + + assert {t.symbol for t in result.trades} == {"B"} + assert result.trades[0].entry_score == 80 + assert result.stats["execution"]["buy_score_filter"] == 2 + + +def test_independent_candidates_allow_overlapping_same_symbol_trades(): + panel = _panel( + ["A"], + days=5, + overrides={ + ("A", 0): {"close": 10}, + ("A", 1): {"close": 11}, + ("A", 2): {"close": 12}, + ("A", 3): {"close": 13}, + ("A", 4): {"close": 14}, + }, + ) + entries = _mask(panel, {("A", 0), ("A", 1)}) + exits = _mask(panel, set()) + + result = _engine().simulate_independent_candidates( + panel, + entries, + exits, + MatcherConfig(matching="close_t", fees_pct=0, slippage_bps=0, max_hold_days=2), + ) + + assert result.stats["full_kind"] == "candidate_execution" + assert result.stats["n_candidates"] == 2 + assert len(result.trades) == 2 + assert [t.entry_date for t in result.trades] == ["2024-01-01", "2024-01-02"] + assert [t.exit_date for t in result.trades] == ["2024-01-03", "2024-01-04"] + assert all(t.exit_reason == "max_hold" for t in result.trades) + + +def test_independent_candidates_apply_stop_loss(): + panel = _panel( + ["A"], + days=4, + overrides={ + ("A", 0): {"close": 10, "low": 10}, + ("A", 1): {"open": 10, "high": 10, "low": 8.9, "close": 9}, + }, + ) + entries = _mask(panel, {("A", 0)}) + exits = _mask(panel, set()) + + result = _engine().simulate_independent_candidates( + panel, + entries, + exits, + MatcherConfig(matching="close_t", fees_pct=0, slippage_bps=0, stop_loss_pct=0.1), + ) + + assert len(result.trades) == 1 + assert result.trades[0].exit_reason == "stop_loss" + assert result.trades[0].exit_price == 9.0 + + +def test_signal_exit_takes_priority_over_max_hold(): + """同一日既有卖点信号又到期 → 应按 signal 平仓 (卖点优先于 max_hold 兜底)。""" + panel = _panel( + ["A"], + days=4, + overrides={ + # day1 次日开盘买入 (open_t+1), 价 10 + ("A", 1): {"open": 10, "high": 10, "low": 10, "close": 10}, + # day2 持有 (hold_days 计到 1) + ("A", 2): {"open": 11, "high": 11, "low": 11, "close": 11}, + # day3: 既到期 (hold_days=2 >= max_hold_days=2) 又有卖点信号 → signal 优先 + ("A", 3): {"open": 12, "high": 12, "low": 12, "close": 12}, + }, + ) + entries = _mask(panel, {("A", 0)}) # day0 收盘确认 → day1 开盘买 + exits = _mask(panel, {("A", 2)}) # day2 收盘确认卖点 → day3 开盘卖 + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + max_positions=1, + max_hold_days=2, + initial_capital=100_000, + ), + ) + + assert len(result.trades) == 1 + trade = result.trades[0] + assert trade.exit_reason == "signal" + assert trade.exit_price == 12.0 # 卖点用 day3 开盘 (exit_fill 跟随 matching=open_t+1) + + +def test_stop_loss_triggers_even_when_expired_in_open_mode(): + """open_t+1 模式下仓位到期且当日破止损 → 应按 stop_loss 平仓 (风控优先于 max_hold)。""" + panel = _panel( + ["A"], + days=4, + overrides={ + ("A", 1): {"open": 10, "high": 10, "low": 10, "close": 10}, + # day3 开盘跳空跌破止损 (-10%): open=8.9 < 9.0 止损线, low=8.5 + ("A", 3): {"open": 8.9, "high": 8.9, "low": 8.5, "close": 8.7}, + }, + ) + entries = _mask(panel, {("A", 0)}) + exits = _mask(panel, set()) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + max_positions=1, + max_hold_days=2, + stop_loss_pct=0.1, + initial_capital=100_000, + ), + ) + + assert len(result.trades) == 1 + trade = result.trades[0] + assert trade.exit_reason == "stop_loss" + # 风控盘中触发: 开盘价 8.9 <= 止损线 9.0 → 按开盘价 8.9 成交 + assert trade.exit_price == 8.9 + + +def test_default_fill_is_buy_open_sell_close(): + """拆分口径: 建仓=次日开盘, 清仓=收盘。entry_price 用次日 open, exit_price 用收盘价。""" + panel = _panel( + ["A"], + days=4, + overrides={ + # day1: 次日开盘买入, 开盘 10 + ("A", 1): {"open": 10, "high": 10.5, "low": 9.5, "close": 10.2}, + # day2: 到期 (max_hold_days=1), 收盘卖 + ("A", 2): {"open": 11, "high": 11, "low": 10, "close": 10.8}, + }, + ) + entries = _mask(panel, {("A", 0)}) # day0 收盘确认 + exits = _mask(panel, set()) + + result = _engine().simulate_portfolio( + panel, + entries, + exits, + MatcherConfig( + entry_fill="open_t+1", + exit_fill="close_t", + fees_pct=0, + slippage_bps=0, + max_positions=1, + max_hold_days=1, + initial_capital=100_000, + ), + ) + + assert len(result.trades) == 1 + trade = result.trades[0] + assert trade.entry_price == 10.0 # 次日开盘 + assert trade.exit_price == 10.8 # 到期日收盘 + assert trade.exit_reason == "max_hold" diff --git a/backend/tests/backtest/test_full_simulation_tail.py b/backend/tests/backtest/test_full_simulation_tail.py new file mode 100644 index 0000000..f5352b9 --- /dev/null +++ b/backend/tests/backtest/test_full_simulation_tail.py @@ -0,0 +1,59 @@ +"""全量模拟 (full mode) 尾部执行回归测试。""" +from __future__ import annotations + +from datetime import date, timedelta + +import polars as pl + +from app.backtest.engine import BacktestEngine, MatcherConfig + + +def _panel_with_tail(symbols: list[str], n_data_days: int) -> pl.DataFrame: + start = date(2024, 1, 1) + rows = [] + for sym in symbols: + for i in range(n_data_days): + px = 10.0 + i + rows.append({ + "symbol": sym, + "date": start + timedelta(days=i), + "open": px, + "high": px, + "low": px, + "close": px, + "volume": 100_000, + "signal_limit_up": False, + "signal_limit_down": False, + }) + return pl.DataFrame(rows).sort(["symbol", "date"]) + + +def test_full_simulation_executes_signal_at_tail(): + """信号集中在正式区间最后一天时, tail 数据应允许次日开盘买入并按策略退出。""" + n_days = 6 + panel = _panel_with_tail(["A"], n_days + 3) + + start = date(2024, 1, 1) + end = start + timedelta(days=n_days - 1) + entry_vals = [] + for row in panel.select(["symbol", "date"]).iter_rows(named=True): + entry_vals.append(row["date"] == end) + entry_mask = pl.Series(entry_vals, dtype=pl.Boolean) + exit_mask = pl.Series([False] * len(panel), dtype=pl.Boolean) + + result = BacktestEngine(repo=None).simulate_independent_candidates( # type: ignore[arg-type] + panel, + entry_mask, + exit_mask, + MatcherConfig(matching="open_t+1", fees_pct=0, slippage_bps=0, max_hold_days=2), + ) + + assert not result.stats.get("error"), f"unexpected error: {result.stats.get('error')}" + assert result.stats.get("full_kind") == "candidate_execution" + assert result.stats.get("n_candidates") == 1 + assert result.stats.get("n_trades") == 1 + assert len(result.trades) == 1 + trade = result.trades[0] + assert trade.entry_signal_date == str(end) + assert trade.entry_date == str(end + timedelta(days=1)) + assert trade.exit_reason == "max_hold" diff --git a/backend/tests/backtest/test_strategy_backtest_correctness.py b/backend/tests/backtest/test_strategy_backtest_correctness.py new file mode 100644 index 0000000..6b55ba8 --- /dev/null +++ b/backend/tests/backtest/test_strategy_backtest_correctness.py @@ -0,0 +1,163 @@ +from __future__ import annotations + +from datetime import date, timedelta +from types import SimpleNamespace + +import polars as pl + +from app.backtest.engine import BacktestEngine, SimResult +from app.backtest.strategy import StrategyBacktestConfig, StrategyBacktestService +from app.strategy.engine import StrategyDef + + +def _strategy(**kwargs) -> StrategyDef: + defaults = dict( + meta={"id": "test", "name": "test", "scoring": {}, "params": [], "limit": 100}, + basic_filter={"enabled": True, "amount_min": 100.0}, + entry_signals=[], + exit_signals=[], + stop_loss=None, + trailing_stop=None, + trailing_take_profit_activate=None, + trailing_take_profit_drawdown=None, + max_hold_days=None, + alerts=[], + filter_fn=lambda df, params: pl.lit(True), + filter_history_fn=None, + lookback_days=1, + source="custom", + file_path=None, + ) + defaults.update(kwargs) + return StrategyDef(**defaults) + + +class _StrategyEngineStub: + def __init__(self, strategy: StrategyDef) -> None: + self.strategy = strategy + + def get(self, strategy_id: str) -> StrategyDef: + return self.strategy + + +class _RepoStub: + def get_index_daily(self, *args, **kwargs) -> pl.DataFrame: + return pl.DataFrame() + + +class _EngineStub: + def __init__(self, panel: pl.DataFrame) -> None: + self.panel = panel + self.repo = _RepoStub() + self.load_args = None + self.sim_panel: pl.DataFrame | None = None + self.sim_entries: pl.Series | None = None + + def load_panel(self, symbols, start: date, end: date) -> pl.DataFrame: + self.load_args = (symbols, start, end) + return self.panel + + def simulate_portfolio(self, panel, entries, exits, config, progress_cb=None, cancel_event=None) -> SimResult: + self.sim_panel = panel + self.sim_entries = entries + return SimResult( + equity_curve=[{"date": "2024-01-01", "value": config.initial_capital}], + drawdown_curve=[{"date": "2024-01-01", "value": 0.0}], + trades=[], + per_symbol_stats=[], + stats={"total_return": 0.0, "n_trades": 0}, + ) + + +def test_basic_filter_only_limits_entries_not_panel_rows(): + start = date(2024, 1, 1) + rows = [] + for i, amount in enumerate([1000.0, 0.0, 1000.0]): + rows.append({ + "symbol": "A", + "name": "A", + "date": start + timedelta(days=i), + "open": 10.0 + i, + "high": 10.0 + i, + "low": 10.0 + i, + "close": 10.0 + i, + "volume": 100_000, + "amount": amount, + "signal_limit_up": False, + "signal_limit_down": False, + }) + panel = pl.DataFrame(rows).sort(["symbol", "date"]) + engine = _EngineStub(panel) + service = StrategyBacktestService(engine=engine, strategy_engine=_StrategyEngineStub(_strategy())) + + result = service.run(StrategyBacktestConfig( + strategy_id="test", + symbols=None, + start=start, + end=start + timedelta(days=2), + matching="close_t", + mode="position", + )) + + assert result.error is None + assert engine.sim_panel is not None + assert engine.sim_panel.height == 3 + assert engine.sim_panel.filter(pl.col("amount") == 0.0).height == 1 + assert engine.sim_entries is not None + assert engine.sim_entries.to_list() == [True, False, True] + assert engine.load_args is not None + assert engine.load_args[1] < start # warmup 只用于计算, 不参与正式交易 + + +def test_score_normalizes_inside_strategy_candidate_universe(): + panel = pl.DataFrame({ + "symbol": ["A", "B", "C"], + "date": [date(2024, 1, 1)] * 3, + "factor": [10.0, 20.0, 1000.0], + }) + universe = pl.Series([True, True, False], dtype=pl.Boolean) + strategy = SimpleNamespace(meta={"scoring": {"factor": 1.0}, "order_by": "score", "descending": True}) + + scored = StrategyBacktestService._apply_score(panel, strategy, None, universe_mask=universe) + scores = dict(zip(scored["symbol"].to_list(), scored["score"].to_list())) + + assert scores["A"] == 0.0 + assert scores["B"] == 100.0 + assert scores["C"] == 0.0 + + +def test_full_mode_executes_every_candidate_with_strategy_rules(): + start = date(2024, 1, 1) + panel = pl.DataFrame([ + {"symbol": "A", "name": "A", "date": start, "open": 10.0, "high": 10.0, "low": 10.0, "close": 10.0, "volume": 1, "amount": 1000.0, "signal_limit_up": False, "signal_limit_down": False}, + {"symbol": "A", "name": "A", "date": start + timedelta(days=1), "open": 11.0, "high": 11.0, "low": 11.0, "close": 11.0, "volume": 1, "amount": 0.0, "signal_limit_up": False, "signal_limit_down": False}, + {"symbol": "A", "name": "A", "date": start + timedelta(days=2), "open": 20.0, "high": 20.0, "low": 20.0, "close": 20.0, "volume": 1, "amount": 1000.0, "signal_limit_up": False, "signal_limit_down": False}, + ]).sort(["symbol", "date"]) + + engine = BacktestEngine(repo=None) # type: ignore[arg-type] + engine.load_panel = lambda symbols, s, e: panel # type: ignore[method-assign] + strategy = _strategy( + filter_fn=lambda df, params: pl.col("date") == start, + max_hold_days=1, + ) + service = StrategyBacktestService(engine=engine, strategy_engine=_StrategyEngineStub(strategy)) + + result = service.run(StrategyBacktestConfig( + strategy_id="test", + symbols=None, + start=start, + end=start, + mode="full", + matching="open_t+1", + fees_pct=0, + slippage_bps=0, + holding_days=1, + )) + + assert result.error is None + assert result.stats["full_kind"] == "candidate_execution" + assert result.stats["n_candidates"] == 1 + assert result.stats["n_trades"] == 1 + assert result.trades[0]["entry_date"] == str(start + timedelta(days=1)) + assert result.trades[0]["exit_reason"] == "max_hold" + assert result.stats["avg_return"] == round(20 / 11 - 1, 4) diff --git a/backend/uv.lock b/backend/uv.lock new file mode 100644 index 0000000..ca4bb59 --- /dev/null +++ b/backend/uv.lock @@ -0,0 +1,2638 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.15' and sys_platform == 'win32'", + "python_full_version == '3.14.*' and sys_platform == 'win32'", + "python_full_version >= '3.15' and sys_platform == 'emscripten'", + "python_full_version == '3.14.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.14.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "apscheduler" +version = "3.11.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzlocal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/12/3e4389e5920b4c1763390c6d371162f3784f86f85cd6d6c1bfe68eef14e2/apscheduler-3.11.2.tar.gz", hash = "sha256:2a9966b052ec805f020c8c4c3ae6e6a06e24b1bf19f2e11d91d8cca0473eef41", size = 108683, upload-time = "2025-12-22T00:39:34.884Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/64/2e54428beba8d9992aa478bb8f6de9e4ecaa5f8f513bcfd567ed7fb0262d/apscheduler-3.11.2-py3-none-any.whl", hash = "sha256:ce005177f741409db4e4dd40a7431b76feb856b9dd69d57e0da49d6715bfd26d", size = 64439, upload-time = "2025-12-22T00:39:33.303Z" }, +] + +[[package]] +name = "ast-serialize" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", size = 1183520, upload-time = "2026-05-17T17:47:30.831Z" }, + { url = "https://files.pythonhosted.org/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", size = 1175779, upload-time = "2026-05-17T17:47:32.551Z" }, + { url = "https://files.pythonhosted.org/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", size = 1233750, upload-time = "2026-05-17T17:47:34.731Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", size = 1235942, upload-time = "2026-05-17T17:47:36.287Z" }, + { url = "https://files.pythonhosted.org/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", size = 1442517, upload-time = "2026-05-17T17:47:38.17Z" }, + { url = "https://files.pythonhosted.org/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", size = 1254081, upload-time = "2026-05-17T17:47:39.826Z" }, + { url = "https://files.pythonhosted.org/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", size = 1259910, upload-time = "2026-05-17T17:47:41.369Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", size = 1250678, upload-time = "2026-05-17T17:47:43.702Z" }, + { url = "https://files.pythonhosted.org/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", size = 1301603, upload-time = "2026-05-17T17:47:46.256Z" }, + { url = "https://files.pythonhosted.org/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", size = 1410332, upload-time = "2026-05-17T17:47:47.899Z" }, + { url = "https://files.pythonhosted.org/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", size = 1509979, upload-time = "2026-05-17T17:47:50.942Z" }, + { url = "https://files.pythonhosted.org/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", size = 1505002, upload-time = "2026-05-17T17:47:54.093Z" }, + { url = "https://files.pythonhosted.org/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", size = 1456231, upload-time = "2026-05-17T17:47:56.311Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", size = 1058668, upload-time = "2026-05-17T17:47:58.305Z" }, + { url = "https://files.pythonhosted.org/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", size = 1101075, upload-time = "2026-05-17T17:48:00.35Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", size = 1075347, upload-time = "2026-05-17T17:48:01.753Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, + { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, + { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, + { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, + { url = "https://files.pythonhosted.org/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, + { url = "https://files.pythonhosted.org/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, + { url = "https://files.pythonhosted.org/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", size = 1081181, upload-time = "2026-05-17T17:48:28.122Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "certifi" +version = "2026.5.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, + { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, + { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, + { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, + { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, + { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, + { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, + { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, + { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, + { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "dateparser" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "regex" }, + { name = "tzlocal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/2d/a0ccdb78788064fa0dc901b8524e50615c42be1d78b78d646d0b28d09180/dateparser-1.4.0.tar.gz", hash = "sha256:97a21840d5ecdf7630c584f673338a5afac5dfe84f647baf4d7e8df98f9354a4", size = 321512, upload-time = "2026-03-26T09:56:10.292Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/0b/3c3bb7cbe757279e693a0be6049048012f794d01f81099609ecd53b899f0/dateparser-1.4.0-py3-none-any.whl", hash = "sha256:7902b8e85d603494bf70a5a0b1decdddb2270b9c6e6b2bc8a57b93476c0df378", size = 300379, upload-time = "2026-03-26T09:56:08.409Z" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "dill" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "duckdb" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/69/00/d579dcb2a536b6ea3a2563cdad6844f77d81a9b2d4b22a858097f2468acf/duckdb-1.5.3.tar.gz", hash = "sha256:df39428eb130faa35ae96fd35245bdeae6ecf43936250b116b5fead568eb9f16", size = 18026640, upload-time = "2026-05-20T11:55:31.901Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/fc/a8a89c6c73f31c2b58c6abbc2f543e0b736042dd5ef7cc1784c24ec31428/duckdb-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:341a2672e2551ba51c95c1898f0ade983e76675e79038ccb16342c3d6cfb82d7", size = 32583465, upload-time = "2026-05-20T11:54:13.132Z" }, + { url = "https://files.pythonhosted.org/packages/63/f1/3423a2f523dd034e505d4a5dd8e210ae577212e152598dc13b6a5e736e1b/duckdb-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c9e8fa408705081160ede7ead238d16e73a36b8561b700f2bf2d650ae48e7b92", size = 17278520, upload-time = "2026-05-20T11:54:16.368Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1a/7bf5ba1b7ea520557e6b2dbee1c85abab016bdac0c1779d9d0ef76c87300/duckdb-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70a18f932cf6d87bd0e554613657a515c1443a1724aacfc7ec5137dd28698b03", size = 15424794, upload-time = "2026-05-20T11:54:19.891Z" }, + { url = "https://files.pythonhosted.org/packages/ad/16/ce4b1e386e45fab0268edbf1b85bace20e9437589e9edb2bd5f9a226fa44/duckdb-1.5.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e80eb4d0fb59869cb2c7d7ef494c07fb92014fe8e77d96c170cd1ebc1488a708", size = 19306666, upload-time = "2026-05-20T11:54:22.77Z" }, + { url = "https://files.pythonhosted.org/packages/99/1f/651f8453f26931e8061b7e27b3090f868868185814ecb9216d0bd71ec8ef/duckdb-1.5.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3248b49cd835ea322574bc6aac0ae7a83be85547f49d4f5f5777cb380ee6627f", size = 21418306, upload-time = "2026-05-20T11:54:25.616Z" }, + { url = "https://files.pythonhosted.org/packages/bc/64/e1ffebf010b1631a6fef8d1508f46d4eab3e97c18729af986bb796fa8452/duckdb-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:f4eff89c12c3a362efa012262e57b7b4ab904a7f79bad9178fe365510077abe8", size = 13101423, upload-time = "2026-05-20T11:54:28.107Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/b1d4e34f9658cc0e13d7aae581ab82643f50a548d5aee8767f0c587cc3a4/duckdb-1.5.3-cp311-cp311-win_arm64.whl", hash = "sha256:75d13308c9da3ee431d1e72b8ab720aa74a1b3e9159d4124cb62435924496334", size = 13951740, upload-time = "2026-05-20T11:54:30.886Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/2e34929b16c8d544ef664fad8f7f3a2a9db05746aae1e7c8c4ee3a8b23e4/duckdb-1.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ff11a457258148337ef9a392148a8cdbd1069b6c27c21958816c7b67fe6c542d", size = 32626494, upload-time = "2026-05-20T11:54:33.738Z" }, + { url = "https://files.pythonhosted.org/packages/3a/53/3af681793d03771365ae3e2215331151c196a3ac8193f613344840694671/duckdb-1.5.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fd25f533cb1b6b2c84cc767a9a9bab7769bb1aa44571a2a0bfc91ac3e4a38ac", size = 17301121, upload-time = "2026-05-20T11:54:36.928Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/c80af1eac2ab5d35fc2c372ef0a84668842e549fbbf7799277b3fccf3e39/duckdb-1.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10960400ed60cdf0fe05bab2086fa8eb733889cb0ceca18d07ff9a00c0e0be7b", size = 15449283, upload-time = "2026-05-20T11:54:39.777Z" }, + { url = "https://files.pythonhosted.org/packages/2d/9a/c63af233c9f761bf5178a5210437e1bc6bcb30fa8a9073de6398cfb12c03/duckdb-1.5.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c5f18e7561403054433706c187589e86629a7af09a7efc23a06a8b308e6acc68", size = 19332762, upload-time = "2026-05-20T11:54:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/21/cc/2d77af4fff86012f334ef82e6d54a995a86c8745e58074f1218ed7d25171/duckdb-1.5.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fb7516255a8764545e30f7efacea408cc847764a3027b3b0b3e7d1a7bebbc5c", size = 21453290, upload-time = "2026-05-20T11:54:45.272Z" }, + { url = "https://files.pythonhosted.org/packages/8d/5e/9bc4817a98feb4dab83e56f2245cd3a30d00ee646d4dec7926464e2b3f28/duckdb-1.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:8001eccbc28be244dfd04d708526f34ddd6460b47a8aeb5d0e39d6f7f9e3fe15", size = 13118308, upload-time = "2026-05-20T11:54:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/81/35/e3f32e4e53e2450ddb1db8312a17d1ce455d60cc4941b6ad2cfc908794b0/duckdb-1.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:6d2835e39bb6af73891f73c0f8d4324f98afe00d0b00c6d34b2a582c2256cbb0", size = 13927187, upload-time = "2026-05-20T11:54:50.584Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/a528eb09d8be51954c485864bd06753e616939a080cbc3dd4417e8c94a57/duckdb-1.5.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e75a6122c12579a99848517f6f00a4e342aebda3590c30fe9b5cc5f39d5e6afc", size = 32626254, upload-time = "2026-05-20T11:54:53.65Z" }, + { url = "https://files.pythonhosted.org/packages/ec/3c/1534c0a6db347c05eb7d0f6ecfb7aefbe74cbff398e4892a8fd1903a20e8/duckdb-1.5.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fd3963c1cb9d9567777f4a898a9dbe388a2fe9724681801b1e7d6d93eecf1b76", size = 17300917, upload-time = "2026-05-20T11:54:56.628Z" }, + { url = "https://files.pythonhosted.org/packages/23/fa/beafb91e6e152d2161c4a9cbc472334c87607eb61ad7104b5a7fa8d8d7b1/duckdb-1.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3d5db8c0b55e072cf437948ebb5d7e23d7b9d03d905fa5f9145583e65aa447f7", size = 15449411, upload-time = "2026-05-20T11:54:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/50/0a/49b6fe04e2fcd63729eb607dadd44818dde77342a4f5ce086c6c92f1dd4d/duckdb-1.5.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ce80aed7a538422129a57eaca9141e3afb51f8bf562b1908b1576c9725b5b22", size = 19333120, upload-time = "2026-05-20T11:55:01.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/4c/0907c3f76adb9dd90e67610b31e0304a35814e65c4c41a354a262c09b885/duckdb-1.5.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787df63824f07bf18022dbc3b8ca4b2bfab0ebe616464f55c6e8cd0f59ea762e", size = 21453266, upload-time = "2026-05-20T11:55:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/6d/9c/d2f23a7803ddbbd9413f7572ecf66a15120ed5ced7ce5c73e698c1406b76/duckdb-1.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:bb5bb5dcdd09d62ee60f0ddbbef918e71cce304ffe28428b1131949d39ffaabf", size = 13118640, upload-time = "2026-05-20T11:55:07.389Z" }, + { url = "https://files.pythonhosted.org/packages/27/d5/7ba2316415bcdab6edd765bbbe35c2ca8a3800f2fe695cd70e3cdb997f09/duckdb-1.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:2fa17ecdd5d3db122836cb71bb93601c2106a3be883c17dffddc02fbf3fa7888", size = 13926409, upload-time = "2026-05-20T11:55:10.166Z" }, + { url = "https://files.pythonhosted.org/packages/a5/c2/d4b6f8a5e4d3bc25773be6da76a99d9661ebbf3552c007c460d2dd59dbf8/duckdb-1.5.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4bfa9a4dadf71e83e2c4eaca2f9421c82a54defecc1b0b4c0be95e2389dec4fe", size = 32636685, upload-time = "2026-05-20T11:55:13.158Z" }, + { url = "https://files.pythonhosted.org/packages/42/58/e835c8298979d29db7a62cb5acc29e9b57aeaca7cdde2fcd3ac980f5cb18/duckdb-1.5.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aea7baf67ad7e1829ac76f67d7dcbd7fb1f57c3eb179d55ac30952df4709ae30", size = 17308134, upload-time = "2026-05-20T11:55:16.194Z" }, + { url = "https://files.pythonhosted.org/packages/c9/46/617b51363f5613418c8b224b3cce16b58e6dde80904566bec232579c1d4e/duckdb-1.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b0b4f088a65d77e1217ce5d7eff889e63fedc44281200d899ff47c84d8ff836", size = 15449891, upload-time = "2026-05-20T11:55:18.687Z" }, + { url = "https://files.pythonhosted.org/packages/b3/72/354146656e8d9ba3853d3a5ee80a481b8c5f70edfc3d5ae80a8c4479c967/duckdb-1.5.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe8d0c1f6a120aa03fa6e0d03897c71a1842e6cf7afd31d181348391f7108fe1", size = 19338499, upload-time = "2026-05-20T11:55:21.34Z" }, + { url = "https://files.pythonhosted.org/packages/56/8f/65fc623b51448f2bfba1a9ec6ab3debb4664c0876c0113a5e782600b53ac/duckdb-1.5.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0405eae18ec6e8210a471c97dbfe87a7e4d605274b7fe572a1f276e92158f13", size = 21455828, upload-time = "2026-05-20T11:55:23.847Z" }, + { url = "https://files.pythonhosted.org/packages/2b/db/d0274cbe9f5fe219f77c0bdf900ac77103569e83c102a4225ce04cbc607d/duckdb-1.5.3-cp314-cp314-win_amd64.whl", hash = "sha256:33ae08b3e818d7613d8936744b67718c2062c2f530376895bfd89efb51b81538", size = 13640011, upload-time = "2026-05-20T11:55:26.276Z" }, + { url = "https://files.pythonhosted.org/packages/07/5d/8f1899b8bef291caf953992fcd6c24df9f29387a35645e58c2504a5ca473/duckdb-1.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:746433e49bbc667b4df283153415fbe37e9083e0eff6c3cd6e54de7536869cd4", size = 14411554, upload-time = "2026-05-20T11:55:29.037Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fastapi" +version = "0.136.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/45/c130091c2dfa061bbfe3150f2a5091ef1adf149f2a8d2ae769ecaf6e99a2/fastapi-0.136.1.tar.gz", hash = "sha256:7af665ad7acfa0a3baf8983d393b6b471b9da10ede59c60045f49fbc89a0fa7f", size = 397448, upload-time = "2026-04-23T16:49:44.046Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/ff/2e4eca3ade2c22fe1dea7043b8ee9dabe47753349eb1b56a202de8af6349/fastapi-0.136.1-py3-none-any.whl", hash = "sha256:a6e9d7eeada96c93a4d69cb03836b44fa34e2854accb7244a1ece36cd4781c3f", size = 117683, upload-time = "2026-04-23T16:49:42.437Z" }, +] + +[[package]] +name = "fastexcel" +version = "0.20.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/96/24314765a3204081a55ecc96e83dfdbd2ef82aa80a521ac3005b2c91e941/fastexcel-0.20.2.tar.gz", hash = "sha256:a4be10eb0f4dd819d2b36950b3f26bf87260b53e54150ac02b78e524c7063902", size = 60862, upload-time = "2026-05-04T12:28:36.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/29/acc5b2eb95fb4eaeb3486b6f034f2d9754dcc0cc0b5dbc79b2fa9a31f66b/fastexcel-0.20.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2a240b9f4b6af42cafc247c1b8c956cf32f5393a3956ad0ed49e07b2b5bf0e09", size = 3432179, upload-time = "2026-05-04T12:28:24.611Z" }, + { url = "https://files.pythonhosted.org/packages/3f/2b/f78a2df2d93ec4a23d7fc94ed967bf004d5115e1f4d2da389bb888d2cc32/fastexcel-0.20.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:6c7e58cf83c873743c18006e3866d5c2b69c34df7a4a253a72e81169853ddf0e", size = 3260476, upload-time = "2026-05-04T12:28:26.191Z" }, + { url = "https://files.pythonhosted.org/packages/36/9c/a8f45e5c195a70a408893b348595bae4c113091dddba7d1b029e9c980b8e/fastexcel-0.20.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab3cc439c18c4ee14c4ec2b321e1d927cae84f557525f390a3c28517f6e721", size = 3625132, upload-time = "2026-05-04T12:28:12.173Z" }, + { url = "https://files.pythonhosted.org/packages/b4/01/da0ae9b3ee86daca5ac9f0a7b05477cf0c1624321d95f1e52492a772dba5/fastexcel-0.20.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15d41bcc4433bb3ab778426ecaeaf3a5f38d949555c631a83e958c57bb0a116e", size = 3789901, upload-time = "2026-05-04T12:28:13.884Z" }, + { url = "https://files.pythonhosted.org/packages/c5/15/80c614c8b07c631c7c2acd015e7f2e1cd683cd04279e5615b39c36a0e43b/fastexcel-0.20.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:441f9b7e97b4fd1c9487e5c0a0d9cad7aa4097a39e65fcd494551f5ec3e5d02f", size = 3792388, upload-time = "2026-05-04T12:28:15.448Z" }, + { url = "https://files.pythonhosted.org/packages/c0/80/4548305ce4d70a0ecf38205988e5caeb9347dae7e5d06bcd2b939586fc52/fastexcel-0.20.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b15f21baef3e4914071e34f176d8692dd79e3464c10f8373047aab1384cfaae", size = 3960316, upload-time = "2026-05-04T12:28:16.821Z" }, + { url = "https://files.pythonhosted.org/packages/22/b3/7de6b49406fda63c9fee817d5fc70fe3f52c24431605f1de2f7b0f3a0938/fastexcel-0.20.2-cp310-abi3-win_amd64.whl", hash = "sha256:ce28748390ae6a7d286ba29d8ee2badcfb6478d32ed700db6c2030de32a16e7b", size = 3275637, upload-time = "2026-05-04T12:28:30.45Z" }, + { url = "https://files.pythonhosted.org/packages/d8/3b/c251f38596d630e87280c191f53803e7409e7723e95e53a477f6760c7298/fastexcel-0.20.2-cp310-abi3-win_arm64.whl", hash = "sha256:c3e58f5053bc05b0ee8fa735056cea7af6e1c41c39fc4b2b06cc86c1025d140b", size = 2990952, upload-time = "2026-05-04T12:28:32.434Z" }, + { url = "https://files.pythonhosted.org/packages/37/d3/fcc1ba752415327f0fd5a1b52060e66f1c0bf8b7b90bbba781b91750ce7e/fastexcel-0.20.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:e5b677d669cc7c099998ef27d9442b78d7190916d3b40418bda619cdc4ebae2c", size = 3427401, upload-time = "2026-05-04T12:28:27.741Z" }, + { url = "https://files.pythonhosted.org/packages/80/bc/e492c343c096e93e269c157fc11def297430047f1ee09db4f8a39bcdc1a0/fastexcel-0.20.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9692ac135ede4d6fc45b25cc22f1c6bd1eb8750bda14097b7f319450c33d3124", size = 3253915, upload-time = "2026-05-04T12:28:29.053Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ef/bd7b98149b50e01fdaa3b146b025ce50b8e983f35522f8e69bd94d2711a4/fastexcel-0.20.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:675d7eab2110bd8d5520b98d5eb3f3e15173b69a5f64b43412f917e9717e9aa0", size = 3621364, upload-time = "2026-05-04T12:28:18.457Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e0/f67911db6515df326900e8ac1ae17cc08233ca5fb8f71c633f57a50cf786/fastexcel-0.20.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db049d51e5323459f534ce9a65869f997bebd4dde75ef1d3b3af53dd64b8b9ca", size = 3784924, upload-time = "2026-05-04T12:28:19.955Z" }, + { url = "https://files.pythonhosted.org/packages/34/82/fabe2d1de28e89a90bb2c884c37d862b5d85063fd41fffcb56b2980d0b51/fastexcel-0.20.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e5b23f69898f6a32c2f279d8f72eb8ac93c336bf7f453a9b8930cab9dc494520", size = 3791264, upload-time = "2026-05-04T12:28:21.612Z" }, + { url = "https://files.pythonhosted.org/packages/f7/34/b3ed819dd6d35d71c6640ff857c6362d42f19e8b15354e64b06f355df3a4/fastexcel-0.20.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c3058d034e75967b6f01e0c82767adeb40cbf4533b6bc54e3b93f77f5f80dec4", size = 3953234, upload-time = "2026-05-04T12:28:23.224Z" }, + { url = "https://files.pythonhosted.org/packages/3a/51/1d9a72473cc213d5647d8cf7c2393ef995b3453ac5e4b544ba652d1428dd/fastexcel-0.20.2-cp314-cp314t-win_amd64.whl", hash = "sha256:d71e2a1fce006cb8bc1ae06da6ff5e5fe83e6496be5aef01b623b15aa0d0f82d", size = 3271344, upload-time = "2026-05-04T12:28:34.443Z" }, +] + +[[package]] +name = "fonttools" +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/2b/a7f1545bdf5da69c4bda0cea2a5781f0ad2a6623e0277267672db43c5fe6/fonttools-4.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b8ae05d9eacf6081414d759c0a352769ac28ce31280d6bb8e77b03f9e3c449f", size = 2881793, upload-time = "2026-05-14T12:02:56.645Z" }, + { url = "https://files.pythonhosted.org/packages/49/50/965308c703f085f225db2886813b27e015b8b3438c350b22dd65b52c2a2c/fonttools-4.63.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cdc9f567aec74a72918fd060283911406750cbc9fd28c1316023deb6ce31a9", size = 2428130, upload-time = "2026-05-14T12:02:58.891Z" }, + { url = "https://files.pythonhosted.org/packages/d8/38/6937fbd7f2dc3a6b48725851bc2c15ec949b9af14d9bbcb5fe83cdf9bdf9/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c14b4fd138c4bafcca294765c547914e1aa431ae1ca94ab99d8db08c958bd3b", size = 5111952, upload-time = "2026-05-14T12:03:01.263Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/a81f20050a3115b57d62c8e781446949512eac36690dc384ccea65ff4cc1/fonttools-4.63.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76ac49f929aecaf82d83250b8347e099d7aecba0f4726c1d9b6df3b8bb5fe18", size = 5082308, upload-time = "2026-05-14T12:03:03.211Z" }, + { url = "https://files.pythonhosted.org/packages/67/00/cdd9d4944ca6ae280d01e69cc37bde3bf663630b837a6fc6d2cd65d80e0e/fonttools-4.63.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dcf076a4474fe0d7367e5bbf5b052c7284fa1feca729c04176ce513521afd8a0", size = 5087932, upload-time = "2026-05-14T12:03:05.147Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f1/0aa0dbea778c75adbef223c42019fd47d22262b905974d62d829545d485f/fonttools-4.63.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7dd683fef0663e9f0f45cf541d788d24caa3ec9db50796b588e1757d8b3bc007", size = 5213271, upload-time = "2026-05-14T12:03:07.238Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/253e4056e1f0e67b9390125a154b73b5eb73ad521bece95c004858fdeec2/fonttools-4.63.0-cp311-cp311-win32.whl", hash = "sha256:afefc1ed0a59785a7fb06ea7e1678e849c193e1e387db783579bc7b3056fcfcb", size = 2304473, upload-time = "2026-05-14T12:03:09.271Z" }, + { url = "https://files.pythonhosted.org/packages/08/60/defa5e69641db890a63be281f41345f4c33b157824eaf0b9fad3e08b0dcb/fonttools-4.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:063e08bd17bd5a90127a14123de0d6a952dbc847695fd98b63c043d58057f90c", size = 2356389, upload-time = "2026-05-14T12:03:11.53Z" }, + { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, + { url = "https://files.pythonhosted.org/packages/0f/8d/d8fec3dcde2963f8c908fb315e5ff2cd0ac34f82394bbbf73a2aa5145ce3/fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd", size = 2876062, upload-time = "2026-05-14T12:03:32.554Z" }, + { url = "https://files.pythonhosted.org/packages/ef/71/d935dc54e4ff121bfdd11e08702db63a7e6f25af21d8a3d7b7212df53641/fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59", size = 2424594, upload-time = "2026-05-14T12:03:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" }, + { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" }, + { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" }, + { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1f/a98a30a814b9ddef3a2e706025f90b9e0bc94890e6cb15254bc86547d11a/fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380", size = 2291313, upload-time = "2026-05-14T12:03:45.594Z" }, + { url = "https://files.pythonhosted.org/packages/92/46/5177b01f3b4abfdd4409f31cca4ab279c9343a26efbe9ec78c97fc612e02/fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b", size = 2342299, upload-time = "2026-05-14T12:03:47.414Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745", size = 2875338, upload-time = "2026-05-14T12:03:50.052Z" }, + { url = "https://files.pythonhosted.org/packages/cd/58/7dfa0c761cb3b2964e2a84c4dc986c926a87de0cb9fb60d5b28ded3f2914/fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03", size = 2422661, upload-time = "2026-05-14T12:03:52.154Z" }, + { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" }, + { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" }, + { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" }, + { url = "https://files.pythonhosted.org/packages/de/40/3ae22b60ff1d41ce0bd044b31238cdc72cef99f28b976f1e128ebd618c9b/fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616", size = 2295026, upload-time = "2026-05-14T12:04:04.47Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d4/98078064ccc76b45cb0f6c002452011e93c4bd26f6850344f0951cc1fe89/fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5", size = 2347454, upload-time = "2026-05-14T12:04:06.752Z" }, + { url = "https://files.pythonhosted.org/packages/49/4e/652d1580c5f4e39f7d103b0c793e4773129ad633dce4addd0cf4dfebde02/fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001", size = 2958152, upload-time = "2026-05-14T12:04:08.706Z" }, + { url = "https://files.pythonhosted.org/packages/0e/55/ad864c9a9b219f552eb46b32cd7906c466e5a578ba0c3abfcc0fe7413eb6/fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e", size = 2460809, upload-time = "2026-05-14T12:04:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" }, + { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" }, + { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/34/3b/214dcc19ee31d3d38fb5ad2755c11ef0514e5dc300bbaf41c0b69f393799/fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8", size = 2359326, upload-time = "2026-05-14T12:04:24.22Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/3ff1a9b523058c2eeb6a9d50f5574e2a738200d0d94107d5bc4105e8da3f/fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419", size = 2425829, upload-time = "2026-05-14T12:04:26.829Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httptools" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, + { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, + { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, + { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, + { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/88/bcf9709822fe69d02c2a6a77956c98ce6ea8ca8767a9aadcedc7eb6a2390/idna-3.16.tar.gz", hash = "sha256:d7a6da03db833450fca25d2358ac9ff06cd624577a4aea3a596d5c0f77b8e03d", size = 203770, upload-time = "2026-05-22T00:16:18.781Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/16/70255075a9859a0e3adb789b68ceb0e210dec03934245fd98d248226572f/idna-3.16-py3-none-any.whl", hash = "sha256:cc246e3a3f89580c3a951b5ad298ca4638078b2cdd4f115654332b5c26daded5", size = 74165, upload-time = "2026-05-22T00:16:16.698Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/84/93bcd1300216ea50811cee96873b84a1bebf8d0489ffaf7f2a3756bab866/imageio-2.37.3.tar.gz", hash = "sha256:bbb37efbfc4c400fcd534b367b91fcd66d5da639aaa138034431a1c5e0a41451", size = 389673, upload-time = "2026-03-09T11:31:12.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl", hash = "sha256:46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0", size = 317646, upload-time = "2026-03-09T11:31:10.771Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "ipython" +version = "9.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "psutil" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[package]] +name = "jiter" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/b5/55f06bb281d92fb3cc86d14e1def2bd908bb77693183e7cb1f5a3c388b0c/jiter-0.15.0.tar.gz", hash = "sha256:4251acc80e2b7c9b7b8823456ea0fceeb0734dac2df7636d3c711b38476b5a76", size = 166640, upload-time = "2026-05-19T10:09:48.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/13/daa722f5765c393576f466378f9dfd29d77c9bed939e0688f96afa3601ea/jiter-0.15.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0f862193b8696249d22ec433e85fd2ab0ad9596bc3e45e6c0bc55e8aeba97be2", size = 310899, upload-time = "2026-05-19T10:07:12.89Z" }, + { url = "https://files.pythonhosted.org/packages/7f/82/2d2551829b082f4b6d82b9f939b031fb808a10aab1ec0664f82e150bb9a2/jiter-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1303d4d68a9b051ea90502402063ecf3807da00ad2affa19ca1ae3b90b3c5f67", size = 314963, upload-time = "2026-05-19T10:07:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0a/8b1a51466f7fe9f31dbe4bc7e0ca848674f9825e0f737b929b97e8c60aa7/jiter-0.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:392b8ab019e5502d08aff85c6272209c24bc2cbe706ea82a56368f524236614a", size = 341730, upload-time = "2026-05-19T10:07:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/f6/2a/e71dea19822e2e404e83992a08c1d6b9b617bb944f28c9c2fbd85d02c91e/jiter-0.15.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:773b6eb282ce11ee19f05f6b2d4404fa308e5bbd353b0b80a0262caad6db2cd7", size = 366214, upload-time = "2026-05-19T10:07:17.259Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/97e1fa539d124a509a00ab7f669289d1c1d236ecabf12948a18f16c91082/jiter-0.15.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2c0c44d569ce0f2850f5c926f8caeb5f245fbc84475aeb36efccc2103e6dbd", size = 459527, upload-time = "2026-05-19T10:07:18.741Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7a/4a68d331aef8cf2e2393c14a3aacb635c62aa86071b0229899fb5baaa907/jiter-0.15.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:032396229564bca02440396bd327710719f724f5e7b7e9f7a8eb3faa4a2c2281", size = 375451, upload-time = "2026-05-19T10:07:20.208Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/1c445c2b6f0e30a274dc8082e0c3c7825411cce80d726bccd697c98cc8d3/jiter-0.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d37768fce7f88dd2a8c6091f2325dea27d30d30d5c6e7a1c0f0af77723b708", size = 349428, upload-time = "2026-05-19T10:07:22.372Z" }, + { url = "https://files.pythonhosted.org/packages/00/94/e20d38984fc17a636371bffd2ae0f698124fdc8e75ef969cd2da6ba7cea7/jiter-0.15.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:2c9cb907439d20bd0c7d7565ca01ee52234203208433749bae5b516907526928", size = 355405, upload-time = "2026-05-19T10:07:23.916Z" }, + { url = "https://files.pythonhosted.org/packages/94/fa/4d09f814779d0ea80a28ed8e4c6662ec9a4a8ecef0ac52190ebac6262d14/jiter-0.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9100ddbec09741cc66feb0fc6773f8bdbd0e3c345689368f260082ff85dcc0cd", size = 393688, upload-time = "2026-05-19T10:07:25.854Z" }, + { url = "https://files.pythonhosted.org/packages/54/9d/8eb5d4fb8bf7e93a75964a5da71a75c67c864baf7fa3f98598187b3c7e57/jiter-0.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ae1b0d82ac2d987f9ea512b1c9adfcc71a28de3dea3a6039b54d76cffda9901e", size = 520853, upload-time = "2026-05-19T10:07:27.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2c/5e07874e59e623a943a0acf1552a80d05b70f31b402287a8fc6d7ec634c7/jiter-0.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8020c99ec13a7db2b6f96cbe82ef4721c88b426a4892f27478044af0284615ef", size = 551016, upload-time = "2026-05-19T10:07:28.846Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/d2d34422143474cadc15b60d482b1c35683dbc5c63c24346ddd0df09bcaf/jiter-0.15.0-cp311-cp311-win32.whl", hash = "sha256:42bfb257930800cf43e7c62c832402c704ab60797c992faf88d20e903eac8f32", size = 209518, upload-time = "2026-05-19T10:07:30.431Z" }, + { url = "https://files.pythonhosted.org/packages/1d/7d/52778b930e5cc3e52a37d950b1c10494244308b4329b25a0ff0d88303a81/jiter-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:860a74063284a2ae9bfedd694f299cc2c68e2696c5f3d440cc9d18bb81b9dd04", size = 200565, upload-time = "2026-05-19T10:07:32.125Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4f/d9b4067feb69b3fa6eb0488e1b59e2ad5b463fe39f59e527eab2aca00bb0/jiter-0.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:37a10c377ce3a4a85f4a67f28b7afe093154cde77eaf248a72e856aa08b4d865", size = 195488, upload-time = "2026-05-19T10:07:33.846Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/4f6bddbcde3c71e56d0aa1337ec95950f3d27dd4153e25aadf0feac71751/jiter-0.15.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0e90a1c315a0226ec822d973817967f9223b7701546c8c2a7913e7ab0926294d", size = 308793, upload-time = "2026-05-19T10:07:35.25Z" }, + { url = "https://files.pythonhosted.org/packages/01/84/c01099b59a285a1ebba64ae93f62bfa036675340fd1b0045ae65890a0442/jiter-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8c9004af7c8d67cce7f1aae1026fb55607f4aa600710d08ede3a3ce4aeefe7e0", size = 309570, upload-time = "2026-05-19T10:07:36.919Z" }, + { url = "https://files.pythonhosted.org/packages/58/64/8fb7f9d45bb98190355454cd04dad8d8f27223d6bd52f83af07f637168a6/jiter-0.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c210f8b35dc6f30aafd4b4365ca89b9d1189f21ab49b8e68fa6322a847aef138", size = 336783, upload-time = "2026-05-19T10:07:38.694Z" }, + { url = "https://files.pythonhosted.org/packages/c3/b6/f5739011d009b3a30f6a53c5240979030ba29ae46a8c67e3a15759f7c37d/jiter-0.15.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f30bae8bc1c2d613e28e5af3e8cceb09b742f1c8a8a5f839fb67afaffc03b61", size = 363555, upload-time = "2026-05-19T10:07:40.832Z" }, + { url = "https://files.pythonhosted.org/packages/e5/12/98a9d9f766665e8a3b6252454e17cb0c464606a28cf2fa09399b003345fa/jiter-0.15.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c60e71b6d10cfc284c9bf36bd885e8d44c46f688ce50aa91b5edd90181dea687", size = 452255, upload-time = "2026-05-19T10:07:42.62Z" }, + { url = "https://files.pythonhosted.org/packages/e8/d5/60f972840f79c5e7544fce567c56f1e4e50468f996baba3e78d823dd62a6/jiter-0.15.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ab068bce62a45aa3e7367eceaffb5dde60b7eb853be8dece45132e3d0ff4879", size = 373559, upload-time = "2026-05-19T10:07:44.201Z" }, + { url = "https://files.pythonhosted.org/packages/ee/cf/d46ef1234ba335aabc2f013210db8e0821a22f5e644a2e9449df199ecc23/jiter-0.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa248c9eb220197d363f688818dac2fd4b2f0cd7d843ca7105d652034823427d", size = 346055, upload-time = "2026-05-19T10:07:46.005Z" }, + { url = "https://files.pythonhosted.org/packages/f0/63/4d2749d8d54d230bad9b3a6b0d00cc28c6ff6b2fdffc26a8ccf76cc5a974/jiter-0.15.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2a77aadd57cac1682e4401a72724d2796d89a4ba129b1a5812aa94ee480826eb", size = 351406, upload-time = "2026-05-19T10:07:47.855Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b9/9965b990035d8773328e0a8c8b457a87bf2b19f6c4126d9d99296be5d16a/jiter-0.15.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ae901f3a55bfafdde31d289590fa25e3245735a2b1e8c7cc15871710a002871", size = 389357, upload-time = "2026-05-19T10:07:49.665Z" }, + { url = "https://files.pythonhosted.org/packages/2d/55/9ddf903deda1413e87fed792f416b7123daee5b8efbad6a202a7421c36a5/jiter-0.15.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f0b271b462769543716f92d3a4f90527df6ef5ed05ee95ec4137f513e21e1b77", size = 517263, upload-time = "2026-05-19T10:07:51.537Z" }, + { url = "https://files.pythonhosted.org/packages/e8/76/a0c40ad064d3a20a4fde231e35d56e9a01ce82164278180e82d5daf85469/jiter-0.15.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2fb6a5d26af81fc0f00f9360a891e05cf755e149bba391c4d563adc54812973d", size = 548646, upload-time = "2026-05-19T10:07:53.196Z" }, + { url = "https://files.pythonhosted.org/packages/23/4f/eca9b954942916ba2f453891b8593ab444cd872396fe66a3936616f236f3/jiter-0.15.0-cp312-cp312-win32.whl", hash = "sha256:c2f6bb8b5216ab9e7873bc08b5d7bef2b8abbb578a3069bf1cd14a45d71d771d", size = 206427, upload-time = "2026-05-19T10:07:55.307Z" }, + { url = "https://files.pythonhosted.org/packages/95/bf/8ead82a87495149542748e828d153fd232a512a22c83b02c4815c1a9c7d8/jiter-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:40b2c7e92c44a84d748d21706c68dc6ff8161d80b59c99d774721a0d2317d7c7", size = 197300, upload-time = "2026-05-19T10:07:56.651Z" }, + { url = "https://files.pythonhosted.org/packages/f4/e4/9b8a78fb2d894471bc344e37f1949bdd784bd914d031dba0ba3a40c71dd7/jiter-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:cc0bc345cf2df9d1c00ac443f50d543c1ccfa8b0422cb85b1ab70d681c0b255b", size = 192702, upload-time = "2026-05-19T10:07:58.307Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f4/f708c900ecee41b2025ef8413d5351e5649eb2125c506f6720cc69b06f5c/jiter-0.15.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1c11465f97e2abf45a014b83b730222f8f1c5335e802c7055a67d50de6f1f4e3", size = 307829, upload-time = "2026-05-19T10:07:59.704Z" }, + { url = "https://files.pythonhosted.org/packages/86/59/db537c0949e83668c38481d426b9f2fd5ab758c4ee53a811dd0a510626a0/jiter-0.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e7b1776f0797956c509e123d0952d10d293a9492dea9f288ab9570ec01d1a5", size = 308445, upload-time = "2026-05-19T10:08:01.184Z" }, + { url = "https://files.pythonhosted.org/packages/37/38/ea0e13b18c30ef951da0d47d39e7fa9edb82a93a62990ffbd7cea9b622d4/jiter-0.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:351a341c2105aa430b7047e30f1bf7975f6313b00165d3fc07be2edaf741f279", size = 336181, upload-time = "2026-05-19T10:08:02.688Z" }, + { url = "https://files.pythonhosted.org/packages/58/fc/2303901b16c4ba05865588990a420c0b4156270b44379c20931544a1d962/jiter-0.15.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ab395feec8d249ec4044e228e98a7033f043426a265df439dc3698823f0a4e4", size = 362985, upload-time = "2026-05-19T10:08:04.394Z" }, + { url = "https://files.pythonhosted.org/packages/5b/6f/11bace093c52e7d4d26c8e606ccd7ae8c972189622469ec0d9e28161e28b/jiter-0.15.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2a438005b6f22d0273413484d6094d7c2c5d10ec1b3a3bf128e0d1d3ba53258", size = 453292, upload-time = "2026-05-19T10:08:05.967Z" }, + { url = "https://files.pythonhosted.org/packages/22/db/987f2f086ca4d7a6582eb4ccd513f9b26b42d9e4243a087609a3137a8fc7/jiter-0.15.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f18f85e4218d1b40f000f42a92239a7a61a902cd42c65e6c360dbd17dcb20894", size = 373501, upload-time = "2026-05-19T10:08:07.857Z" }, + { url = "https://files.pythonhosted.org/packages/8f/7c/89fbcabb2739b7a5b8dc959a1b6c5761f6484f5fed3486854b3c789bb1de/jiter-0.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1aa62e277fc1cbd80e6deacae6f4d983b41b3d7728e0645c5d741a6149bba45", size = 344683, upload-time = "2026-05-19T10:08:09.431Z" }, + { url = "https://files.pythonhosted.org/packages/30/6f/6cca7692e7dddfec6d8d76c54dc97f2af2a41df4ac0674b999df1f09a5f3/jiter-0.15.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:6550fa135c7deb8ead6af49ed7ff648532ea8334a1447fe34a36315ef79c5c29", size = 350892, upload-time = "2026-05-19T10:08:11.352Z" }, + { url = "https://files.pythonhosted.org/packages/39/14/0338d6190cb8e6d22e677ab1d4eabd4117f67cca70c54cd04b82ff64e068/jiter-0.15.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:066f8f33f18b2419cd8213b2436fa7fbc9c499f315971cfa3ce1f9820c001b1b", size = 388723, upload-time = "2026-05-19T10:08:12.912Z" }, + { url = "https://files.pythonhosted.org/packages/90/31/cc19f4a1bdb6afb09ce6a2f2615aa8d44d994eba0d8e6105ed1af920e736/jiter-0.15.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:75e8a04e91432dde9f1838373cf93d23726c79d3e908d319acf0e796f85592e7", size = 516648, upload-time = "2026-05-19T10:08:14.808Z" }, + { url = "https://files.pythonhosted.org/packages/49/9f/833c541512cd091b63c10c0381973dfe11bc7a503a818c16384417e0c81e/jiter-0.15.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a97261f1fccb8e50ecd2890a96e46efdc3f57c80a197324c6777827231eca712", size = 547382, upload-time = "2026-05-19T10:08:16.927Z" }, + { url = "https://files.pythonhosted.org/packages/d2/11/e7b70e91f90bc4477e8eee9e8a5f7cf3cb41b4525d6394dc98a714eb8f7f/jiter-0.15.0-cp313-cp313-win32.whl", hash = "sha256:c77496cb10bd7549690fbbab3e5ec05857b83e49276f4a9423a766ddd2afcd4c", size = 205845, upload-time = "2026-05-19T10:08:18.401Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/5c20d9ad6f02c493e4023e5d2d09e1c1f15fe2753c9102c544aff068a88e/jiter-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b15741f501469009ae0ae90b7147958a664a7dede40aa7ff174a8a4645f546d0", size = 196842, upload-time = "2026-05-19T10:08:20.131Z" }, + { url = "https://files.pythonhosted.org/packages/6b/11/1eb400ef248e8c925fd883fbe325daf5e42cd1b0d308539dd332bd4f7ffc/jiter-0.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d6a60072b44c3c2b797a7ddcbcbbf2b34ea3cfd4721580fbfd2a09d9d9b84ba", size = 192212, upload-time = "2026-05-19T10:08:21.807Z" }, + { url = "https://files.pythonhosted.org/packages/8a/60/2fd8d7c79da8acf9b7b277c7616847773779356b92acfc9bb158452174da/jiter-0.15.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ef1fd24d9413f6209e00d3d5a453e67acfe004a25cc6c8e8484faed4311ab9e8", size = 315065, upload-time = "2026-05-19T10:08:23.218Z" }, + { url = "https://files.pythonhosted.org/packages/46/f4/008fb7d65e8ac2abf00811651a661e025c4ba80bbc6f378450384ddd3aed/jiter-0.15.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:144f8e72cb53dab146347b91cceac01f5481237f2b93b4a339a1ee8f8878b67c", size = 339444, upload-time = "2026-05-19T10:08:24.701Z" }, + { url = "https://files.pythonhosted.org/packages/00/55/90b0c7b9c6896c0f2a591dd36d36b71d22e09674bfef178fa03ba3f81499/jiter-0.15.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553fcac2ef2cb990877f9fc0833b8b629a3e6a5670b6b5fd58219b41a653ddc4", size = 347779, upload-time = "2026-05-19T10:08:26.408Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/69666cec5000fd57734c118437394516c749ae8dbeea9fb66d6fef9c4775/jiter-0.15.0-cp313-cp313t-win_amd64.whl", hash = "sha256:774f93f65031856bf14ad9f59bdcab8b8cad501e5ceabd51ba3525f76937a25b", size = 200395, upload-time = "2026-05-19T10:08:28.055Z" }, + { url = "https://files.pythonhosted.org/packages/39/04/a6aa62cd27e8149b0d28df5561f10f6cceaf7935a9ccf3f1c5a05f9a0cd8/jiter-0.15.0-cp313-cp313t-win_arm64.whl", hash = "sha256:f1e1754960f38ec40613a07e5e372df67acb3b890fb383b6fb3de3e49ddbf3c7", size = 190516, upload-time = "2026-05-19T10:08:29.35Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d2/079f350ebf7859d081de30aa890f9e3be68516f754f3ba32366ffff4dcee/jiter-0.15.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:ac0d9ddea4350974be7a221fc25895f251a8fee748c889bdced2141c0fec1a49", size = 308884, upload-time = "2026-05-19T10:08:31.667Z" }, + { url = "https://files.pythonhosted.org/packages/04/4e/a2c30a7f69b48c03b20935d647479106fe932f6e63f75faf53937197e05d/jiter-0.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:01a8222cf05ab1128e239421156c207949808acaaea2bdfd33130ae666786e86", size = 310028, upload-time = "2026-05-19T10:08:33.304Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/2e7cdfd3cf8ca967be38c48f5cf474d79f089efaf559a40f15984a77ae69/jiter-0.15.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:182226cbc930c9fab81bc2e41a4da672f89539906dadb05e75670ac07b94f71f", size = 337485, upload-time = "2026-05-19T10:08:35.259Z" }, + { url = "https://files.pythonhosted.org/packages/9b/11/15a1aa28b120b8ee5b4f1fb894c125046225f09847738bd64233d3b84883/jiter-0.15.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:71683c38c825452999b5717fcae07ea708e8c93003e808be4319c1b02e3d176e", size = 364223, upload-time = "2026-05-19T10:08:36.694Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/f442e8af5f3d0dcf47b39e83a0efd9ee45ea946aa6d04625dc3181eae3b6/jiter-0.15.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f2218e6a9e5c18bc10fe6d41ac189c442c88eacf11bad9f28ef95a9bef00e6", size = 456387, upload-time = "2026-05-19T10:08:38.143Z" }, + { url = "https://files.pythonhosted.org/packages/da/f4/37f2d2c9f64f49af7da652ed7532bb5a2372e588e6927c3fdd76f911db65/jiter-0.15.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5157de9f76eb4bc5ea74a1219366a25f945ad305641d74e04f59c54087091aa9", size = 374461, upload-time = "2026-05-19T10:08:39.869Z" }, + { url = "https://files.pythonhosted.org/packages/60/28/edcfbbbf0cb15436f36664a8908a0df47ab9006298d4cd937dc08ea932d6/jiter-0.15.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c5db5527c221249a876160663ab891ace358c17f7b9c93ec1478b7f0550e5c", size = 345924, upload-time = "2026-05-19T10:08:41.668Z" }, + { url = "https://files.pythonhosted.org/packages/47/13/89fba6398dab7f202b7278c4b4aac122399d2c0183971c4a57a3b7088df5/jiter-0.15.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:3e4540b8e74e4268811ac05db226a6a128ff572e7e0ce3f1163b693cadb184cd", size = 352283, upload-time = "2026-05-19T10:08:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/1b/da/0f6af8cef2c565a1ab44d970f268c43ccaa72707386ea6388e6fe2b6cd26/jiter-0.15.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:62ebd14e47e9aed9df4472afcb2663668ce4d74891cd54f86bf6e44029d6dc89", size = 389985, upload-time = "2026-05-19T10:08:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ec/b9cb7d6d29e24ee14910266157d2a279d7a8f60ee0df7fa840882976ba64/jiter-0.15.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0be6f5ad41a809f303f416d17cec92a7a725902fb9b4f3de3d19362ac0ef8554", size = 517695, upload-time = "2026-05-19T10:08:46.486Z" }, + { url = "https://files.pythonhosted.org/packages/64/5e/6d1bda880723aae0ad86b4b763f044362448efe31e3e819635d41cb03451/jiter-0.15.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:813dfbb17d65328bf86e5f0905dd277ba2265d3ca20556e86c0c7035b7182e5a", size = 548868, upload-time = "2026-05-19T10:08:48.026Z" }, + { url = "https://files.pythonhosted.org/packages/0c/72/7de501cf38dcacaf35098796f3a50e0f2e338baba18a58946c618544b809/jiter-0.15.0-cp314-cp314-win32.whl", hash = "sha256:50e51156192722a9c58db112837d3f8ef96fb3c5ecc14e95f409134b08b158ec", size = 206380, upload-time = "2026-05-19T10:08:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/1e/a9/e19addf4b0c1bdce52c6da12351e6bc42c340c45e7c09e2158e46d293ccc/jiter-0.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:30ce1a5d16b5641dc935d50ef775af6a0871e3d14ab05d6fc54dff371b78e558", size = 197687, upload-time = "2026-05-19T10:08:51.088Z" }, + { url = "https://files.pythonhosted.org/packages/f2/c9/776b1db01db25fc6c1d58d1979a37b0a9fe787e5f5b1d062d2eaacb77923/jiter-0.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:510c8b3c17a0ed9ac69850c0438dada3c9b82d9c4d589fcb62002a5a9cf3a866", size = 192571, upload-time = "2026-05-19T10:08:52.451Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f6/45bb4670bacf300fd2c7abadbfb3af376e5f1b6ae75fd9bc069891d15870/jiter-0.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7553333dd0930c104a5a0db8df72bf7219fe663d731383b576bb6ed6351c984d", size = 317151, upload-time = "2026-05-19T10:08:53.867Z" }, + { url = "https://files.pythonhosted.org/packages/d7/68/ed635ad5acd7b73e454283083bbb7c8205ad10e88b0d9d7d793b09fe8226/jiter-0.15.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2143ab06181d2b029eedcb6af3cebe95f11bbac62441781860f98ee9330a6a6", size = 341243, upload-time = "2026-05-19T10:08:55.383Z" }, + { url = "https://files.pythonhosted.org/packages/5d/db/3ff4176b817b8ea33879e71e13d8bc2b0d481a7ed3fe9e080f333d415c16/jiter-0.15.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eac374c5c975709b69c10f09afd199df74150172156ad10c8d4fd785b7da995", size = 363629, upload-time = "2026-05-19T10:08:56.928Z" }, + { url = "https://files.pythonhosted.org/packages/ab/24/5f8270e0ba9c883582f96f722f8a0b58015c7ce1f8c6d4571cf394e99b6b/jiter-0.15.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3b3b775e33d3bfaec9899edc526ae97b0da0bf9d071a46124ba419149a414f8", size = 456198, upload-time = "2026-05-19T10:08:58.618Z" }, + { url = "https://files.pythonhosted.org/packages/45/5b/76fc02b0b5c54c3d18c60653156e2f76fde1816f9b4722db68d6ee2c897e/jiter-0.15.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3071db3346334beae1360b46da4606da57bf3528c167b3c38533afaf9f2c5", size = 373710, upload-time = "2026-05-19T10:09:00.151Z" }, + { url = "https://files.pythonhosted.org/packages/c4/52/4310821b0ea9277994d3e1f49fc6a4b34e4800caebacb2c0af81da59a454/jiter-0.15.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6694a173ecabc12eb60efbc0b474464ead1951ff65cd8b1e72100715c64512b", size = 349901, upload-time = "2026-05-19T10:09:01.621Z" }, + { url = "https://files.pythonhosted.org/packages/93/fe/67648c35b3594fba8854ac64cc8a826d8bcd18324bbdb53d77697c60b6ef/jiter-0.15.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:a254e10b593624d230c365b6d616b22ca0ad65e63a16e6631c2b3466022e6ba8", size = 352438, upload-time = "2026-05-19T10:09:03.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/28/0a1879d07ad6b3e025a2750027363452ced93c2d16d1c9d4b153ffd51c91/jiter-0.15.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d8d2955167274e15d79a7a020afdd9b39c990eb80b2d89fca695d92dcfdd38ec", size = 388152, upload-time = "2026-05-19T10:09:04.741Z" }, + { url = "https://files.pythonhosted.org/packages/c1/78/46c6f6b56ba85c90021f4afd72ed42f691f8f84daacb5fe27277070e3858/jiter-0.15.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:acf4ee4d1fc55917239fe72972fb292dd773055d05eb040d36f4326e02cc2c0e", size = 517707, upload-time = "2026-05-19T10:09:06.231Z" }, + { url = "https://files.pythonhosted.org/packages/ca/cb/720662d4c88fcad606e826fef5424365527ba43ce4868a479aed8f8c507e/jiter-0.15.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:e7196e56f1cd69af1dbb07dff02dcfb260a50b45a82d409d92a06fedb32473b5", size = 548241, upload-time = "2026-05-19T10:09:08.093Z" }, + { url = "https://files.pythonhosted.org/packages/60/e3/935b8034fd143f21125c87d51404a9e0e1449186a494405721ff5d1d695e/jiter-0.15.0-cp314-cp314t-win32.whl", hash = "sha256:7f6163c0f10b055245f814dcc59f4818da60dfe72f3e72ab89fc24b6bd5e9c52", size = 207950, upload-time = "2026-05-19T10:09:09.616Z" }, + { url = "https://files.pythonhosted.org/packages/93/59/984fd9ece895953dad3e0880a650e766f5a2da2c5514f0eafdaaabbeb5f9/jiter-0.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:980c256edb05b78a111b99c4de3b1d32e31634b867fd1fc2cf726e7b7bba9854", size = 200055, upload-time = "2026-05-19T10:09:11.367Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a4/cf8d779feb133a27a2e3bc833bccb9e13aa332cdf820497ebf72c10ce8c3/jiter-0.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:66b1880df2d01e206e8339769d1c7c1753bcb653efd6289e203f6f24ebada0c0", size = 191244, upload-time = "2026-05-19T10:09:12.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/43/1fc62172aa98b50a7de9a25554060db510f85c89cfbed0dfe13e1907a139/jiter-0.15.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:411fa4dfa5a7ae3d11491027ffb9beadec3996010a986862db70d91abba1c750", size = 305585, upload-time = "2026-05-19T10:09:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c4/dd58fcd9e2df83666e5c1c1347bef58ce919cd8efc3ffa38aeea62ce493b/jiter-0.15.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:2b0074e2f56eb2dacca1689760fd2852a068f85a0547a157b82cb4cafeb6768b", size = 306936, upload-time = "2026-05-19T10:09:37.435Z" }, + { url = "https://files.pythonhosted.org/packages/39/86/b695e16f1180c07f43ea98e73ecd21cf63fa2e1b0c1103739013784d11ae/jiter-0.15.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:913d02d29c9606643418d9ccfc3b72492ab25a6bf7889934e09a3490f8d3438b", size = 342453, upload-time = "2026-05-19T10:09:39.294Z" }, + { url = "https://files.pythonhosted.org/packages/34/56/55d76614af37fe3f22a3347d1e410d2a15da581997cb2da499a625000bb5/jiter-0.15.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b15d3ec9b0449c40e85319bdb4caa8b77ab526e74f5532ed94bec15e2f66822c", size = 345606, upload-time = "2026-05-19T10:09:40.727Z" }, + { url = "https://files.pythonhosted.org/packages/73/38/505941b2b092fd5bbbd60a52a880db1173f1690ae6751bed3af1c9ddcb4e/jiter-0.15.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:631f13a3d04e97d4e083993b10f4b99530e3a10d953e2eb5e196b7dc7f812ce0", size = 303769, upload-time = "2026-05-19T10:09:42.203Z" }, + { url = "https://files.pythonhosted.org/packages/e7/95/a06692b29e77473f286e1ec1f426d3ca44d7b5843be8ad21d7a5f3fcdcc0/jiter-0.15.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:b6c0ffae686c39bf3737be60793783267628783ea42545632c10b291105aee45", size = 305128, upload-time = "2026-05-19T10:09:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/7270d7ad41d6061a25b950c6bf91d638bd9aacb113200a8c8d57a055fd67/jiter-0.15.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d54fb5b31dea401a41af3f8a7d2512e9b6a6a005491e6166c7e4ffab9639a9c", size = 340459, upload-time = "2026-05-19T10:09:45.452Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8d/302cb2057b7513327b4d575cff6b1d066ee6431a5357fc3f8867cd684406/jiter-0.15.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d5d6090cdc1b7c9e780dfb04949a990adb1e301a2fc0bbcee7de4638d33f9a", size = 344469, upload-time = "2026-05-19T10:09:46.864Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/dd/a495a9c104be1c476f0386e714252caf2b7eca883915422a64c50b88c6f5/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c", size = 122798, upload-time = "2026-03-09T13:12:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, + { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, + { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, + { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, + { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, + { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, + { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, + { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, + { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, + { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, + { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, + { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, + { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, + { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, + { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, + { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, +] + +[[package]] +name = "librt" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", size = 200139, upload-time = "2026-05-10T18:17:25.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", size = 141092, upload-time = "2026-05-10T18:15:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", size = 142035, upload-time = "2026-05-10T18:15:36.242Z" }, + { url = "https://files.pythonhosted.org/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", size = 475022, upload-time = "2026-05-10T18:15:37.56Z" }, + { url = "https://files.pythonhosted.org/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", size = 467273, upload-time = "2026-05-10T18:15:39.182Z" }, + { url = "https://files.pythonhosted.org/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", size = 497083, upload-time = "2026-05-10T18:15:40.634Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", size = 489139, upload-time = "2026-05-10T18:15:41.934Z" }, + { url = "https://files.pythonhosted.org/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", size = 508442, upload-time = "2026-05-10T18:15:43.206Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", size = 514230, upload-time = "2026-05-10T18:15:44.761Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", size = 494231, upload-time = "2026-05-10T18:15:46.308Z" }, + { url = "https://files.pythonhosted.org/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", size = 537585, upload-time = "2026-05-10T18:15:47.629Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", size = 100509, upload-time = "2026-05-10T18:15:49.157Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", size = 118628, upload-time = "2026-05-10T18:15:50.345Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", size = 103122, upload-time = "2026-05-10T18:15:52.068Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", size = 144147, upload-time = "2026-05-10T18:15:53.227Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", size = 143614, upload-time = "2026-05-10T18:15:54.657Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", size = 485538, upload-time = "2026-05-10T18:15:56.117Z" }, + { url = "https://files.pythonhosted.org/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", size = 479623, upload-time = "2026-05-10T18:15:57.544Z" }, + { url = "https://files.pythonhosted.org/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", size = 513082, upload-time = "2026-05-10T18:15:58.805Z" }, + { url = "https://files.pythonhosted.org/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", size = 508105, upload-time = "2026-05-10T18:16:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", size = 522268, upload-time = "2026-05-10T18:16:01.708Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", size = 527348, upload-time = "2026-05-10T18:16:03.496Z" }, + { url = "https://files.pythonhosted.org/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", size = 516294, upload-time = "2026-05-10T18:16:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", size = 553608, upload-time = "2026-05-10T18:16:06.839Z" }, + { url = "https://files.pythonhosted.org/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", size = 101879, upload-time = "2026-05-10T18:16:08.103Z" }, + { url = "https://files.pythonhosted.org/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", size = 119831, upload-time = "2026-05-10T18:16:09.174Z" }, + { url = "https://files.pythonhosted.org/packages/59/67/a6739ac96e28b7855808bdb0370e250606104a859750d209e5a0716fe7ab/librt-0.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f10cf143e4a9bb0f4f5af568a00df94a2d69ef41c2579584454bb0fe5cc642c", size = 103470, upload-time = "2026-05-10T18:16:10.369Z" }, + { url = "https://files.pythonhosted.org/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", size = 144119, upload-time = "2026-05-10T18:16:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", size = 143565, upload-time = "2026-05-10T18:16:13.334Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", size = 485395, upload-time = "2026-05-10T18:16:14.729Z" }, + { url = "https://files.pythonhosted.org/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", size = 479383, upload-time = "2026-05-10T18:16:16.321Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", size = 513010, upload-time = "2026-05-10T18:16:17.647Z" }, + { url = "https://files.pythonhosted.org/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", size = 508433, upload-time = "2026-05-10T18:16:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", size = 522595, upload-time = "2026-05-10T18:16:20.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", size = 527255, upload-time = "2026-05-10T18:16:22.352Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", size = 516847, upload-time = "2026-05-10T18:16:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", size = 553920, upload-time = "2026-05-10T18:16:25.025Z" }, + { url = "https://files.pythonhosted.org/packages/9c/21/623f8ca230857102066d9ca8c6c1734995908c4d0d1bee7bb2ef0021cb33/librt-0.11.0-cp313-cp313-win32.whl", hash = "sha256:78fddc31cd4d3caa897ad5d31f856b1faadc9474021ad6cb182b9018793e254e", size = 101898, upload-time = "2026-05-10T18:16:26.649Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/b4ebd44dd723f768469007515cb92251e0ae286c94c140f374801140fa74/librt-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ca8aa88751a775870b764e93bad5135385f563cb8dcee399abf034ea4d3cb47", size = 119812, upload-time = "2026-05-10T18:16:27.859Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e4/b2f4ca7965ca373b491cdb4bc25cdb30c1649ca81a8782056a83850292a9/librt-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:96f044bb325fd9cf1a723015638c219e9143f0dfbc0ca54c565df2b7fc748b44", size = 103448, upload-time = "2026-05-10T18:16:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/29/eb/dbce197da4e227779e56b5735f2decc3eb36e55a1cdbf1bd65d6639d76c1/librt-0.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4a017a95e5837dc15a8c5661d60e05daa96b90908b1aa6b7acdf443cd25c8ebd", size = 143345, upload-time = "2026-05-10T18:16:30.674Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/254bebd0c11c8ba684018efb8006ff22e466abce445215cca6c778e7d9de/librt-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b1ecbd9819deccc39b7542bf4d2a740d8a620694d39989e58661d3763458f8d4", size = 143131, upload-time = "2026-05-10T18:16:32.037Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3f/f77d6122d21ac7bf6ae8a7dfced1bd2a7ac545d3273ebdcaf8042f6d619f/librt-0.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da327dacd7be8f8ec36547373550744a3cc0e536d54665cd83f8bcd961200e8", size = 477024, upload-time = "2026-05-10T18:16:33.493Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0a/2c996dadebaa7d9bbbd43ef2d4f3e66b6da545f838a41694ef6172cebec8/librt-0.11.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0dc56b1f8d06e60db362cc3fdae206681817f86ce4725d34511473487f12a34b", size = 474221, upload-time = "2026-05-10T18:16:34.864Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7e/f5d92af8486b8272c23b3e686b46ff72d89c8169585eb61eef01a2ac7147/librt-0.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb8fb2ab90e21c8d12ea240d744ad514da9baf381ebfa70d91d20d21713175", size = 505174, upload-time = "2026-05-10T18:16:36.705Z" }, + { url = "https://files.pythonhosted.org/packages/af/1a/cb0734fe86398eb33193ab753b7326255c74cac5eb09e76b9b16536e7adb/librt-0.11.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae74872be221df4374d10fec61f93ed1513b9546ea84f2c0bf73ab3e9bd0b03", size = 497216, upload-time = "2026-05-10T18:16:38.418Z" }, + { url = "https://files.pythonhosted.org/packages/18/06/094820f91558b66e29943c0ec41c9914f460f48dd51fc503c3101e10842d/librt-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32bcc918c0148eb7e3d57385125bac7e5f9e4359d05f07448b09f6f778c2f31c", size = 513921, upload-time = "2026-05-10T18:16:39.848Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c2/00de9018871a282f530cacb457d5ec0428f6ac7e6fedde9aff7468d9fb04/librt-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f9743fc99135d5f78d2454435615f6dec0473ca507c26ce9d92b10b562a280d3", size = 520850, upload-time = "2026-05-10T18:16:41.471Z" }, + { url = "https://files.pythonhosted.org/packages/51/9d/64631832348fd1834fb3a61b996434edddaaf25a31d03b0a76273159d2cf/librt-0.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5ba067f4aadae8fda802d91d2124c90c42195ff32d9161d3549e6d05cfe26f96", size = 504237, upload-time = "2026-05-10T18:16:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ec/ae5525eb16edc827a044e7bb8777a455ff95d4bca9379e7e6bddd7383647/librt-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:de3bf945454d032f9e390b85c4072e0a0570bf825421c8be0e71209fa65e1abe", size = 546261, upload-time = "2026-05-10T18:16:44.408Z" }, + { url = "https://files.pythonhosted.org/packages/5a/09/adce371f27ca039411da9659f7430fcc2ba6cd0c7b3e4467a0f091be7fa9/librt-0.11.0-cp314-cp314-win32.whl", hash = "sha256:d2277a05f6dcb9fd13db9566aac4fabd68c3ea1ea46ee5567d4eef8efa495a2f", size = 96965, upload-time = "2026-05-10T18:16:46.039Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ee/8ac720d98548f173c7ce2e632a7ca94673f74cacd5c8162a84af5b35958a/librt-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ab73e8db5e3f564d812c1f5c3a175930a5f9bc96ccb5e3b22a34d7858b401cf7", size = 115151, upload-time = "2026-05-10T18:16:47.133Z" }, + { url = "https://files.pythonhosted.org/packages/94/20/c900cf14efeb09b6bef2b2dff20779f73464b97fd58d1c6bccc379588ae3/librt-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aea3caa317752e3a466fa8af45d91ee0ea8c7fdd96e42b0a8dd9b76a7931eba1", size = 98850, upload-time = "2026-05-10T18:16:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/0c/71/944bfe4b64e12abffcd3c15e1cce07f72f3d55655083786285f4dedeb532/librt-0.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d1b36540d7aaf9b9101b3a6f376c8d8e9f7a9aec93ed05918f2c69d493ffef72", size = 151138, upload-time = "2026-05-10T18:16:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/b6/10/99e64a5c86989357fda078c8143c533389585f6473b7439172dd8f3b3b2d/librt-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efbb343ab2ce3540f4ecbe6315d677ed70f37cd9a72b1e58066c918ca83acbaa", size = 151976, upload-time = "2026-05-10T18:16:51.062Z" }, + { url = "https://files.pythonhosted.org/packages/21/31/5072ad880946d83e5ea4147d6d018c78eefce85b77819b19bdd0ee229435/librt-0.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0dd688aab3f7914d3e6e5e3554978e0383312fb8e771d84be008a35b9ee548", size = 557927, upload-time = "2026-05-10T18:16:52.632Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8d/70b5fb7cfbab60edbe7381614ab985da58e144fbf465c86d44c95f43cdca/librt-0.11.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f5fb36b8c6c63fdcbb1d526d94c0d1331610d43f4118cc1beb4efef4f3faacb2", size = 539698, upload-time = "2026-05-10T18:16:53.934Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a3/ba3495a0b3edbd24a4cae0d1d3c64f39a9fc45d06e812101289b50c1a619/librt-0.11.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a9a237d13addb93715b6fee74023d5ee3469b53fce527626c0e088aa585805f", size = 577162, upload-time = "2026-05-10T18:16:55.589Z" }, + { url = "https://files.pythonhosted.org/packages/f7/db/36e25fb81f99937ff1b96612a1dc9fd66f039cb9cc3aee12c01fac31aab9/librt-0.11.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ddd17bd87b2c56ddd60e546a7984a2e64c4e8eab92fb4cf3830a48ad5469d51", size = 566494, upload-time = "2026-05-10T18:16:56.975Z" }, + { url = "https://files.pythonhosted.org/packages/33/0d/3f622b47f0b013eeb9cf4cc07ae9bfe378d832a4eec998b2b209fe84244d/librt-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd43992b4473d42f12ff9e68326079f0696d9d4e6000e8f39a0238d482ba6ee2", size = 596858, upload-time = "2026-05-10T18:16:58.374Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/71b90bc93039c46a2000651f6ad60122b114c8f54c4ad306e0e96f5b75ad/librt-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f8e3e8056dd674e279741485e2e512d6e9a751c7455809d0114e6ebf8d781085", size = 590318, upload-time = "2026-05-10T18:16:59.676Z" }, + { url = "https://files.pythonhosted.org/packages/04/04/418cb3f75621e2b761fb1ab0f017f4d70a1a72a6e7c74ee4f7e8d198c2f3/librt-0.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c1f708d8ae9c56cf38a903c44297243d2ec83fd82b396b977e0144a3e76217e3", size = 575115, upload-time = "2026-05-10T18:17:01.007Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2c/5a2183ac58dd911f26b5d7e7d7d8f1d87fcecdddd99d6c12169a258ff62c/librt-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0add982e0e7b9fc14cf4b33789d5f13f66581889b88c2f58099f6ce8f92617bd", size = 617918, upload-time = "2026-05-10T18:17:02.682Z" }, + { url = "https://files.pythonhosted.org/packages/15/1f/dc6771a52592a4451be6effa200cbfc9cec61e4393d3033d81a9d307961d/librt-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:2b481d846ac894c4e8403c5fd0e87c5d11d6499e404b474602508a224ff531c8", size = 103562, upload-time = "2026-05-10T18:17:03.99Z" }, + { url = "https://files.pythonhosted.org/packages/62/4a/7d1415567027286a75ba1093ec4aca11f073e0f559c530cf3e0a757ad55c/librt-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:28edb433edde181112a908c78907af28f964eabc15f4dd16c9d66c834302677c", size = 124327, upload-time = "2026-05-10T18:17:05.465Z" }, + { url = "https://files.pythonhosted.org/packages/ce/62/b40b382fa0c66fee1478073eb8db352a4a6beda4a1adccf1df911d8c289c/librt-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dee008f20b542e3cd162ba338a7f9ec0f6d23d395f66fe8aeeec3c9d067ea253", size = 102572, upload-time = "2026-05-10T18:17:06.809Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz", hash = "sha256:62031ce968ec74e95092184d4b0e857e444f8fdff0b8f9213707699570c33ccc", size = 193614, upload-time = "2026-03-31T18:29:53.497Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74090f0dcfd6f24ebbef3f21f11e38111c4d7e6919b54c4416e1e357c3446b07", size = 37232770, upload-time = "2026-03-31T18:28:26.765Z" }, + { url = "https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ca14f02e29134e837982497959a8e2193d6035235de1cb41a9cb2bd6da4eedbb", size = 56275177, upload-time = "2026-03-31T18:28:31.01Z" }, + { url = "https://files.pythonhosted.org/packages/7e/51/48a53fedf01cb1f3f43ef200be17ebf83c8d9a04018d3783c1a226c342c2/llvmlite-0.47.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:12a69d4bb05f402f30477e21eeabe81911e7c251cecb192bed82cd83c9db10d8", size = 55128631, upload-time = "2026-03-31T18:28:36.046Z" }, + { url = "https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:c37d6eb7aaabfa83ab9c2ff5b5cdb95a5e6830403937b2c588b7490724e05327", size = 38138400, upload-time = "2026-03-31T18:28:40.076Z" }, + { url = "https://files.pythonhosted.org/packages/fa/48/4b7fe0e34c169fa2f12532916133e0b219d2823b540733651b34fdac509a/llvmlite-0.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:306a265f408c259067257a732c8e159284334018b4083a9e35f67d19792b164f", size = 37232769, upload-time = "2026-03-31T18:28:43.735Z" }, + { url = "https://files.pythonhosted.org/packages/e6/4b/e3f2cd17822cf772a4a51a0a8080b0032e6d37b2dbe8cfb724eac4e31c52/llvmlite-0.47.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5853bf26160857c0c2573415ff4efe01c4c651e59e2c55c2a088740acfee51cd", size = 56275178, upload-time = "2026-03-31T18:28:48.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a3b4a543185305a9bdf3d9759d53646ed96e55e7dfd43f53e7a421b8fbae/llvmlite-0.47.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:003bcf7fa579e14db59c1a1e113f93ab8a06b56a4be31c7f08264d1d4072d077", size = 55128632, upload-time = "2026-03-31T18:28:52.901Z" }, + { url = "https://files.pythonhosted.org/packages/2f/f5/d281ae0f79378a5a91f308ea9fdb9f9cc068fddd09629edc0725a5a8fde1/llvmlite-0.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:f3079f25bdc24cd9d27c4b2b5e68f5f60c4fdb7e8ad5ee2b9b006007558f9df7", size = 38138692, upload-time = "2026-03-31T18:28:57.147Z" }, + { url = "https://files.pythonhosted.org/packages/77/6f/4615353e016799f80fa52ccb270a843c413b22361fadda2589b2922fb9b0/llvmlite-0.47.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a3c6a735d4e1041808434f9d440faa3d78d9b4af2ee64d05a66f351883b6ceec", size = 37232771, upload-time = "2026-03-31T18:29:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/31/b8/69f5565f1a280d032525878a86511eebed0645818492feeb169dfb20ae8e/llvmlite-0.47.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2699a74321189e812d476a43d6d7f652f51811e7b5aad9d9bba842a1c7927acb", size = 56275178, upload-time = "2026-03-31T18:29:05.748Z" }, + { url = "https://files.pythonhosted.org/packages/d6/da/b32cafcb926fb0ce2aa25553bf32cb8764af31438f40e2481df08884c947/llvmlite-0.47.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c6951e2b29930227963e53ee152441f0e14be92e9d4231852102d986c761e40", size = 55128632, upload-time = "2026-03-31T18:29:11.235Z" }, + { url = "https://files.pythonhosted.org/packages/46/9f/4898b44e4042c60fafcb1162dfb7014f6f15b1ec19bf29cfea6bf26df90d/llvmlite-0.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2e9adf8698d813a9a5efb2d4370caf344dbc1e145019851fee6a6f319ba760e", size = 38138695, upload-time = "2026-03-31T18:29:15.43Z" }, + { url = "https://files.pythonhosted.org/packages/1c/d4/33c8af00f0bf6f552d74f3a054f648af2c5bc6bece97972f3bfadce4f5ec/llvmlite-0.47.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:de966c626c35c9dff5ae7bf12db25637738d0df83fc370cf793bc94d43d92d14", size = 37232773, upload-time = "2026-03-31T18:29:19.453Z" }, + { url = "https://files.pythonhosted.org/packages/64/1d/a760e993e0c0ba6db38d46b9f48f6c7dceb8ac838824997fb9e25f97bc04/llvmlite-0.47.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ddbccff2aeaff8670368340a158abefc032fe9b3ccf7d9c496639263d00151aa", size = 56275176, upload-time = "2026-03-31T18:29:24.149Z" }, + { url = "https://files.pythonhosted.org/packages/84/3b/e679bc3b29127182a7f4aa2d2e9e5bea42adb93fb840484147d59c236299/llvmlite-0.47.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4a7b778a2e144fc64468fb9bf509ac1226c9813a00b4d7afea5d988c4e22fca", size = 55128631, upload-time = "2026-03-31T18:29:29.536Z" }, + { url = "https://files.pythonhosted.org/packages/be/f7/19e2a09c62809c9e63bbd14ce71fb92c6ff7b7b3045741bb00c781efc3c9/llvmlite-0.47.0-cp314-cp314-win_amd64.whl", hash = "sha256:694e3c2cdc472ed2bd8bd4555ca002eec4310961dd58ef791d508f57b5cc4c94", size = 39153826, upload-time = "2026-03-31T18:29:33.681Z" }, + { url = "https://files.pythonhosted.org/packages/40/a1/581a8c707b5e80efdbbe1dd94527404d33fe50bceb71f39d5a7e11bd57b7/llvmlite-0.47.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:92ec8a169a20b473c1c54d4695e371bde36489fc1efa3688e11e99beba0abf9c", size = 37232772, upload-time = "2026-03-31T18:29:37.952Z" }, + { url = "https://files.pythonhosted.org/packages/11/03/16090dd6f74ba2b8b922276047f15962fbeea0a75d5601607edb301ba945/llvmlite-0.47.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa1cbd800edd3b20bc141521f7fd45a6185a5b84109aa6855134e81397ffe72b", size = 56275178, upload-time = "2026-03-31T18:29:42.58Z" }, + { url = "https://files.pythonhosted.org/packages/f5/cb/0abf1dd4c5286a95ffe0c1d8c67aec06b515894a0dd2ac97f5e27b82ab0b/llvmlite-0.47.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6725179b89f03b17dabe236ff3422cb8291b4c1bf40af152826dfd34e350ae8", size = 55128632, upload-time = "2026-03-31T18:29:46.939Z" }, + { url = "https://files.pythonhosted.org/packages/4f/79/d3bbab197e86e0ff4f9c07122895b66a3e0d024247fcff7f12c473cb36d9/llvmlite-0.47.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6842cf6f707ec4be3d985a385ad03f72b2d724439e118fcbe99b2929964f0453", size = 39153839, upload-time = "2026-03-31T18:29:51.004Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb", size = 8306860, upload-time = "2026-04-24T00:12:01.207Z" }, + { url = "https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb", size = 8199254, upload-time = "2026-04-24T00:12:04.239Z" }, + { url = "https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb", size = 8777092, upload-time = "2026-04-24T00:12:06.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/fa/3ce7adfe9ba101748f465211660d9c6374c876b671bdb8c2bb6d347e8b94/matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9", size = 9595691, upload-time = "2026-04-24T00:12:09.706Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/6960a76686ed668f2c60f84e9799ba4c0d56abdb36b1577b60c1d061d1ec/matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb", size = 9659771, upload-time = "2026-04-24T00:12:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f", size = 8205112, upload-time = "2026-04-24T00:12:15.773Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ee/cb57ad4754f3e7b9174ce6ce66d9205fb827067e48a9f58ac09d7e7d6b77/matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80", size = 8132310, upload-time = "2026-04-24T00:12:18.645Z" }, + { url = "https://files.pythonhosted.org/packages/35/c6/5581e26c72233ebb2a2a6fed2d24fb7c66b4700120b813f51b0555acf0b6/matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1", size = 8319908, upload-time = "2026-04-24T00:12:21.323Z" }, + { url = "https://files.pythonhosted.org/packages/b7/18/4880dd762e40cd360c1bf06e890c5a97b997e91cb324602b1a19950ad5ce/matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320", size = 8216016, upload-time = "2026-04-24T00:12:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/d024616abdba99e83120e07a20658976f6a343646710760c4a51df126029/matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285", size = 8789336, upload-time = "2026-04-24T00:12:26.096Z" }, + { url = "https://files.pythonhosted.org/packages/5c/04/030a2f61ef2158f5e4c259487a92ac877732499fb33d871585d89e03c42d/matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2", size = 9604602, upload-time = "2026-04-24T00:12:29.052Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c2/541e4d09d87bb6b5830fc28b4c887a9a8cf4e1c6cee698a8c05552ae2003/matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf", size = 9670966, upload-time = "2026-04-24T00:12:32.131Z" }, + { url = "https://files.pythonhosted.org/packages/04/a1/4571fc46e7702de8d0c2dc54ad1b2f8e29328dea3ee90831181f7353d93c/matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6", size = 8217462, upload-time = "2026-04-24T00:12:35.226Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d0/2269edb12aa30c13c8bcc9382892e39943ce1d28aab4ec296e0381798e81/matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42", size = 8136688, upload-time = "2026-04-24T00:12:37.442Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d3/8d4f6afbecb49fc04e060a57c0fce39ea51cc163a6bd87303ccd698e4fa6/matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f", size = 8320331, upload-time = "2026-04-24T00:12:39.688Z" }, + { url = "https://files.pythonhosted.org/packages/63/d9/9e14bc7564bf92d5ffa801ae5fac819ce74b925dfb55e3ebde61a3bbad3e/matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e", size = 8216461, upload-time = "2026-04-24T00:12:42.494Z" }, + { url = "https://files.pythonhosted.org/packages/8a/17/4402d0d14ccf1dfc70932600b68097fbbf9c898a4871d2cbbe79c7801a32/matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f", size = 8790091, upload-time = "2026-04-24T00:12:44.789Z" }, + { url = "https://files.pythonhosted.org/packages/3e/0b/322aeec06dd9b91411f92028b37d447342770a24392aa4813e317064dad5/matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838", size = 9605027, upload-time = "2026-04-24T00:12:47.583Z" }, + { url = "https://files.pythonhosted.org/packages/74/88/5f13482f55e7b00bcfc09838b093c2456e1379978d2a146844aae05350ad/matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2", size = 9671269, upload-time = "2026-04-24T00:12:50.878Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/0840fd2f93da988ec660b8ad1984abe9f25d2aed22a5e394ff1c68c88307/matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921", size = 8217588, upload-time = "2026-04-24T00:12:53.784Z" }, + { url = "https://files.pythonhosted.org/packages/47/b9/d706d06dd605c49b9f83a2aed8c13e3e5db70697d7a80b7e3d7915de6b17/matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8", size = 8136913, upload-time = "2026-04-24T00:12:56.501Z" }, + { url = "https://files.pythonhosted.org/packages/9b/45/6e32d96978264c8ca8c4b1010adb955a1a49cfaf314e212bbc8908f04a61/matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9", size = 8368019, upload-time = "2026-04-24T00:12:58.896Z" }, + { url = "https://files.pythonhosted.org/packages/86/0a/c8e3d3bba245f0f7fc424937f8ff7ef77291a36af3edb97ccd78aa93d84f/matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4", size = 8264645, upload-time = "2026-04-24T00:13:01.406Z" }, + { url = "https://files.pythonhosted.org/packages/3d/aa/5bf5a14fe4fed73a4209a155606f8096ff797aad89c6c35179026571133e/matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc", size = 8802194, upload-time = "2026-04-24T00:13:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5e/b4be852d6bba6fd15893fadf91ff26ae49cb91aac789e95dde9d342e664f/matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99", size = 9622684, upload-time = "2026-04-24T00:13:06.647Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/ed428c971139112ef730f62770654d609467346d09d4b62617e1afd68a5a/matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d", size = 9680790, upload-time = "2026-04-24T00:13:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/e7/09/052e884aaf2b985c63cb79f715f1d5b6a3eaa7de78f6a52b9dbc077d5b53/matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8", size = 8287571, upload-time = "2026-04-24T00:13:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/f4/38/ae27288e788c35a4250491422f3db7750366fc8c97d6f36fbdecfc1f5518/matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38", size = 8188292, upload-time = "2026-04-24T00:13:15.546Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e6/3bd8afd04949f02eabc1c17115ea5255e19cacd4d06fc5abdde4eeb0052c/matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d", size = 8321276, upload-time = "2026-04-24T00:13:18.318Z" }, + { url = "https://files.pythonhosted.org/packages/41/86/86231232fff41c9f8e4a1a7d7a597d349a02527109c3af7d618366122139/matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f", size = 8218218, upload-time = "2026-04-24T00:13:20.974Z" }, + { url = "https://files.pythonhosted.org/packages/85/8f/becc9722cafc64f5d2eb0b7c1bf5f585271c618a45dbd8fabeb021f898b6/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b", size = 9608145, upload-time = "2026-04-24T00:13:23.228Z" }, + { url = "https://files.pythonhosted.org/packages/32/5d/f7e914f7d9325abff4057cee62c0fa70263683189f774473cbfb534cd13b/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2", size = 9885085, upload-time = "2026-04-24T00:13:25.849Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fd/fa69f2221534e80cc5772ac2b7d222011a2acafc2ec7216d5dd174c864ae/matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716", size = 9672358, upload-time = "2026-04-24T00:13:28.906Z" }, + { url = "https://files.pythonhosted.org/packages/ab/1a/5a4f747a8b271cbb024946d2dd3c913ab5032ba430626f8c3528ada96b4b/matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f", size = 8349970, upload-time = "2026-04-24T00:13:31.904Z" }, + { url = "https://files.pythonhosted.org/packages/64/dc/95d60ecaefe30680a154b52ea96ab4b0dab547f1fd6aa12f5fb655e89cae/matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456", size = 8272785, upload-time = "2026-04-24T00:13:34.511Z" }, + { url = "https://files.pythonhosted.org/packages/70/a0/005d68bc8b8418300ce6591f18586910a8526806e2ab663933d9f20a41e9/matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe", size = 8367999, upload-time = "2026-04-24T00:13:36.962Z" }, + { url = "https://files.pythonhosted.org/packages/22/05/1236cc9290be70b2498af20ca348add76e3fffe7f67b477db5133a84f3ea/matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6", size = 8264543, upload-time = "2026-04-24T00:13:39.851Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c2/071f5a5ff6c5bd63aaaf2f45c811d9bf2ced94bde188d9e1a519e21d0cba/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c", size = 9622800, upload-time = "2026-04-24T00:13:42.296Z" }, + { url = "https://files.pythonhosted.org/packages/95/57/da7d1f10a85624b9e7db68e069dd94e58dc41dbf9463c5921632ecbe3661/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4", size = 9888561, upload-time = "2026-04-24T00:13:45.026Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/ef8d6bb59b0edb6c16c968b70f548aa13b54348972def5aa6ac85df67145/matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf", size = 9680884, upload-time = "2026-04-24T00:13:48.066Z" }, + { url = "https://files.pythonhosted.org/packages/61/1c/d21bfeb9931881ebe96bcfcff27c7ae4b160ae0ec291a714c42641a56d75/matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39", size = 8432333, upload-time = "2026-04-24T00:13:51.008Z" }, + { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785, upload-time = "2026-04-24T00:13:53.633Z" }, + { url = "https://files.pythonhosted.org/packages/63/e2/9f66ca6a651a52abfe0d4964ce01439ed34f3f1e119de10ff3a07f403043/matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20", size = 8304420, upload-time = "2026-04-24T00:14:04.57Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e8/467c03568218792906aa87b5e7bb379b605e056ed0c74fe00c051786d925/matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba", size = 8197981, upload-time = "2026-04-24T00:14:07.233Z" }, + { url = "https://files.pythonhosted.org/packages/6f/87/afead29192170917537934c6aff4b008c805fff7b1ccea0c79120d96beda/matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4", size = 8774002, upload-time = "2026-04-24T00:14:09.816Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "mypy" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ast-serialize" }, + { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, + { name = "mypy-extensions" }, + { name = "pathspec" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", size = 3898359, upload-time = "2026-05-11T18:37:36.237Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", size = 14691685, upload-time = "2026-05-11T18:33:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", size = 13555165, upload-time = "2026-05-11T18:32:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", size = 13994376, upload-time = "2026-05-11T18:32:39.256Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", size = 14864618, upload-time = "2026-05-11T18:34:49.765Z" }, + { url = "https://files.pythonhosted.org/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", size = 15102063, upload-time = "2026-05-11T18:34:05.855Z" }, + { url = "https://files.pythonhosted.org/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", size = 11060564, upload-time = "2026-05-11T18:35:36.494Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", size = 9966983, upload-time = "2026-05-11T18:37:14.139Z" }, + { url = "https://files.pythonhosted.org/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", size = 14874381, upload-time = "2026-05-11T18:37:31.784Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", size = 13665501, upload-time = "2026-05-11T18:34:23.063Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", size = 14045750, upload-time = "2026-05-11T18:31:48.151Z" }, + { url = "https://files.pythonhosted.org/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", size = 15061630, upload-time = "2026-05-11T18:37:06.898Z" }, + { url = "https://files.pythonhosted.org/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", size = 15288831, upload-time = "2026-05-11T18:31:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", size = 11135228, upload-time = "2026-05-11T18:34:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/24/0a/6a12b9782ca0831a553192f351679f4548abc9d19a7cc93bb7feb02084c7/mypy-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:98ebb6589bb3b6d0c6f0c459d53ca55b8091fbc13d277c4041c885392e8195e8", size = 10040684, upload-time = "2026-05-11T18:36:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", size = 14852174, upload-time = "2026-05-11T18:31:38.929Z" }, + { url = "https://files.pythonhosted.org/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", size = 13651542, upload-time = "2026-05-11T18:36:04.636Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", size = 14033929, upload-time = "2026-05-11T18:35:55.742Z" }, + { url = "https://files.pythonhosted.org/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", size = 15039200, upload-time = "2026-05-11T18:33:10.281Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", size = 15272690, upload-time = "2026-05-11T18:32:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d7/9e90d2cf47100bea550ed2bc7b0d4de3a62181d84d5e37da0003e8462637/mypy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:767fe8c66dc3e01e19e1737d4c38ebefead16125e1b8e58ad421903b376f5c65", size = 11147435, upload-time = "2026-05-11T18:33:56.477Z" }, + { url = "https://files.pythonhosted.org/packages/ec/46/e5c449e858798e35ffc90946282a27c62a77be743fe17480e4977374eb91/mypy-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ecfe70d43775ab99562ab128ce49854a362044c9f894961f68f898c23cb7429d", size = 10035052, upload-time = "2026-05-11T18:32:30.049Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ca/b279a672e874aedd5498ae25f722dacc8aa86bbffb939b3f97cbb1cf6686/mypy-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7354c5a7f69d9345c3d6e69921d57088eea3ddeeb6b20d34c1b3855b02c36ec2", size = 14848422, upload-time = "2026-05-11T18:35:45.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/e6/3efe56c631d959b9b4454e208b0ac4b7f4f58b404c89f8bec7b49efdfc21/mypy-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:49890d4f76ac9e06ec117f9e09f3174da70a620a0c300953d8595c926e80947f", size = 13677374, upload-time = "2026-05-11T18:36:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/84/7f/8107ea87a44fd1f1b59882442f033c9c3488c127201b1d1d15f1cbd6022e/mypy-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:761be68e023ef5d94678772396a8af1220030f80837a3afd8d0aef3b419666f4", size = 14055743, upload-time = "2026-05-11T18:35:18.361Z" }, + { url = "https://files.pythonhosted.org/packages/51/4d/b6d34db183133b83761b9199a82d31557cdbb70a380d8c3b3438e11882a3/mypy-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c90345fc182dc363b891350457ec69c35140858538f38b4540845afcc32b1aef", size = 15020937, upload-time = "2026-05-11T18:34:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d7/f08360c691d758acb02f45022c34d98b92892f4ea756644e1000d4b9f3d8/mypy-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b84802e7b5a6daf1f5e15bc9fcd7ddae77be13981ffab037f1c67bb84d67d135", size = 15253371, upload-time = "2026-05-11T18:36:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/67/1b/09460a13719530a19bce27bd3bc8449e83569dd2ba7faf51c9c3c30c0b61/mypy-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:022c771234936ceac541ebaf836fe9e2abeb3f5e09aff21588fe543ff006fe21", size = 11326429, upload-time = "2026-05-11T18:34:13.526Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/75dbf0f82f7b6680340efc614af29dd0b3c17b8a4f1cd09b8bd2fd6bc814/mypy-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:498207db725cec88829a6a5c2fc771205fd043719ef98bc49aba8fb9fc4e6d57", size = 10218799, upload-time = "2026-05-11T18:32:23.491Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/caca04ed7d972fb6eb6dd1ccd6df1de5c38fae8c5b3dc1c4e8e0d85ee6b9/mypy-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d5e5cad0efeba72b93cd17490cc0d69c5ac9ca132994fe3fb0314808aeeb83e", size = 15923458, upload-time = "2026-05-11T18:35:28.64Z" }, + { url = "https://files.pythonhosted.org/packages/ed/52/2d90cbe49d014b13ed7ff337930c30bad35893fe38a1e4641e756bb62191/mypy-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff715050c127d724fd260a2e666e7747fdd83511c0c47d449d98238970aef780", size = 14757697, upload-time = "2026-05-11T18:36:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/ac/37/d98f4a14e081b238992d0ed96b6d39c7cc0148c9699eb71eaa68629665ea/mypy-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82208da9e09414d520e912d3e462d454854bed0810b71540bb016dcbca7308fd", size = 15405638, upload-time = "2026-05-11T18:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c2/15c46613b24a84fad2aea1248bf9619b99c2767ae9071fe224c179a0b7d4/mypy-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e79ebc1b904b84f0310dff7469655a9c36c7a68bddb37bdd42b67a332df61d08", size = 16215852, upload-time = "2026-05-11T18:32:50.296Z" }, + { url = "https://files.pythonhosted.org/packages/5c/90/9c16a57f482c76d25f6379762b56bbf65c711d8158cf271fb2802cfb0640/mypy-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e583edc957cfb0deb142079162ae826f58449b116c1d442f2d91c69d9fced081", size = 16452695, upload-time = "2026-05-11T18:33:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4c/215a4eeb63cacc5f17f516691ea7285d11e249802b942476bff15922a314/mypy-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b33b6cd332695bba180d55e717a79d3038e479a2c49cc5eb3d53603409b9a5d7", size = 12866622, upload-time = "2026-05-11T18:34:39.945Z" }, + { url = "https://files.pythonhosted.org/packages/4b/50/1043e1db5f455ffe4c9ab22747cd8ca2bc492b1e4f4e21b130a44ee2b217/mypy-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4f910fe825376a7b66ef7ca8c98e5a149e8cd64c19ae71d84047a74ee060d4e6", size = 10610798, upload-time = "2026-05-11T18:36:31.444Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", size = 2693302, upload-time = "2026-05-11T18:31:29.246Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "narwhals" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/a0/6198c56d42ef2f3c6ed0c42ba30dbcefdc86a91262d7d449010770ae085b/narwhals-2.21.2.tar.gz", hash = "sha256:5c5b2d0b47aef7c73ea412cfcbcd467f2f2d5be73e3c2ab19d78f4a97718790a", size = 632176, upload-time = "2026-05-16T08:49:08.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/77/928ea2e70641ca177a11140062cc5840d421795f2e82749d408d0cce900a/narwhals-2.21.2-py3-none-any.whl", hash = "sha256:7bb57c3700486039215455b9bf2d64261915cc0fd845cc30272d631df696b251", size = 451201, upload-time = "2026-05-16T08:49:05.536Z" }, +] + +[[package]] +name = "numba" +version = "0.65.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/c5/db2ac3685833d626c0dcae6bd2330cd68433e1fd248d15f70998160d3ad7/numba-0.65.1.tar.gz", hash = "sha256:19357146c32fe9ed25059ab915e8465fb13951cf6b0aace3826b76886373ab23", size = 2765600, upload-time = "2026-04-24T02:02:56.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/b3/650500c2eab4534d98e9166f4298e0f3c69c742afdf24e6eabccd1f16ad8/numba-0.65.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:7020d74b19cdb8cff16506542fdd510756e28c5e7f3bd0b7f574f0f42272fcd9", size = 2680563, upload-time = "2026-04-24T02:02:18.414Z" }, + { url = "https://files.pythonhosted.org/packages/44/0b/0615dbedb98f5b32a35a53290fbdc6e22306968109278d7e58df82d7a9f6/numba-0.65.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f80ed83774b5173abd6581cd8d2165d1d38e13d2e5c8155c0c0b421784745420", size = 3745018, upload-time = "2026-04-24T02:02:20.252Z" }, + { url = "https://files.pythonhosted.org/packages/49/aa/4361698f35bf63bff67dfe6c90493731177f48ede954f77b0588731537bc/numba-0.65.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7ed425a43b0a5f9772f2f4e2dd0bbd12eabecae1af0b24efcfd4e053f012aac6", size = 3450962, upload-time = "2026-04-24T02:02:22.449Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9a/af61ec03b3116c161fd7a06b9e8a265729a8718458333e8ffbb06d9a3978/numba-0.65.1-cp311-cp311-win_amd64.whl", hash = "sha256:df40a5028a975b9ea66f6a2a3f7abbdbd541a863070e34ed367aff21141248e4", size = 2747417, upload-time = "2026-04-24T02:02:24.43Z" }, + { url = "https://files.pythonhosted.org/packages/57/bc/76f8f8c5cf9adee47fdb7bbb03be8900f76f902d451d7477cf12b845e1de/numba-0.65.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:ac3f1e77c352dd0ea9712732c2d8f9ca507717435eec5b5013bf138ac33c4a08", size = 2681371, upload-time = "2026-04-24T02:02:26.105Z" }, + { url = "https://files.pythonhosted.org/packages/69/47/a415af0283e4db0398104c6d1c11c9861a98dc67a7aa442a7769ed5d6196/numba-0.65.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:52bc6f3ceb8fcaff9b2ae26b4c6b1e9fee39db8d355534c0fe4f39a901246b84", size = 3802467, upload-time = "2026-04-24T02:02:27.712Z" }, + { url = "https://files.pythonhosted.org/packages/46/36/246f73ec99cfeab2f2cb2ce7d4218766cc36a2da418901223f4f4da9c813/numba-0.65.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90ca10b3463bae0bd70589726fe3c77d01d6b5fc86bee54bcdf9fb6b47c28977", size = 3502628, upload-time = "2026-04-24T02:02:29.763Z" }, + { url = "https://files.pythonhosted.org/packages/db/9e/3c679b2ee078425b9e99a91e44f8d132a6830d8ccce5227bc5e9181aeed8/numba-0.65.1-cp312-cp312-win_amd64.whl", hash = "sha256:5971c632be2a2351500431f46213821dba8d02b18a9f7d02fd36bd2743e41a6a", size = 2750611, upload-time = "2026-04-24T02:02:31.477Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/14a4579049c1eb673afd0de0cb4842982acd55b9ce2643e763db858bcea0/numba-0.65.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1735c15c1134a5108b4d6a5c77fc0947924ea066a738dc09a52008c13df9cad3", size = 2681344, upload-time = "2026-04-24T02:02:33.65Z" }, + { url = "https://files.pythonhosted.org/packages/a0/22/b8d873f6466b20aa563fc9b33acd48dec89a07803ddaa2f1c8ca1cd33126/numba-0.65.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c09f49117ef255e1f1c6dad0c7a1ed39868243862a73be5706793241a3755f1b", size = 3810619, upload-time = "2026-04-24T02:02:36.041Z" }, + { url = "https://files.pythonhosted.org/packages/62/08/e16a8b5d9a018962ebb5c66be662317cde32b9f5dab08441f90bed5522fb/numba-0.65.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:594a8680b3fadac99e97e489b1fd89007177e5336713745c3b769528c635a464", size = 3509783, upload-time = "2026-04-24T02:02:38.245Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a5/03c970d57f4c1741354837353ce39fb5206952ae1dba8922d29c86f64805/numba-0.65.1-cp313-cp313-win_amd64.whl", hash = "sha256:85be74c0d036842699a30058f82fb88fc5ffdc59f7615cab5792ea92914c9b62", size = 2750534, upload-time = "2026-04-24T02:02:39.903Z" }, + { url = "https://files.pythonhosted.org/packages/4f/2e/8aed9b726d9ba5f11ad287645fd479e88278db3060a25cb1225d730eb2b7/numba-0.65.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:33f5eb68eb1c843511615d14663ce60258525d6a4c65ab040e2c2b0c4cf17450", size = 2681554, upload-time = "2026-04-24T02:02:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/87/96/f3eb235fafa82a34e2ab5dd7dc9ffff998ebf5f0bbc23fa56a96aeb44da6/numba-0.65.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:71e73029bf53a62cc6afcf96be4bd942290d8b4c55f0a454fb536158115790f7", size = 3779602, upload-time = "2026-04-24T02:02:43.726Z" }, + { url = "https://files.pythonhosted.org/packages/09/90/b0f09b48752d23640b8284f22aa597737e8adaddc7fbfacc4708b7f73a4c/numba-0.65.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a07635e0be926b9bdbffb09137c230fb13f6ec0e564914ba937cee12ce3eb35", size = 3479532, upload-time = "2026-04-24T02:02:45.427Z" }, + { url = "https://files.pythonhosted.org/packages/56/46/3f7fc04fb853559e74b210e0b62c19974ec844cefec611f9e535f4da3761/numba-0.65.1-cp314-cp314-win_amd64.whl", hash = "sha256:2a20fcdabdefbdacf88d85caf70c3b18c4bcb7ebb8f82e6a19486383dd26ab63", size = 2752637, upload-time = "2026-04-24T02:02:47.664Z" }, + { url = "https://files.pythonhosted.org/packages/81/7b/c1a341a9067367778f4152a5f01061cf281fb09582c92c510ec4918cabf6/numba-0.65.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:548dd4b3a4508d5062768d1514b2cd7b015f9a25ec7af651c50dee243965e652", size = 2684600, upload-time = "2026-04-24T02:02:49.653Z" }, + { url = "https://files.pythonhosted.org/packages/03/36/98ddbcf3e4f04a6dd07e1c67249955920579ba4af6bb6868e3088f4ed282/numba-0.65.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:78abc28feff2c2ff8307fff3975b6438352759c9acb797ecd6b1fb6e7e39e31d", size = 3817198, upload-time = "2026-04-24T02:02:51.266Z" }, + { url = "https://files.pythonhosted.org/packages/a3/83/0dad21057ece5a835599f5d24099b091703995e23dbbf894f259e91c010b/numba-0.65.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7676cb389555805f9b9a1840cbcd1ea6c8bd5376ab6918e3a29c5ea1dbda20", size = 3533862, upload-time = "2026-04-24T02:02:52.987Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/8be7118ffd4c8440881046eac3d0982cc5ab42909508cf5d67024d62a2e4/numba-0.65.1-cp314-cp314t-win_amd64.whl", hash = "sha256:20609346e3bd75204950dcbbfe383a8d7dbf4902f442aedbf00f97fef4aa8f38", size = 2758237, upload-time = "2026-04-24T02:02:54.612Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/2ccc6c2fe8898dee01d90c75c5f5f914a23daf99e3e0f59516a08760c8b5/numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91", size = 5961134, upload-time = "2026-05-18T23:34:55.618Z" }, + { url = "https://files.pythonhosted.org/packages/b5/cd/9cc4dc876fb065d5c220aae4d5e14826b2715331bb7618ce1fb07a679d99/numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359", size = 12318598, upload-time = "2026-05-18T23:34:58.928Z" }, + { url = "https://files.pythonhosted.org/packages/39/1e/c0bcba1f8694116485fe28fd1be698c278fcda4141c5b0e53a2aed8b12a8/numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778", size = 10222272, upload-time = "2026-05-18T23:35:02.167Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/8a/90/0ac3bc947217e66dec77e7cbc6a1979d1af70b6461b82f620d3bccd5e4c8/numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab", size = 6084971, upload-time = "2026-05-18T23:35:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/77/71/5673e351671a1d2bd6063b91b44f70c0affea7d1516fa7a6572941ba4aa1/numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75", size = 12458532, upload-time = "2026-05-18T23:35:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3f/88/19d3503c5046e688f049274b27a3ef3d771152fa80d3ba3d01a3dff61abe/numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd", size = 10291881, upload-time = "2026-05-18T23:35:35.465Z" }, + { url = "https://files.pythonhosted.org/packages/f8/91/3ab2044d05fd16d343c5ac2e69b127f1b2854040dd20b193257c78028bd3/numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079", size = 16683458, upload-time = "2026-05-18T23:35:38.353Z" }, + { url = "https://files.pythonhosted.org/packages/8e/62/764ce66fa4147ae6d73071a3abf804ffe606f174618697c571acdf26a7c9/numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7", size = 14704559, upload-time = "2026-05-18T23:35:42.14Z" }, + { url = "https://files.pythonhosted.org/packages/60/61/23f27c172f022e04025b7dc2367f4d63c1a398120607ec896228649a6f48/numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5", size = 5209716, upload-time = "2026-05-18T23:35:45.377Z" }, + { url = "https://files.pythonhosted.org/packages/03/71/21cf70dc6ea3e3acb95fc53a265b2fc248b981f0194ceb5b475271b8809d/numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096", size = 6543947, upload-time = "2026-05-18T23:35:47.926Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b4/298628d98c72b57e57f7165ae6a481a1deaf6f3c28262a6e4c739c275930/numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1", size = 6010196, upload-time = "2026-05-18T23:36:05.92Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/46de6dda46478f7942f839e094970be2d4a861e005c4b3bf07c92e291a09/numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261", size = 12450334, upload-time = "2026-05-18T23:36:09.107Z" }, + { url = "https://files.pythonhosted.org/packages/78/92/b8b798ac784102c0da830d2257d59358e3d3d90d1e2b3f2575dad976c5cf/numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6", size = 10495678, upload-time = "2026-05-18T23:36:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/30/34/ec28d1aa8115971537c01469ab2011ee96827930f0a124de1000cc2a7ed7/numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a", size = 14823672, upload-time = "2026-05-18T23:36:16.473Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/f6d1fede4e54e8042a7ff97bb495510f3c220f94bcd9e8b228e87c92cc0d/numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e", size = 5328731, upload-time = "2026-05-18T23:36:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/e105b9e2fd728a9910103884decd6951d9dd73896b914a98d9a231de02ee/numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e", size = 6649805, upload-time = "2026-05-18T23:36:22.266Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, + { url = "https://files.pythonhosted.org/packages/9c/50/0753655aa844c99cd9e018aacf76f130f1bd81d881bb74bc0aef5d73a8ba/numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063", size = 6156982, upload-time = "2026-05-18T23:36:40.817Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d4/7c67becf668f973cb490cec3e98dfd799d866f9c989a54d355672cfa0db6/numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627", size = 12638908, upload-time = "2026-05-18T23:36:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/43/bb/e1c71a4295b1b1d1393d50dbb4f2a36283c6859d9d3892e84f00ec5a91d5/numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66", size = 10565867, upload-time = "2026-05-18T23:36:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, +] + +[[package]] +name = "openai" +version = "2.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/12/cfa322c5f5dd8fa21aab9a7a8e979e7a11123800f86ca8d82eb68a83d213/openai-2.38.0.tar.gz", hash = "sha256:798694c6cf74145541fda94325b6f8f72d8e1fd0262cc137c8d728177a6a4ce3", size = 772764, upload-time = "2026-05-21T21:23:42.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/bf/ccff9be562e24207716d04ef9dc931c76aff0c89a7265da43e2104d7fe06/openai-2.38.0-py3-none-any.whl", hash = "sha256:ec6661c57b2dcc47414a767e6e3335c7ed3d19c9696999283a3c82e95c756a3c", size = 1344910, upload-time = "2026-05-21T21:23:39.636Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/16/b5c76b838fd9bf6ce84d3a53346b8874ec05c5f0040d75ef2c320100cd2a/pandas-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:455f6f8139d4282188f526868dbc3c828470e88a3d9d59a891bd46a455f21b98", size = 10338495, upload-time = "2026-05-11T18:52:11.558Z" }, + { url = "https://files.pythonhosted.org/packages/5a/b0/a4ffc4ae74d2d822200dcc46898987d8eb6032d1e2b219cae39da6f5cbcc/pandas-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e15135e2ee5df1063313e2425ceef8ac0f4ae775893815b0923651b806a5639", size = 9938250, upload-time = "2026-05-11T18:52:17.005Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b2/3323601a52caee42c019e370090ca4544b241437240ca04f786cce82b0cf/pandas-3.0.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f1f1752b8533ea03f7f39a9c15b1a058d067bb48f4748948e7a8691e0510f2", size = 10770558, upload-time = "2026-05-11T18:52:19.865Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/bbecd2f867b97abebe0f9b53d750f862251b40337e061b36676ded3d920f/pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1e45c80cceb3b4a21bc5939d52e8cbd8d9b7305309219d59e9754d9ce09e27", size = 11274611, upload-time = "2026-05-11T18:52:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/7f/4f/eafabf2d5fae5adf143b4d18d3706c5efdc368a7c4eb1ee8a3eddabbd0f6/pandas-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:14da8316da4d0c5a77618425996bfb1248ca87fc2c1486e6fde4652bd18b5824", size = 11784670, upload-time = "2026-05-11T18:52:25.4Z" }, + { url = "https://files.pythonhosted.org/packages/49/44/1eb20389301b57b19cc099a1c2f662501f72f08a65f912d05822613c1532/pandas-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a55066a0505dae0ba2b50a46637db34b46f9094c65c5d4800794ef6335010938", size = 12353708, upload-time = "2026-05-11T18:52:28.139Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/c321f13b5ba1819fc8dca456c7fce578da2dcfecff1abbf0eaddf8406c0f/pandas-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6674ab18ad8c57802867264b00e15e7bb904700cdd9046e3b2fa1fce237439ea", size = 9907609, upload-time = "2026-05-11T18:52:30.982Z" }, + { url = "https://files.pythonhosted.org/packages/53/85/1b7f563ebc6357c27233a02a96b589bcce1fa9c6eb89fb4f0e56421d277e/pandas-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:5cc09a68b3120e0f54870dede8287a7bb1fa463907e4fcec1ea77cab6179bf7a", size = 9165596, upload-time = "2026-05-11T18:52:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" }, + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/2c/20/559ace4200982c3887d0b86bfd0d856a2143ef8ddab63cc07934951a964c/pandas-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:a82d532a3351d435432cd913edbccaf8b8e01d4dd0e5ced5a8d2e8ecd94c7e44", size = 9757091, upload-time = "2026-05-11T18:53:16.306Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/69055a09fe200f29f922a3eeec4804611900b95f52d932ece3393c3c0c19/pandas-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:275c14e0fce14a2ec20eee474aecd305478ea3c1e6f6a9d8fe219a165542717e", size = 9057282, upload-time = "2026-05-11T18:53:18.768Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, + { url = "https://files.pythonhosted.org/packages/45/a4/865e0e510cae5fc2194de4db28be638952de942571ba9125934fd9c01d47/pandas-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:08d789b41f87e0905880e293cedf6197ce71fe67cc081358b1e148a491b9bd13", size = 10499958, upload-time = "2026-05-11T18:53:37.857Z" }, + { url = "https://files.pythonhosted.org/packages/86/54/effdcc3c0ff7a08037889200e148ebe94c16c4f653be078c7b3675955df1/pandas-3.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3650109c0f22879df8bd6179ab9ee3d7f1d1d4e7e0094a3f0032d9f51e2e64ac", size = 10336065, upload-time = "2026-05-11T18:53:41.099Z" }, + { url = "https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f", size = 9926101, upload-time = "2026-05-11T18:53:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/e35cf11c8a136e757b956f5f0efdcaa50aecde85ea055f1898dfc68262f3/pandas-3.0.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba7e08b9ac1d54569cd1e256e3668975ed624d6826f7b68df0342b012007bddb", size = 10457553, upload-time = "2026-05-11T18:53:46.394Z" }, + { url = "https://files.pythonhosted.org/packages/58/3b/1cdec6772bdbaf7b25dab360c59f03cadf05492dd724c6540af905389b07/pandas-3.0.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d71c63ae4ebdbf70209742096f1fc46a83a0613c99d4b23766cced9ff8cd62a", size = 10914065, upload-time = "2026-05-11T18:53:49.134Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c2/1ef644445fcd72e3627bceec77e3560636f87ddce4ed841afe76b83b5bf9/pandas-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360", size = 11459188, upload-time = "2026-05-11T18:53:52.527Z" }, + { url = "https://files.pythonhosted.org/packages/7e/49/4d8d4f42cbc9c4adc7a1870f269c02cbd6cd40d059622c06fb298addcbad/pandas-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:335f62418ed562cfc3c49e9e196375c28b729dcef8543abf4f9438e381bf3c76", size = 11982966, upload-time = "2026-05-11T18:53:55.043Z" }, + { url = "https://files.pythonhosted.org/packages/38/55/792619469bab9882d8bbd5865d45a72f6478762d04a9af4bf0d08c503e95/pandas-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:3c20a521bbb85902f79f7270c80a59e1b5452d96d170c034f207181870f97ac5", size = 9876755, upload-time = "2026-05-11T18:53:58.067Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/33c469653b0ba03b50c3a98192d4c07f0c75c66b263ceb097fce0ee97d31/pandas-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:a2d2dff8a04f3917b55ab3910c32990f8ddf7eceba114947838cefa976a68977", size = 9198658, upload-time = "2026-05-11T18:54:00.733Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fa/b8c257bd76b8bd060c3a9151c1fca05e9b9c5e3af5d0f549c0356f6d143d/pandas-3.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:0d589105b3c14645af1738ff279b2995102d8f7a03b0a66dc8d95550eb513e04", size = 10787242, upload-time = "2026-05-11T18:54:03.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/eb/f19206ffb0bf1919002969aa448b4702c6594845156a6f8050674855aac3/pandas-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:13fc1e853d9e04743d11ba75a985ccbc2a317fe07d8af61e445a6fd24dacd6a6", size = 10436369, upload-time = "2026-05-11T18:54:06.311Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/c7c39fb4fe22b71a0c2d78bf0c585c600092d85f94f086d2b3b2f6ca27e2/pandas-3.0.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:819959dab7bbd0049c15623fbac4e29a191b9528160a61fb1032242d8ced2d9c", size = 10358306, upload-time = "2026-05-11T18:54:09.085Z" }, + { url = "https://files.pythonhosted.org/packages/16/ec/dd2a9eb7fa1204df88c0864164e35b228ac581062ac612ba0a67fd812e4c/pandas-3.0.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:60ae316d3fd75d1858d450d0db0103ea2be3e7d4a95ec2f064f7e2ae63f7b028", size = 10758394, upload-time = "2026-05-11T18:54:11.956Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/00c61ea8e85b4f6d8d35e11852a1a4998fc7fafc91c6a602d1cc9c972d64/pandas-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd3a518890b400d32f9023722dc9a9a5c969f00b415419a3c06c043f09bb5d7d", size = 11375717, upload-time = "2026-05-11T18:54:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/31/89/8fc1c268969fac43688d65fd92e67df24bd128d53cb4d2eee534cd307399/pandas-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c39be2d709d01fa972a0cabc522389fceca4f3969332ba25a7d6c5802cf976a", size = 11828897, upload-time = "2026-05-11T18:54:17.146Z" }, + { url = "https://files.pythonhosted.org/packages/56/3b/e7d20dea247a3e6dc0bd8a6953854afbedc03951def4e7371e05e7263e25/pandas-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4db8c527972a821cf5286b40ccc57642a39bc62e62022b42f99f8a67fca8c3a1", size = 10900855, upload-time = "2026-05-11T18:54:19.72Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/68a0978d1ef8502b8492099beaa6e7a0c1b32e3b5d4f677f5810cb08711c/pandas-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b2c95f8bfc1ee412bf482605d7bfd30c12d1d26bd59fdd91efeef1d4718decb1", size = 9466464, upload-time = "2026-05-11T18:54:22.754Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, + { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, + { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, + { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, + { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, + { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, + { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, +] + +[[package]] +name = "plotly" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "narwhals" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/7f/0f100df1172aadf88a929a9dbb902656b0880ba4b960fe5224867159d8f4/plotly-6.7.0.tar.gz", hash = "sha256:45eea0ff27e2a23ccd62776f77eb43aa1ca03df4192b76036e380bb479b892c6", size = 6911286, upload-time = "2026-04-09T20:36:45.738Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/ad/cba91b3bcf04073e4d1655a5c1710ef3f457f56f7d1b79dcc3d72f4dd912/plotly-6.7.0-py3-none-any.whl", hash = "sha256:ac8aca1c25c663a59b5b9140a549264a5badde2e057d79b8c772ae2920e32ff0", size = 9898444, upload-time = "2026-04-09T20:36:39.812Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "polars" +version = "1.40.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/8c/bc9bc948058348ed43117cecc3007cd608f395915dae8a00974579a5dab1/polars-1.40.1.tar.gz", hash = "sha256:ab2694134b137596b5a59bfd7b4c54ebbc9b59f9403127f18e32d363777552e8", size = 733574, upload-time = "2026-04-22T19:15:55.507Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/91/74fc60d94488685a92ac9d49d7ec55f3e91fe9b77942a6235a5fa7f249c3/polars-1.40.1-py3-none-any.whl", hash = "sha256:c0f861219d1319cdea45c4ce4d30355a47176b8f98dcedf95ea8269f131b8abd", size = 828723, upload-time = "2026-04-22T19:14:25.452Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.40.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ba/26d40f039be9f552b5fd7365a621bdfc0f8e912ef77094ae4693491b0bae/polars_runtime_32-1.40.1.tar.gz", hash = "sha256:37f3065615d1bf90d03b5326222df4c5c1f8a5d33e50470aa588e3465e6eb814", size = 2935843, upload-time = "2026-04-22T19:15:57.26Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/46/22c8af5eed68ac2eeb556e0fa3ca8a7b798e984ceff4450888f3b5ac61fd/polars_runtime_32-1.40.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b748ef652270cc49e9e69f99a035e0eb4d5f856d42bcd6ac4d9d80a40142aa1e", size = 52098755, upload-time = "2026-04-22T19:14:28.555Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/48599a38009ca60ff82a6f38c8a621ce3c0286aa7397c7d79e741bd9060e/polars_runtime_32-1.40.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:d249b3743e05986060cec0a7aaa542d020df6c6b876e556023a310efd581f9be", size = 46367542, upload-time = "2026-04-22T19:14:32.433Z" }, + { url = "https://files.pythonhosted.org/packages/43/e9/384bc069367a1a36ee31c13782c178dbd039b2b873b772d4a0fc23a2373d/polars_runtime_32-1.40.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5987b30e7aa1059d069498496e8dda35afd592b0ac3d46ed87e3ff8df1ad652c", size = 50252104, upload-time = "2026-04-22T19:14:35.945Z" }, + { url = "https://files.pythonhosted.org/packages/15/ef/7d57ceb0651af74194e97ed6583e148d352f03d696090221b8059cdfc90b/polars_runtime_32-1.40.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d7f42a8b3f16fc66002cc0f6516f7dd7653396886ae0ed362ab95c0b3408b59", size = 56250788, upload-time = "2026-04-22T19:14:39.743Z" }, + { url = "https://files.pythonhosted.org/packages/10/0f/e4b3ffc748827a14a474ec9c42e45c066050e440fec57e914091d9adda75/polars_runtime_32-1.40.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e5f7becc237a7ec9d9a10878dc8e54b73bbf4e2d94a2991c37d7a0b38590d8f9", size = 50432590, upload-time = "2026-04-22T19:14:43.388Z" }, + { url = "https://files.pythonhosted.org/packages/d9/0b/b8d95fbed869fa4caabe9c400e4210374913b376e925e96fdcfa9be6416b/polars_runtime_32-1.40.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:992d14cf191dde043d36fbdbc98a65e43fbc7e9a5024cecd45f838ac4988c1ee", size = 54155564, upload-time = "2026-04-22T19:14:47.239Z" }, + { url = "https://files.pythonhosted.org/packages/06/d9/d091d8fb5cbed5e9536adfed955c4c89987a4cc3b8e73ae4532402b91c74/polars_runtime_32-1.40.1-cp310-abi3-win_amd64.whl", hash = "sha256:f78bb2abd00101cbb23cc0cb068f7e36e081057a15d2ec2dde3dda280709f030", size = 51829755, upload-time = "2026-04-22T19:14:50.85Z" }, + { url = "https://files.pythonhosted.org/packages/65/ad/b33c3022a394f3eb55c3310597cec615412a8a33880055eee191d154a628/polars_runtime_32-1.40.1-cp310-abi3-win_arm64.whl", hash = "sha256:b5cbfaf6b085b420b4bfcbe24e8f665076d1cccfdb80c0484c02a023ce205537", size = 45822104, upload-time = "2026-04-22T19:14:54.192Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pyarrow" +version = "24.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", hash = "sha256:85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83", size = 1180261, upload-time = "2026-04-21T10:51:25.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/c9/a47ab7ece0d86cbe6678418a0fbd1ac4bb493b9184a3891dfa0e7f287ae0/pyarrow-24.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b0e131f880cda8d04e076cee175a46fc0e8bc8b65c99c6c09dff6669335fde74", size = 35068898, upload-time = "2026-04-21T10:46:36.599Z" }, + { url = "https://files.pythonhosted.org/packages/d1/bc/8db86617a9a58008acf8913d6fed68ea2a46acb6de928db28d724c891a68/pyarrow-24.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:1b2fe7f9a5566401a0ef2571f197eb92358925c1f0c8dba305d6e43ea0871bb3", size = 36679915, upload-time = "2026-04-21T10:46:42.602Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8e/fb178720400ef69db251eb4a9c3ccf4af269bc1feb5055529b8fc87170d1/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:0b3537c00fb8d384f15ac1e79b6eb6db04a16514c8c1d22e59a9b95c8ba42868", size = 45697931, upload-time = "2026-04-21T10:46:48.403Z" }, + { url = "https://files.pythonhosted.org/packages/f3/27/99c42abe8e21b44f4917f62631f3aa31404882a2c41d8a4cd5c110e13d52/pyarrow-24.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:14e31a3c9e35f1ab6356c6378f6f72830e6d2d5f1791df3774a7b097d18a6a1e", size = 48837449, upload-time = "2026-04-21T10:46:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/36/b6/333749e2666e9032891125bf9c691146e92901bece62030ac1430e2e7c88/pyarrow-24.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7d9a514e73bc42711e6a35aaccf3587c520024fe0a25d830a1a8a27c15f4f57", size = 49395949, upload-time = "2026-04-21T10:47:01.869Z" }, + { url = "https://files.pythonhosted.org/packages/17/25/c5201706a2dd374e8ba6ee3fd7a8c89fb7ffc16eed5217a91fd2bd7f7626/pyarrow-24.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b196eb3f931862af3fa84c2a253514d859c08e0d8fe020e07be12e75a5a9780c", size = 51912986, upload-time = "2026-04-21T10:47:09.872Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d2/4d1bbba65320b21a49678d6fbdc6ff7c649251359fdcfc03568c4136231d/pyarrow-24.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:35405aecb474e683fb36af650618fd5340ee5471fc65a21b36076a18bbc6c981", size = 27255371, upload-time = "2026-04-21T10:47:15.943Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a9/9686d9f07837f91f775e8932659192e02c74f9d8920524b480b85212cc68/pyarrow-24.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6233c9ed9ab9d1db47de57d9753256d9dcffbf42db341576099f0fd9f6bf4810", size = 34981559, upload-time = "2026-04-21T10:47:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/80/b6/0ddf0e9b6ead3474ab087ae598c76b031fc45532bf6a63f3a553440fb258/pyarrow-24.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:f7616236ec1bc2b15bfdec22a71ab38851c86f8f05ff64f379e1278cf20c634a", size = 36663654, upload-time = "2026-04-21T10:47:28.315Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3b/926382efe8ce27ba729071d3566ade6dfb86bdf112f366000196b2f5780a/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:1617043b99bd33e5318ae18eb2919af09c71322ef1ca46566cdafc6e6712fb66", size = 45679394, upload-time = "2026-04-21T10:47:34.821Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7a/829f7d9dfd37c207206081d6dad474d81dde29952401f07f2ba507814818/pyarrow-24.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6165461f55ef6314f026de6638d661188e3455d3ec49834556a0ebbdbace18bb", size = 48863122, upload-time = "2026-04-21T10:47:42.056Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e8/f88ce625fe8babaae64e8db2d417c7653adb3019b08aae85c5ed787dc816/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b13dedfe76a0ad2d1d859b0811b53827a4e9d93a0bcb05cf59333ab4980cc7e", size = 49376032, upload-time = "2026-04-21T10:47:48.967Z" }, + { url = "https://files.pythonhosted.org/packages/36/7a/82c363caa145fff88fb475da50d3bf52bb024f61917be5424c3392eaf878/pyarrow-24.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:25ea65d868eb04015cd18e6df2fbe98f07e5bda2abefabcb88fce39a947716f6", size = 51929490, upload-time = "2026-04-21T10:47:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/66/1c/e3e72c8014ad2743ca64a701652c733cc5cbcee15c0463a32a8c55518d9e/pyarrow-24.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:295f0a7f2e242dabd513737cf076007dc5b2d59237e3eca37b05c0c6446f3826", size = 27355660, upload-time = "2026-04-21T10:48:01.718Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a1abf004482026ddc17f4503db227787fa3cfe41ec5091ff20e4fea55e57/pyarrow-24.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:02b001b3ed4723caa44f6cd1af2d5c86aa2cf9971dacc2ffa55b21237713dfba", size = 34976759, upload-time = "2026-04-21T10:48:07.258Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4a/34f0a36d28a2dd32225301b79daad44e243dc1a2bb77d43b60749be255c4/pyarrow-24.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:04920d6a71aabd08a0417709efce97d45ea8e6fb733d9ca9ecffb13c67839f68", size = 36658471, upload-time = "2026-04-21T10:48:13.347Z" }, + { url = "https://files.pythonhosted.org/packages/1f/78/543b94712ae8bb1a6023bcc1acf1a740fbff8286747c289cd9468fced2a5/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a964266397740257f16f7bb2e4f08a0c81454004beab8ff59dd531b73610e9f2", size = 45675981, upload-time = "2026-04-21T10:48:20.201Z" }, + { url = "https://files.pythonhosted.org/packages/84/9f/8fb7c222b100d314137fa40ec050de56cd8c6d957d1cfff685ce72f15b17/pyarrow-24.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f066b179d68c413374294bc1735f68475457c933258df594443bb9d88ddc2a0", size = 48859172, upload-time = "2026-04-21T10:48:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d3/1ea72538e6c8b3b475ed78d1049a2c518e655761ea50fe1171fc855fcab7/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1183baeb14c5f587b1ec52831e665718ce632caab84b7cd6b85fd44f96114495", size = 49385733, upload-time = "2026-04-21T10:48:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/c3/be/c3d8b06a1ba35f2260f8e1f771abbee7d5e345c0937aab90675706b1690a/pyarrow-24.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:806f24b4085453c197a5078218d1ee08783ebbba271badd153d1ae22a3ee804f", size = 51934335, upload-time = "2026-04-21T10:48:42.099Z" }, + { url = "https://files.pythonhosted.org/packages/9c/62/89e07a1e7329d2cde3e3c6994ba0839a24977a2beda8be6005ea3d860b99/pyarrow-24.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:e4505fc6583f7b05ab854934896bcac8253b04ac1171a77dfb73efef92076d91", size = 27271748, upload-time = "2026-04-21T10:49:42.532Z" }, + { url = "https://files.pythonhosted.org/packages/17/1a/cff3a59f80b5b1658549d46611b67163f65e0664431c076ad728bf9d5af4/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:1a4e45017efbf115032e4475ee876d525e0e36c742214fbe405332480ecd6275", size = 35238554, upload-time = "2026-04-21T10:48:48.526Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/cce0f42a327bfef2c420fb6078a3eb834826e5d6697bf3009fe11d2ad051/pyarrow-24.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:7986f1fa71cee060ad00758bcc79d3a93bab8559bf978fab9e53472a2e25a17b", size = 36782301, upload-time = "2026-04-21T10:48:55.181Z" }, + { url = "https://files.pythonhosted.org/packages/2a/66/8e560d5ff6793ca29aca213c53eec0dd482dd46cb93b2819e5aab52e4252/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:d3e0b61e8efb24ed38898e5cdc5fffa9124be480008d401a1f8071500494ae42", size = 45721929, upload-time = "2026-04-21T10:49:03.676Z" }, + { url = "https://files.pythonhosted.org/packages/27/0c/a26e25505d030716e078d9f16eb74973cbf0b33b672884e9f9da1c83b871/pyarrow-24.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:55a3bc1e3df3b5567b7d27ef551b2283f0c68a5e86f1cd56abc569da4f31335b", size = 48825365, upload-time = "2026-04-21T10:49:11.714Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/771f9ecb0c65e73fe9dccdd1717901b9594f08c4515d000c7c62df573811/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:641f795b361874ac9da5294f8f443dfdbee355cf2bd9e3b8d97aaac2306b9b37", size = 49451819, upload-time = "2026-04-21T10:49:21.474Z" }, + { url = "https://files.pythonhosted.org/packages/48/da/61ae89a88732f5a785646f3ec6125dbb640fa98a540eb2b9889caa561403/pyarrow-24.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8adc8e6ce5fccf5dc707046ae4914fd537def529709cc0d285d37a7f9cd442ca", size = 51909252, upload-time = "2026-04-21T10:49:31.164Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1a/8dd5cafab7b66573fa91c03d06d213356ad4edd71813aa75e08ce2b3a844/pyarrow-24.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:9b18371ad2f44044b81a8d23bc2d8a9b6a6226dca775e8e16cfee640473d6c5d", size = 27388127, upload-time = "2026-04-21T10:49:37.334Z" }, + { url = "https://files.pythonhosted.org/packages/ad/80/d022a34ff05d2cbedd8ccf841fc1f532ecfa9eb5ed1711b56d0e0ea71fc9/pyarrow-24.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:1cc9057f0319e26333b357e17f3c2c022f1a83739b48a88b25bfd5fa2dc18838", size = 35007997, upload-time = "2026-04-21T10:49:48.796Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ff/f01485fda6f4e5d441afb8dd5e7681e4db18826c1e271852f5d3957d6a80/pyarrow-24.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e6f1278ee4785b6db21229374a1c9e54ec7c549de5d1efc9630b6207de7e170b", size = 36678720, upload-time = "2026-04-21T10:49:55.858Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c2/2d2d5fea814237923f71b36495211f20b43a1576f9a4d6da7e751a64ec6f/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:adbbedc55506cbdabb830890444fb856bfb0060c46c6f8026c6c2f2cf86ae795", size = 45741852, upload-time = "2026-04-21T10:50:04.624Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3a/28ba9c1c1ebdbb5f1b94dfebb46f207e52e6a554b7fe4132540fde29a3a0/pyarrow-24.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:ae8a1145af31d903fa9bb166824d7abe9b4681a000b0159c9fb99c11bc11ad26", size = 48889852, upload-time = "2026-04-21T10:50:12.293Z" }, + { url = "https://files.pythonhosted.org/packages/df/51/4a389acfd31dca009f8fb82d7f510bb4130f2b3a8e18cf00194d0687d8ac/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d7027eba1df3b2069e2e8d80f644fa0918b68c46432af3d088ddd390d063ecde", size = 49445207, upload-time = "2026-04-21T10:50:20.677Z" }, + { url = "https://files.pythonhosted.org/packages/19/4b/0bab2b23d2ae901b1b9a03c0efd4b2d070256f8ce3fc43f6e58c167b2081/pyarrow-24.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e56a1ffe9bf7b727432b89104cc0849c21582949dd7bdcb34f17b2001a351a76", size = 51954117, upload-time = "2026-04-21T10:50:29.14Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/f4e9145da0417b3d2c12035a8492b35ff4a3dbc653e614fcfb51d9dedb38/pyarrow-24.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:38be1808cdd068605b787e6ca9119b27eb275a0234e50212c3492331680c3b1e", size = 28001155, upload-time = "2026-04-21T10:51:22.337Z" }, + { url = "https://files.pythonhosted.org/packages/79/4f/46a49a63f43526da895b1a45bbb51d5baf8e4d77159f8528fc3e5490007f/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:418e48ce50a45a6a6c73c454677203a9c75c966cb1e92ca3370959185f197a05", size = 35250387, upload-time = "2026-04-21T10:50:35.552Z" }, + { url = "https://files.pythonhosted.org/packages/a0/da/d5e0cd5ef00796922404806d5f00325cdadc3441ce2c13fe7115f2df9a64/pyarrow-24.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:2f16197705a230a78270cdd4ea8a1d57e86b2fdcbc34a1f6aebc72e65c986f9a", size = 36797102, upload-time = "2026-04-21T10:50:42.417Z" }, + { url = "https://files.pythonhosted.org/packages/34/c7/5904145b0a593a05236c882933d439b5720f0a145381179063722fbfc123/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:fb24ac194bfc5e86839d7dcd52092ee31e5fe6733fe11f5e3b06ef0812b20072", size = 45745118, upload-time = "2026-04-21T10:50:49.324Z" }, + { url = "https://files.pythonhosted.org/packages/13/d3/cca42fe166d1c6e4d5b80e530b7949104d10e17508a90ae202dac205ce2a/pyarrow-24.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9700ebd9a51f5895ce75ff4ac4b3c47a7d4b42bc618be8e713e5d56bacf5f931", size = 48844765, upload-time = "2026-04-21T10:50:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/942c3b79878ba928324d1e17c274ed84581db8c0a749b24bcf4cbdf15bd3/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d8ddd2768da81d3ee08cfea9b597f4abb4e8e1dc8ae7e204b608d23a0d3ab699", size = 49471890, upload-time = "2026-04-21T10:51:02.439Z" }, + { url = "https://files.pythonhosted.org/packages/76/97/ff71431000a75d84135a1ace5ca4ba11726a231a8007bbb320a4c54075d5/pyarrow-24.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:61a3d7eaa97a14768b542f3d284dc6400dd2470d9f080708b13cd46b6ae18136", size = 51932250, upload-time = "2026-04-21T10:51:10.576Z" }, + { url = "https://files.pythonhosted.org/packages/51/be/6f79d55816d5c22557cf27533543d5d70dfe692adfbee4b99f2760674f38/pyarrow-24.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c91d00057f23b8d353039520dc3a6c09d8608164c692e9f59a175a42b2ae0c19", size = 28131282, upload-time = "2026-04-21T10:51:16.815Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", size = 235551, upload-time = "2026-05-08T13:40:06.542Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", size = 60964, upload-time = "2026-05-08T13:40:04.958Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/82/c8cd43a6e0719bf5a3b034f6726dd701f75829c08944c83d4b95d02ed0e8/python_multipart-0.0.30.tar.gz", hash = "sha256:0edfe0475c1f46ddd3ff7785a626f6118af32bdcf359bb21260367313bb32118", size = 46316, upload-time = "2026-05-31T19:24:55.198Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/fd/0318007beb234790993d3ec5afd051d1dbceb733e81e3afe2b981ece3f37/python_multipart-0.0.30-py3-none-any.whl", hash = "sha256:830964def8c90607ac5daa00514e3987815865713ade8d20febc9177ac0c3c5b", size = 29730, upload-time = "2026-05-31T19:24:53.814Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "regex" +version = "2026.5.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/0e/49aee608ad09480e7fd276898c99ec6192985fa331abe4eb3a986094490b/regex-2026.5.9.tar.gz", hash = "sha256:a8234aa23ec39894bfe4a3f1b85616a7032481964a13ac6fc9f10de4f6fca270", size = 416074, upload-time = "2026-05-09T23:15:19.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/dc/c1f2df4027e82fc54b5a473e4b250f5139faca49a0fbe29a48668d228f34/regex-2026.5.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ccf5249114cc3e772ecdd88a98a86eca0fd74c61ce32a94743758c083fc05d48", size = 489445, upload-time = "2026-05-09T23:12:06.111Z" }, + { url = "https://files.pythonhosted.org/packages/03/d2/59f01110660081cce9c0bc30ebd0b5ee250dacf658e3248ed92f01e0e8ee/regex-2026.5.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46f1326ca6e65b0879d23ca302c0f2415aad42ff0309b9c818e7949fe19a41d8", size = 291271, upload-time = "2026-05-09T23:12:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/58/b6/14b2c84ff90ddb370c81d27503f4a0fcf071496416f4855f6cc8c5d81c35/regex-2026.5.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef31cbfe458e21c6122ba8150ff060e0c7789ed0d26eb423f25472584920b555", size = 289212, upload-time = "2026-05-09T23:12:09.266Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/4db86529117320de0c84afd90e70bb47434625875e34fcef9d8c127c5b16/regex-2026.5.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:992604d02e6d9c6d786c24a706a71ecffe1020fc1ef264044474cd81fa2c3919", size = 792310, upload-time = "2026-05-09T23:12:11.416Z" }, + { url = "https://files.pythonhosted.org/packages/07/78/fe4800cd322f862ecffd2d553409b20d80650e5ed71b9d178f853d020b82/regex-2026.5.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9411dd64ca95477225734a93dfc8583b51916b8d5942f99d6cac21e09965451", size = 861721, upload-time = "2026-05-09T23:12:13.681Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d0/b3618a895dd8feb897c61bb2954edd265e1767d82a01d53065d5871127a3/regex-2026.5.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4a3ff360dfb836fecdb93a4598f9d6e2ac81e3e397125145c6221bf58cf4c", size = 906460, upload-time = "2026-05-09T23:12:15.443Z" }, + { url = "https://files.pythonhosted.org/packages/33/6f/1481597e859ef19508b345eec4afd1416ed6e6b459c75a64026ef193aecf/regex-2026.5.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a661a7d270a61f7cf460caee8b9fa2d5ef9e5c681234bcb9e0fe14f488e7dfc", size = 799843, upload-time = "2026-05-09T23:12:16.892Z" }, + { url = "https://files.pythonhosted.org/packages/73/59/955734c803f59108deccba3597ae440c76b62a652733c0006e6243758420/regex-2026.5.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f079e50a0d3cc3cd5091fa9ff45869a2e6b2cd35895731edafb0327901a8d86d", size = 773610, upload-time = "2026-05-09T23:12:19.127Z" }, + { url = "https://files.pythonhosted.org/packages/68/8f/70c04a236d651c81881dac42ef8538bddda6121434509d0a22d9e601503b/regex-2026.5.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ebe8f0b5ec5a5024dc4a4c59f444c4e9afc5f2abdbb8962065b75d27fb971f9", size = 781645, upload-time = "2026-05-09T23:12:20.806Z" }, + { url = "https://files.pythonhosted.org/packages/1d/96/05c7434d88185e5d27fe54aeb74df86bd77cd79f52f0b4eae54faa8fea70/regex-2026.5.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:97cf3bc1b7d7d2306772ec07366c80d9df00ff79e79cea32898883a646d2fae2", size = 854473, upload-time = "2026-05-09T23:12:22.465Z" }, + { url = "https://files.pythonhosted.org/packages/4e/c1/6e3d8202d981f3117004bf341ee74893ba4ba8a9fbaf4b94615846550a08/regex-2026.5.9-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0f9eede6a5cbdc02d4978090186390936e1776a7d1359b21e41014c609880bcf", size = 763311, upload-time = "2026-05-09T23:12:24.351Z" }, + { url = "https://files.pythonhosted.org/packages/93/c7/e7737f1526b3fb32bd4c337fd6c71c3ebb5c8296fc34d11197e0955d2e35/regex-2026.5.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:01f0f5f55f4b64dacec85dc116d3c05fd23ad3ff037bbc73a2085775953c2611", size = 844593, upload-time = "2026-05-09T23:12:26.341Z" }, + { url = "https://files.pythonhosted.org/packages/a5/27/0daffb1a535bb39f422c3d200f4ab023c71110ad66a32b366bee708baba0/regex-2026.5.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1268eddd8486dc561d08eee1156e40aa3a8fe10f4bdec8fa653b455fcbffd12c", size = 789167, upload-time = "2026-05-09T23:12:27.975Z" }, + { url = "https://files.pythonhosted.org/packages/ce/fc/294fe4fac4f2ed67207b17471815870c1c45b3a489e08e0ac96daea16ef6/regex-2026.5.9-cp311-cp311-win32.whl", hash = "sha256:8676474c07469d6f33dd1085ca2cd45f65785f32518f2b20e36d9953ca07f994", size = 266249, upload-time = "2026-05-09T23:12:30.141Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b0/8dce459f6245bcf8f6e9f23ac9569f1a0f15c131cc0745e82b43226204cf/regex-2026.5.9-cp311-cp311-win_amd64.whl", hash = "sha256:246de9d60aa3f8538b519834dd95cbf276ea263d6a7bd5a3666dc3fa0230505b", size = 278423, upload-time = "2026-05-09T23:12:31.676Z" }, + { url = "https://files.pythonhosted.org/packages/db/8d/f9aeff6ad63a3ef720386f2907e6d34a35a510a6e498ebad28b0fb3f6ab6/regex-2026.5.9-cp311-cp311-win_arm64.whl", hash = "sha256:d726ca3f0d76969bf1e8e477d160d3d666bbf999f6860bd314889e5345782046", size = 270420, upload-time = "2026-05-09T23:12:33.194Z" }, + { url = "https://files.pythonhosted.org/packages/50/9b/6550044bc44e17c84d312c031c2ec42fbdb6a4ec4e29093be3a172d08772/regex-2026.5.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06", size = 490451, upload-time = "2026-05-09T23:12:34.72Z" }, + { url = "https://files.pythonhosted.org/packages/1e/95/fc7ba4303b5a0f92446a12ee6778ef2c6c799233f5060042a31bf390cfe9/regex-2026.5.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:398c521292f4c7fb807001dcd54694d3a1fcafc179a36ad9cc56f98df85930b6", size = 292112, upload-time = "2026-05-09T23:12:36.285Z" }, + { url = "https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225", size = 289599, upload-time = "2026-05-09T23:12:38.089Z" }, + { url = "https://files.pythonhosted.org/packages/d8/dd/ba103dc19614e25f3880800ca67ce093d6e21b325d72b8383c7bf906e9fa/regex-2026.5.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0", size = 796732, upload-time = "2026-05-09T23:12:40.062Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e7/f035b4fd858b050b0080bf302968dc0f59ba34e391872d54936758e6844e/regex-2026.5.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107", size = 865440, upload-time = "2026-05-09T23:12:42.059Z" }, + { url = "https://files.pythonhosted.org/packages/0a/51/8cd301ecc899aea28124357f729f4272f44de7806fc7ca02490bfbe253e8/regex-2026.5.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309", size = 912329, upload-time = "2026-05-09T23:12:44.373Z" }, + { url = "https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8", size = 801239, upload-time = "2026-05-09T23:12:46.268Z" }, + { url = "https://files.pythonhosted.org/packages/17/2f/6f6008682bf2cf98040a0d3153a8e557b6ab728d7713d045cee4ce544ab8/regex-2026.5.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66", size = 777054, upload-time = "2026-05-09T23:12:48.051Z" }, + { url = "https://files.pythonhosted.org/packages/19/2b/eee0d20a6842ba04df4b8847a920b57ef56853f14ef85405473e586b605a/regex-2026.5.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026", size = 785098, upload-time = "2026-05-09T23:12:49.851Z" }, + { url = "https://files.pythonhosted.org/packages/4a/98/6fc1e6410feefb92159edaed5041992bfe390e8d26c721865434acbca558/regex-2026.5.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962", size = 860095, upload-time = "2026-05-09T23:12:51.666Z" }, + { url = "https://files.pythonhosted.org/packages/18/a3/bd855e0f2cb1a978ecf6fa6bb69632dd9c3f6ea3b81cde62fde14c9daec7/regex-2026.5.9-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621", size = 765762, upload-time = "2026-05-09T23:12:53.413Z" }, + { url = "https://files.pythonhosted.org/packages/dc/66/0ae8c092e60b14c79d24f8e0b7f0aea5bfbffdcab00b5483d13404d3c3a5/regex-2026.5.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d", size = 852100, upload-time = "2026-05-09T23:12:55.256Z" }, + { url = "https://files.pythonhosted.org/packages/21/de/8dfde60fc1b21c946a893ba273403b72617edb261370cb1087099a83f088/regex-2026.5.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce", size = 789479, upload-time = "2026-05-09T23:12:57.573Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1c/bdcc98f9a4af4fdd166c74941174619ccff4726d3ce32faa8e9a2ecd38dd/regex-2026.5.9-cp312-cp312-win32.whl", hash = "sha256:164eba9b755ea6f244b0d881196fbc1fac09714e9782c9e2732b813142033c8e", size = 266699, upload-time = "2026-05-09T23:12:59.14Z" }, + { url = "https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl", hash = "sha256:86f40a5d6444db30a125c9c9177e6b25dad981cbc37451fd838f145e6edac92e", size = 277783, upload-time = "2026-05-09T23:13:00.789Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b5/7b30f312b0669dff5beebe5b0989dc2d1a312b1a44fab852199c387a5b96/regex-2026.5.9-cp312-cp312-win_arm64.whl", hash = "sha256:96f5f58b54a063d7ea9dca08e1cf57bfe10499c4d579ee672da284f57f5f0070", size = 270513, upload-time = "2026-05-09T23:13:02.426Z" }, + { url = "https://files.pythonhosted.org/packages/aa/da/797e91ecec6f84135da778ddce78c20e0af5d2a15c26f87a81bc3eadb6db/regex-2026.5.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d626b84406444b165fc0ba981604edea39f0588ff1f92baa23fe50799ea9afdb", size = 490303, upload-time = "2026-05-09T23:13:04.382Z" }, + { url = "https://files.pythonhosted.org/packages/44/da/bf30abaaa737b58f4a4b8c4a03659e02fd92092c822e0197ed9e0daab917/regex-2026.5.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d7bdc0ab8f3dd7e1b4f9ab88634e13374669db86bb3c72e8292f07ae313f539f", size = 292019, upload-time = "2026-05-09T23:13:06.022Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e7/d0eaf5713828417b9e5648cf81fa9bacd4961f6ab98c380c2034f8716e35/regex-2026.5.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a8820737949116ffff55fe18f9fc644530063ba6ebfcb8314239416e78f1347c", size = 289468, upload-time = "2026-05-09T23:13:08.214Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9b/b3fdd62b003baa1a9b593cd8c8699c9651c2e80cc21a5c715707983c42d7/regex-2026.5.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0fbdbac82cb3e4450d0ccde7d7a35607f4cb2dd9fba4b8b69bfaf8c9fa6aed", size = 796749, upload-time = "2026-05-09T23:13:10.573Z" }, + { url = "https://files.pythonhosted.org/packages/d4/30/66ab84588765f5b4b271a9ca09ef7ce2b87caa95176ec3d2ad65d7bc4902/regex-2026.5.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57e8915c7986aa33d25e4d3629cef711cd2863f2961b10409f0c04cb8b7d9020", size = 865445, upload-time = "2026-05-09T23:13:12.523Z" }, + { url = "https://files.pythonhosted.org/packages/1a/89/f05169e8588aac365f35ffc7f3bc3184f095ef4cfded7cfaa3c7fd5dbd89/regex-2026.5.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508f56a89ba9cb26e4168cbc37dbd60a28d82430a9e18ad1d25fe0883c314ca2", size = 912322, upload-time = "2026-05-09T23:13:14.281Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/c93444052cf41581f3c884ab3fb5823daf0992f11cd4388d4275ca610558/regex-2026.5.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d189041f15691cfa2b6c4290448ec221244d225b3f5fe9e7771b34ffcdf6e2", size = 801269, upload-time = "2026-05-09T23:13:16.569Z" }, + { url = "https://files.pythonhosted.org/packages/50/fe/0cf96b882f540e62e8b9956599798203d599c44cf4c77917ca27400ff69b/regex-2026.5.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e82db382b44d0111b22601c509c89f64434816c9e0eef9d1989cda8cc6ff1c04", size = 777085, upload-time = "2026-05-09T23:13:18.675Z" }, + { url = "https://files.pythonhosted.org/packages/23/5c/d78d4924e7fc875557b9e9b768423925fdfaac5549d06da7810019a9bd26/regex-2026.5.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2acfb48634f64996b57f90f39afa692ff362162722581921fe92239a59960f3c", size = 785153, upload-time = "2026-05-09T23:13:20.525Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e0/5214774090e7b4524dcea3e3c4aa74141d43043f8beb49c1599db1c8b53a/regex-2026.5.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d29eebfc9525db68cad3c97eedd7f754fa265aa5cd0cf4f863b2421e1b48fc9f", size = 860164, upload-time = "2026-05-09T23:13:22.263Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e1/4a57a83350319b1271f0d7a249b8672513ed928b237a741631270de6caea/regex-2026.5.9-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:debb893095e944091c16e641a6e33c1b0f4cb61ab945ec5afbf53ce7068834d8", size = 765731, upload-time = "2026-05-09T23:13:24.277Z" }, + { url = "https://files.pythonhosted.org/packages/12/f4/499e74a20c156fc75836ee04a72a38d1a063978f600937f9760467beb1b0/regex-2026.5.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d659eee77986549c9ea45b861c7567e44d6287c3dc9a4565478853f7b9fe2ff6", size = 852062, upload-time = "2026-05-09T23:13:26.125Z" }, + { url = "https://files.pythonhosted.org/packages/5b/92/7eebc0d0a01e78629695f342ba17e0deaff8fb45e79cc0d7b98287da6e3e/regex-2026.5.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2efa205e6d98b24d1f3ab395c11aa15cdf10935bca283d0285e0499c284fba21", size = 789577, upload-time = "2026-05-09T23:13:27.814Z" }, + { url = "https://files.pythonhosted.org/packages/05/a4/018e71f7d2ad48c1ebe6d3ae0026f9b7cb4802fd15c7cc02fdf724355102/regex-2026.5.9-cp313-cp313-win32.whl", hash = "sha256:f3844f134e834076677dd369976e9f5068679fcb8e50102fdf6b7ac96a3ec127", size = 266691, upload-time = "2026-05-09T23:13:29.549Z" }, + { url = "https://files.pythonhosted.org/packages/e6/1d/861a93719fb9ee7dbfc3761b3797b7a3e112a5d42c6129459d2d741be9b5/regex-2026.5.9-cp313-cp313-win_amd64.whl", hash = "sha256:3527bb4942d2c14552155406cdedd906567456821848aed1cb4933a391bf5eca", size = 277747, upload-time = "2026-05-09T23:13:31.859Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c6/0a2436ae4da1ba76e51cb98943c6838a9a721faa40ebe2dce07694ae34e3/regex-2026.5.9-cp313-cp313-win_arm64.whl", hash = "sha256:56a33f191f17d8c417f99945ebdc1e691d3af9605d86ec68c7e54a57e3e17af6", size = 270500, upload-time = "2026-05-09T23:13:33.525Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e9/d21346f7b60ed58789371358ed66b09d00f832e1bd7c06e55d9da5679882/regex-2026.5.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:01f28d868834624c934b8d2e0aa1c8341337e37831f4a012f18a5afcba4cbaf3", size = 494172, upload-time = "2026-05-09T23:13:35.935Z" }, + { url = "https://files.pythonhosted.org/packages/c4/43/fd1177a2032037c681baecdb3422ee4e1424aec4e4f470ef47793d325274/regex-2026.5.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:48036f6374aaa79eb3b754ec29c61d1c6b1606749d705a13f8854fa2539671f6", size = 293952, upload-time = "2026-05-09T23:13:38.307Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7d/9fbf919768368d3f8a4f6c692cf2aa61e482b2b81ec6a298ace4cbf02480/regex-2026.5.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b96350aa424e79d4fd6b567b344dcbe2b2d6bfc48dfe7717587e1fa6d43da6ff", size = 292314, upload-time = "2026-05-09T23:13:40.353Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6c/e41bfeecb589716843e7c4df09ba46ff2a42961457afece19059d85caeef/regex-2026.5.9-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f3af7a4903c5c04a11a196a5aa75cdd7dd3f8508132f9fb3259d9f5908e3b88", size = 811681, upload-time = "2026-05-09T23:13:42.543Z" }, + { url = "https://files.pythonhosted.org/packages/87/83/a5c1c525fba0aa656e88ad0face0b1829788ef4c2fb6b26df58aa1151b84/regex-2026.5.9-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e87577720152d2caae19fe2baaf1f8d5ca12091e9e229f03915c37d1e4b9178", size = 871135, upload-time = "2026-05-09T23:13:44.326Z" }, + { url = "https://files.pythonhosted.org/packages/18/d4/80882e799e440dd878b0979cbebf8fa4d54624a332c83037c7a701649e3f/regex-2026.5.9-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c8b9b9d294cfea3cd19c718ade7cc93492b2c4991abd9a68d0b3477ae6d8e100", size = 917265, upload-time = "2026-05-09T23:13:47.295Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ff/8db60211e2286e396aad7dc7725356c502bff0901ea05bd6cdc2e1a042b9/regex-2026.5.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:728d8bfd28a8845c8b6bc5dc7ce010453d206396786c0765c2740cb65f37791e", size = 816311, upload-time = "2026-05-09T23:13:49.885Z" }, + { url = "https://files.pythonhosted.org/packages/4c/47/742ef579c61730f8d268e5cf1f9ce0e37e2ea041ad0f5644724f2378e463/regex-2026.5.9-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e30b874d341fac767d7df5a0870540541c2c054b80cfaac116e8d367a8a7ff2", size = 785498, upload-time = "2026-05-09T23:13:52.25Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ab/cb0999802dcb0fb95b1ab005e8d4163d8afdd67efc2cb6b6630ac13f8cb1/regex-2026.5.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fd190e88a895a8901325fad284a3f74ea52b1da8525b76cc811fa9b1edf0ce2b", size = 801348, upload-time = "2026-05-09T23:13:54.127Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/8ca59a24c55bc34d166eefaf3717bd77772f329fdbf984d86581e0a3571c/regex-2026.5.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:8e76e8161ad00694cfce6767d5dea860c6391ac5b83e5c3a39661e696f11fc7e", size = 866493, upload-time = "2026-05-09T23:13:56.067Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3d/30f2ae62cef3278bb5bb821f467277a55fb73f01032cf85997e15e8289a8/regex-2026.5.9-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ddda5340e6c01a293027dd46232fa79eaff1b48058ce7a98f572b6445b088041", size = 772811, upload-time = "2026-05-09T23:13:57.867Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ae/7d2089bcd78ad0c0161bc684339df50032acb438a7bd3305e7ddb1193cec/regex-2026.5.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:205109e96b3cf5adf8f4cd62bedde9487feb282b9497a3535451e5a24cd706a0", size = 856584, upload-time = "2026-05-09T23:13:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/a9/29/92ff47f75990131ea4f24ba17819e5a9d141e10819807e09addd73409af6/regex-2026.5.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbe4579b9f08036aa7d101d1835437a20783574ac66327e6b29b4018a138081", size = 803453, upload-time = "2026-05-09T23:14:01.978Z" }, + { url = "https://files.pythonhosted.org/packages/04/99/eff29f1037dcab36702c9ee5d6858cf1ce2336ea8ea2987f64245b99ea5e/regex-2026.5.9-cp313-cp313t-win32.whl", hash = "sha256:ed2c9e8068b614c574d8d30e543d617cf5379b0535d46f97ef00e904745a08b5", size = 269951, upload-time = "2026-05-09T23:14:03.661Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9d/8870b8981d27b22cda77bb26a5ac7ebfa9c7d9e0dea195a834a82380e748/regex-2026.5.9-cp313-cp313t-win_amd64.whl", hash = "sha256:b46b0f094dc1d3b90356c85a0bd2c9bafc4a6a190b9d6f8ddd5a033b6e088ed4", size = 281240, upload-time = "2026-05-09T23:14:05.56Z" }, + { url = "https://files.pythonhosted.org/packages/72/b1/3379415e8f135c13ac551353397cc4fe97b4978f3cac73c5fcbcded548b8/regex-2026.5.9-cp313-cp313t-win_arm64.whl", hash = "sha256:872acc074bd29ffc9913ecdfedf6ea77502312ca44a4aa0d3779089c6069d8de", size = 272383, upload-time = "2026-05-09T23:14:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/13/3e/9c3cd292d8808b3645a2ce517e200179b6d0e903f176300bd8b542e14de5/regex-2026.5.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:1bd7587a2948b4085195d5a3374eaf4a425dc3e55784c038175355ecf3bbbf8a", size = 490376, upload-time = "2026-05-09T23:14:09.64Z" }, + { url = "https://files.pythonhosted.org/packages/60/70/d43ee8a2ca0a8b68d167f21658b85520ac0574617c7f320367c5047f7556/regex-2026.5.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dea2e88e1cce4522496cce630e11e67b98b7076620bc4336c3f674bc21a375f4", size = 291964, upload-time = "2026-05-09T23:14:11.424Z" }, + { url = "https://files.pythonhosted.org/packages/21/91/9d50b433828d8e74196904e168a43abf1e6e88b2a15d47ed742456720c37/regex-2026.5.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2099f7e7ff7b6aa3192312650a56e91cc091e49d50b04e4f6f8b6e28b3b27f1c", size = 289682, upload-time = "2026-05-09T23:14:13.123Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/b835e3cafbb9d977736912436259ff551d60919f7d7b3d37d46659c63564/regex-2026.5.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecd353045824e4477562a2ac718c25799cdaaa41f7aa925a806a8a3e6848a5b9", size = 796996, upload-time = "2026-05-09T23:14:14.923Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a6/9f992d00019166b9de01c546dd4549bc679f2a68df11b877740b0760b7c2/regex-2026.5.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65c8c8c37377794bd5b2f3ebe51919042bf17aec802e23c833d89782ed0c78af", size = 866089, upload-time = "2026-05-09T23:14:17.757Z" }, + { url = "https://files.pythonhosted.org/packages/e0/08/4d32af657e049b19cb62b02e46e38fe1518797bfb2203ee93a510b21b0dc/regex-2026.5.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b73ab8afcf66c622db143d1c6fda4e58e4d537ee4f125229ad47b1ab80f34c0", size = 911530, upload-time = "2026-05-09T23:14:20.353Z" }, + { url = "https://files.pythonhosted.org/packages/d9/27/2af43dd1dc201d1fecefda64a45f4ad0995855b92724f795a777b402ee69/regex-2026.5.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0de5cf193997384ed2ca6f1cd4f78055b255d93d82d5a8cd6ba0d11c10b167e4", size = 800643, upload-time = "2026-05-09T23:14:22.265Z" }, + { url = "https://files.pythonhosted.org/packages/a4/dd/23a249047013b5321d4a60c4d2437462086f601b061776a525e5fba2a59f/regex-2026.5.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d641a8c9a61618047796d572a39a79b26167b0411d2c3031937b2fe2d081e2cf", size = 777223, upload-time = "2026-05-09T23:14:24.179Z" }, + { url = "https://files.pythonhosted.org/packages/94/6a/e85ed9538cd19586d0465076a4578a12e093ce776d15f3f8ce92733a8dd6/regex-2026.5.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:24b2355ef5cc9aa5b8f07d17704face1c166fdcc2290fa7bd6e6c925655a8346", size = 785760, upload-time = "2026-05-09T23:14:26.065Z" }, + { url = "https://files.pythonhosted.org/packages/2a/c4/f25473209438638e947c55f9156fd8f236f74169229028cc99116380868e/regex-2026.5.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a24852d3c29ad9e47593593d8a247c44ccc3d0548ef12c822d6ed0810affe676", size = 860891, upload-time = "2026-05-09T23:14:28.17Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f7/f4f86e3c74419c37370e91f150ae0c2ef7d34b2e0e4cdd5da046a02e4022/regex-2026.5.9-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:916714069da19329ef7de197dcbc77bb3104145c7c2c864dbfbe318f46b88b14", size = 765891, upload-time = "2026-05-09T23:14:30.06Z" }, + { url = "https://files.pythonhosted.org/packages/26/70/704d8e13765939146b1cd0ef4e2feb71d7929727d2290f026eed10095955/regex-2026.5.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:fa411799ca8da32a8d38d020a88faa5b6f91657d284761352940ecf9f7c3bbdd", size = 851380, upload-time = "2026-05-09T23:14:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/26/29/1a13582a8460038edc38e49f64ceb0dd7c60f5caba77571f4bf6601965d9/regex-2026.5.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e6da47d679b7010ef27556b6e0f99771b744936db1792a10ceac6547ae1503e", size = 789350, upload-time = "2026-05-09T23:14:34.799Z" }, + { url = "https://files.pythonhosted.org/packages/73/56/3dcafe34fc72e271d62ad9a291801e88a1457bb251c132f15fcc2e5aad1a/regex-2026.5.9-cp314-cp314-win32.whl", hash = "sha256:98bd73080e8756255137e1bd3f3f00295bbc5aa383c0e0f973920e9134d7c4ad", size = 272130, upload-time = "2026-05-09T23:14:36.729Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9c/02eebf0be95efe416c664db7fb8b6b05b7a0b06a7544f2884f2558b0526f/regex-2026.5.9-cp314-cp314-win_amd64.whl", hash = "sha256:ff8d372ac2acdc048d1c19916f27ee61bc5722728458ba6ca5052f2c72d51763", size = 280999, upload-time = "2026-05-09T23:14:39.126Z" }, + { url = "https://files.pythonhosted.org/packages/70/5a/1dd1abee76cb7a846a0bcf42fdc87e5720c3c33c24f3e37814310a513d9f/regex-2026.5.9-cp314-cp314-win_arm64.whl", hash = "sha256:e1d93bf647916292e8edcec150c07ddf3dc50179ccaf770c04a7f9e452155372", size = 273500, upload-time = "2026-05-09T23:14:41.059Z" }, + { url = "https://files.pythonhosted.org/packages/86/c1/c5f619b0057a7965cb78ec559c1d7a45ce8c99a35bea95483d64959a93d9/regex-2026.5.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:83d0ee4a57d1c87cb549e195ec300b8f0ec3a82eba66d835e4e2ed8634fe4499", size = 494269, upload-time = "2026-05-09T23:14:42.869Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/5d01f1aee33de4bbe60c8452945bfc8477ca7c5ae4450f6bfe711036cb36/regex-2026.5.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d3d7eb5c9a7f6df82ed3cfac9beb93882a5cbcb5b8b157b56cb2b3b276574ac1", size = 293954, upload-time = "2026-05-09T23:14:44.822Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fe/e8988b2ae2108c6ef71bd4aa8d87fbe257976dd0810e826cd75f701c68b6/regex-2026.5.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:075160bf16658e16d35233300b8453aac25de4cbea808d22348b6979668e924d", size = 292405, upload-time = "2026-05-09T23:14:47.211Z" }, + { url = "https://files.pythonhosted.org/packages/79/34/d2b0937faa7859263f7f0a3c6b103a1296306be6952dc173d0154e9a2f49/regex-2026.5.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45375819235558a4ff1c4971dc32881f022613abdb180128f5cb4768c1765a1c", size = 811855, upload-time = "2026-05-09T23:14:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/80/fe/daf53a47457a8486db66c66c01ceb9c2303eecee3f87197f1e77eb1a736d/regex-2026.5.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ead4b163ac30a29574510cd4b3e2e985ac5290c05fc7095557d6a5f403fc31b5", size = 871189, upload-time = "2026-05-09T23:14:51.555Z" }, + { url = "https://files.pythonhosted.org/packages/1c/75/058fc4470cbfbf57d800aff1a0022b929a3f9fa553ee10a0cdf2070eb31f/regex-2026.5.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c6e4218fbdfbcd4f6c19efca40930d24a621bf4b48cb76bc6640543bd28ef20", size = 917485, upload-time = "2026-05-09T23:14:53.633Z" }, + { url = "https://files.pythonhosted.org/packages/88/e7/179cfda3a28bc843b5c6cfe7f79f23489c791ed95f151083803660878432/regex-2026.5.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6351571c8a42b505eb555c0dc47d740d0fb66977dc142919eea6f4325b7c56a0", size = 816369, upload-time = "2026-05-09T23:14:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/41/90/6f0cc422071688266d344fca8462d787cba0a2c144acb25721f9a61ec265/regex-2026.5.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:002205cafd2a9e78c6290c7d1df277bf3277b3b7a30e0b4bb0dac2e2e3f7cb2d", size = 785869, upload-time = "2026-05-09T23:14:58.602Z" }, + { url = "https://files.pythonhosted.org/packages/02/67/a31f1760f09c27b251ef39e9beb541f462cf977381d067faa764c2c0e393/regex-2026.5.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8abd33fef90b2a9efac5557d6033ca82d1195ed3a15fea5af15ba7b463c6a63b", size = 801427, upload-time = "2026-05-09T23:15:00.642Z" }, + { url = "https://files.pythonhosted.org/packages/e3/c4/1a80654597b6bc1e1ea0494824c31200e8a956abe290afae9b19a166a148/regex-2026.5.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:31037c82eccb44b7ea2e9e221d7c01429430e989a1f4b91ea5a855f6017b509a", size = 866482, upload-time = "2026-05-09T23:15:03.384Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/960724e06482c08466ff5611e242e86f80062949cdf6b4b9cc317b9dd93d/regex-2026.5.9-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5604dfd046dc37eca90250fc3be938b076c8059fa772ac0ed6f499b0f0fb0415", size = 773022, upload-time = "2026-05-09T23:15:05.625Z" }, + { url = "https://files.pythonhosted.org/packages/50/a8/a9979c3e7918280e93159ebcab5ef1a65116dd4f3bd6091be0eae4a126e8/regex-2026.5.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e1b1b4e496afbb24f4a62aba855ee4f88f25578927697b340702e48c9ee6bc2", size = 856642, upload-time = "2026-05-09T23:15:07.966Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d4/a9b732f2f0072c0ab12227483abb24fffcb9f73f8a2b203df0a6d0434735/regex-2026.5.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:be3372b9df6ddecff6486d37e19095a7b4973137caf5512407a89f4455361f41", size = 803552, upload-time = "2026-05-09T23:15:10.215Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fe/1b3113817447a1d4155e4ac76d2e072f42c0bcba2f43fa8a0e756ea2cd91/regex-2026.5.9-cp314-cp314t-win32.whl", hash = "sha256:3ddd90103f9e5c471c49c7852ecc1fe27c7e45eb99e977aefe7caa4e779f4f58", size = 275746, upload-time = "2026-05-09T23:15:12.609Z" }, + { url = "https://files.pythonhosted.org/packages/92/73/93d42045302636c91f2e5ef588b65b84b01428f28ec77de256b1dfdfbe5c/regex-2026.5.9-cp314-cp314t-win_amd64.whl", hash = "sha256:ca518ed29c46eecba6010b15f1b9a479314d2de409536e71b6a13aa04e3b8a77", size = 285685, upload-time = "2026-05-09T23:15:15.086Z" }, + { url = "https://files.pythonhosted.org/packages/da/80/35b4c33c804a165a7f55289afda3ea9e3eb6d15800341a2d66455c0f1f30/regex-2026.5.9-cp314-cp314t-win_arm64.whl", hash = "sha256:5e41809d2683fcde7d5a8c87a6567ba1fb1ce0de9f31bff578de00a4b2d76daa", size = 275713, upload-time = "2026-05-09T23:15:16.98Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" }, + { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" }, + { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" }, + { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" }, + { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" }, +] + +[[package]] +name = "schedule" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/91/b525790063015759f34447d4cf9d2ccb52cdee0f1dd6ff8764e863bcb74c/schedule-1.2.2.tar.gz", hash = "sha256:15fe9c75fe5fd9b9627f3f19cc0ef1420508f9f9a46f45cd0769ef75ede5f0b7", size = 26452, upload-time = "2024-06-18T20:03:14.633Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/a7/84c96b61fd13205f2cafbe263cdb2745965974bdf3e0078f121dfeca5f02/schedule-1.2.2-py3-none-any.whl", hash = "sha256:5bef4a2a0183abf44046ae0d164cadcac21b1db011bdd8102e4a0c1e91e06a7d", size = 12220, upload-time = "2024-05-25T18:41:59.121Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/92/53ea2181da8ac6bf27170191028aee7251f8f841f8d3edbfdcaf2008fde9/scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da", size = 8595835, upload-time = "2025-12-10T07:07:39.385Z" }, + { url = "https://files.pythonhosted.org/packages/01/18/d154dc1638803adf987910cdd07097d9c526663a55666a97c124d09fb96a/scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1", size = 8080381, upload-time = "2025-12-10T07:07:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/44/226142fcb7b7101e64fdee5f49dbe6288d4c7af8abf593237b70fca080a4/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b", size = 8799632, upload-time = "2025-12-10T07:07:43.899Z" }, + { url = "https://files.pythonhosted.org/packages/36/4d/4a67f30778a45d542bbea5db2dbfa1e9e100bf9ba64aefe34215ba9f11f6/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1", size = 9103788, upload-time = "2025-12-10T07:07:45.982Z" }, + { url = "https://files.pythonhosted.org/packages/89/3c/45c352094cfa60050bcbb967b1faf246b22e93cb459f2f907b600f2ceda5/scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b", size = 8081706, upload-time = "2025-12-10T07:07:48.111Z" }, + { url = "https://files.pythonhosted.org/packages/3d/46/5416595bb395757f754feb20c3d776553a386b661658fb21b7c814e89efe/scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961", size = 7688451, upload-time = "2025-12-10T07:07:49.873Z" }, + { url = "https://files.pythonhosted.org/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", size = 8548242, upload-time = "2025-12-10T07:07:51.568Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", size = 8079075, upload-time = "2025-12-10T07:07:53.697Z" }, + { url = "https://files.pythonhosted.org/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", size = 8660492, upload-time = "2025-12-10T07:07:55.574Z" }, + { url = "https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", size = 8931904, upload-time = "2025-12-10T07:07:57.666Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c4/0ab22726a04ede56f689476b760f98f8f46607caecff993017ac1b64aa5d/scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809", size = 8019359, upload-time = "2025-12-10T07:07:59.838Z" }, + { url = "https://files.pythonhosted.org/packages/24/90/344a67811cfd561d7335c1b96ca21455e7e472d281c3c279c4d3f2300236/scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb", size = 7641898, upload-time = "2025-12-10T07:08:01.36Z" }, + { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" }, + { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", size = 7989409, upload-time = "2025-12-10T07:08:12.028Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", size = 7619760, upload-time = "2025-12-10T07:08:13.688Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" }, + { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", size = 8507994, upload-time = "2025-12-10T07:08:23.943Z" }, + { url = "https://files.pythonhosted.org/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", size = 7869518, upload-time = "2025-12-10T07:08:25.71Z" }, + { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" }, + { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, + { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/2b/58abc2d1fd397e7dde08e947e05c884d8ef2f78d5e2588c17a12d42d6994/sse_starlette-3.4.4.tar.gz", hash = "sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0", size = 31819, upload-time = "2026-05-12T17:37:17.019Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/67/805710444ea8cc75fbf70b920ed431a560c4bf9c57f7d5a3117213189399/sse_starlette-3.4.4-py3-none-any.whl", hash = "sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973", size = 16514, upload-time = "2026-05-12T17:37:15.601Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "starlette" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/a3/84e821cc54b4ab50ae6dbc6ac3800a651b65ec35f045cc73785380654057/starlette-1.0.1.tar.gz", hash = "sha256:512399c5f1de7fac99c88572212ded9ddeddef2fb32afa82d724000e88b38f4f", size = 2659596, upload-time = "2026-05-21T21:58:58.433Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/e1/b2df4bc09a1e51ff664c1e17018a4274b42e5e9352e4a478ea540512dc88/starlette-1.0.1-py3-none-any.whl", hash = "sha256:7c0e69b2ee1c848bd54669d908500117a3ee13de603a21427e5c6fc1adf98dcd", size = 72802, upload-time = "2026-05-21T21:58:56.551Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "tickflow" +version = "0.1.24" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/56/d911f7d03363a06f69838878df4f92dd01235c899431197f94fb4c0e36ad/tickflow-0.1.24.tar.gz", hash = "sha256:13f6464a9dd1bdf98a312bc8c313fcc24ad0ad83c16d4f83b76bee83df6e11df", size = 36867, upload-time = "2026-06-20T02:39:35.891Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/9d/6c03706054f3bcca8a7113a60258e1a52a762077a555d52a5a84e4f6895f/tickflow-0.1.24-py3-none-any.whl", hash = "sha256:e898867b0e3e668618135c78e3a367542f81b7a289567335d298c707452e5f42", size = 43031, upload-time = "2026-06-20T02:39:34.307Z" }, +] + +[package.optional-dependencies] +all = [ + { name = "pandas" }, + { name = "tqdm" }, + { name = "websockets" }, +] + +[[package]] +name = "stock-panel-backend" +version = "0.1.44" +source = { editable = "." } +dependencies = [ + { name = "apscheduler" }, + { name = "duckdb" }, + { name = "fastapi" }, + { name = "fastexcel" }, + { name = "httpx" }, + { name = "openai" }, + { name = "pandas" }, + { name = "polars" }, + { name = "pyarrow" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-dotenv" }, + { name = "python-multipart" }, + { name = "pyyaml" }, + { name = "sse-starlette" }, + { name = "tickflow", extra = ["all"] }, + { name = "uvicorn", extra = ["standard"] }, +] + +[package.optional-dependencies] +backtest = [ + { name = "vectorbt" }, +] +dev = [ + { name = "mypy" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "apscheduler", specifier = ">=3.10" }, + { name = "duckdb", specifier = ">=1.0" }, + { name = "fastapi", specifier = ">=0.115" }, + { name = "fastexcel", specifier = ">=0.10" }, + { name = "httpx", specifier = ">=0.27" }, + { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.10" }, + { name = "openai", specifier = ">=1.40" }, + { name = "pandas", specifier = ">=2.2" }, + { name = "polars", specifier = ">=1.0" }, + { name = "pyarrow", specifier = ">=16.0" }, + { name = "pydantic", specifier = ">=2.7" }, + { name = "pydantic-settings", specifier = ">=2.4" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23" }, + { name = "python-dotenv", specifier = ">=1.0" }, + { name = "python-multipart", specifier = ">=0.0.6" }, + { name = "pyyaml", specifier = ">=6.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.5" }, + { name = "sse-starlette", specifier = ">=2.0" }, + { name = "tickflow", extras = ["all"], specifier = ">=0.1.23" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.30" }, + { name = "vectorbt", marker = "extra == 'backtest'", specifier = ">=0.26" }, +] +provides-extras = ["backtest", "dev"] + +[[package]] +name = "tqdm" +version = "4.67.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/22/40f55b26baeab80c2d7b3f1db0682f8954e4617fee7d90ce634022ef05c6/traitlets-5.15.0.tar.gz", hash = "sha256:4fead733f81cf1c4c938e06f8ca4633896833c9d89eff878159457f4d4392971", size = 163197, upload-time = "2026-05-06T08:05:58.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/98/a9937a969d018a23badfea0b381f66783649d48e0ea6c41923265c3cbeb3/traitlets-5.15.0-py3-none-any.whl", hash = "sha256:fb36a18867a6803deab09f3c5e0fa81bb7b26a5c9e82501c9933f759166eff40", size = 85877, upload-time = "2026-05-06T08:05:55.853Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/b1/8e7077a8641086aea449e1b5752a570f1b5906c64e0a33cd6d93b63a066b/uvicorn-0.47.0.tar.gz", hash = "sha256:7c9a0ea1a9414106bbab7324609c162d8fa0cdcdcb703060987269d77c7bb533", size = 90582, upload-time = "2026-05-14T18:16:54.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/41/ac2dfdbc1f60c7af4f994c7a335cfa7040c01642b605d65f611cecc2a1e4/uvicorn-0.47.0-py3-none-any.whl", hash = "sha256:2c5715bc12d1892d84752049f400cd1c3cb018514967fdfeb97640443a6a9432", size = 71301, upload-time = "2026-05-14T18:16:51.762Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, + { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, +] + +[[package]] +name = "vectorbt" +version = "0.28.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dateparser" }, + { name = "dill" }, + { name = "imageio" }, + { name = "ipywidgets" }, + { name = "matplotlib" }, + { name = "mypy-extensions" }, + { name = "numba" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "plotly" }, + { name = "pytz" }, + { name = "requests" }, + { name = "schedule" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/a7/15e6af76aa8dafd18c7fae2068de889a385fd13eb804aacb8e0310765f1b/vectorbt-0.28.2.tar.gz", hash = "sha256:e1a5b7a11c0e2b5b271f18093cb7d1ea075d94d711388c0f423355e83c63c104", size = 487377, upload-time = "2025-12-12T16:18:12.818Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/b9/250f7a1d033618bd0e43ae40bc180aa88895c907876ca39e219a45caecca/vectorbt-0.28.2-py3-none-any.whl", hash = "sha256:93e5fb20d2ff072b7fed78603b516eb64f967c9bf9420ce8ba28329af0410e7d", size = 527808, upload-time = "2025-12-12T16:18:10.624Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/3d/8024c801df84d1587740d0359e7fdd80afeae3d159011f3d5376dd82f18e/watchfiles-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:704fd259e332e01f9b9c178f4bce9e49027e5587cc2600eeeaf8e76e1c846201", size = 400242, upload-time = "2026-05-18T04:31:19.014Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/f4dfd45323e949984a3a7f9dc31d1cbb049921e7d98253488dda72ccdaa9/watchfiles-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6543cf55d170003296d185c0af981f3e1311564907e1f4e08671fc7693a890a5", size = 394562, upload-time = "2026-05-18T04:30:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/19483ef075d601c409bce8bcbb5c0f81a10876fff870400568f08ce484a1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d8c2394a065ca86f5d2910ff263ae67c127e1376ccc4f9fc35c71db879f80a", size = 456611, upload-time = "2026-05-18T04:30:45.723Z" }, + { url = "https://files.pythonhosted.org/packages/b1/6a/cc81fbe7ee42f2f22e661a6e12def7807e01b14b2f39e0ff83fd373fd307/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:772b80df316480d894a0e3165fdd19cf77f5d17f9a787f94029465ad0e3529d1", size = 461379, upload-time = "2026-05-18T04:31:29.292Z" }, + { url = "https://files.pythonhosted.org/packages/b1/57/7e669002082c0a0f4fb5113bb70125f7110124b846b0a11bc5ae8e90eac1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d158cd89df6053823533e06fb1d73c549133bff5f0396170c0e53d9559340717", size = 493556, upload-time = "2026-05-18T04:30:05.44Z" }, + { url = "https://files.pythonhosted.org/packages/45/7d/f60a2b19807b21fe8281f3a8da4f59eef0d5f96825ac4680ba2d4f2ebf91/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d516b3283a758e087841aedb8031549fb41ced08f3db10aa6d2bf32dc042525b", size = 575255, upload-time = "2026-05-18T04:30:40.568Z" }, + { url = "https://files.pythonhosted.org/packages/bd/49/77f5b5e6efbcd57482f74948ebb1b97e5c0046d6b61475042d830c84b3ff/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53b2290c92e0506d102cd448fbc610d87079553f86caa39d67440856a8b8bba5", size = 467052, upload-time = "2026-05-18T04:31:17.942Z" }, + { url = "https://files.pythonhosted.org/packages/ee/5a/73e2959af1b97fd5d556f9a8bdba017be23ceeef731869d5eaa0a753d5a3/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a711b51aec4370d0dcda5b6c09463206f133a5759341d7744b953a7b62e1100e", size = 456858, upload-time = "2026-05-18T04:30:30.182Z" }, + { url = "https://files.pythonhosted.org/packages/50/57/1bc8c27fad7e6c19bddee15d276dbb6ab72480ec01c127afff1673aee417/watchfiles-1.2.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:e2ca07fa7d89195ec0865d3d285666286740bfa83d83e5cee204043a31ecc165", size = 467579, upload-time = "2026-05-18T04:32:15.897Z" }, + { url = "https://files.pythonhosted.org/packages/09/6c/3c2e44edba3553c5e3c3b8c8a2a6dee6b9e12ae2cf4bd2378bebf9dc3038/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0618518f282c4ebff60f5e5b1247b6d91bb8b9f4476947563a1e74acc66f3c6", size = 633253, upload-time = "2026-05-18T04:31:37.123Z" }, + { url = "https://files.pythonhosted.org/packages/30/c2/d8c84a882ab39bbefcc4915ab3e91830b7a7e990c5570b0b69075aba3faf/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d191c054d0715c3c95c99df9b8dbf6fd096d8c1e021e8f212e1bd8bc444ccb5", size = 660713, upload-time = "2026-05-18T04:31:24.62Z" }, + { url = "https://files.pythonhosted.org/packages/a9/07/f97736a5fc605364fe67b25e9fa4a6965dfd4840d50c406ada507e9d735f/watchfiles-1.2.0-cp311-cp311-win32.whl", hash = "sha256:9342472aff9b093c5acd4f6d8f70ae0937964ab56542502bcf5579782da69ae8", size = 277222, upload-time = "2026-05-18T04:31:21.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/99/2b04981977fc2608afd60360d928c6aecf6b950292ca221d98f4005f6694/watchfiles-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:dbd6c97045dad81227c8d040173da044c1de08de64a5ea8b555da4aee1d5fa22", size = 290274, upload-time = "2026-05-18T04:31:45.966Z" }, + { url = "https://files.pythonhosted.org/packages/3c/74/f7f58a7075ee9cf612b0cfcddb78b8cd8234f0742d6f0075cf0da2dde1c6/watchfiles-1.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:57a2d9fa4fb4c2ecae57b13dfff2c7ab53e21a2ba674fe9f05506680fcdcc0d7", size = 283460, upload-time = "2026-05-18T04:31:39.126Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2f/e42c992d2afda3108ea1c02acecc991b9f31d05c14adc2a7cee9ee211fc4/watchfiles-1.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bc13eb17538be00c874699dc0abe4ee2bc8d50bb1166a6b9e175ef3fd7eb8f26", size = 400115, upload-time = "2026-05-18T04:32:02.06Z" }, + { url = "https://files.pythonhosted.org/packages/5f/8f/6af2ea19065c91d8b0ea3516fdfc8c0d349f407e8e9fbf4e5a17360de8ad/watchfiles-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c", size = 393659, upload-time = "2026-05-18T04:30:50.951Z" }, + { url = "https://files.pythonhosted.org/packages/13/01/b32a967c56fb3e3e5be3db52c3d3b87fa4513aa367d8ed1ad96d42952e5f/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc", size = 453207, upload-time = "2026-05-18T04:31:04.231Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/97557a812180338cb1abd32e1cffcc4588f59b5f23e0cb006b2ba95ba64a/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0", size = 459273, upload-time = "2026-05-18T04:31:50.377Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a8/b4b08dcb7653b8087c6586f7ce649505900e866bbcfe40dc9587af02e686/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2581a94056e55d7d0a31a823ea92bf73749c489ca2285bfdc0fbe6b2bb49d50c", size = 489927, upload-time = "2026-05-18T04:31:42.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/3dceea03545d2e5ddfd839f0ddd5e1cecbf1697b5a428d5ba11cef6af95d/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01", size = 570476, upload-time = "2026-05-18T04:31:03.071Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f2/d39a5450c3532092b91f81d274360e613c2371bc874a89c7a1a3c5e8d138/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8", size = 465650, upload-time = "2026-05-18T04:30:12.701Z" }, + { url = "https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5", size = 456398, upload-time = "2026-05-18T04:30:13.784Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/982ef4a4e5bab5b6e5b6becc8cd5e732f6130a78b855f0abec6439a9a135/watchfiles-1.2.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d", size = 465140, upload-time = "2026-05-18T04:31:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0c/95282abf4ed680b6096010bcfc30c5fa7a041fc5aa5a2ad17a2cc6c75bba/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c", size = 630259, upload-time = "2026-05-18T04:31:25.676Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/607c1de1530c4bdcf2cf1d1ecc2505ddba5d96bd43ba9f2b0e79876f850f/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906", size = 659859, upload-time = "2026-05-18T04:30:24.333Z" }, + { url = "https://files.pythonhosted.org/packages/fa/08/d9e2e0f9e8e6791d33aefc694ad7eefa7f901f63caff84a81ded38692f9c/watchfiles-1.2.0-cp312-cp312-win32.whl", hash = "sha256:7a2cffd17d27d2ecbb310c2b1d8174f222a5495b1a721894afa88ec11e25b898", size = 275480, upload-time = "2026-05-18T04:30:31.307Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e6/9d42569c0102645cc8cea5d8c7d8a1e9d4ada2cb7f05f75e554b8aa2202a/watchfiles-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f155b3a1b2a5fc89cdc70d47ee5d54e3b75e88efa34982028a35daef9ba00379", size = 288718, upload-time = "2026-05-18T04:32:10.745Z" }, + { url = "https://files.pythonhosted.org/packages/0a/26/88e0dc6ee3898169d7fa22bb6a69cabf2502d2ee25cb8c876d1262d204f8/watchfiles-1.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fa585ede612ee9f9e91b18bebf9ba11b9ae29a4e3a0d0cf6fca3e382133f0d5", size = 281026, upload-time = "2026-05-18T04:30:22.23Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4d/70a7feced9f87e2ff26dba42667290f41694fc64646c67261fbb8cab5d5c/watchfiles-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:01ea8d66f0693b9b60a6541c8d10263091ca9a9060d242f3c1f3143f9aad2c98", size = 399730, upload-time = "2026-05-18T04:31:38.162Z" }, + { url = "https://files.pythonhosted.org/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", size = 392842, upload-time = "2026-05-18T04:30:27.051Z" }, + { url = "https://files.pythonhosted.org/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", size = 452989, upload-time = "2026-05-18T04:31:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", size = 458978, upload-time = "2026-05-18T04:30:52.606Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/7f9c07c433811c2fffd93e13fdfb7135de9aab5f2ae41be08960fa0047dc/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb4d80e212f116474a545c21c912b445f16bb0cef9e6a73a498164223e14e2f", size = 490248, upload-time = "2026-05-18T04:31:36.003Z" }, + { url = "https://files.pythonhosted.org/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", size = 571847, upload-time = "2026-05-18T04:31:10.862Z" }, + { url = "https://files.pythonhosted.org/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", size = 465974, upload-time = "2026-05-18T04:30:17.006Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", size = 454782, upload-time = "2026-05-18T04:30:35.656Z" }, + { url = "https://files.pythonhosted.org/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", size = 465182, upload-time = "2026-05-18T04:30:20.846Z" }, + { url = "https://files.pythonhosted.org/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", size = 629841, upload-time = "2026-05-18T04:31:05.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", size = 658028, upload-time = "2026-05-18T04:31:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/71/72/4508db1856d1d87fcbb3b63f4839bab1b5682cb0e8d224d122263c09654a/watchfiles-1.2.0-cp313-cp313-win32.whl", hash = "sha256:eb283ee99e21ad6443c8cdb06ac5b34b1308c329cbdf03fa02b445363714c799", size = 275183, upload-time = "2026-05-18T04:30:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/f9/36/14b76ca57652e5cc5fd1c11f32a261292c08a0d19a00351013c2549cbfb2/watchfiles-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a0f27f01bee51861392bb6b7c4fdb290b27d1eb194e9e28788d68102a0e898d9", size = 288059, upload-time = "2026-05-18T04:32:07.937Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8d/0a85e395398d8d20fadfe5c5d32c726eee17a519e78fb356f2cf7531bffe/watchfiles-1.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:3651aa7058595e9cfb75d35dd5ada2bf9f48a5b8a0f3562821d3e210c507e077", size = 280186, upload-time = "2026-05-18T04:31:54.484Z" }, + { url = "https://files.pythonhosted.org/packages/37/68/36db056f1fdcc5f07302f56e631774d6835bcd6fa3ace402304621d5f9e5/watchfiles-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:faea288b6f0ab1902ef08f4ca6de005dccf856c4e0c4f21b8c5fce02d90a1b08", size = 399031, upload-time = "2026-05-18T04:30:44.576Z" }, + { url = "https://files.pythonhosted.org/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", size = 391205, upload-time = "2026-05-18T04:30:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", size = 451892, upload-time = "2026-05-18T04:32:14.005Z" }, + { url = "https://files.pythonhosted.org/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", size = 458867, upload-time = "2026-05-18T04:31:22.279Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/9d09605187f1b838998624049fcf8bf47b73c1a3b76901fcac1782f62277/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22943b7770483f6ea0721c6b11d022947a98eb0acae14694de034f4d0d38925", size = 490217, upload-time = "2026-05-18T04:31:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", size = 571458, upload-time = "2026-05-18T04:32:11.875Z" }, + { url = "https://files.pythonhosted.org/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", size = 464707, upload-time = "2026-05-18T04:30:43.492Z" }, + { url = "https://files.pythonhosted.org/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", size = 454663, upload-time = "2026-05-18T04:30:16.061Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", size = 463537, upload-time = "2026-05-18T04:31:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", size = 629194, upload-time = "2026-05-18T04:31:14.141Z" }, + { url = "https://files.pythonhosted.org/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", size = 656194, upload-time = "2026-05-18T04:31:47.14Z" }, + { url = "https://files.pythonhosted.org/packages/e7/54/a9c7ea9a82a4ac65e7004c0a03920b5cdd2f9c3b678757d9cd425aa51d53/watchfiles-1.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8c8358484d5fa12ef34f05b7f4168eaf1932f408725ff6d023c33ec17bd79d4", size = 400205, upload-time = "2026-05-18T04:32:05.153Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5d/c9ab3534374a4a67450696905d6ef16a04405448b8dc52bd752ae50423d4/watchfiles-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f04b092229ad2c50126dd3c922c8822e51e605993764a33058d4a791ab42281", size = 392508, upload-time = "2026-05-18T04:30:54.849Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/1ad30103535cf0cecd7b993e8d50edc5351b1820e38f2d22e3df58962feb/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7ce236284f002a156f70add88efe5c70879cccbb658be0822c54b1306fc09d", size = 452448, upload-time = "2026-05-18T04:30:53.727Z" }, + { url = "https://files.pythonhosted.org/packages/37/a1/ceee2cdf2afbd715fa07758d39c9859513eae411b23196f7fd039e5feedd/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9909cc2b48468b575eefa944919e1fe8a36c5849d5c7c168f80a8c1db69398e", size = 459605, upload-time = "2026-05-18T04:30:23.312Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/421e30fd1cb3907a84ed92ab3f1983e37ba2dca015e9a894a048418417a2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a37faaed405c67e28e6be45a1fa4f206ef5a2860f27c237db9fa30704c38242", size = 490757, upload-time = "2026-05-18T04:30:47.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/55ed1b97ed08be7bba6f9a541cac15f2a858e1d74d2b07b6da70a82aab00/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9649193aa27bd9ff2e80ff29bfaa93085496c7a3a377592823cc58b77ee88add", size = 568672, upload-time = "2026-05-18T04:30:38.915Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/d8ae8a80dd7bafab395ea7681c10237311bbf34d37704a8c744e7cf31fc7/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4ff8e37f99cf1da89e255e07c9c4b37c214038c4283707bdec308cb1b0ea1f", size = 464197, upload-time = "2026-05-18T04:30:09.914Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8a/3076c496ca8dafe0e8cd03fcebdfc47be4b1174b4e5b24ff6e396e6b3af2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:054dc20fd2e3132b4c3883b4a00d72fd6e1f56fdaf89fccd12e8057d74cd74d7", size = 453181, upload-time = "2026-05-18T04:30:14.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/10/9745e17c98e7b8a86454df0a3c7b5686bd650383f1e9f26e4ebcbd6cc0c0/watchfiles-1.2.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e140ed30ebde76796b686e67c182cff10ea2fbab186fafd1560f74bb5a473a6e", size = 465109, upload-time = "2026-05-18T04:30:28.123Z" }, + { url = "https://files.pythonhosted.org/packages/8f/95/8ef4a95481d3e0cb52d62a06fa6e972e81424be2d9698b91a2fecca9904c/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bb7e52ecf68ba46d22df23467b87cffeb2146908aa523ebfe803019618cfda06", size = 630653, upload-time = "2026-05-18T04:31:49.304Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e4/3b3bf36b0f829b50c6ebcb8d031583863c59f923d6a6af3d485e470d0fac/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23282a321c8baf9b3a3c4afff673f9fe65eb7fdc2338d765ccad9d3d1916a5ba", size = 657838, upload-time = "2026-05-18T04:31:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/6cbbb50c1f3002ab568777d44aa21206dfb8807a840990c4037523b51812/watchfiles-1.2.0-cp314-cp314-win32.whl", hash = "sha256:c0db965c5f79aa49fe672d297cf1febc5ad149b658594944f49a54a2b96270a7", size = 275108, upload-time = "2026-05-18T04:30:06.891Z" }, + { url = "https://files.pythonhosted.org/packages/92/45/190ce6db8dcb4536682cf75d3889ff1a27182a58cb519d343cb6d9ea63d8/watchfiles-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:71283b39fd17e5408eb123bd37aeecfd9d54c81fc184421943208aadb879d103", size = 288441, upload-time = "2026-05-18T04:32:12.901Z" }, + { url = "https://files.pythonhosted.org/packages/74/0d/3eae1c2313ab08378431d907c3f8095ecca00f3eda33111cf4f0f2591799/watchfiles-1.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:c5c19526f4e54a00f2666a6c0e9e40d582c09e865055ea7378bf0009aab857b3", size = 280684, upload-time = "2026-05-18T04:31:26.902Z" }, + { url = "https://files.pythonhosted.org/packages/b1/75/fb64e6c25d6b5ca636d03df34ffb1c6e9873303e76d27967e045f8df088f/watchfiles-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d73a585accffa5ae39c17264c36ec3166d2fad7000c780f5ef83b2722afb9dd2", size = 398857, upload-time = "2026-05-18T04:32:17.108Z" }, + { url = "https://files.pythonhosted.org/packages/73/4e/9f7adf01754cbf81843722ccfec169d8f26c69778281a302855cecd2ee08/watchfiles-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae99b14c5f21e026e0e9d96f40e07d8570ebee6cafd9d8fc318354606daa7a28", size = 392413, upload-time = "2026-05-18T04:31:07.911Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/bec626bcc2d69f44b9acb24ce7d60ed7b16b73628eea747fcbd169d8edda/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429f3b105524a10b72c3a819b091c495d2811d419c1e1e8df773a5a5974f831", size = 452409, upload-time = "2026-05-18T04:31:20.142Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/b6362068e81e7c556d155a34c35d40ac3ef42d747b06d7f6e5bf58e359c2/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d818978d06062d9b22c4fab2ebe44cf5213d42dc8e62bda8c2760cfa2eeb33", size = 458827, upload-time = "2026-05-18T04:32:06.219Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/9a813fa42afb1e0b4625e75f0479826644d3ee8dc287e093799bc01f390c/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f732dc58b2dbe69e464ccf8fff7a03b0dd0be439da4c0720d3558527d3d6b4", size = 490104, upload-time = "2026-05-18T04:31:56.034Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bf/27dfb6094ca4c9aad21298b5525b6c53cb36121ee454331d05161e58d130/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f200104103feb097de4cab8fe4f5dd18a2026934c7dea98c55a2f5fd6d5a33b", size = 571360, upload-time = "2026-05-18T04:31:57.133Z" }, + { url = "https://files.pythonhosted.org/packages/fb/39/44a096d67270ea93df91d33877dbe91fbda3aa4f8ec2edf799d93eda8736/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ac26eefbf4af1741247d6fb68b11c49a25b2f7413fbd318a83a12aaa9cf666", size = 464644, upload-time = "2026-05-18T04:30:57.33Z" }, + { url = "https://files.pythonhosted.org/packages/0e/80/c7472203bad6268e3ef1ad260739704847898938ad7ea8b63a5131f46b50/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4997d4e4a55f0d02b6cde327322daf3a0400e5df6c6b15948994bf72497925", size = 454771, upload-time = "2026-05-18T04:30:48.736Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/3b10b268b4b7f0fc26e9debb5eef1998b515887840f444cd3ec80c688755/watchfiles-1.2.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4c887eba18b7945ac73067a8b4a66f21cd46c2539b2bc68588f7be6c7eb6d26b", size = 463494, upload-time = "2026-05-18T04:31:33.826Z" }, + { url = "https://files.pythonhosted.org/packages/3d/3e/a4302545cd589262a0dc7d140e86f7688eba3f9c72776c27f7e23b8864c4/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3416ff151bb6b5a8d8d11664974fbef4d9305b9b2957839ab5a270468fd8df30", size = 629383, upload-time = "2026-05-18T04:31:15.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/99/d5649df0a9a410d45b7c882304d0b790903ac9b6e8f2cfd12114e0c6b9f2/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:0e831a271c035d89789cffc386b6aa1375f39f1cd25eb7ca0997e4970d152fc5", size = 656093, upload-time = "2026-05-18T04:31:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/92/b9/362702539275019a54dd2e94511b31a9b89c5f9e6a21966de7eb692549fc/watchfiles-1.2.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:37a6721cdf3f65dbb13aa9503510ccb4451603ac837e44d265d7992a597e1374", size = 400109, upload-time = "2026-05-18T04:31:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/71d5ba62db781e5587bded1d944c675374bc4aa37ff33d5018d98e8b6538/watchfiles-1.2.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b37d10b5a63bd4d87e18472d80fa525bd670586fae62e5dd580452764879b65", size = 392167, upload-time = "2026-05-18T04:31:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/c66dd95d0423fe30d31820e2d1d5bda773764131bbb6ac0cb1cf303ac328/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a105bc2283f67e8fbec74253ec2d94925de92ed72c0393f1206bf326b7b7b69", size = 452372, upload-time = "2026-05-18T04:31:00.836Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/2fe99557e72f85627c6a8eed50d889e8d101623e060a22ad75b875cb932d/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5327989a465505f05cfe06f04fa9d0c2fd5432bb243e10e6f012b1bdca3c8579", size = 459596, upload-time = "2026-05-18T04:31:34.96Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/d4acfa0023367428ed48351b3b9b267893037b6cadae55620c61c24bcfd4/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecb47f183a8025b2aa18b546725c3657e542112ae9c0613a2af79b4fa8d04ad7", size = 490869, upload-time = "2026-05-18T04:31:59.923Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5f/3164cbdce06c9fb95c4f7b9e2f9760b5e2797af43a9ecc317ef42a23a278/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8520a4ab0e37f770afc34459c4f8f7019e153f9124dc101c15538365875d1ab2", size = 571641, upload-time = "2026-05-18T04:32:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/e6/85d3731c55e65cd7690f3f803d24c139588aaf863e4bf2148fe7a7fa1a19/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71cd71740ed2c15211ebb237ced4e39a1cdf6f80566e5fe95428da1626f4fde6", size = 464444, upload-time = "2026-05-18T04:30:34.298Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/562641012b8b09872742c3b8adf9629ec479fd78f8d68ae4a0c13da8add6/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f88af53d6ddaf72179ef613ddc905e6f4785f712b49b80b3bef9f3525e6194b4", size = 453593, upload-time = "2026-05-18T04:31:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/56/fe/cb8ef3d6f929d14158fdaaad9925985b7310abc9384dcd4d82dd0016fb59/watchfiles-1.2.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:cee9d5efd929efdac5f7e58f72b3376f676b64050a91c5b99a7094c5b2317488", size = 465096, upload-time = "2026-05-18T04:31:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/80908e835e100527a9267147b08c0eee1fa6ab0ffec15edc04d1d44885f7/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b718bf356bbc15e559bd8ef41782b573b8ae0e3f177ab244b440568d7ea02cfb", size = 630638, upload-time = "2026-05-18T04:30:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/95ab2f256bb4af3cb2eb23b9317bda984ee6e0f11733a5c004a6c95b06e3/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:922c0e019fe68b3ae392965a766b02a71ba1168c932cebc3733cd52c5fe5b377", size = 657684, upload-time = "2026-05-18T04:31:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/23/f4/7513ef1e85fc4c6331b59479d6d72661fc391fbe543678052ac72c8b6c19/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4674d49eb94706dfe666c069fc0a1b646ffcf920473492e209f6d5f60d3f0cc2", size = 403050, upload-time = "2026-05-18T04:30:36.753Z" }, + { url = "https://files.pythonhosted.org/packages/27/0b/a54103cfd732bb703c7a749222011a0483ef3705948dae3b203158601119/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:094b9b70103d4e963499bdea001ee3c2697b144cd9ae6218a62c0f89ec9e31db", size = 396629, upload-time = "2026-05-18T04:32:03.268Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2c/73f31a3b893886206c3f54d73e8ad8dee58cdb2f69ad2622e0a8a9e07f4e/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0ef001f8c25ad0fa9529f914c1600647ecd0f542d11c19b7894768c67b6acb7", size = 457318, upload-time = "2026-05-18T04:31:01.932Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f9/45d021e4a5cc7b9dd567f7cbb06d3b75f751a690063fb6cc7ec60f4e46b7/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0", size = 457771, upload-time = "2026-05-18T04:30:56.331Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" }, +] + +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, + { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..73dcb7d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,36 @@ +# Phase 0 单 service:FastAPI 启动后既跑 API 又托管前端 dist。 +# 见 ADR-17 / §8.1。 +services: + app: + build: + context: . + dockerfile: Dockerfile + target: runtime + args: + - PYTHON_IMAGE=${PYTHON_IMAGE:-python:3.11-slim} + - NODE_IMAGE=${NODE_IMAGE:-node:20-alpine} + container_name: Stock_Panel + ports: + - "3018:3018" + environment: + - ACCESS_UUID=${ACCESS_UUID:-} + volumes: + - ./data:/app/data + - ./tiers.yaml:/app/tiers.yaml:ro + restart: unless-stopped + + test: + build: + context: . + dockerfile: Dockerfile + target: test + args: + - PYTHON_IMAGE=${PYTHON_IMAGE:-python:3.11-slim} + - NODE_IMAGE=${NODE_IMAGE:-node:20-alpine} + container_name: Stock_Panel_Test + volumes: + - ./data:/app/data + - ./tiers.yaml:/app/tiers.yaml:ro + - ./backend/app:/app/app + - ./backend/tests:/app/tests + command: ["uv", "run", "pytest", "tests"] diff --git a/docs/screenshots/backtest.png b/docs/screenshots/backtest.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b55c8819881ced1d8be2c9031f965a397acda3 GIT binary patch literal 668676 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%0A>E&W+q@3}C|B;E-dN7p z)w-UkLrX`&pbB$4+ku4u6xP+(XS(9{n05az?3_pO;-C@Ozta{K4WzPX=jL9_J1K12 zcbu8UYv*KxfGG(IRA4T#w%!E#@bTHKr$RALUg6FN#QiXzF9?$)18uzD*=#!clT=Pl zPDDa6h(Y0m|C;iu9%pBoksR|&mW9PWxpZ=^(cl9Ym%5pWZA|nV;IRnia>KwtjUBn| z)({GWjElQ|xQGkU&{}|wF-J#3B_+S~vL}$ZbHf`v8KS7bugq#{n868yiIoua8E?+x zj4A~&H&V0>Z07hjC@U*?o$cH#%+(m2t}Ek(?*K*M{|aefa1bc+Dd{$VCehfIi9Jyr z0JIaujX1a(I9#ep-+Txt97H6<#4h)%^`Y;)ULPVl5nfKefDq7WBQ&XIz5)Dzk(sXn4;(Yqz`-d0^belwisP9(+tLy8G20b`F z1kMe=fri$z4NT(1L@cCNFP1{2nQm&!6(}+(P=BFFeKP+2{3r}QgG9uE(% zQl#qd>XKzYy*yF?03;mb{r9h(!wd7_-(MuXC6zDOTu)U$wh*u+HJVS$OGqF-4k}D4tJ?uT1qTrldeLarO@VnfHg?*dub#-8wktFcuNPFMgv*7tBL;huZJa?2Rm)?e=Ewg)Vx@Jt)OUP&-RhiP{B_t5v z>Yv_L1E8{X7OGTwA`%KWv0}=+z)ODP0NNIG<@l5h4dq7=sA8-1kK{R0O0vKi7?G^J zsA#WT@-~K=Y6T!&`DFI)ooBl!u(03=TW!VrNEHuYadGfT-+bhfz|@=> zuy?V-NJuQ0(z>6`bBeR1GGy}<3xEr`=3KzQQSl$b07J>N?EG$B2F&0N_%BP#SubQ# zxd?aXi!`cJd&d{fn-_Bjzb7O_Wn^bF8x3e;V`CeE03YM+iRiuO5a9H9JgNRY(}r%o z`lVp7S?7gFNbDcYfLPUU-TJz^os5i(hJD`=AW+vGT^s^%&;5K4V5u^v+l+zyFlE6d ze%VUG!ik#NZYQ~QIpSn7{s9l$dwXQ46QEf-dLQWfFj>r>#fm?LtgLt;Yuf^F=sW6h z0pWCRH|Xu{4L&{%tDO&!w@`>DpdOGAI5QYzu);dlO)s_?ks*CsHO%I34MIb|yV+@J zVIihUdn&5?lx&6VZF;~@9V~=hAJpe_aB%3?A;=6m0`_h#OTSD5a4C%qGn3qnKx^Id zB?bD3JXTNuFC_Z)*a85Hju)2Sn!N_k_wR^^OR3XJaym}W&%t(mak!|=)X@%t*3lU; z`%)XPK`Ud(yFW1LKi>~7GzkTqH`#MMg;IGukn!;WNqJVP`PDyAkQp)YfZQX<>wwWu z0dTT0*clm}V6E+Dz&|<~#OmgXii}*^*~yHKSRQq`y`;n>%%GvLzMQhrqoSfR?7wbW zD9_9~1l@^$yP}5b0?aM;yS`%y^|ty37!D-!3G<7RMAK?4sPzG`H_i9Oi@n+E<^x$~ zW@fNzkyNAoLWLp|ujPjqDhr$I>VzE}d|8hGP}IH11buqH1-4Mq_~+3un8U+P)Kt%~ zu#%MuJwYp~_@Bv_j|=Prs$Yh*$|U*s8O7%T>A%(l8Buj^5GfdfB;|?GUh4mrw=sy) zJgr3kZA^rfB1}epJBjIdD^`D26Tw-1+P&;ETevW5G2WAA!ju>rTWP!6hY7}cakb?% z1-b-kn0&r!Eennx|4RhU7f_Z+1g!UQnJolNkGBF*TA8r+9UQBoejNc3=5tuY=_ZR_ zz}8Wf_8Jx<;b44}4QzHA&u3DPIB0}ghFSpnCK4_#;g#_Ha&BPaV7*tdDzWZM#+Ma) zs#w?C%QPxIDst>g)aUAI_6#nAzURV%>l>-PefLA%5^GeJ0=|?d+&(p9Fs(Soub$~U5ppPpY>H)TLc({6(^C_r6CH;Gyz;4K%ykau9 z8X1WU0moc7D>fm0{WV}IfyKdLa_kHWyEBcSO9B4ZviW0-My9LB0s;|W1}gK2XUINz z;{S7ej6VXGRK%<+x?Q5OqUOcxgL<2jYY^*BO+~#)f9ZLBn!r5HtVpG#s-XADSTOsI zp&>d$!rpGN*gxg2na#o6Hi)AfWLcP)s7hif9v>b}Vztq#&5QvgBLynGl@9c?+U^sBT1G|y&G za~Xl#Nca3+kz|mdrsi)ud+R#L2mt;90>q4rjZxLx%gf!%*5H_@<%Ao>0MF;_cC%3X zmNG6FCLQ>$ft)MCMf1-qjN$${wSJ`2jMTem0a<)m!#Fs}Jv~=ew%RfKE?2c{!DR4$ z@><1kmg(NNDM_EenQCh+zp$>(zvmfPMo8Wq^=qK?oS?!zd--w@=xE^~MXIoN{dOMD z%e#w^DRYN>#W(m5BxD-{ORanWwViKpVJ6!+aP!*2mjWYZOXqt3Xpo6F_UFrWO@uJB zJk+jtD^tH>K#JAb##d|miWlC;$JJjz7^gNKt7WMF^A`|slu&%>fgD1r*Wph7hS~95 zlMq5Du#ox^sz@|?4q$vq2%N~3q+h~gEo2C|p-X^cBg{v~b2I2WqY;Z*;9AR+K~T>&z}vHov(C^DpJ0v;tS>pdIv z@jWwKPE}n=c|{^Uofj=igXMvXhX)TwoDWwuU9eW3Bhg{~iTmM%N>^k7ot}l;>pZk9By5|Sx>41Zr2M6@(#fc~* zSa8mP4d?PCVtQ}=wTJo@HeOysN@^;L*S+sM`ZteYsm&kd^;9rems&k~Xn`z4#gpTn z@-{{l{`fQkF4veS7o8SLH|UK^NWi>){v45mn3EF$Dk`?nZgQ`+SuJ(Dz{B|PnZ%F3 zyTAWV(2gKqP>6)rEBf{}=ySYE6VeW;P}KvP)lSqc_i@ZpfWNWGFgD`}TTQn1MmtPm}@& zj|~;7vUt#v(6|})eUT*+h7uwODCS6UgW0M(dV)`Zf<$T!Yn=eE0tV8(!>t+DZ|N!c z{=Kt`su0tW<~DTo^sE6iovfcI%_JO;TkdMv(E6{_Y?TF(9c|?B!^DK+8lfG68Tbkk zOpcPn9{OZ%&HzjWKyg473)BYhP}g8Sii^L2o<-bB)5Yu5+Gd0qacbduv|lPx71z{I zaB{wdB&BE(k;1+iiDt`#N*2gI#+w?g;_0~QG`aqK0!RC)*49PfU{X+MhWza4+QAo? zF*-PO_n{lC8w{=}#qY+9eK&Eb2{UnR+2KrBhcg@qzj$y}IJvBCZQ zv`kDDT`RR9%}QVVHAGM?^x1~b(*jl%?AvR?5vg}$%xqCnlN6{upt>+&>iGI{v_{hc z8X6fp7;a>R<{BKdqA*sQH%|QAA`N(ad_`EIqxb=DLXeQPGAh;G+B(pk4-2uev4KqE zb;&nUioibmXl1=_{}~?uubxAo@5@cceB{SVeHvKE{$TFtw;w`&{^7TGChqyN5BDDA zGO2>dZQuxpi?fFmtGof@ode#(PTWUnDUWGTE!%R^(>vYG==l0Pxx1@}K8lHLgHeyl z4b*$XAlpMrE9K?erjXFkm6PTu#Foby8SkBw)5&E0oIMcM<;}ep(If{Z84>9Nbyt>c zsG7f}Ev}jFGJ@Dyt`_D)7^R2pWtx8OW%_+k(94U%$&RFp-Py&iDH4*kbfVpkC2ztR zjzf~gnBH|@ga}r~!}+Z(X;C}Oli<7#k&u(e$H%+4RMS&9-@rA? z9Nr_6olF#WegBRjv^vAQJ2uYTl*Wk-kx71^116&;qhv9du<|-0~eByj){M$I2~H%6%P&(;D7bB<#?UfS5sRN z=%qK^T&oD}_B?`3ZmD@F0DKJGx!%!f5>x}wirb*)RG34j)-_5+@d>GssTm0s=z!kH?|eX)BSKW1hX;u0KgSN*e{%EugHrS(+Y zI}SOM%EfgMK2~?>ggfOW3!3-9v9iYIZPz(~eE^QgN=#fHI*5<+UeWhYt=mQKT`lqd zZj9G)$j`DxBAR6Ic-?Q;cH6OI4jGC!h!<*@^PoVsiML{Y-HrT(oz}aBT-T3 zxNoOVpwrVc^3XJNGzV_74Lt9@p&<-trut%ZWbMgEWy6l`pR4@KvzxWR{U=U&;x!%! z1zu;VdIbyf_Iy(BsQ^=1$vX{0C3kLw8^L1x& zq9nkElZ7RxiS-2}tE^0iIx)0;+Ax<~C(_v9G2?bqHoXJMDk-61Vz#dD7@OK4A%)Uw zBg%+6S2-VvmyxINsf@7_vUAq=tRGiYd`nLsR#vV806AKaAoMXOw!e3fydJcHC1}D! zC3Lj)4u=YdB>Vd*d;2MhSVBb09bslr%Vag9Zz~NY<;2hsux-CM+CH7s$z5#d-XArJ zEH9^4lZJ)3X2<+B=NjMnEu*Gs8gKn_*qx}Us{_SvGi#<#(eq=mtLtkT?S?=g)d7l5 z9^18{x!Myu+xwK8Bv8UeIvBjd;}Wc*QGH)(rs4%5!~01-^4kD*wV5tUTU}km*Zd56 z&rQe085tEIQ86*CddKpp-|f=XCgc9j)=s^OfTUD`pfS z1yNX+Nfcu|3@Ln)9cpW`A}q z%q_Y;!XF>Vfayem3Lh&DbR1yE<$wg|!*SjN6<#v8TaMboyGPXf@d*Ba_3qtk4-bJj zENtlaZ)w0Gg<`XUpxVo|ZsO4#kHrjM8Ns%7zzzWO#KlT82_Yd;2oQ}>q!?+iW^_kK z&Kfr|trT6F&Kne)548I!o$2}@m$|~)_UQPSl7{ATHNpdEXP)Hsf6@K?d1j;$4FZ3H zGR;_D{~4qojKHAdFRAP%u)X}pO{?w{@~)^*%#fWL!u}@O7A#Kcu)Vuou3EGbO{9f; zmzQT|VobzMORvhpr4^EidPi zNheR|+d0un(H_rp2L^?Q*3rfGR8%^E=0FAcp2DKr!;OYp_hr;zvS*%2h^T#Vn<*4 zq{~x&w(-3%1^4qAPy<>4QLL0?sMnQ2B_QRYZ{JX55*X$uCymbc)Bp#6cg+mc{LOb& z`3ts$KLCXB3X|b0;te220K1g-Ey8ho#82`k3`E(Tf3{H#hfvsPwy{5NIgmWP1|&)K zW#vj%&otpy;n ze>kV~p&AS2@)HVT*nYA3Tp$f5MOvrcu`#xi8PIQa7J~;VgKtw`(@n7?q=qBPN%A-tll$E6{G<`q@Fq7#MRIz7fa6N2}z_HozOmerpI?kCRHOip;oP z3~gwb^ZCucj;?KEv8g)EOOG!#4saz%z@tr$o zQ_tn|w`;1Zs(@IDoYnsoTE}u*CAZju458Dg=FK%Z?4Gx^J%dz#F5QHNN-{`%jgP-* zX5$8lmUyLGjq@A*4^4G-9U~*R7mH3*SO&J~vJ@f_I0^^d$|@?i3Yo}}7}~`aIx-SH)%kiCv1EU9lC+ti z`hajGo$m`U7dW0c173koycMZ9?Ts(?rV%8>gF$RbacOQ^Yzkp)4+dgK*OCony`#S+ zq7!BXqVIAE{tyGkA2b&MiOsxh^4EX>H|xJ$GTbp?*j`z~TVPOZ^i2a>uWCyni|Mkc z_Rk=a$(JS!oI)4x4*AQHU;FVBvH}@#u5>Z4pE)pc1R`jdrJ)RBy^c`8IY>Vj&^OfY zPh}LLiPNloBd0*D`STOrzX+$8`udwdlq{@7(-3s&XM6yk0Si0O-Kwy=?u_LV3iv}G z-Q92V6}(uENX!%m19>`}c(VDofwz0mSGb+xD)0>7PM<4>*=N zRypdI1?Pk+{ib)ht*Ocdq)LxmX_fYyAQGY#EC`3~=jL3kb(zP}3aKegWtyk9^g%R! zJ2qdoyiBU|=F|5ntl08IgQZ>BniEN{ImoIbVPifP2j#PHr@5p(l9VG$SasVlp2lY4MQ#ZzuZ0Un$|ez z|9x_5Lh|?Tn3<{D-p)sb|6o1^SGFJsik}3UlacJdEiE5hU7t^uYPnwKRV8+WCY*FP zz>(xDUQ-csvv0%JYS2+A;CU@Hw1b^LI6U0_@85&n>Q|9N5Zq*VJN(!%Ub00-z3|~Q8O5|;t z`0-1I$lv3YjzEDZA=Ub6s8*8}Vsrj${V0jn2UHzC9+SyP8<4nfo7&~u*AY2qX7Fh@ zDbf~Zv}~S`z7YcoSs)!bT;P7`6WOhwAp(vpp8Uh)3=C9+gv;?d%D}*BZLPsXzp7CA z?)YS|ce41V^2d)NMq8Na<{jL!{dG1rEuRBGiS4$oVPSn=Dd z&F!4f(8qGX^~0Ig+M5i;A=OHshoYH4c#rs<+fJaLe+EUyo!egiB?Okp3+Fel;Qh+% zI;+A{IO^-_q*7RpfF8%q#br`a1t`duFN2)ox)dnBl^Z=gfy(McT-2`Ibh;)dBU<%& zT;y-;=;`Qa>F7wS{fIuqw2F(Fm=a=urIL$~ueQB^JXScD^-9WX6?jtW%E74NKZ5|F z0vLB7rJ3R2(7LOiugS;CyNeYEB{S%is@n&>GO{MXyS^+-FNDYA+Qif*S27jZb?=$) z0H9tRa9-tFE#6b9eY{80S8N1ieF9LN-H&ulU9NUS^{y-AO37JHH=0FcPQ8FgNE^HQ zx_(xa&D1$?LSSJam3S8gGQE<40$i?R)65#Q;q-Zcl;TEAq<;~PkDr;BM6R?J%+f$g z7l>xJWlNk^OMucZv66sKKva~Wg@uuY-o<4%u*7{1y&PO+Vq$~6s^yQW@p|yy+5%^~ z`ZL3H04t!v3(>_#1z~n|-U7L(wl;2Z$~-^+Ih7NzGS}DlmCR?Oi5164`i_P+zVJd; zK`(k6^HH3=$YL=IdTNxERKObUbarU7YS@-rBM89t@-l|e5ug|EogM5MxduZ$E{;W? zE(~<5$2dI&Sq0!|j-Mvo-tZX;Y;XwU(h?AO3w>oC$LIcHHdzwbUhn~bO$Zs@47>)Q zYpMq+hqkr16UBiy7g-O}vv)flV0fg=#+>eGG|VxO{?$jNO(o3ql&pomIQjpr6yGV7zZn{bGz2FD@#$y~4 zeBrG+5RbrmzdiIfh{UKM^I#nwA7^1;&@KG6ZhJLde)#nvF%bhB3ln%NgR~@S!^_y? zv+b?DwGn50AP;UREV-BN@Bun!QVGu=@<6>P{nW3_e%iKHvq`@@vz?bNiN&KM%mH(on@a2x;z;RvRNf7(yXm30~9E5XDQz5HY}vB zs(0Mq*xJhD%E`$=huGLTWlBp~KFiA=1FpDhUpl1@^8T4)coG*Dw*lxCbO`yqv2~bi zUPcD!W*N%()1Au9tn`jZQ5XYRj>Y0awNfFA%asdown%xeTUT8Cr^4g}3|mlYft2*p z5dduUWJR6PfC3(k7P!zrvZ|_Z(5qMB+WQopt(rG-Cy|eL!#c%OEgF_iF zmn2&CsSbnN-?Xz{E99DnJT*44p`|VAYQR;b5+aL<{q~oEaYR8rMyGk;Tlbp9taGL1 z=s?>T(?vhFP%vDn<35bHrqGE^mnkKcF;iV*V`F`NZe=Czqii!*+VA)(8~=`KF?0}D znon5q>sK61PDdt82^gs77it<)B>$H|`q?@M4Psn<1~sYv0NA%*{rsq_Vqz4cV-&h< zSj?x!y3_!gT`)W4d=3WzTMMgITxcmbO*yaP+qZ8GtZ_bqWc#2~ZW+kn-GDqOOGHX* z3K!D_Gyq(JTMUe)3DR0CEP+m&J`o80Hu`6IQ2^U365$Uh%Kf=oqq}RJ?v6S_;~v!P zCX{Rc;jz=L8J6D-W!|&#lvGE*@)vazNt`l(|onitoW*1|(7Ew=TEqy_IQ(++6CEc$7NQVewotxGWpO zw0|X1zJ2!^|K4{m?b|5}59NDn!IpH0BV}NGVq(o0n6A=MQksnKpn-JQL|(6DAJ`L~ z{<);Zk!)UePWGq=)DUR{aM|Nk~*ihJ5xVJoFJH7RKuMftG!zZxFDV?_aB5ijPaZ*`4!4 z@RCa9YF}*D_}evX?%)t5%jP!F7aUvw5H$`Cj`N*yquB??=V2JH{#~FAkuR;Ui)6^+ zao5Qhej_R8Q`MLS&<35B>$f;`qXzL9ao`@a{}LVtXja)>j*Fy{CRmu%b#=c;lAW1O zKH}H4n$pP6_+$+jwhLAAp{1oIpmtJHRRw6y-@R!C1`6O1U@FmC08C<&G@>PFQ1z}a z?TZQudb&i@c)eZ%f<)egel(g~IK8E`-JzO;`eddMuXgPl80f{TJ>ceS_G#%S zP^~Z4zl-_yt;?`{=ltT-oIF@s4J2R6rBv=Gj5Kpgwz5N_2)iGjTSe5|Fx4?*qX6x{WoE8f|C5Y|PMQMM|0|BPloX)`NJsSiyX5)Yx6*hx0zmb$`li#3ZYsbn zIU&Jibnzcsf>XYg)ih&kwqL)jtT;up%htZNv6hynk#iN7l+eBhtyU2@+)LASxW3)8 zJX$p9phSy}ZR`)U-Wpn9v1m{&n(4&n(jJa!miP+Hifpcqb*OfI2(Z01#MZ1(Th&Q9G~O&eoQ>zOnsX2UyY zrAjFbLjo#~tj&kg%*=*{A{x>&A->kx`nH>kL-Warq;7eIioma#thLjFX{?v-4VjrV zn^FVwTS@wnBD!)YVcvU_(=urtR5|MLid6Xp1qB)=86|UbIKM;@p}{n6kUZ&%{;)QE zQqvscp017xFnTh30l16}5ZsoKIHRhS6tS_ibiAX~!;90_(Q%Z8Kh@SI2%-_(x75Jd zq|EDq55nMapYliA1zd$B8R%~Q{pG3K_L)-1#rb)y)8Q*VWKbk=+i!Wt#Z7FF8i77% z2qGiv(7*ciI`fS*%%duIs@{neLPbM!adoBDsCw*w4-55PM%_vhS^Zv)IG>oB$Uo}x zT~m|P+2trj89uCMgyj2-JuY=z>RW+9KY~0fI_Zoq?Avd*5wZznjn%_vdqP5#F7Zab zMZaYF>}e4=s#7ax;4?>5qK_w~ylnhSe19?t5M6pJd;@FP{h#Jd7M5^KOp^zIVg9VD zy4m#o2lfHW>X26_Z*#G!g~dfsDoJ!AE$3qoC$PY!U<0A83a)_s6>+&3%jX3pz$+wf z@hmxjC5W?twz?jm9FClQjlW>Eg0nG@@(z1ebs}ebG}r&@S4Cyzn3wse`v~s_Mu&zF zk&u91I5k4%1?Yb;=tV!Asl52@=h}k-S|n^18cI12IryanCz-5VP2uapQ>rE|7uhHceMsA89qHe z!<;)e*FdY`X(cWbYYh*915Yb(gaBuG5JfiB9^wT9ffCj8jw;~K_SA6mwjJn28tm!8 zVm8$Wtu?^WtE6l9(e~^(5ar7se?+viur2_KdJ?;GneXqfKAU4-7U47BUz|h%HisWct}No6%7;)5 zpC36Cww2nOXf)-H*E}IE!$=b}MJX;Oae?tgBV9vIId;5kVGWuj={qwD7(2Fd>j9}D z|9miyh`R?7hV&O?ew}9=DZy>>lI zPj3PGei&~sdr$W{y*mrT0zNTdo@@@nLOuj5E2+%(u1ZSdpg041!TEBd!8#FQ;w*Rs z?80~9L)BkPN)}JYP=5rU!ih;G=teA#S=1e+1w@C9Tj8P3YtFQxP%tsaz}$HAd;iFx zqE7rhBF|{iJLL3!tEy=!*pwuW!KY{BL?hF1nK(Z1gl+&i{>Qpbs>z&He4PhC;@i!? z_-B167%4qTd&n5c+h_M1u%NLK5?ITGud8c<`~R56czk%D42((=)5`5as8x0-BVix| z0|QIT;+?8AZnv4y^0O+7Sr8$AJ4pWb(x&Jm0q9)o=;#1lw0O*>eL#H#^Jz2(Ns{a> z1U9U3XVEsm{sP5{++oH;xzpmZoZ>Ei%Od4$8EyUcm#-wq{4X03SQ3L_|N1W zT0^Bu|Cx{P8SL1uQi;zK_~-4<4U#Pby|SxzYQClmu;Oxbwc2 zNd+c%068b`j-Eek+6QTn2kU}_Uby&2IkF5?;^6S)+pahYzdq>sjX zqunbutc5<57q(AM|0?=!A0wk7Fc5KHIMG!~QN)2vnJ=@tC**niJkHF8kZ?Y!Sf9=X zy;b*1qGMFt{+p}XuGvk~w^j(I!==WX$;Y9K1zahk{sn!-Pp}s6|t6XR{rjt8bWfDU|UoEGue%?)vu*3ERsN8|5!DzkbP@`IU%$SK< z*`3>B2D|yb?&zTYkccSY54(eD*;?iqN z5>EOBBZ!p9Ky|l^bD?mqS--Qs>Qo6POxs9o`<|3%7n5Cr@Ll!$VL_r5Uw&$p-X#Y) z!aHqw@Ro^&4X7_Ig6sbV(wP`r$G?!cps&PLi>kJ?y`&vgt>oF;P~o-^LAOj2~S==_T5%=H@|1bY4S&={m2-4)6sSu;1r;o4Zz5VO!c2HZ`W9eAGnv-NX z|8x0W)-apH&NomO*6GwWG`KId%&vtnAf8a6oRW$PBtXS` zT?}R1xpFVy`|Tq1PSW6_joeULtRTD0#@5q&&5t(lLG9e}~hh#={?7aEAS# z*8wf5`+ye27Nx#bo6gQoCG%yr@Idn_EO)jhqBsKp^UoAcE+RO#wO0cF&;6xVCq+iN zFL1D$n;65L6lcs-vM3)hqXh-E&4g(ODi3t@2USZgCj{_$MU&ot#P%|qP!SMvQbW@! zjLK%4{3Rdfvy3YE!-`RHzQL%4P{2}UI$c2WA z`tAEvL1GYm;rR8E@9Qh4=4;b@;jH|2Nub%z98`)QbHU;I_J=jx0CpXc5%4dNg)gH#{tN*vMM#bZ93;$%Qw#HLQ1kYd3g( z)(j$El=Bsp8ReGGTpzB@(!3@&{}}Zz*Ab6p(7~c?$B3Xr5qmHbi;eSA*PIA6e3(KKaPUP^UEJ%F@;?Em2uj8MVyo}Qit=F~Q(Q$M|mG_SY^PlAGqwcU^WsuvPnf@~zo zMnUx1`Jrj$%#J4Rk~&cxExbojZjFC8bTH@DtvEwLREDRiUS2*fZ1KBz<}!(U0?}z1 z<#Vim8(}h!Pauv_)wns?c*|~PP*-Yg#xVoYXBV;J0JQly4jH6>zY_>bUmyUpf9Q12 zv9o&dUUsxxUjBeM6RdE1dwbZHHDJzERCowhc-#!2QOAKLF$+{rZoUHsYUEiH_A} z>Ie7omT@)x>(uD|RYcdbW6Mz;T6Z&XNIQ3IKK|$Zcym0CrSza~G&0iyhuyZoKsch~ z&G&J1T0|w;fQUw+N#(Njn?8ZYNc=e*_&2P*g^fu*+Dz#Q3A(y0KSHNysXtB;rV< zO)K*!s7JYiui67wS=Xung30R*L9oDs4pd(ez8ooX5ox!$h zXx~52QxuQy1@l{RUA8yQgA(ouO5;(-?s)C#-(_Mzvm*}yl`F63!(D{Zxr}I_)jY=s zQiC52)NoB$3)C%29U5`j4DBj*jj#3Uqu>R;4QhWs**DgHhw0gylsMG{zTV-^xz^c& zgfaJZp{w0gLLzBwx|iC+;{*ssf3FRLhm-~Nr|Xw|94(y3xa)Hj!9qm%)7I1VfrJ+nX%r%k_tY8`em zU8cBkX^Ngl!F}CGw(-38;30bJEY@JX2&*(~r!`64*7Rv_Vc;^Rf9&^WFa8vlFTB5D zo{8}7=g_iAz#0V&%Gn3;@Mwge4azucIkzae8>p@4R@+czk-R)eo*&rbE%4Hk#wT^z z=h0B!&-t(UH}vswjW))*x`J(OZRK>ly&sWKC>ZrR*;oYGp#uYPP6`Umc)<6d%phN| z;#2EyqqG!IceK91cki-v>gu(VOuL^bES1(OTMH>;NaB@_N=dmpn_TRgRW{rH?Uy$G zc?0D5mB>8+JijZJ5wxHf_PbW2t30dOsX=&E_gLbYS2S47m0LXU_ziS-Nzg6OEoa@v3C z1z>#!BKBD${U4Jykzc?5C@LB~W6I(H2hGWWlrQ)%tVYSUw}$QG3IcC~XX8kG|~Pz_5S|IFVRYZ;{Y#+n7|Yl`k&`*--o zy#yaV(C%E`a1j!2kLAx4)ho)myBF5I{*V2w^eSKXws<&NJ2~E8+1H9R29iQ;y<;htn9g0PvsDQmDCwf z{%6ubSa2F)JdclM^$vauAeOG2%1LoYQKRHWe0Gkl{|Te;=f8f~;S1O+An2nnGHg7j z6TSe=8#I`2gvFSj=WA~SVY1Es^P@}fkJ}3PQ2`X#ct)#;HHU)CIwD0r!BF{9M3a3x zRJN0I0szPVbEz;i<&!@?vJSI*hmY11qPV>8to3a$m3qoH$yHd&TW$yKn&NYpmi5#o zjp@#R7xkLYAEy!oAq{NO9H%V&-ql0($52vKN#l+W6s%4OB#9`_H<~2C$ktwv-O9qq zmbO-(k5d4HS7Go!=FL#L`u|v^8k6v7#0|!^Q&hrRU=%V?p32db#!Z=>Jm`gPz4f4L z)jOFPaK`nE?i?Ni632h8yf0=a>u%toH+9^ajWgG)%)XpdxPQJ4ZW!w9*xUbl{I7r3 zls)cP|Mz7L^S`Ff|MfK8|N2S)*HbO9|MPnP>nW%P`kznYzn^>e|5{uxJ$XDG{NI-* z^#7X2BK-foxc|LP5F{0`?h7dobQ?*iPY` zGyEEnBZ42=uSSf96Fv9|~4mc%j?_4}ShE%s4`#=)5`I*=n=Gd1Yae z?w6t39xt{K$@~pOiTM8BpWSrGO9b&MX0UG6&%gheKZYzo5>-CeWOh?(nOjb2^^Z|? zdaE_gV$})Kkwv{S56N|d#w4u~yEg8RBUXksvoPVb&Q;qPsx%_8X#OmVCCWe9|NGfk zYptRNmv~rixR8o{Za*L3wuFC)bm2N*JDuCWV`XojtZcO9_=k4ZQ;QakhiGTq$(x7m zN5u~cdUAzaR^|u^@XZ!2jfrUsgG`Eiro;n}7gS1o;FoFI{dA*-GjxX=uU`QNgp|o$ zi@Mpz8TGHrnBq;4AM7-Z7oP*Xzph4ww4w9DDrI#%n$@*Q{zIU8G2Uf_hz#y@QtEl9 zkT7bYWq|PiOkJqOp;%)OJ61f51Rn9vCANcWBRh#?^pAaPWdt626azd?_Y;dh<5(7v z%4XEm2tk2km{R8>(arZ$G?xvC0t3fo%KLR~c`|8S?kl2+6!7e7 zxpk)vA4r%OGS&8`ixe`wo1gxBa4)G7!++M5He8;T^g<9QQnoUV8q4@WFsXDv5-ob# z9iSSw%!Vcw-MNeE(UgTuTWjOC z{8f_y+W^H3?kOBHvESRFSw4f*aGAG*hO~r1Kq}rVAM$mA<`16KEcGQ0biDFM2%?ztK}C zl>q<2eSE`LOQ8Y+aMagIB}=5y6pm5K-2$)l`-cm1^6Ge}n3&nzAEDw>TGE0c@4SZD z?3~wQDS=hM)Ygyk9$kUEPp?a2q#lpERg6%wPOrA2AC z^LiHSqiRa~@@0s8!T4GCVH&ycwG8?5NA>vp{Cx8oZv_h3#s}y7AOa44p^Q*hN`<_5ZeTI--nop3D zGHb0gKff27P*L|ihKsiD`>pkP(4Ysm_4lar1mA5hEmp?9ejaq+H??(viYH~d9E9kt z&1+cJk}@&vwZD6y4Q9S^G*WW}VocLY4(796Qi%a>f|HH@u;5_O+?8*b?6Zj`*mlz6 zeg5<3&zc(a{zM@WVc{xcl(cVSz@4@$U}Z()bZhu-kk@I_7+5!f4-HL@A~wbKJch*P z@PL*ljg9<6D$c*}%;BC_1)YFlNO@j4Nma z5I;!AC)F<1terVC&mbs=|1)Z8lx=XZQD%czQ85E9l#ir;k>po!1nE||W~pZtItymM zB9ddPaAQPSL6yosT0wTUYNaBNoPaD}d*U||HM%Ofrs!DtecsM{~> zsheoQEvP=X-3=0RhuLA=fpN=MN-C2`RzU*DCo^R)Nogi!KYGz_5B`Q^%?i`*<>om<3Zy!zXOCQ#y2=>-Z zGNM>@+9*N9mpn2pi*7!Hy~rwAE>!jzT)D_kcM1O4D4F1eQ5)!VTudwm3~Iqr5}4_H zt%`QI!+`ki4f^_tv)7GfhT^iG1Y&R1{s?`JlAG8Ysx;WJ{0}Rr@ksJrAU5Ok(F#4) zM2YdOtl!{f{mp@{V1@Cp5emvOJ3BjoK6TZ?0|CIxZZTs9tO{hf&q67b@4^aYt>2PK zVlb?|^4BF1Q?J@9q;J*~7QDMzWH1?FbZzt;NOr0=pFY07d9cwwW;RoEcb@~Pfk9hq z-JwX>ELXG55BHtF^zes_ndqA?Z=b%t)uFXi0Q$Sb$=x#!oON;;Lm&+UVc*qL`{C+{ za8Q`l)X!yb#s~28YdFR-nj{9(vAVQLVA{(%zqgbKdYyg(?#56*8PQlq+;l!mWDxWf z0Izx_Bb*dz0PX&)07uoEbLKutnDpoB)w||!uh?zYKADJRICtmybnY*dd1muxhX#k6 zO;-sFV!yDszY>Y)Bn{+=GnhtLebc}%Bxo7myXzPu*g*7m5Gi~!Tbx=@8>`nQlp)U$ zkxCKq4^xC0X|Vjjb_}0-F@HW?C2COS+KGz?&*63`v1=A( zrkc6p$y8C_Tc62JGoQfk!Ni5WOo)HjQeH*$ijm|i@x8I*Tj9@84C3#wH5^F)_naz7foQ8bC@lT|KYQmaN#(mV!`cRU(4GdHgtUYIwB@> zaG&Ccm>mG`^MVfLM;=fvcePX9W(4n~d74zuJI=<)@GLJr?x?_Suj$s-BsQfUjK2(l zW8fYJ%p=w--#_8lvY#PObHDAtwpwG8)~41!T<`#hFrOe`6@f5~(MbB?_N0B$y&U-F zAAvxm()&BBb(j0|Su1=d;~~(}4I=-(rFs?}J1iz}Yvh7-ivaxl>O6|S#2eHq_hZdo z4?liP_=2S0%H2UADt=-Ao%bPYYU+D1ExyMozKb3Zc!)$O+Xz9%`dPx+h&XID*LS>E z`uCub`L5nnDsomyC?%=>5K~;xwvUKHbk~->P&EW0eMUIK(_8m@@od%DR#6o3;plb+ zOxUkqHiD?5T!tV-Ggd~e(o~6A4-=Ag688%>Q1v&^sNP+%(pQZm6&F7cev`s&SD-XI zkbyGn=6J8HE>DxY1j|Q5)fZ%pt_R1$h`9SRwt!h(;AgjbMw4HwF})|&whq@98h{c*Lw_PU&;xGA9; z*YOL+auIX|D&shw?^ValRFGvBYgCs4H->`8 z!UWh@2xiMmB^-}vST*8C<}JCT>e9i9T{)q_8_eSiKza4JoQ^%s+<{wQiCAZ|1a6Jg zjx|ReNoeqX%}3x|`;d`NK->AtPg$bn`^6liBK8k%&)ca4##|7W$)@{zmG_~+vDF6_ z$&1yxe`m6~ltc_TsS#!#aMv|o{%*btSTl<2j!8>lGAWx|Ik^&!z!MU@m}jM0GU=jc zqS+hZJS>^>1S(x{*aA+a70#O-X@R=bERNeAD&?x1@APmvl)>cPmJDOLv#Fw19MXcXxN4&HdcZd){+q zv6d`9=*;Z>zw#F!k5J_5rFpPoxuTpkB9X)Yb0fa_X2XWELJ<_UNSw{FB>!UT&B2Jy zxBDf!Xn}S|hm-9?6KyX;ZWtl5&mWbx&#@uK1eoI_WqoR2=-=KMH~vK~mA`FR5J{p} zEY@8`myDwWWOor8n_IAm%gUj;|3T%Rc5z~5<(!vfT@p^5L@DX zDAz$=vmYA7bQ?%zzeY?7@;`4(CqzN}Wg`mEq|Pa&4N0A|6$^}5XF}+xI2T~>8DP9$ z$IAD3$J}Y1DY{56KH~X!ON_EVU7;SC_0iixz3xmhw<7SvJ4l>;C%$6=YXZo!CpMy& z1oLfet#Cnb_oChiBH0p3h849Mn-c7`$(zcKw?}PAcY`h-U`$NFVk|omUo>u}tlTuw zt~~$zn=esdWScJ1*JvS33w^QQBjgVIB=9ZYkU&G&6Y5$LjNJm z#_T6jmsEXMVe~`7lmFj3YK%0SabnE6h^Z2R5x(sRHDY9{b;`l1g$-Qhvu$E#wbX235@`yNme#a%OfGDofN(LsvL#(q#biJvO#}Vu}wm z9u*2%K{lQ0Bphu1nz!PM>%w<7B-q`(Px~%NW08cGwpc_ixYu-=36LsKB1BFdS#9Ld zbERCP{8KzV${Qwpl?%x-Kz@GpI?+F`vXVw82~*2SJX5ZB*ShOEn2P@L{*wA`){AJ) zesTzdx=FKaMg7reG$7A>HVc%qnoSmJGwGYDp2s6KR(DqcProHQ8Xj{$?o~wHp4T6T zurEZL5zp=;*3T2uE7Ch2fNeyB^Pvj2X71?YQCkfru0~|ma+|0IaQ_;Ds=bGHrQWJg zp!e(R`BU&Vk)iNB-o1tM(F09`jYE%K86bjP$EsVngXRk4!O^h_-@=g>`W^lmSId5c zR(O|tYnz;)8b5gE`C&6VPHShOannnNZ@P@ssz1L!5v&%;H$Cp0v_1+MRF8lTPx0%e zi@O8Yg97Z(6xCyd2o!}e7z&pGCHKC3Xkx7GMfi|O*<{Zo{+A)RDr;%zfscnbjJq`@ z8MpqTsT~^+1`u0rs3UVmTubr zSf>547cdD%*uKu0Om4XhjsA>gJ5fS|w%&TI3fBdAgmb*^Q3cREK2sCWh``H)6 z7fI%;%{zm!EtNLuLJ6ci4{9-iGEDlgF;H$R1IX>y1Xp~I!+CiC9Ej}fdbIS>XyA+c z?LN#~Z%vxJXAqV02+~JJ+l^VUeOh$VSF^JlBMrM_X20A6un)jL(XE-@7<{zU&Bmd$PPQ`9 zULoRru5EO`T?6$_k)9+VB?%&hmFB9x;NRb$t4txw(VK^@FaA1NtsMjAzLw!oD(Z?W zZY{a9;cE)t&eiEg{Y-%tT(5pa(fHZzcP}m5(|p^s>g?N0V zAy}Z&24iIK6XXa+Q*Rd|bg>qYy@9XV5QmUlCAwkp{Z4ZR6y^Tj2D_Jukv59!tWF6% ztGT+Um&dm6Q4gp0^!`;C{0KIgxP0DNBt^2s;-Z}+WD}I|PrW&4$CIR0L^^;bXLPJX zo@#|LiG(<|5~Cu@uM)p@J#k5{u>vKp(QOH7i)M#?8Kn;ToeY4GJbBey&TROJkndrc z3e@qYBsZY6_ww@cH(u*P5%gOS6q4a)lq(UF8}>%xwJYoO@%3#w9VqJRf+bP=rK7u! z2vRrb^5J||z&>Vc_R=?oy1CHwCsh(pqT}PeJ^+@+|NQw|x6Kj*Y2Nd3E3h7kkNaV7 zIw_g!acH|zXzkPqlp^0Bw<-pu4OJcH>+D}6<#d~QDcU}V$P)go>c92jLVg>U@0s&NYWC4*=?~K8O!n?rPY-d#8!rmjgKr{oS$7q=Z39Uk z>KqH(wA7Aa*hNq)r16-1L@SC~cPR%s-HR$Ynum=LzJrKPY(%-X4?;SCd`;C@KK{1W zU+3`QQ;djp=pxJtpRD~{XEzPpBB(>dBbg+48v#5Rn*fD?;NsHa%U?mH5K@wq&2@xE zEpoyYjuij18{73BC8`*W;g1h}j;vsC75)b8q5G5@#r^RfiSJIfJ>giZ^e{$63viWs z`ulNhI+1+@RQp@Jy+eS^WPa{@GV&T3Nv<_Z6^h>=M34t&G^BJ{Hk)HHq&@c1%Un-3 zr&tVUz@T8L7XkeE$z>|bHg>E*7#^n@VD;j30XGQn*zGMUQDD&Y4kVmQxAUqchwAGoym6bO{8I72lXzC=(2iWjSkvYRQF8U5-; z|N22Co)VCab&|#b6PUT)+04 zt*Lng-Lr|modG=$z?4X9dwU;d%B1Ulbrs?@bGS3nQm^`h>;Vmkw3?orduqt-1HU=_ zXt?vc8z+o8GNOF$ax)1R&uRM#1%&FdrWN!@7Z;K?24GC{g=v4GG1v9df>b0p90_=+ zlhB}3@^_Al?v9{sd)eana3+Wm#(TSGOBJ*8 z=eswk^ocS+zBh{>VxntmkEVQ#jYFrTrY`Ofgn=MrNXA)!>I&YtXbyE~DnmHv#p{d9 zo#`Nd=~PZBp$HVYNT@2!gkMKk{Z!REnyaejv(hSb8)A3G>RTT1oB5Lkl+v#m=h9&N~P>3|HOjNBbTFA7u=bd^}&5QV)( zPa=>V|8LQ4MEM1be2M+2)>2|JQJ+zN8;e`g(Fc;+y+AwOW+35H4se;OtQ36n=J?~s zkC9MtBAtuO?Cgho(;6f$2esXx@HXVKr(&k2-Yt&<3;x^P(q^hSpK!j_dLZBVc(<8p zYUs}dRO*-qF$7eoFw}}e{Q&{x_V%!z%Ax+a!$WAzL8a`$t~d4#`}|m#KbSWUH#l#S z5Iv?a8FWVu@?Ecuf|6L6r2I2j9vL%%V^v3FLy74AlEC+fRyfY2+sa3Mp?b6}kgSy& zX_MM490?`anJMN%0dFC;JgXOBJZ{9?e#o zUw(9RpD}yr08cGtOhHdF?YrJk{Mi>coxDf2lkNj zUQA^IESQ+Ig=N|2f+96JOc~y5Xd45Npa9KJgu3CN2RrmHx8(xfM`SJc^Kc6ezfOvQck7qyzMWBG%OvH&q zN9ljD0O0yhR~VHx8>NDX>$H5Wkjq3a<5BXV0v}8zuZwd4^#%rS#PnQf?N|{-+vR** z1?Ndcoj&yT%>_Z6bki?OBKe`&O5!uK*3iC`z7^XlZ(&Sti|@>Xe@r^9744y0xi zk(BZbI=E#+odW!!-Rce<4l72QZl2eMF&!NGiMrXMp2jQUFCc#~N?R~*!&P>j4jVav zj)P6_)$yu4NX0pHrFdCKahX6s?7hOTyV|MqT~GIiYs_712{4ujhnfKPw?b|cO$|Cw zEq?dzhU;%3|!tLn^W*}!rF1bU3Pz z5UO<8$9YT#ZUwh*N4j_)zec>L$ZN`lpY#D%;v(#3B0`RfJc?S?Kx9`|OSfnD+~ab- z27@aM%Ub)-HlQVcE?b!!og)q7wz=I0Yc)x$Uz7kK(v?RM)P8ctETe=?{NK_0HTQ?r?? zWX2YCe`V?n5jmBUd&N@ds)o<@!3wDqJJ|OBhEqJ=9=Tz)m;-YeBaY;f;9!M!K_GeT z+t7f}I5tzo*G=u-^)b+KA)eKC1K!yLDX6_1NK61`W`&V0Se2>lsXBrYYd5!jT_p>H z&(h`TU^6gMt5UoF^FrU>cqGfnf9q^pvT@WIh~c8jX=yb{WP9vasc5_IkGHlyCjt7h zV0QH9+XJZ9Yz9+3)S^;6g8d2HjvhfWr{ft1{GHww|HG!+k`uW`Eg2y)ve<7IeSM#D zM{9vw%(cL?4|Za)aqxg(zLZ^x2niu2=Kb!^W-+JO|DaWBxzhZ8V{^S%iLSg{n*HeI z@`v@OX|6Vy0i=3rfo`Z-Gz8~(?QdtJR;q^o3Yb=xT*;u*;{;=|Tg>g(AW_nE0gg8# z@C@H{znC_Pkdq^9cqHz$#sms)|GswoM}K-D4}#0k#wbIBhRyScAsD4 zYEey{6s-Rtxji0V7_qhVVxY-oAs2!FiOs$v>b^2B3!B z7IDqf(o!5dCe}erTCR(VZhx7O7_@qBF7rlJR?C|`m7k&L48t#m^wdRP(NONC-ZPUwBCv`eW5nV6h^o#_xLFU@y3PztiJ)sswuZ`NxQTfkygc1;li1 z(slnbx-;Fmp+K>w5|lk%CU+ClVT(wS)S>^>?{V z+`TQFLrdsz9wVbs0mhODo>0-;IpA0*S<}0Y=JRvvC#6CT_~$TgF5xxyKgaG*m8}-n zAZ`tnWqvFLtA)V==M|nycq#0d48?rB^-%GsREJu+&*eK{c_W|C0+wSS-Y*=?dp12j zH1wFM{TFG#Pn-9NR!Wm_l5An%q~NVLI-Ai2qWX=5$}yw3mH2~cW~3NzZZ1co)#;hM zZ9`ex&u_9m*Kk_5g4lDdLxy>t@kk&+dFWM9T&?Zw_0^U_ErSRWnJ;CM?ZZhpLa}1m z|6J{Y?-r3)S|JHw!W;@VFKw zGiTvwx?>a9J68ndZ(#CE+lN8BRARIIWK>fF!hbkKwYbxBrxuXNAkJe)T@%~_o z_S@w=p{ETIhlPK@?e4fUb-cMBY>IoR-N9hK2xtCT+A~(m1-F|-W<^tbYq{aOYeJ>R zzij4_2lt(PP;nRAn@Rvl1Pih>pjo*)Q9_)t(CA99>h=*LiG~h^#nkk9wuB1AlBXL~ zD~O7fJ?c<|8F%}(fe#Z(#DdOG_RGe=WapGimjR3tfQ~qAe$Q(FkN7^L@%CcC`7-$% zjnCJG22Q}WP2k?H1r|$g57&|4*}R#xRAHIu|L<99cq`^8Zybc}pjzlVh4ASTsbpCh z9#&>QI`N7v7rK=|10%QWG4ZJ8Z#hxA1K>Cn)0v*aqsh*V|2iDCLOS9h@`xEzTmG76 z*!q`l?MF2CfuIzkh|;}ap4GVKw~Bw$_@7Qu;^`FkXHygE=9<;~?pRsvo%!=JP6EJ& zQ%YL;;x*;-9d(u;;IJat_Z()yu={E~ZgHksDiU{e1o8gvl>RCCypA5Xhvv%#S0O0urt*;SZ1p@?tOa!KVu1c7*k4ai&liDELdd!H`eat|@pe%ZzOB+? zv`#N+Wq`|%8hgLK`8?)83IBYrvmUl*s;8N&9!&IX}gKXVU@oLBp5Hb z@4Bw?>6;VAa{Bw(=YRYI?t6-p{QKZ>>z{wj4nveM{vB$A3mFmRO9w5AgSRbl+@n#=QGR|M{0}?kIbo z)F0M^+RYRm+YP&QhmXi`C#UZp%=Fqj=$k+9*rmLE@H}ouP3*6>Sr2=-^7({L_IR3~ zI=b!Ryb}$e(I$f_JP5Xg|IKHUOg$*_~N6Zhf|7DBb1 zE{!CL_`E^Iv31+{>#i>}Z3_1;9ZrkTWQ#!!P&2v@uB%s-N;wxeqB}m@){qB_3kIyN z)A+3ak)J(|$=GV_;|UDzOfcZP4$7asevZ*Emj;SYx`LKfbSBTdR&84nBE{h!AK|6} z%b`U3vCy+d(CCi_2MFPY6;lzJm27Kr58aZ2}E660{ zoFWABN0?PUN#H#>IVkGXt@p#CqvcFY{1TvIWtXLmR52%Ed=5&yl`iKviTxWkoVK>7 zcOjtJE$upj75v2u@MaFp9Uv^z7mA^ z;gZM5LDl)j~-2TK%`QYKThSJ**_aXF7uUF_gOs_?#NDtA`UtY3j6D*w-v z)VMMb9aymh1(;axO{M!{)q)lU8++Rx5BQ%^QWx&X9KC?>ulfg=$aOAmzIh{_D?QFC zheNnnaNzx)XX_8ExQR6U_Jx0m@Z(PEifx<=4K^lMPkw(vIMi2#c@E|y+-$m{dWR*H zLpU|cpA2<(m%5EAnmFKwjg)11AEV>l2?p6P`AyP7WN>8TTO3-&be4`EXGzA!uBi>w zQ>R6*n`wB;GjbfW7&_wXrG`4@C4?d=I4Y`*?m0@VEx?z1xARbL3Q*&(T*&1n^2RBj zU#UQdNwO&Z`|N{1mvAy!$bIcRTZeWKJz0HBld~DA;ma`j1{4wHqm%DKUixjFB9lh^ zMHUx=XVh!_Dw#27X?6yB+KZaqQ-R*52napOQ{3)Qcu z-iv3@#VUUP$~1rDa-Fu9j;l#JQ~|Uru%XOQ1X{uGU@r4pR-uFP%LyFO|9VT1Nz`mk z#;n^_)_!?p6h@l1vbcTw5)$E!S0^)MsfqqrBD|Uf42nGFlDxxar|$^qW|$hs=6Zf| ztKqupx6As}-l8GYUA)d^+ChD_9pwvdlmAQCrt>AH*<+=QLFa=KGdu0bLCt8x`CDhJ zxMQKeyNNK4cYKb+a*o!Tk~m<_P?fd4`o9Qx5Xj`uQ`JCX)&Y4%?=3o8!$TS=?QObG zg|ZP|TN=t~>D6Q(k=vPwA0f_~LXjFd0*Fd^0;r_7%?1Z2zj*W;b6E-(Y%z9@LN~Oc zRJCXiUB1><>leOE4Z$V6pWE?&+v*CN8Zcil1&%53?r*jM4mo=25I6m-KxO z3y*+M(oCMof;vXzkEc|-8MBPqs=lUx>KU($1$uOGZ15KU*^b(H#K>6z!HZ~{nCVxfC{nOXuEVCJ2FyLyvV zzXk@bDmGT}wC*ubar*|$VRKr(TR%3Bv=MYs_(GPyI5TtVzugTr4MC$kiTeNI;dfpW zqU#wuCzg!kKhXH(9?2dbJl@cBV)+tB`UA|2Z^W88N$sE3_8DPubg}?ls&^_xk%dfS zUy^)H;@o&|Rd2h;4b6kpj3*?f82&KW@BWSVg8DL0EKl*Q5i zG*7?|MTm>LM&5IdtuzQ-Eflkx+&P9fj(e#d%5$o63X(=QoI%xAnBBgb+RPx&G&s#+$Eb8l$#){yRz9 zNMR5LC#)waPX@2G;7&D=X168#B5GHtWpqrzj3!bB*?o=Haby1yosgcjW~5`jZ#RRE zLOGqSfb>H_Ux1cT1eaqCk8N*z;M2Ws>DKom;p+B*zI4?xxw#x@xW_EykTcWD9gjUu zY#o!wb?mKuj$!Uw@9E1QYq=jt-W@ACeK&Y^*O_R9T}fc#gt4Eb!jnz(DXrkoTM7T>h3 zlyvrnyfwsB5NMSKz->Jq@gO>c}M3|X5`{$wL(S_)Q4%* zX7$Xj5LQ3*ymF zcT{L38qMjf(rYK@o6oNy)*1r?u&%y{}Bzn?ycyEa_l7E#&Vbsc)|9{D7! zR$LNo+MiOp?h7i7ko`!ggqQkRt=qcKK+i#{H54ICT3*a50S1D0rQ} z8a@;W8XtBGHxHVRSkeKSoZb@&hXq?oHhday#k#(?cb)(cm2zK9qCW}$6=Wu217+Cc z_4O*;mx~!gX*=un|H)Hn-IPi@Lq}b|{EY!kyk#2TNw>jj{8~aXFdEL_^y=?Xo}oqD zsOiU$K(nZxv7Rw=uab3hPb12a*cq7;w1&-xF#{+G>iP`YNi|fnI$138ZdTrBAAH*A zhPCoQ0>4R{z|SRpcU6F?k0FThcbkL6UP#oy*zDrY$n~Xb3hlk9%JQ;rN-l+qW;;0; z6UW!_eiABr&ym+IRj^uEw)PtG=lp3C^DQU+4IERV;67Vo=c>t0?H^V^eRkp|$nG>_ z^NW?0qg^QMsG(q~tn-ZfCrXp z1{+H1tAwM6Al?S&*k}4f5+vxDH&37G{U3(lX*@6Xg7kEt0a4#?$mW-1|G}&><$05E z`taDzzlT&J0xmx9Hi6(Q3QevaM+y?$@;PH&5+8V$H0{%Y*f>5a0rtD`Plc?%d-gev zm;wXgpe-t8VV&!Jyiw^KiR-`OSm!^br{{et?gP#BEtjO6vV&f+{o#{>$FW@WHQ}G; zQHScuGilg#7+57)p_eeOm}Qrz+`Xy;r`$X|ji=n_1E+fngC$d37jP00BxK(q#6Qk{ zKxZ9|9BvN7-bliVi^VElHEBDyPa7GfINV-{&pRV4le+WI-$1Ml%`rkgTo(8pkP7r7A4UfME8tmvI{?82FCb84GlYJ|%H@Ym z|ER;3$SIArCznR*Lm>emf-2+%)`1z%V*k(x|3@PZfh*_CWMgi1MHLSJK^>V|6 zsLs=n<{P%gK7=S)VHQ+S1tvqMjiE$@$XWhDuPNb+hK*Uo^@2CApW(gV!2};<@Ie)> zEW1zTq>cmz_BsCxBFIcr`=j^%d`)iww9rN|)EwO#18Sg%5ictw43Et4YxS8b?8Fa8 z&%+cqR!BI_yFBn-NpU(Tkp+yAhghfsms<#6KFIrL7}w0Yo+Bq^7=I&Uko;GYwJj)f z34L;G5eKjKMk?LDen`I6rK5~e7{V`0qifjjY)k1X{WY)TURNhXoYJJId&O)T?W~3> z5GOUtvcy&GE9I`08bJ-(^u(8# z%ffy2*KY8E$Sb>(Vx$|)1KeJJpJTuh+X=P(zoJO#9$zF9_3&LoTbKjWjCmwcXjDDzmm&~Vmp_w**~M<>uyLunc-@Orj2JikCHSRx%eT_h6t8}Z-Y!ZjS9z#v zu=Q|Sv%Ted073Bzv7`XQQU#YrH|2JjG0T$Wey(-KgGeGzsCCesf+yObd{=rM|8;KJ zMt|B$LB8Lc=U*s4qZQl@Fs~<6KgYNxpHc4-;EF@M7y{Q7fhAbsf2&v_@6hK|QXZI0 z##e+9Qy6N;W?Ya<1z4Xq!_sDd-T7iP>|<^~C6>Unr+(YkyuI%2ONEum$jZ~U{7GI( zSZ>^y0~zin`zJEu_3al`gjiM=`H{#`X4-e^Lx-h>GZ-N+U1tLdOqajaO#d+qp%Clt z3Vbt+`Ji5N_;jc0=5TuUQkuh z68AmMe=ad8^3%omucRUP?fk964Eo^M?k7%Lu^Cth)naVu<3C8P_8k6a8yr}u}nkaTKpEJ7+E9$xPrB!S`E#VeW zJ2y!W3Wh@?K3BFTCq>49JU)XiTu@qKTC_+jDK7&Y6vH#}TG9qlj>xmKf}U$Dm63jz z9$I2D>a+UPlp`2RB7dAsC3-n4^MdH;*6NWi=zGD@z+iu^E#zC8u{ZT1+s@gMZgL(G zg7O5j2u7xt0@*_hdnnWxT8uGqke3=BY z!U`>NFfz2@eTIzq3MOKAJb@?>`u6#t?ea!PhcT3*cO?Ce|1Z{Jd2Wj_ldJs5wXvN{ z8j2|x7W_vSKz}~{%=gt#PJNLPMo*TUciZgX0Ihn}BLYhm?(eBh@&B|K-O}xsOW8ODo1M5swRK!uP7-j(EfJSN2t53$w3Y-&eJ=VP-f8>`b4N zNEEuDaRRytTyz8K+{3XB5*moag#Z7^Gdes1cOapHxYs=kFE|?>L)B(I(Y1`{iLVOR zbgFDuvR!)>htP#V6f5gqz3M>t-d}2UZuWWNXMA#8Yz*d`*Q%L5o6bt({4wW|D3Q<~ zq{OI1T7m+x2E^|wIPvo1r_)RdsHh8YjLq{)r^ijY;bK`)(bMTWP~NkP#;xAOc)Vw?}4it@huG4;e!>I^qj4^Q_QQ#v5)TT9QK=?R9LP8&?b~z@iHx zLqB4F*Moc`67yo(LL%-bxU5|K{;CE4Cy15!+YC=CWB>P&$fIYRurpf5-mgG++wVCF zmANpaJnNmR3Y|@WFYg;K4XmvR?CX;^5ak&+QAx2R5v;t45==k;3zgH47%{- zOfV&d~>r6k?%Q?xrOuVlWv_Eb%HMXjg?F2&Zgay8E+W)D%b z7~|IjkUDc|o$LOzG>hC@#LmB4U|pwz5UJ);-WpdoSarS26C>grru53f-h{m@;`?>b zs*6bo^f{Y+tl@qj<6IP>m6l^@V`yApmTYuh>_?N)uFqXwC#S+FKiVFN_#sQn{U<{s ze^{9kNj4>PwcwT{uCzdk^`yI^TFIuE*`KvmkAe}l2voeMc(ogheOr95D?ukFX+PuR zwm5KzQy}SH++Xf?BXV1ZEh_xOv#!?Lr6Aq`4=F$n9J@oGxz2tsdT}r^@5U=%XzDd*RX92OIW_jrk?O0=c4M2IpOjzr9+CtI&Y1Wzvk zr}9;SJcR%IrDROONmqyQ#C<7#N}r-22A9=gK;+da0||x{KOXIedyOAg@fpioW53M( z9xkOnHmr}3Q|pUB-+gZ8!popEuBh}X{NvnYmoRC4kEA(b&HS>Vs&|Xd!m62ZL1`qk ztiI{S>$^d*LmXA_Gfy*5!nb6;_87l&HO;V{sSJK?sRkYm(0eCp4M&R&k~8B>z{*Bj zNoAdIO-2_!`}PGtb}zF{Foz#z7bo6rZ$2kFKEDyvTEJ=xz2A8LImWM}b^+?+^k(!vK{8+CP=VXC}-f!@firY)#0Ysq$xkK5V!t z9L!zZA_oJT8X4UalTuI`AD1PhlFTkhELlOt2Y&KOMQ4FQyF>G4F!rc{>VZd1%H=Bv zy6{d6gDc<8{Vy8VK1NX>$Ov2ta|$!@#7387--!UYGQI7TJD;@Q>Cb7=$+5BMSPSv1 z&w~9B894|A4PH!q{PpP|wLxwDt{-5%0@WVGI&~!1pvPDw>w+`WukKfM#(dZH+aWpe zU}T+NP-nAVz{^R2lVF@M0V@#kL7FeYaE}i2c91*WeL zblB8EU}xAu`=B0&^N*l5zTsCGa@U-B9Xre|O9Y>Z{gy~FjeQ%b(DOQaDS4%U!qLfx zpL>)ag8B%E^P^QNg(;&bXJaC`1I%WSr|zgG6J>>8yA;E!enoUqe-lY0CLgip{h&EP zK9>?b7m<12H1QKT#QMs@xl30QG`6?p=nx{7xR-2=X|OFV1UNXdsJWPV9N(=sP@(Pb z!z2?Q{ViADE+?lVtmJ{aozTo+vSA)gmVb-xLv^f|rWVD~Qm=G&Xkm7&WE{wEoIusd zq6DcwXxH0T1y$2PzI6x|mz209sP6V!CKiQOSP1U|dD} ze)exDhaLPHdbY_%2)kASL%M&??83NHW7BR){qmo$J-zggmN#c6Hhh~#SttJ*aiIWw3a7Td?pe!%aYfuO0vIm#Lk&GHE>H3zV;>x zl4Tq7hgYH$iAXMRN3uQplMbc2po6ucz=x8c!@qRXsvljq%VDt|f8p*lM$03qi$BgQ zDYrrIu7KkGIc`Nv@EZw?*(wYbY>$ov_F;+x4+LI0!>c-{E~wNxnA4A?ezv9%mHd?{ zOFWu-&tHDBEmrcodVUl|DFuv_a2Ny#%h1>WiN(#_giuQj&#!F*FNowqlaTO8(QHV5 z)N}PkjE31)I{_ptG!f{WHg{)pa%e~ml1f?H9(U1tScSHWL2*#yig7yeNaVMKSIAN? zz-Tiz&T>C218B@wGwwvSb>%GhfU?4NBJ&d~!kUY<_ z-0N?xt#SaJ^scx3hEj{?MS7}^*6*WAtKa*n7nPM`04wuXuWXCl;EmVN>9cg%t*od4 z|5S&4T}x|p;S%*4KsN#{3IO$yUsNQpA6@}&NfK0CY7{uC4;zmSezu&cy!Lua7jRf@ zI$kafG(|FkaaEH3SQEOhrGs9H)}vySqy4yZ5CF-@&r-c7iJbAoq|&K?h2^Yzq-*{>m3 zj2TNqT-Y?w{=Nj;jPZl#QuhZHjw`HUaGf$e1Gw1*rsnI?f$0h(<(~|L250L``kCCn z?@(53K*@}Lc(=sns0H;$#KyOs&iRh_k_;o~;q>C<;=4DrADEgKyuE2GS+lDl=R`j$ z(LP`Oqp{=nPdWDrD^Ynb{zhGL056hp+sy5yWUP=`oXH7s@(Tv6&kzB0eSRQDNQ*ss zUd6YS|dH;OUO$>b!L!ncAt15Qc6%Q#Jvkk zH{#!`QBAJWu=o}ffuDK_;uBcQ-AO-&tCDt56r9}q(Z3}=ZR!OO}`C$W?q7mBm&4GpV^FKe{2m=|SVIyuR{1kfQ%}($6 zSsS>utiW6D4O$M*#nfs-&M?b;F5f+I)9f4azR6R#RF9MCA8&xI4cEB2;FMe{0TyD}cy6Jm8kiDBTOy-{8OD7Vc6-%>$5c$Q;ijU#^q}m!NlTl5F63Z>Z#=O z@%kPK&?qd_8m#twE1f<#gXS9SsFM9tqT6w7hi8XpE^HlG*3PUapuQlQX@bqD-ydkg zh3}~B+iSI6<)Ji5>n0NYeWRV=*--C%?Ji(Do5~C|&nhz6KslXLC}lRfsIeZRWB2G(g>X~aAKY*3WnLOka%iWm zg~Vb!u9>Mwq*Ia2WC>m7$;-y*C!mg^6Sr(4mZO&-S-974C(fRe349}>^llGl>0sS= z3>`K?>{Adi=8#9P%5QSnE#+%(?qR!AtaZ;6;UB6O^%quB4gKM5u00%1B9UgoNY_wW zHjjykNZ6qosQZksQwTO)cd+?FZV}1Rx29=0UDH@&_jY;UPr>U;w!GK8)vi81nUJ)s ztg~+N)OC)gs&Us{b4ULSSV$*c#i77OcNF<^ekrMa5NES%8ZH<7fN>;*!Te?nT%5)0 zGiGU+Z%Ty|cuwCvkRqV*2?@_3+V0o(!tHd8$Dw==;-f4Oj{Ny+9boR2y>ABG(g2z8 zrFbO3U^O4L_M&otJQeE!)FxLkMKU#;hOyZ#Xdplk;Qhy#>UcL|L z-)K)ZS{K#q_`(r@zLlosvu^2mD{3jaFk80$Pq1eWO?U;tz^D)9ve0TD(A3-qpbw2k ztM=6}KFZ!mB3LAzvtL@#D?iW>3n^WG^!5`*C8em=*K@xMGTomsmqzNxQo9%v&CnG` zC6imqlxwc>fwbz`M?xcb^w7l_xoXTeGEl@(VNw<~%cNp|j0Jy1g@uUqc0EI&aVLXKo%j#$EmZ`RIVRXpHwSG-tne*oQ$?nD5g``Fl-^b zzQ2hi^yWz-#W8o7?M#WYxqDIF%4}Sbn1%(B^^wgwNsLtr`$64gQNN{~>bJi^Wr4KD z2ES5G1-F1tOHF8UcVbxLqMg^eM)@hl-nD0s4|hKE#xYQBgqzvo0`HW(C+U-{Z*>NG z74=1t8%O22rq669rQ0H}BSaPBg~okCZ0ZBS{Jl3XyjK>&fZHcUqA?y}@TCNK1_;oQ zk;;sY&97(Q#3WfmzqNdM4iW#97Y@JUd8UH|#`r_TXqk5hmRyawg%>Hn0a~jxj>sQq zb>z6a8mu2M>Wdf|?5k5#adKiqcmd<*q8=0tDuC=|;^Lxa={m}DIi~=;{37j6`)l6c zp}+q`F*5o7>JUw)9hWn-G;fO4RPm#=HMwM5vh_`V821hGM`XY>Xt>!~eD9zUx_VHz zy8wc3&h31IR%*W?GuFku`q!#z%`@3*b5}h-f{YuZz#YDwn;TylzWLI$6`=fz$5SV( zZ7srXarYTARh~`L^y3+X`}C{=i1Y)h2|2lXDeZ9Ef*sQR>ftdJ3jV^gO9`aToPR28 zSg$J}Ch>Th8fMq54)oiLRGB|0q6|&Go>r>8m3{Ti7txQJ(({ai4sT9VE;c%H;ejp? zO8U`LQXfC>Rymxl{5|kNg@te=5e%_3*9a@k>S0AvhzNM(l85LbKoVMv*J`b9?R5o+ zQ!~Vr>!V(h9LFL2GYrDf!!oPWKf{jwXP)2WVBoZwTY&f63xWU(F;+i9gDuXTedR0F z+xJPT7yZX)eRoX;Wau~l!%Rv>vKjPZwH$FT+ZD2#8A7NzwAf_K-x*#1`M2frBR{NF z^#mMoFQx=3kqXL=<(n<JYwmX*|5=#xYOs2RKEOZXEO0FynfcV zR&%k6P4QvZN}L%eI^FS^PjiEZ zbbT{^HVmT~e4JBoT`G9@BZBqC$1j+{Ra|rU2MUVW4PWeU!$ODu{M!<`+)RD2DC=;n z4HwD{+Z~t77~Z0@fM=kzZN^0trHkk+d-(Rvp-z7heLKj#`5-wSISfVVZY44FUK~ zbjaQQ_gmwHSKq*sv;TC{V0{@s{j@%Qi_bOLF7=h4v~>!AbA^3)R4zI#X@4!kp&QIZscijo)=j z8IHJ#Y}1Sv4NiHj(X7<{%)XX0$TZIGTYglEN^fD@hQ(l6q~x+%2nHg$k{Efm^Jd}m zg~t}g(IEWBbf@M{yw$miQEmH!G-fyPhI71;HLP;R^ULbDl|$wI%2ueWU1VZ#@XEHP zD4e?v3Oj#gr(GErrME~cS;sZqs?5*gS#}|H`=ip}mh~*WF~8-<@P5I_rzCf#;xx%a zdPO}SRXTx&@q@FwYv2>#vF>6ArXUyZcHw5w(2y|duSZ6g z1ywJI_pk)=kMRS>c=LTiBb|_fg6KG?RyNl8o2RM%(2*d+I|xJA2i7vbsP{FkRqrpR zKt(Ft{K<2BMA~M8rgy=n7gU#zm(4QJIb11b!0L`_f^?eK+&=)aS0vPAvZUws(9^2T zHzWW77gAo%WYM(Up*>M_ebh#`IJddExjh^XF!I1A;~Lbm?n~ca*U!}A@^H!_KuVi# zW-wGVR_s1#yB%L^d(Jbs*rkI8ie(?v2+~Vwf;~ji!=Md(gBA$UxxX1O>RoBy#FR-m zoAONY7ixWTd9fDtIGo#ab*$gh!}g5d-MvkczOnpE_iO;dZJPe>?4&SKuCbeABZl}&Gu=R{#lvv;dvy8jq^o8nauJ-LHb=j{P{VBMr7-F z0~@l%#g9;pJ+D>tfAAI-kz2rdkdz24^X@&ZZ3_wm409Op1(*PEDcd{u29^ zlCiv!tLP3!b5#AI%j7M4p^2kr0=niKqeQtf=h;!Gau#;hWRa{t5>M+9QMR^2S) zix1V!7dL0ll;trZ%Z|%uo36kT`z}Kw5m?jGKT+)au6vq8Tgltv19Lc0wmgB3yvAB+8!LS_{$ zAZG3+VKzw`{+N>KDJvo*M($X^R8_SbnD6pRf{zDyQVK_GfjwTwX<`F{gGP1_^f}IF z13YY)nQGN+q~J8a#^f;mv#qA*V_B-_hpg23U}#Vk5AXEcV>o2~#3~OH4A-b1Q`gU(77=a^7KxqPF83uG`g;4=d;d zjkH`Au!1juM9E zP2cV~*~zPE*gUH=BVy2#MqhoR1Ag|5$l1wyI*Kl&>Ef8W- zo4Ma-k@V)9aSm87)aKOX%fiQGRS5j4dtqyM_(l+j2EL&JQc={Kx73nmO-x+rxLG+2 zkMT=I{xLJKfoP7o*SnQo8tA%WhCM-L-A=#Ig02slyL%doidJl?x3TjI+=mxA6NpHs zf}8Cf1}*pUIOvrk$qPyi|FEe?b~Lnvsle&QG@n?>Bev${LZJ zdyN&Y<*;}X%Jn@f?Cod)qvYa&)*1?pdKXXe(GfdwBwa0?c5f|)WG2-jy_*YCbu+`w zE9DpSsvj!6YM<5E@i!Ocn=|1&?FjjeTL7p8WC)U^Ut4!hC>2(m84@^t0q=jJL@{{P zS1ogLTkSR%Vjp3vF>OG-!P`JT`gTZ8OeMy5xKU#T_9Z8=++@#)k+=tKYJG`Vi^~6* z?#Jt!459bKm2E#+UHefzD1%7CD4+5{Wh1|It=Q9M-)NF%{2UazqLq|0cmBOZHV-dE zm;4#Yw4+jpN5Qp=@sIgkkx)Wy4UHa}d{=*xLkA)v%)s9K3TXE9XTuhR6{R=vt2Cseq6N96^(IKe7P7m((RPWmsGqZfi@nQpo z<1I(1IGE8Y1~U5xFm{*o1POK&ceoKJCi5Q)rsSJ>f)k}_gB_>2n$?FW(&7l(AqXlH9F zl1P?G*f3{yS@9>h(tvRdfs9bMxy$LuaZV&bx-Y9vxo9j+=E(eu4L#0hew404cx!Hu zf!~Q-`YoNv25fl+o~_^NsU*DK>cs*93BX%^v**Z`uc!RxwZBLb-3woyvXiH@8jP z&kJ|h&Pt^1F*WnOC>a|(Y)oB(t7REZ%#3bYjeTOHoP=~ ze<+dz6@nINoP3i?(n2JWf=lm4RlX;^O*0$0O5F5Y=$6U9sw+2-xZtY9%im`H7wcP& zZ$sK4m5gP+O0i5-;ZyIZL%9}oT#MVd3XHmh#g4)kg>=VF=mTi(;@4+Cok7NQogGIw#q-g&yExcc&!7x}gg_I%B@{~2U?Oirj_Ey86Wo*mXjl*W-X zVABHY?hGEo+df7E!5CND*_2@I!hM{_(UD_vEHzlw_8%=k+UDjawD?xW?xZtL*PD4| zQ9P^<)%WYyui$-9vC*jB-)fmZn+l@1LG56xtK*xP;BxnP_s)wFXM5Pe%WEs}V?BkY za1%>CkH_T*i0)#ApsDI{w`5a1(6S(#rp)%)|6f$7!f-je5RsDu^&si-t&Td5hj@Of#>~k0)bbtiCx_i#b znFt|~60Mx+Rfu8r><7wK9|qC^;}HF8)A((fnD)hP)_=|HFoZ2f)|pV(s4rRaM`&s` znx$I+RHwKP6}!YGkiC>UNgF@=1Mjaqsh7D-5PbIE6A#p4N&Cnc1AILrvH1R3k0(F( zrdqM(Uh}k&%|F<+Q;|W+Ouu2EMkxY+z_B&+;OvuT5WFx896|(;976o|4*JSRYPGKJtVI~gUoRL-y zS~4-b&DJq4Fb65eh=P5W{OMl;E?D?&nk(9H$3mwhr*Vct4s5hYL#v!~60;rbOehOJ~YINAPj)7#67UM|7S^=+s}J|O2;JNC1@$^}T!;)`BfRhwwJ zxb(I;1p$8@V2Nuv)1GsKS97(n1>ni%+#m4USB^pc=iC|0=XwRm(22h?Fp(`Z!?L1e zkKE`MG)s?>AlH|3M@QFd+K^H}fr0-F1E?oRTv};I*7bqO=sw^6VB62kqwP3?43SsT zc325qh^bYtv%lzzfg-e8a??yEEm))a5(ppFnE&ZXV}fmUVB;a#wLd=l%g;5PfSnHR zu!|b^2c~*bO*lBbE;k!-2yZPc_Syq;5#Dl=rtsLbC33y8TV(mqv|&WjD6;eF2|ld5q5h}Mgd8Nz%{xD@E5Rm zF@=qf0@~KCtP}}IAc@cRILgl?LP?c0npH|fIo-9`C4XLUHE?3V@!$V#HAuTd^P?7& zN~+e$0r?O4!N*#2=TUr{`|gjTp`js7Zq8jJb0p5wP8Mlt@@U30edz>Nlu z@18}@MLINE?bmgW2S>M!Iy=7ToG5vGbf3JWlp%@Qf`*zdYgRyC8Cz5A&Z&Iq=QUsF zo+nCW7G>htXLt36PKS(M!+uyE*{Jl>84>k!Ck!h|gv5zwMuS9)m)@oKPXjH;f8>r* zCDKZ!&n{PE1FE7p&Z{@6D1W!w6U_RquaxA|A=e4h{Z(75c?1{Vg4W682~kj6U0rJc+A z`meFEvFq#WUEhZ~c*Taay)Fo*bm7mMjyrmDlbx0em6Qn}^VVv2-Hnaa{*||)Y)#uT z3J7lxS4Hy|Q>hPor*AKvMjXa+WKeuJ`Y#DoRqz3~Tm?`p;oI%Z+qG||t@I(gSKKb@ zZ{MllW3}#CA*d**45TERJJd=(Qjg-Z8K1ta03tXOYBDqH;)pNzvM#5cJ3X8{-0D{0 zq5A@mJSNsLI+Kgy^62xzd>u$UrLH@+6Qc019X3^G%O+^Z*^kRc zv+@wGguPRd^$f%AZZ$SE%*io9e?)kqW9n_zw_WC93Ov|;<}BNo1Z~urRZvN_Zlz+W3l+%>yy$lj!{6?mJj}puRB#H z;VR}i!8@miD!G%eJpy)K`Jv1$Wf}BfX3hH~9h65*ZtfZW+`JOB1C3!$M3sdPS9%f0 z-`*;sIBb6O7y*-C0-z_tDH&#C&C+aNz&jQKcv`7Q#YU*Q384jG$CN?3ZX|W#6PJTkkH*n*y{D$(zVgY3-rtj8D^v+ zI6Mok9VtHM9{r|e>f+&lP<;oIu9^Zyo|2m+d++8-&pl*mlrF#j`Wd44ckXla`GAzp ztn$WTvQPy&wLM2Ixl4jkF*8qrD#*nA$?=c^?#d70tYY5M!t)xz@Kz_ah%#nCn)uc6AY|> zl4Bt8{CjZkX;Xn=qj)n{e&#NO*dO*i?SjmJ4b<0caC$`x(~BpM&df-u=QTYFm~1bg z$V<)!vxYtK4u7iZN-NH(GBRF0Bx$%vS8d5oO{5|I$0Vxz zb+sc5iCJE?ThHjDHFw?bk@7&OCe00_M?Cb`0J-#_)?K^Vhmf|puydZAY}2wIgM`~A!8l9+S-3YoIY5-XsH)H@Cdx-e_GK7xRB^~5>2ZSIJvrH{>h;sZFv zxw*L}Mn>IhXhd4JI*N*TkV4HX3mXq;;k=;petgBCP-a%8vhJJp0w{}ash$wTa!z#- zdIBw|H<5Gr^l7&@m&x-aTdl9(6TkE@>cx5w_7(qz(SWk4$O1T!4HwNt|_~IPKT=>mMK>5o%&CAS2yo zj8zyHDSMy!or0!PU2a+Pm|!4r2`cT&72Dq1m{7l}H^~A-Kaqq;ANRbH%PSx}<|@%W zLF_0egbLz4mV7iMMs;iOpSPv7Lw)QZb8uQ%x{R?AW+3)aV8u!g(~Km6!Hh&S)Fuyl z;;yMub@s_OSiwjZ%K?3B?7fgqj(^t2tOY~vI$v(Af!74(OsGxFw38oxa6Vqw!_Jki z8hE|-EdXR2^ z#_~9nV~cEH+F`Ye(bt$n^NoT1v#}iWkY!T_tXQTUA!Wc?l!j`(CAoSfg*$(1UAtRK zFO^=!KePzr_NK@?N@VQ&NgH@(E*kWjAV0eI9f=hZLVAi-Fgl=wLj@R&CJ(-hh#l6n z_Mo<%%0&YM+HvTUQ%?~*PyQw-{5cDJo@)(dlFy$~(%*?#iLL?5d6-f;JUGN#t{+K!*>xHHwNIE(vl`LYX#El8htcHy1pAcn^5=2)yf~60-C1Sxso~jFw_gg( zU+DIqW=m5`n)+xz75hn2m)Rr7AD%J8yysmw*Cgo8DmF5 zl1>yDNYi4hx?Bx|(3VjZb@l-~AlPi;9Nk<~yrU)l4Cz z^-KT~|B)7!eBO?n+f$Ns~uhqI9XY<~AkmY5Z5yCTU($!k@{W zNPMKtT$}@eaC58&c5_xW0N9(jttKxTt^tU6+ym?ge!lw+QtIXLSj3TpI8DF}rRM~4 zoV26`0(5K0T!;18T+c^(Ts{%K_zb4%rbK9mQOE8UK`|wW($5~iMr@N70$I<)d zJjvfhLhlSZvb&L(cui5N3Zk;o|BHv7BSrhQKMN7oOF(HPKS4aZg^3n>RbP2@)D zkLxD&mNE5XW||syGrqF`i0<*Z z^Qfc=V3jcds&VV4r4b7)C}3^a-$hd8R0pVsMe)r6xI0SwH^vbuGU!=!AI?Dh_o#PG z54lJ3)(uGa8U^n|*;iA}+ZK4!@w@};`Qv0 zY{N*ig@8P09Deu6||9`P!X7977&A8*ph^*$}!fq|ctg zkAs9S++rVLx!BkEOyw8k6a?K+c>n9#g9PV(BVUeeRSzkCk%~L6dgbA5-l*issimeZ zhVz~mZ+EU9|M@<%(u#_hwQd4>x1ru^v#4jLXYwG*sGxxH$wI;7*g_3SiG}tY0*d$y zd3^-FQF>I1modU0(#_iop081Frj1OJ}Zb( zUCqy8bR+gB27P9Qm%?9D%+G}-XjyA1tCXF*Am1~gX%(y|cc5B__${Wd2&I=!IiWiz@T$IK)<#%>{EZ^lrrL&jM$ZHaR9oqbx^#a1i4mkd zl1EMVx?{P|MXrGyVxfFa;?J%A+W1X3E4T5`JgaosLC4#jJ^Mc;aPcf#E8DxC-U{ob znssmzMdxgLBfLKJZ713@8#&SrHBJb5E9{lGoGT@SJOKmCOTPh&W`dg!L7iCz<`ewV zdj-xvZeK~^W8X1#m9oYEJBQkyCt|l7@sMKxW9Vf(dNGcmn!7#jt9_g1%b-NtU#_J% z%45S%E1L{~c#Q(45G2+YfILU2#kMg|PzSf0{YiIN5+0gA^&eBt!9=dHy$kDw`l_^I zUOp|T5;Y|q9X~6p3rI!wI?WvH>-#-4bOc>==dBj<)IP_Nj2z36{fzksd_%3bW;qe` zzh*H`!-UZgC1b6vUg2)=wG91Q77jB+7umY#3c`@ud2%^L#h{?~FBN<&zEh%WA1q(p zfKml{i~B{~6s8)RK^4iZU|hpc74@0`*u3tObn)If3GRoK(Q?H8skUbB4HXRFrWu*U z1c(xOcj6OBWJ$7x7Hjq4w@Fy!v@aIQ&S?;q)hqUzwn-rj`O~BT zAyk_R8JQ@;w|W%6OO56^OahkkQk*nS=V_5H z$Mo78yw6S{EZW{T+24tDhntN~Rxt=!oAs985xBXz@yy%8pe4=CM$&1_q~}4x^W5&| z+d#m(3Zmr@d`UQRv^@^0!otEp`q|W?GmyjhQTM8-sGJZ6b$IU;)qqX3M1qY-&O4(K zkZ*e>aP2D-90W=}zME(z*+jSTk7-LTR|`Hn2lBY0h!QanU%U0oT`exFp)np#_DLJ6 zfK=VRrKeu5?dq}FM*a1gQc6UaU*nkX>Pnu>zAIDT@1cmpIu^N`!b#2G;;I5aUK5&t z7#4xM9n_JBTTuq!zfn<{D%KQkMg5=e6u0{P@r;CayeiwIVJOb8d@YAR4Q;=V3?)?{ zSe$GLOsVStX#@ckVMq|lN@E|3SH36^+9sM*P87YY%aCguUiFJF|z=C#ErJ6K&& zUoz=>v?-L)elR$$oMCOvh%xVEOQHI_bu;ebHNidnmJZ3tDQ1WprD2{Jd1RVKi zz>!-g!vK^VE;WJfGF7Dk!_qbMB?{h~SZ>E^E|s7DD!?1~6Ee8^>Mv=`?WQ$qcU8mE zg8h^r$Y0;8I9P4^J4=?86`b5Gq?5<`xcDZ5%v#>48FnO!_@n(|aU#Mv`LKim_m{IA9pykqDn?=%tMG-Jko3qE53M}m zl;f9hF{aBx@Pv_+vvGD2R)Fh=f(^wZEI8iEDIT7jT?UJ~dFOP^d0LPh<5@ zxlmtrB0-U=|6@i2-!HPm!{nHtMW55(MR*hm}%>>@!?}Ke!5|kJ7aH`Dmi;;7Gz5p4WYUN0hO> zw3L~HrdTVo(g-ZSC_}^+m+a>cuYBb>pZR>5E}y75K`zdJA0-OoB)9CjOs%pgUsl_l z%G1YzoWJjCMiz4R&N&rQ34SgLhrGr7>5Ro0Xn}rsjRr<}%awkqSL8_1IJ1$_ z0$U}qg_#UW4ah>(KKQejsl;Z!*EU(OBV@x7%}q^srN=B5&>_Y)^5v|bsQ>b(q*vNJ zzZN!0Bs+V!tz;BK_0Tf?Mmo$Z7DU+<%dB}+yC&;(2Qcx!8x1bx#S})agUH=&_4<_W zAFg=n7g!*!AT9197OY&NX@29XCLYH4x2eDNu!PtGDZ(~xP<_4EQBfR=_AO}qlTuT; zKevAw9erOcC%BbdQPOm|D|@u+)?8m;yp|INa(RWm_)&eiRm(aj=-V!pZA`Yj>iH~Z zOQ0L*?N+(e9Vq`SIpbev1N{DlWreuDI7o}p+`&@(lO@?GZZh%-wriV{eY#o4-X`Z_ zk~lO75MCB3oUFyX{DSJMU9<2t*JcBfc9z(y;Wrlhan35?j|Vif^_W{szB|mn^jg7= zWdHe5)yLCR_BE~EM|_BtjKNrLZ+gA@+E>#FY}BGxEdBNt4o@XVNHq8~>X3h_ARz|) z$kP)H1U>Nd8Bru~aB40+Ik>H_sNz6by~<-`=bFvxek6LP8p$577*ZH`R|LsGPyet{ z<2TB)v7HLkngQ&C-Zn>uO@ZW;RgQe*c!FrSFVqKl>;KZs4HJNB{kzKQabH4``q$yr85!cRnipk#;P_WznveCXQyf zqOG*1FM&xq5R(p1r_Xs8vH z+zU+ArtCSUE?>nMVtRHO6!fi)q#AGnLU+ax-i9I9Z7SwhDX%sL@V9$UNyfyHTdrNT z-4&Zfl3B@L$ExqC{xC=^$d|GlmY5J8QjQXx@Ec%7@TIX~5mBtzqvUI zI0w$`-uRTL5}JX-YNoF0h(|Ofn3unXe{jFG3z4Ak;?;>3bpaj6-<~$*u+gZ0@_Nv{ zGD8@Tz+sErrRRCgQ=}JY?Ya;4x{ZIMNcXMOFyFljDR55BJ$xb=sVx}td0T?q?HeVU zn8L&D)E)o)UEiw`9UqvDAo-P5&BE!lLB!Q%ZT$!82<83$%82E6>p#32n5N-&9)z}*f}ugo8Yz$uR=DlZiC|a zA!jzxTsN?!kuRAki>@|GRgypq7oqPjLGDdty$kMBnJ7+;M=GOGO4EW2hL_j*)2T%( z+DpV^v zRxN)mr%Z6w;knIxTprtOh1QriDkMH{`*BDWAFa+IQ~kHH>^{KaNIUz!onJ4FC=_V@#62h)=M)alH$I+1GMr63q;a-1sUe)X|{z%IWO&~>OVC8Tr z8;%`VDI)p29RInsvkmA#Zv|w_uKmU0bnQqW^dYCMh(6!D+?ytgWB#WFIQL1GU2t7H zlI7c2k9nmge7!8}e$m>`(y;E2K?u9u`|5E7+w;2;y8TV13dMq?y6^5xPKMvi00#j` zVRXxsAOft#W3Z@4vrOM8=s8e5CL|~CUorz!C9Ap2`2e`J`#rdn|7+>~D{~%R2{8)W znQ_bC(FiHHZ5&wK6f7e)`NKEz^L5H=^>Z(M4{rO3eh^CF5$Zhy<;JYx*F+Lg(KoLZ zU(vkI8HjExOe;|&s5_`D$apFJg?2{)PbCJP*2EtXu~vA5`jFyrBt5IG9c##6ZJ^m~ z|K|zX$)%4AGTE`v5J(a!=f)-R=-f8+I?81ZkD@= zbSkc#HE`ZabxYm4>iG=>k0I8*msc=!>>(k3{N zgc-1p6i|O6VMS5eLZD@&eT$h}q4r=s(tLPe~tp@ zsdP~6{kQS#l3V?)p(Wv|T+XF?BO$y!n@gM9eoq{X3jA%XKVr%HcbCuMcP+vxryVZ) z(|nm@esZ3xYg5`+prevGvw7H@3=a{eG_FK%eAU%lUe9Jgbz3SEq|_IO?sHQU}r_;|Kt(AO+nUb)PlOeh4S zE8t7OR0TbiBG-Fm3I6Fr|MTHky^8e2HwGQ?#!n}+z%7+3cj^lvJQd&Ogr^h(H8i!T zlU-KeYun6JZn5Nq0n5kk&PzFM46tSEZD^x+q82hM$iF;=tms+gnNc|~SNJrHTqW|q zR1-m)sM<}=W{6JQ=)IsbV%UF3$vzNfbKu{}tH&Q}c!;Eb9I2NOOZ@>1K{L1FqG$%= zX97i^*k$^;WmK4D%+scOgf59>)7bU5t_XEuSGN`|C=l-q|DwA*ZPOYIR7i^d(->PA z%}Mn$(IOkcveuwXHEe;rL)X@doMZP73w`XcRw}>#2NVdeh@#?Fm#U8L%+;BOa6;gh zIMIBpH2k2r8{T7iv%4lbZI&bv@I1m7*bFT;8Z_2XaVkO-R+ zo>CKk+FYY^Ug~F4J6cWaqG$Ju?|h`cd6BB-%1->J7^|jHtXTWS*NO*j@8U<0_VlN9 zA>hq8@Jo@+ws1Y!eqUal?p9_++N3SWP z!yoVYQhFz|EY1*bk|z!nN)#v7-)i7@nKI#pyr){BH?XuV)h&vKP!eNytv-ev3&>3| zjxq3uf%vA-H?r{X(@T%1d+>2NWu({83N`OCc#Ur7`!0Hays#3Ot^Ea-XKDA4BHQXG z#0DrT1$({DOJ_6llGe~qpSB#Nst0sW1EMnXF@#p09P+!w-Y>tWDccR8io20_x&NV# zybPiZOg$a&bJgWjJ?)j42;uWvLPzjjw|?d{$?QnTaR9}<$6k@o)MT~!Oa7U1qyD&N zM^p${<0S(Xe>sBfxeU|2UyY;X4f@X73>ek!X+R6}2-Mndg!tUVvEEvE?t@){lbXUj z53*0l1swN^((Y!b9#rtVT3~Z6b@!*Q9yWBF*VCeNb`oX2R4tSIshP#>hs`7F@>57t)R6ZSY_~c@Sw9pT?31;`em%TY+mXutEA||oHgjDZqPSDLO;JeEHcrW&3HfN`0s_Vp)i9CWXGW50Rm}7kV^*+i1&RO;#7esWe z*U5FK^Xz^>yOUntW|#FMls#iBWbQ}_Z%Z4O@0M~+NHO;r&JL=q1UTWUVDfnQol;vxJhvbq4j0q#=a zYt4r?ibkO9=n;N6i5TqW)ba6}14z$c#PiCkswUWh4XQ6#{~~m~{I1tfG&$asle@74 zq@qJw0pCI^gbM$4bN_4aNl~lIO5n4@=DR)bSg>Vssp)fUdkxsG+j7?c-+~u=f;H1i zKJX^0qoR@$Xi*WLcc;bDRr8*>pcY@#TS~T*vHysj|1(lCtB2s_*_dlrn|qzDo;^yJ z&;PMh<1x2#shz0$yvhh%Zlx!RE3P7s=vpL>+;J=LqqMAWm^zje+^uv*{;wqxQ=1((iF+n;EntSn6hS&114?%+=%mw^H?clpJav2 z+HkA6oOBD7B1IPL%{yq~?ve$mxUP*$ac-^_BXRwUV10qqP`XHe>RXTS_iNH|MW#T- z8v9}3w?J7J;T(wt36*%UyJ?j3zT0t6maX9oMHXulG7gA9TA8h{@usOed>`x2>+ZA! z7#f#2&7GW1B)#0a_NSyKp+BYKW*Y)2yPa>$4l1b~~OXmN{b3^Ty}0BJG9>Y@<-00yzx1 zKuAxFhBP}n>wL5*`14(fMg=LP+GdGcpxj}LWv-e=@)mptY?G&DXGDS`d0FH9aucYk z-?=O}ZGkeA>bA*4byUBT^Gss#{<=qac5d!$RJ!E-%g>NwvaM%Jx0lCFK6f=f9cTBz z`ch>vW$h#LH-!-ak5*Pia-060^39?l^BMz6#51`<0biT}XR>?EVjMU($ ze9n66$4l`IBi)g*VRCm#VdknL)gUP8Q>g?)@tM#f8&}D;b2_%H7>{*r{pG2CkpZHa!*RvBkg0AbE-; zNB#4gX6!}6(ER9R^=wJhN)+`<$SaoI=-aL9q$L4|0WLM46^t6#gf7fUS{eg_FSYSA z*8yB!8*bi9%`k&hDp6Bow^Zi-^0hzePVc{TzvwUDnu&5p6A~LCOKPvc|Ic~hv@5pS za-Z`RsRb)YI=l4g`((>ub!S^iO{mJDfIPG_@dEu_g3P=dh>n2Bu|y zD}l%3kTSaN7xXZC_!PU`hr}Z<^Xm0%xheAR*h&5{x8UeCEKp`SzuGD=560s@fw4hW zaochAAmLb;yyULS_a0F5i|zD)1WPX_TsdkB2ji>gt>87@W=J;zu?u0?-O^5~w!p8$ z+cG?xpLj)NtVsIbBZ**qhfHdv#$JlgomD8#YI79-u1D`glixc! zd_5EVvOsf46pBSIC?>#O21B+3VD$O z`1+JQuRDC~*TQ&`d0CPUuX@W2Qa~L^U3RCSfNe`4yq&6o-N}VmV@j|$UmP5bPZ)je zfnVC#1i#N%SP)zS<_8ID_@PV7oj(RQ=7w`b3E%5g1)p5{zQL4+$zp9p2-u$#ARWhK zr9E#yXO*_a`vk&B-~?(OP9k9kn<1a?kxFLWi~h*ZAB$OD{eO?P`GbJY()7N%b8#+c z1hroww#JK~>y{p7*q&{4^n0q;9n6-QB&@+R4&gJg9S@FomKk2+g8Fg6MR-lRN8SlU z0d4h8BLqJ9zY8x~-gcy;$7*l!rA*9o)H{#jy@<*fXOb(vu|02GT9Ytj7#9>SB6APn zQz3@!+?ZVmuBsLgMEp>Eaa8vt+cNRaF#2cuRc9-ePPQT;H3MG6WX@PlG1T15cq_td zUoI2dR^sql4)5^lVDwp2SuaeoiM7auq_e6OYX3TP{yK%{7Z z%aPNDF~i;zrnBiP6~6M?C0Qmx^4&%>w(iMKNB@yXKQMfZ z$7d_z+JoqR)z2m=HE_Cq8zC{|fm-q&hN~v1O46sOEW7BuyY(_SlJYp#ioLrard*-O zwMUqqm+FqOTr@mgOufa1h#wT8u$T=+l_>S?pZy`TZrs z&XL(Pfo9K%VPeQJX19k4QOeo%O=_#aup<^kDti=6ioIZDLn1%vCil623|Zzq40%;d z?9=bkwD&xcnxh-k7>TDdXZ%YyPg>$Tf##iSx7d~!9b(WtauEUamOXZLTJYbGh&Re_ z{jlfHfwk!7ab$DzVsHwXsOctqcSx5gHEGO7aPfY?F#hjyvS9J=U5^Z+Fs4_P@COnY zg#Q=0n#+-#ofrKbCYVwTLwU6qSZ)zTG*6~}ZY=u)W+Wu#;jMoubF1yf3C%O9H4k#W zRzn=}VSu;C?fX5gqNisad#nBHhIs~hq;-FI#MHF^uBvE{u2wVKS;M}gN8IS|tEklT zTk)edC9%1=nVC*G6QT4YNTy>UQ&(sibHfh`dV&x`?ugeB??o^rUWVW$9|co#I&~JQ zVhd`_+NJqKJzalW&FuYfx9Oqd@a1XDhyDo}A4eb86Ry>h^0%ofjLn`dW>c_3NsSPV zR(f{(uIE>L*;J6$6MuXg+2Uq9?k8Q+E918j#wE=ho{MuEhR|fo7z?#=t#hKXn5m)e z6AZNIbVKqD z4%?BVD<7(9IxrU|K3NVhX!I7#1i5{L(wW`-Z{BX8;~(KUJJx zk{yJTh@12IJkgkm5Gzo$Ox?0MH(-!4)#TY%cHa23LAr+%h7jY4P=WuwK~!J>jxv*) zFqDx#8gi1Omd5QX#^TahHDQ3X_8v_(=(aO;J#w+n)A!2TK+iS~Bp$@;d#1%i>9Es< zKvPj)1FiVMJH+sO+@t&2Fh#LKpl-!rB%5wmaT>-i&40*cKW75+k%PMlt140aUsP%B z9vxMM^0}L{OEG(#qv8)e0%IA}M#|(Fnq8GS4PNlqmkQm#Kw&TB=B5ZX}Z_yp#7_kO=y&h$8{5 z7FL|O!ePJNqLp6B?0o%(hyT^X2U!-rvULgX7VUUH(3FUvbLqso^$VY+bNbx7gnlMt z{WkJ-`(_HEm5GLtS3we7%jO+Du%uAl*>pO&xa{~c?4`_#@kig4Y|jM!%&t!&;9${u z(^^~(#CNaQ!$(td4tNijY=g>~ympn+kRUQpq4Qy?Tx*;N2?W{uRL;?+t3|K}sO7ms z&6KWB6GeM`+bS7aIs;hdVQ%EVVUCmN0dA-N46W%LXhRMeObM}zQ*K#W#PJ_uUzV+G z>UCs4$kYrMQ#{0|3B93<5*u@RsXTI35UKIZx>jAPQZ$FzriWQFxTjJ~Idc?S z>8UM(FS4{49m)9iZGIske!=PQ^hN$e9B)A|Tel#ry2`AW5wnI&vltETG=$}SX=U3C zyn+_$=H1)n44#NTirWX+aV`RH|Fmn#ePgeg)pWf{y>+>tJITOh?&adyOl|N=`wKZX0>t-e0^`3xlmC2de_Y{p-WqXEB_iuT7qGbx>$24bPl_)M$%kzTYeQVS0x8ilY1=c=O(}Qj=hA>~{xu$~BZd&EiGEWA~l2-vryaP~%8cR0<$P+SCAHc_h(7%?ye11uh z`pKTX#zoD1y_1InSYpSlxoPi?AwiAzFa*DkNKC{BF*$!KKpM$<{+yP_0T)>hLMzA^ zdvhY_b32xH`7|HERdU9Teg7rl|2Bu|H|g{UkW#DfI8vAf{t+R}cd+Tct5d1Y7PAW* zjyI`YMnZ$~;~cFVm<<3nw^gK9ubI?&ur~cfN@$sC(1;%y^}XwZYQAQiJU^cfc|vv` z*=*L~jjlevF`G03q}XcH{mziDq`>G@d?i&w^s&=(&B$!Sm)V3ECZ>Mq3OF4lGalVo(3b*FTyM`FlhZ$?e5RG^x$^m-1_YiWyGp z4;P3Lv6l~N&?ghk_NNV}teyoM#cAhtH1;$HD+88Lz(R^|hE0&4#5G#b@)5DGdEeMS!GEnru23%v7%z2>&pjyt_J8{2<8`Yam0G zO;v%v@fr`e= z0W@m_)LdxrfD2MUlVoLS+e{M82C0(32!xASgD=XJdhJ;>q&Go_j$S@U$r2?nftHB% z1`5j8CGqX|8&@9<-1;_%S8hSvSy#b-9AEcvs#r+b$oEv*ec*qXbn&Feqo>T1)Afk9 zA>pti*7S_x#9{YRwEt|tvtRGkeIBE1e5rvUpxb_i_cFq;H@C;_$NbVBkaNp>FF|L` z@{$d95UhYm_}9%pr~keyv_Q|k)y6T#IHsu!zzmc~?RW>`(O3Oo=jQMvbG*p%OQbLu zKUf|=dSk1EPN3??RrtUhF!V#;IobvDQLP)3nY14^$U1c0nZ#|i*5X8lZk_RfE_2RD z)&2ZB$rK4xct`;F@`JPKuUL(0%?&6Wd{B>|M}Xg1V!`A*8cT;Kur7Xo;4N_4<5vh# zlzClHpvX#qe!pzHbU9nWFObuH8!dc;Q0cMCDJhQdzpy*kA?Z1D;!J#>(DK2^R8&ke z7!8-Nz=C6B0H8Boi`)TU$(8vI%s5NF*z>kC*KcBmxK&9QV&L-V!;=C| zV(}FZq_Y?=)~_1D36|9r6@yMWxwRO}&4ebVU2BC6Ol8W<@3DX05^Cm)ft0BrEot9UT?cnVJzSK1<6eSDu_gW*hqu&!Va2ioz> z#@0FUWKP$^(SPIuVHF#?F7h)VlV$-_^bW8>bt~PJ`%HNucn%?6{rYKT=AqmsPKX(y zY+7mQ-Va2OP_C&LFs329e4=*qV$25T7-s?g;{|H563vkXSP1CSY7pp&bXzepxzou8cKaSm0!Z_Io0oi*q8 zIQ9mvX?WLB>3)ia{uzI$=bqdfPRZ+km&geObo zv()SKuK*gjyPKQ5Mc@Ap#b3zPvh1w&PzAUbW@^-EwKFLvJ++FjtQF!wffnGZ@Blkk zfi2$502XAD9)i5tY=PN@#sA9%7(Gi8?mm9GO368Iy)Nh;`Cv%mNTow^qq9%wUmgs; z;bLqr-g#`X9`RD+=14ACxM&>2plDo27Dkn6uU|Yr3Y1K z2=dg`12iM8*Po3U>hSvryA2Vj;yAx)@L#6?egbaicz|Bi23~pDO=|NR%llMdX%D5q zwc#ji<>KY`)h^^yZyQ=+)o(KUF6SRah*E+sjt)&vPDcyo))?83Ze&x+o8?lH@9F<6 zrBp<}V1r7t%hyX3$B?+AH(~;MtB&Hq9xFFt8vh}6W8T@uPxo$si)hxfKVa2-db{;` zd>}@l!RulNpjZe3PSZt0z*76w+T%{fMpif`+3)XrR-;7kbeZs?4W7?)*f|MdSN5G( z7Xgn@?o~IKUailxu`@8D9V?Md!&v)nX8|bV`1!R)9$w$=<{_`kmTa<5xRzJ8*)7Mh z0iq0xyMVHex(2VXlSKXjxql`8fgdnkUz)*6FI|0@QY2oL$Z&6#34aW_Z)_R zD2d;#p5|J4mW%LstmP9k_x0_hm}E1LkaMZP^S68!i~zvT>- zjD#(j!t`;jSxzqH_)B*WybCYU#lBVyz=d#ISs+7>#(LIxs-fn~sT*N{Ksn+8QC7nu z-)M6?AAjXG_F0G3aUQXUu5z&}-@C}6dzYZ+uHW1%&u@lW-_{6^%X?<`pSgID5Y)fA z>5n6GBni!``{VgB!qkM}_W?Lw6;lw-0z*HpWZsXb^_Z$3&6jmE-ESF{W$kE>cb|wB z_K9F|e1eB{zf!8{T1q+19}ncI^qR>_rz4=M?PX&ox9GnZ&~-0Kk&PGkqWn=%mj5=r zZTBSt7-Ra&yo*SRA5E_!rL%hy!o(tyQAJVi@EVCkRX`um&_A)DQ((L>!sys=>j5Hw zFAxEM)Jixk!V||%3~0&yIO#$jBJt2Wzp7hfCzc{HkdlIGbU8ySwpcnZM*u0V4^4jl zS5*eY$KB8O%`MD_2X~-Fp6TvdqA2cT_y_ zp5jEd@M^Hs&o1BYC1AouUY~5H(Redxja`hQj{#P13Xhil-1#Of*zHX$XA_~QrGdd` zqx`k26{}+xbDg1b{hCWxQWrg_o86H4dbLISwx_;27VmVfS(;jyK#meK( z1|yQwck2g}l+JF)*|;r>wspmcN>V?`pWnaWcfaA$N4LNxe*QH=_6_Yp(rypGB%;PU zp!_as;}Bj-kfFQ9`SkVE0$T2raIcGL4BvhNFymKQrDzm7kJ>oFE}0-O5Z30!2Fl#(A_ zo*9^Bo{Fm%IPDIjm#H5l(eQ{DKS<6h!v%73c%6Ns#x5sI_6i6}7hz4Wv56SMe(u+W zxxE{8TUD;lS5pJgL@1MEUFt%cYgBF+QGyFYAq7u@dLeft6r|AD-{!w{mg|v`k$EIv zmq7DQFNCX{w4q%5{BfrO4p~DhzcLg{Q&9ye*S?pR)VC6XMz;Gp43KRnrc%AGdusa_ z)~Z`C8~;7sLBp{q04Qx8bg%Nn!ULvDqHg$5jc(!Zw?qL!n8LCJM*+nRyKov4EQc_% z{XIb9&EK(uoK`#0j{8sUOIgCMX9r~PjVOyaBb_lIa~IZtx?}(_ut%88LV8rMfol>)zJUfz-Nq6zJ{c6De^%6 zUwvLMG#b_j1{q%4bMob$k-Smx!!atqydl_HNq68|zs+DheydE6C*O|}DjJ2&!4dnW zGf9HZEVu_D5E7N3nd~|1Vh44q#Ki@fYWK(=gy*NWrlHGRX$+WYywY4t=r8pbm z#iR8&@x*PJ#IsLuJ-Azj=PKymN`nkL2!2)9cAk^H3V7H?$|_$^(R3aogQ|BKpjZHb zkSZ=`t%}sQkLMbm?V_mJ00riC$y1_mXSv-&)kGYg_V|MgG#k9bW}x zaJ@_BVGA0qEO+%|KViCR%?&MF1>et_M@h+N%D@@4kBE(%T`sQCH8G*wGx>q+##_?9 z@1oa`jtKMrHOTq!|<&ef$$C_4vj!*JQSli55%ou>#7?6!KOAj5l%@M}&{WmMcdm^Np1U!23ETEU1;RRQ6o``YC5PY)8Mx zeRhc3-2(dL+Iai{SFWrvQ~K>b_*Nkve~dVly2^Ln*-0UhoMiAItQ5!ol0Kd8YEsY8 zCF||=KJD8O4daR?vZ%U;2m+Z0su&*gwdTH2kAG({mhH0_h3>A>R*d#ey~X##%;8O& zKmda0bLyq7=|!+FVV`n0F}{lRHC0uLlA7xjrqzx^$1O?U_a$&+fYKwA!pF(#-CFn; zipqTlP~Nn|SZmeOU~qN2=bsN`O9^F>8Ce6q-}sP-@c)007ac2h@E}W@K&18|-GIw5 z7=Dqn;))xYnB^LnUxaK6zL;Eh#yF5=XAu;M>E|bSA((?B{;^u#f+$l5PE(@hN3Ed2 zT2_qG%p~%I58W00Hg=bI{@p-%(RL*=Y1$^!#ts88NS3JRCdaigt|c9=ZMkn@`KtH@ ztN_!$zEd3C?$<)yw4A$!(m#;8j!5nJxF`Ml^2qW@8jkFrKgMzR+u}C+eV^f7M8`DV zqy-QtB^x&yAR5ys8sk+x`1eK->s>4Gwhnw&oz=h35E+XK!aorJmNVF}3?86jqrQq0 z<0lOE-42N?2LHmRRD`(kg&=Y$7GI60fD$C8Hkgyj+WJF@vQZ|#G>r{I(%lvk(C`!D z$J3VHdFRT_r;ZLPq2-pB8ukbV5yadEte|M?+AKem(UgNc5}DhBXp1; zfhHj8OJsAHf*+6Qkpo}G76Z@&g~hbv5QYd4b^<)plqJh|+j4h#v-#(F2Bk zWYp#rxBK0|nD*xT@m+UVk^`a1uercoF?r(NI_$R&i7E^OhSS0y_cK!v;!~RaVf$;6 zN7FH+IZ6}GvQjm@ok5q@6zP9>^c9VjjqAbHQ|(;wckd&bR+BZaJ}M-`1yb2>57)(* zbZ5*uJzae)Jrft1`S2uMMUzyaS=PuO%ITfom+KJIwp{pT^h}18HRi!Y5$@-@(JJFW2E?`9K)Yx-%+G z)IU{p^+{Or1}&85Lcel@J);B@BUvPPvi`2PMpQw3*SR%OZ4KDMo2uwL2x!lyha2om73q~{V3u(CB7kPTcJ4K0@K9X9z(@F38riq{zVc)D!YPdhh`jspK%W8(pet(bQeJ_2FwIN?m>(QFrV*|!DuvG*2XXdr zWSXqCn9>N5^m)!$Hh&&l@I4udB&6h5rV5HyX{YRR2+Ojixuk!}gRe@S%dL$YDorij zF$bNlooS=E^gr`1lnt0@W15IG*|)fUvI(I4erXpp>rD3>9z?<-J@pENRTL{@ZFTv0 zV}(rCg6yuNGNShHn5LpR3$#6A{>d~8#>Vd_9CGS!f`qYcF5Gp_g?!%6$r3CI2-2;p zzef+uQqA*L_gWJ(CLfVz`wDJZP|$m4IQ@_zna5L7R8q6H%fsApYX@L9#^mkI$C>;i z{3kPUf_V$4(sarm0bNYm;v7Xc5(a3445Q@}drt%Ya#mSVZ;lW6=Zd(XdLc9%1YI!RPE7{9%sqh382f1FDA@`8J3BrTYG( zo)DYmnZ*h4eIfZ!QiU9i7(pYzXJV2eMB)P;wCWmFt~R|C<&>PC9}p%6;WLP@Cl-a? z=N7qpYNx3zu!!SJq;`raO4fj;DJ6*!I7hQ(9JYJ#TC3;GQD=VsO%iz#2dcim4CVYMZ01VgDv$wj;|vxskSHi zn)i+utIYSuk1HRrrt4V~Q2qS;{+{Ko%5Y24YTyIe;F0j@_pXYZ6FTAYw|uYvvrr@T z%=Kuak0fC^b52g{>mX-4KJ-o5NtcS0)yv^ilVnp5o|H4n-HqJztRoH*Ay27Pno~A# zpe25guyj|FkyqiC_j6>`P)Vw&s$#)IOEnwoSN$K-pY{UyJ^5(j5x~KG3wwVY`h3S2 z#y&M)RW!O*Vmf~&>lsXuo^2RmL*$;nFiF%%yZ&;mC!Ab?7dyKi6=LDp_&n z1VQe&er6A?Lo;iPi=+9U>|mWit2;&<|5(?-(vzQ`0L#32qubR$v+HOx{_x7T0OlLQ z_wFTGFctkBxueY(3kIdklgL}G!Q z;qfMuJ{SHC&!zNUa~zBONs9K5hLw}!Fbf0(c<4g<`(q>uU54Sa0=peg1(ygXO4_Jk z0&sBCfKsFoipY+SGD^-Hf{UTMBW5g=*;4jS!PPc>-c>G_Fg5}b5?1-Df_f`f;lRlM z+$JbOB`bc;!Z^!&#LP;KCVHbG)8IA{Y34;zvHWO)LP5lyd0!5Zr9lC;#-vz%V zVe8^QGKx>!UEk8Cmrb7sW1%2M9%wal8fUW&jd@l}b$Ht-pWwK4(k)WqfC2 zt|QaSdiku2Il;C%sRzsHtO{jnPV)E1j#qDoRGCW>lVlz~ zkVl7efA9~YB-^s9d)_prl36-3Ci^E+&}}5@x+efdf{Jo;)^rxUURT?xx(deN1J zKmBCl>N?w(Hfxa!OL3owsBzIdK2g`fLnzHf*CI8JlbFfm*KAb|ln+8dO6aeojpfph zr_)_B;4({Y0o#x&;AkHnW7$ z?v3@k3Ap;|XTca={id`Z_vJO;a4ot{O<6hl z6Nj{b)C~RX1)%-k>d3L!=G>2X)5E41{RG80&RvZxoZ;F1-696~c1Pfd85bvPNwNsL z$F1`y#c+6QW75!LWeT2&i>k?@(aQoX)2PZHUJ>i9{=uqi=_intL8agCGc%`e6x-H&Os!Q;l zM)8&T2sJNOG_5Uk@A$AhS(d5+Y=IuH7@zKM07g_wWE#yrk*44v0%A7l)pzEqZ+TnP zHBXUBgY?DXRRlT%y3ra#4B`c3cO`4@$3 z`;9<04A2(%0&xor>@J@mvMGCvo74G{K!Nk#;)|~FBx1=0R1_Fr9=!Q?eJD*Bz^}&n z9ZJ+|ejIxS&`7#a5yj@U7|TPjapoui8KvaiR@df&dM~R6E+&~E=X%yhDx0}Bw1fRD zc|9_czi+~+nihwe-w=CrJQo(I!HJ}%s1Y;E&zYiyAZ!~4P^OH}az|2jZ#AuXk^0yC z107xQ&S$VeYOWBJ-xEFm?3I^n;QLe}l+i3>j?pswjM!5NUK)P!w<0E&cEZ1f^n0jz%YK;^yY& zs%zsKfN@-e6(Xe=^g!!YIqqktbOoqE{JgRo_=T)-f>MH`L$6Pl)MD!o2(9B($k%+e@7>+1wF0E+ zXB3mhcOHDg88rWSfm@o>^^#vj_`LEzzLP711cjBRdfMTE#B&k!Pow2PCf;gpBw4#& zqASi$lg;lyr@Es~Bmumb0hrBJJK+bON?Zy`sBGDh-#a)PE;9|?5y&dvk& z8+Di6Z0(a;lI9!>R(|0+UQlRN1vV+p#4B|n+ReNn515c%M~*@b&QUJGO*Mv;vld~M zq1Pq3yFX>fbzp{B=B>Kg=@+{BTj0QOC8jMW-{v7YPldhVGsVHAjnpch_lLXmkD}m# z`Iw^a2HEiP5^rrX1WCrD+uu6@&pblb*~rXT=!Du+jrw>zLV5;im9m%^A7u6ny8`wf z@{j~3V5V97L}`~K{GN_Ccu=ksk>Tm9!73I@P3NvQw?>oY!Jw^3j@)Q*>|{21rfdRn zv{zk0fI;6y4YhBRsFMk`%%Op zKCe7tFsXJoolm_y*DZHBd~fg+N{^DGDjbZ1p@k&H5eL*^gXM(VKCOo8wM^6 zWV%1I^mM+)ZkQ90%+5N3cN0cm;R~cGY=4MIP-e(nU0unof5gF740el+tyuc5O@HM| zN{nHhjYMFg)-*daH#IrCvakXVqQb%b`{s0ETue4{w_Hk~W`_Q7%d?{Gg@X6D%)dK@ zFzeK$-`&ys^)8pGxvZH4Dz%y5+RO}&b0qQj@f2ue8G|50uCIcF5+3N3(RS|}paA3O z$E;M?hctdIU-vTldENwC>0Pb6ZGw`(ggRc_;@jrV|Gtm+0`X$OgBU;7v;HT2x`V?a zwd;e5hQ=Zl$$6jlI&_lbXM-urq43H=^PYx;dEhiK9PeP(8oBwZ-|1oMRPqB7`0sD zSe(89CF~fF@TY{zF~oj0kaA73XD+~_iDio37Wu@q!z89LhrL5@o?3|5HO zxL0PlIJikt@!eU`PrQ37n^VsCr|XsPQaf^#M0M?6-NZi;o?P^NF`05L1zti#Fa#M4 zZKf*;h5!{+vF0xypXyB4cM}&t>?FrJ7bt6KKM*g8iX`(WbrQ(?#gQ7tJ34985F454 zEu-6%EZi1Ae5MfV;20!=#ZzlPrTm_N$c>ER&)+Us{rG`E9}j@^jnV3(em1OfL1FpA zrVun4v*l%U`{v|Jq%vQJD@P{&l&0}s6xT8bAI7nht<9hA2@3fY7{7HH*lN`3|}T z4axq|q^cVTg9;XvlX*9I-=^s|jW*6L@^FY+2o9AisXe&(B`5Cfl8S$nn={`hCVsEQ zj2|tSlT&NsW%}_Y$=8|$ws&%{-wQ~T)nZ@H@4P`X{_^FD9xL2A@{74E>@izh$MJ;oB-zjgTnrve5l zS-eVh#*bU$9Qt3WwVGY+R?Qru%cg@NF4^k~J0d4jPs?2KOX*u87~;Hf(J<5gsoP7eUn^-uuTK;rvxI9$p+&4gppVMQ!=fJjDOr} z_LuNV&_(_r>9vdH{$DP@H^vrWmF{{9KOc*(jMZp)Y0JiE@a>_c{T>7a zvscM)GbxuTLY@$M;0jh;yHddK(}Cs0F;kxP^HyDda*M@zt;Zv)%z48X&_r~p5qA98 zp;c5c^+=)_5&MtNp_8HmIm533>au0a!g5bpJh{F6SlUUDxP)>A2K2ky<8IyHm z0uxB0Msd3~2U&Kq!aokwmOuP4wDejY9NTSD8~JkF?;|BhnK6zvvHZNL5)*qXO9W-n zucugE7&)CVzCiu2NXR1yuj{AnMGKzHFups-1(Z%;Ch>yaCw^;rKta8yz1U2VAak;M zr`^iKdNvZ2{2?wx=|I-G0|i9tq?ZN?QHhRo6qumND8)x$Q$Uy7rvOmR$welT=yMVa zf>%z03RokVHT!X;HUrxk1h|7!HZpwZ5dgCuzp|NC6BmgzIg~^VM83R`EJMRMI{jvK z^3CX^o`-goQZ|}sf@5hdGpQ`R;~lX5rRbW@_+^^ipIj&%*kc9TdN(F&3poQRg`W3m zxu#3wX!D~nx-&@<6?=ed=(zm(rLj^6c_8=|+w5{yl_kboN@wa1CP_M9Z54)bIVDlZ zIPGlAtfV|Nz~G4lSc@QQKlTJ2%(OI2c4Y3&2R)E zjKSsC?w)~A@fC*xa?V~v2VavTIFh8RHUPGNDXLsJ3Z?=uH@%jxEMQraWGG(o`fZXa zdW1^Bj=0J&2?#SALbt5%-8Ko6M!`j#YOIM~JI|fpwvmF;dDhY_Ytp^J*x{3Uwu-~Q z4cjs6sYlZHysZvD(FUGqYsA*}pUMLf)ynW(_ofx!&lVqlTqZIkHgQT}k_k8(PWVok z^)7nurCi0vA}`+@{qFSZ+Wp|c+~H^BWppKyZDbrRv)qDxm>*hnjp1C9hPoKvO zSwSQgS#5TiAUSn-N9Rq^L^H0t061kCM=vbkx_(msqsWseH!ohO1a*7x=3{8yS1QE2 zh=DWPdJ4UQoarLVfj~jKga|J#4z+fQMA1Xo^`60=wXzYVm6h6Du4DbWgPPP@mC|$K z|E|0$J%+XRoSS(`b2z|6@7NUF2$Q`tjKWFYa4K^Z=f4b{yCGtWj#(1xw#d=0B!W6U z$`RcNlm7~OIl=HB7|xDofO}6AyO^q0qh9unEZ*}jC@4z%gM74do8!36JfKG;u*v%j zh`#_FkuanlxCu$SmzTx%i`yTS=K<>ztL6sm85xJtGda!Q$<2_18c-;s$QvLiQRD{x z28iNM!4PuF;D&N?=3z>5eoaKB>tIHvFVoYp_Ez(YuyzMPkwbpQDzVgx|EJva?i186 zhxg`J4!c#7-0{=OE-S~DbGxp6%b2-^=8};Id?4e9-x;ZdY9I|)>T9X~dGGwpQaHG< zrttn=Q6c_Iw{TLjhpO^5YLPVC8a9sW&%^$irTrV9zLkbyQASZxh^LwvV<~OEmtF!` z#T=^(E1T}^1gTBSJZegaLAyvF6C_0CSR+b_ecXMGu@YF^-Q5+zDG`e{Ha2uosPl+- z#<^G~!=B`&Y=2;L7{kq35t98Jk@V3tSkiw~{BlZ--~)~RW{B5O;&nbx#`V*c%^W#; z`Eb>dxuV831bdfH|A&e^kVF*{E8Ko*+yH@26$HC3TG1j~qi0MD?$%tJ$oS9G`zoOq z#4jrI8F6`ApKmt{!b#vjdHjYO0F`su^n=j(?PBAN@LsWs6zR-r=ha>r8Pfp=LrCGm z7G93XOw7#2g2g6yR-@bd+W%n;A@J@(_-4uG1#oa_k@6SS(|a-sexzbD*A;)(iXYr}2+eZEelZ z*DW~ff|SuPGE>dC!t@IE-M;4TMMzWwukMWb5zEg$sS}o<4S)Fv(WxEB*3~X!HvUs+ z?lL}Lm#xKxKE~>r29;G>4#C1m3o+8v0++8=D3wcli5g}81LlRstUM4!H!_zZ#x|T6 zj)FBKZrrz3B0KA-6ZU`NW9wDNUfhRZq%9wyg^I$}e^o?%9fH-qI$rNCk-{m@G^3Mo z>Y5>=Vl7nPG>osNM(Af&r(~RC|iumRI4KwTusos!J z(_11OeG5CkVwyC0i_M%OUsPyAkmAC|HxIibz(l*b(B^?8%nSigQY>(!N%})DzvK9g z5$dSRoD&1R2lec@OW7Rg*<<#91Ixc9ucUT~8Jc>Rl$st{jMbbs2gzEQBSsw_AFOH?y{86-!vBr*)&nndR`8-fEXp8bxa z2rtk|<$R;NU)1;CImOAPn%v3t?qC-PcY2lbhp7H!t8YicXt#T*Na|%_L>a`!Yv6ZT zP6qwm=Jh9S{Zal}WOUd>)58>VttUNF^58S?oh!)mCBy?*Lv3v|3MX~`o>IappH#Yc zG0}Z{)BO@#7;_1&n>e^RtkgE)(RDNU`c@I_G96hq3*$!Ufik4lYMyQM)b?ZWPt(ID zCJ))5xjg4isZ4$vShw|gCj`b?$H5mY6%Lkwo;`Ms0<2JiHoV_08ef>x_4KV23Bbhk zwGk9JK)nRC)tl_Ltf{i?gcWr z0T4~W&yi!-c}@54?=A^^igGN(~j_%vm&H6w)6kN{xsH zI5^dsUJWOHRTbA;euhyFDx%B3T}1@NPv`(iGYaaw7@1Ye+LGchz+_MROP#wy^K%*_ zN+LuNecQ2(F3O#Uq>}or9x|(Z=8moH0!~4MnlwB}1jZ?pmo`8-$Z8+o(#&Oy{Z$+; zP!W9O+$tw_a=3slVl%MNV8qnFz@e8yJvAFs?}?8nS6_~hUf9!!F6N40>BzUjm3k(* z&(TQ(uGV^*Vm>Yn`A89=hru;wIx(-Pm({`%b8~f==8W<7SM0oX34(X4#6XBczH$+weG_de6*NZ*=Vo_>Y@A2V~+LCj)hv zD2&XvgJ4k@hCE&n=dzlK$%2mNRBG;y)4O2Od2&Q>|ar-WRReK_h>wcW&K!1CD98Ll7lq>res=nvhc@=Ke!mj0f3 zC)SfHK`JYiQ^{p3-Ufq9)8Bdve{E(~Qnpd0P(UXPtIZ0;q9>DH->Ux&%wQb>L-bLq zHQO!s2O=Hqr{4V1@=n2=LK+rHq< zhwGt6j2cWN*M9jN$mT26W(5BR^qny(OGwA0aoO6ssI)#hMd&)viYN;fKw@vL=lHjf z$wqhsO{=ckeB=-btVk@ZH~->pHM0Hs@TRqhAWrAzxw~bxxaFOMl6#p>%3#B1%p<)2 zCc22`Xy3K9Q1zJ4v-H_Qi!JtFUn{nkT}4bj@0JSR>FgOsm5L$zLb*?>KwtIlJnfHM zK$8z6pNSMY250=`iu%`XhTfF&P3K5@*GnC0@qJ(WI+o)m8geUv%dCTva%o_teTP zU(hCarffp!pxQyPA9uP8vQvo0(zN^z^i_ej2~a+Oj@o(+5 zN%YXmD>t1SWKvJd54Z>WhhM4Rg5+in0rW^IX6*zyFkXmcC#xJ47gd6RtDaq*v8~4X4F5n!l7*b{OvQm?$1?J@%llKKRzuA%678#ixTgo>md3&{7)@i2(=#NUma8)$bWPgdFrtvbsz00!PfJ zGgOx#Hx=$urnw$Fd*f|h*$gu6{Tv4b3nkHnR^*?0X(PHEYDohpJ!j-Q(?`J_LIL?S zSm=X3?cwi+8nRgkA|#1d^vUuVXt4e6>a{xEY&~AVu)|FBr@b43MdPZ9XyvW|2A-p78 z9x^C@5B}f1&`QOUfpLIXEtP-m&euK7qUv12qFJSd@=Og6 zH@>lf)fou72Eq>b4{UaI(D)(>Pt&?rOfp}A{y0~JlRl5OFyGd$+P_@4bl=SD)O9{x z+oX6RZ&_GBa6}b?CHya^kXbrT6Q^|txyRefy8z~#kapK$Nq}8l|3{@mH`u?-D{wAS z!0IH+XwU7klMUES^`pjFX5J6r#JjrMk}R}a&z+loaPLLJcga4QRq6H~cncM}S;6V- z%mGc#%<$UGXFr)wjG40oZd4wi)4Skkyc`nrR{)XeJ>ytP$AE2S>1ztIv|=`z@9$-Q z7ea^t`KUQ486z9|+=^31yes|n)Puv%LPOgJD)uz#I{o@z8{gXn{k8Daw8l+UhMNDT z7^R>6u4!Q8J5(qer8))dYtI)|7t;u&0Dy$%4Z|lToG2ba{r*X`<>M|jwGzq;Iwq}z zu_fMl;LO=uH&DX|t{%tCb9+5L+w##x_nB&=n&v~kOprnTxSVw{ccssOn{?59za2-E zZ4+pWzHK(--*qTB>YDCEz@__hNt6?x6^0JdOolITDx#NR&N@R54$92bmjB>*=#sUAZUICD|#!x-7Z4e2rNahPfW6I`W`n6S5zydu?xC ztjk1tGiSL*O&Ai+(72iKc#m(j^p@|^CwXkuaU|!l6ox%|%wA$toA6+sx0B_!blce} zC^7SkcQ@N1$Hn(L0~(IObNH<&PVkz#3MGg-GT`~*1T4X~8DWx{r6YXzXRFCZL+EUP z%HUy%7ro#A`67CUh3B+&H}`Ollmr6_)Ute$l(+JM`NYcBZt43*MHwlfs+{e0_1*k5 zDWF^q8B>-MT5G*MZ?g=UNPwC+&|t$r29Ue zH2}>4Jwf%^L&%-)bwqzWJiwOrX=`b2mLvAO2O4J#kYDF&QU(1vAZD$!N0(op7F+cLxn4SFTQh1uB~uC>l1WfMRatrbX-h5ZCG?hkOd6{yJKQ zYN2i`YWr&M;vvYeaaqs4Zp?fO?Tal}Nd+osmb+K4Oa~}3aN%<3MZ=I zsrT#5QQVEa{N>fBMAdon!KvKqExV>hLXYC_B!kUSVA+xy2O|m8Q2Jqz*!snt?)=tO zo36bC(GI_o(zfddD+28g^JVlY(j7-3t|}9|E+a!%`gOtts4&TW7eXM1tNL?{&WBND z$Bvn)Y*$iz4Ae|vy5`I*Ej7;JkZ-IWW4$~gqkEkY)j=tHAnYYfc%WK*H0p%~A4R>8 zLz-z`Y~1CtRrd3(tYwi?;6H9_X3xMa{X%^@;x1}yCdMm}(ZMpPr`0;E>k@eg7ZFrw z6WJ1=b*O0^dpZ7$J?Q*p;<@Ck{&2}+AQy8#t~Cg)$*Yw4{5u)3&&94UbQ#xM$LC-G zN5PFx4|KXiT=zpa_v1EB*G(sbSi!fs=i4GogL{}T3LD7qc;#-xkwas+POsg0Yp4m3 z9~}jRvK&T|uLFfWH(HprTF%Fv$d|shO4jpHCMR9zoX038G zuR(wXyE%bE>ih71uW5V*y{7Y|r(H4>P^9?U;o<|a7OR`5mPEwt>({@wlhGb z#xmF9$~$<$`DO2sUdlTna3480}SN%3PXF|1@SUf}9@**o7IX6`y`5 z)!3_+h4K!`>z%&5IRTsjaHK43SeU$yME zPuhUba>Hob=d+2;0^^tMAmkT0B``(U=ypSt7kXcV?w(luGC!9KiOz)3g}9E+10V)F zIXlZ|w|^Prp9lLq^S#!lyn;AnF`EJeg@RD zaV~z4b%?Oy-s4B7P};Ihqf<5j^6@~T zrZ`IKd~CRK043}~x=diB|IfudOiRTqXjh`*#nhF4ar6Qytdw_r09PIACnF5GWzfgN-t4s$8MVRdV1hlm(wZs+`>SHe=UbsE<@{ z9R(9Z`7*8O?~}-=?L2DEy`vlDThXm}f-vf+5-rqJ6ThH*7(VzGs7IyH#olR7_YE9* zI>_s>fX~tUbp-9}>bmNA2~S2X*m3igd2Fpxue|*V92fSS**Rp{zpt8eM`lcH-&4h; z0a%dn^tp1U_4a;)%w&6KGj<^<}m zhs-&ew)v~R672#sP=wWW*R#s}8pQtTq&8mkllxVY?=F9H4>*?WsnBw6dsby4A2MRC z!-=4on#Ju9)W6}o85s^*2lhq<9#1D&w9ebql8sFP{qB_xul|q7@9w9hPU4?dsxT+Ls_WUnkLdreV`W^@_;juDQ z;V}yo*VMSJ8`&Hr2XRUC5?W+89X;3*EZQE=Y0z5dU<3UNO2O3WU5J}}&7dzc?#UF# z*rb{kUJa&~w*EB7JCK};#-C@*&xe%JakBY@ERL;I#g>_SVl^k&>tX25Fe7n#!r8r@$< zA&Dr4)@|ndG{8!>R;B}iW@L=fU*CBQ;15)n($5n_6};&Ok*gy`i?EtvQ@%DfxG9yZ z>~{Y$dO#66t;UIkDz#4xf^=yTc&hk#`LAlj`sbXBnHI)>P<>xDASz}ZjG1g#U1}3o zsGIU+lnPQ*bKzM{xW8AlTi}qFCK)uAEVw5+pg_;q;>rp(;S>hF{4r9av_D~igv0q9C|a;d!ZFs4b%X9LEP4)95Q;e zp~;n{pw{2sbA-4w&7nga=gj5vVJdCnQ1&GNi|FltwBZk50lfR**$Q*)`$>35+7HB2*c0_Ow=8%6Pgo^xt1yUwlgeEUCI z*8J^OEZUZ9e{7Bzelu6x1%?lRc2~vBXW@%Jv~KqE8Ne#JUk-4s!uii_yAr)@h7d(U zG{HM-l^In)f*q9EgH}0j<;Te3*3a?qc_h>Pr71uQY(~&!+)=`)hE@5|3Y8*BCaQ3_ zAsf1TgDghcomUVXMHvZSXH{AFX-`!&m0B$USBpy?7(vU!+?u-mb4%%${?70Hop3q) zr1HnLgEmjPAv?CvGHVP7PHtjqDbHIz2%J~3Ox3aMZkvuvoNBRG?pJGz9Uk`~U==*x zKA?Vcoopjjmq4v|iA>Zk!rc-l6L1MtygGdqJT_*B4&@(ZrZIw;HV`9C~; zby(D0wDkxm9V*=tQUgdgDDl$W-CfcRDm@4Y=paK0NOyNA5`uKMh~&`Sd7 zGw{ss%sKn)z4qE`Ep+b`)JGJq^UUB?iIc)=lv6nfVbRji%mJ;=`BUHi87ID4^ZL0J z&qko{rx$0bF9SYsB4ae<@%i@%uVP#&0p;x8Cyu=ltEemyMs5JN;sfclpdHpc(WAL4gJFTHIhNH$M*wrkuDpv+xpjYY%KnP>Pfoop) z(a;?SxyB_i|alg6y@PEg=x(@jcbm>(8Ia|I+x!u+snuJU|rN%;Y}hE|#Vq&3w!%p3Ik) zN@MVg;?~gaGSCU-{99Eh4);(aWbe-=65zt&$&@Gdn0dv=)R$Xh)BW-x_ER(3vR6@s z%!x&;{HbEej}s3TEySyD`o2-KU}|g&*cszP)OaYm7IPf}Ytu|(UtxtkM}wQExd`-B zT^Naff~{BEYm;gJ!j7e|AkcrJrL1n9TbWz?{K+yXR+tqR2AF#iFJg8yklaz_J}2BMTWSZ5(^_sx6FZ(e{{#P24S@B{Q%p zd-Ul)GJX+h{#ciLT}Ii!rf((`JK}BbTP9$(z*j43jyFkFm~w_Y^lK~vS0gIjm5l}5 zk;7qM?G5;o%$fbC=j@+@0`TMtbIx_ENewEO$Q*-W>$B}1`0&aejys8#YM56=na>LA zII4m^>4Y9Wbo^*eYEj9&yLnKW&z9YL^pH*KF~%ezcIU#h<|k7cpyv{duy&L*mpt~Q z)5kp`3k^or)l=1r9ILie*V>8xBP%|y2<&-sSM#({&2T3x`3QMi_*2LSnZSo0OaXcG zS#s*i+K*_Es0yaa{By!u==b!9SE*VrIB_%8>!n7G7GrrQZ(r^J9VUmJg$B2vMw8w> zY)A*3J+%+WNPOLHd6&E3Qs4GFRE3V@aKgmX+}6Euyn5)iwPrn0u?!yt}U381RT3X0GE{^Bk~@+6bAQv zp0#`pamCBt?@jb?{nq`~)4H1KNu)P|y>v!0nQ1WIV8s3phyLxV_(gN` z=8MT?++Vi}W~aIeK8z9#k)*4bgXm{h!Vm(k^8Usu%GXL_7k_g|j6E@xdDhcB-qvf=Yy|eJ9ob@pEe;~P~HI7;bOJkxT_yU2@AWP z!V5ZcHtP}FUNv>fm9za4M#8(*6oy`2UX^+!qt!3(XHQurG9~n;rZu2{pB$J-jY+FR z2w25fw2Vud2tnb%SN&@DLQNsKsgy2!Is`Lc`hw)T`&MkHhrh1Uc+q>aQ{m)k(ng;A zg9_;S!R7bms0DLdJ%hgw^`FRwq*Wb{L2cQ$mQODswCPc2o(De|s+fNeJ$$o);NM_b zO^*j@X(es+yE1!1NdL@tFj6p;tnkAQL!c zXT)y|_V`M$#;9sRB0p`7$GkW3jhdT#a~Z1V~FB++XO}6Jd{bSpOaY zxZ2Zx2owWi-?3ZHfX#H-`r*vbWI2!|q%{8<#uIe;zIpfZrpj8;wPBg*QwFgAeHNxR z^RLgrKv;Hmf!b8`g4eRcit{MWJCmM!Na74S^zo@e6(PluV+LWLo0imcAmG3XLw* z%Kp%QYFf>wyr9*yj)deDrshrL+0U*XM07rm@9C7?(umfpW6)9;yYrr=uIC?cuU(Fc zt!7LDHOC-qC||=lf;>2#APoAyePXTfHUU>O$Sm1k!Fr8t7FTE1rT3f$Y(Za>C0^L+ z+AT9?OwvE1Rwx|mJ8uf0r$#oPEs8LM6pt=N$zZInn!GHxtc>M1K1xS%`K{w{*+XpN zdpz|Kb+<*Ub>PCmL5!)9?k0;CL}o;DHgDIdd~PS@&neE97NNCT8VaPh&b9R|f*IA{ zUpT=3xe3hT%VKv0gM3AsIOO+{zaqL}^L;D{d(K?U94?`z$jtL;Ly>VM!ep?WW%%#! zs9)HFcW~Q2y4mG=|M6el*9fMtf%2_H?ap{|L4ADG_{vykClF0mCZ0b}V0<-UrLF#b zL^xti)FiWWQ-@C;&Vco%dgl5Yxw7`rjFR7ahuUxV#_W+tuxuc4%srVpv`(Zy$`{M( z*L@zMjAI;s;!T8o@tT1gPnHr7c%*P|Dh!~{eR3XyQp8S9@bMl6R_0er!N2z1-j&!j zrzL9*{|)^IJu)b<6w5VNZlgSW)bX1UGlDhnG`l<~;iFNh;^wR7b9PtZ>?>4ADO=!F zfW}^Avjmb$I_h!!S!{4i8Ceb)ag0~F{*}F=$6OB$K8H`G`>L!grCZI!Zp>Nh$)sa5 zkEs?{7%8~f0(*u=o7JGi3K=Sp-<3Vo(=Cl52g%qREj5jmGE=NWp2OcC zKN3Cc4Fy@R<-M||%^>0i7;xflkK(TM=ckKujQy)vSgU94q>QCvhG+=REn4b%k`*0c zPNcrgn+YW7Jfj9}J>v?*iA)>I__bRmsk?MIZY@#t%7x-*WzMl8tyDl8(FVI<5VpY1~0=oFXDub5a+1UMxI zDU-B|icMKZUGJC=VbBSI8bPDDx>Nf`#4tP-S&vT#A#^#5W>*};9Vmr%db=#pMO$>O zYkn(jq+p5|X~Vd0iPgl<9&gx(sZ|uS>f~{FwI1J@^)8%3I$Zrimkzr>E5B~JIe9Cg zHeR3*AbR!760hfl&(8YMjG^nz%x9&tK7wqZSYMB?K%`^`V!|(Ki8I~yCUdnRDg1eX z;kJu4$1@9)Pgb9sF-TKxBt#=Fmd&;(%qX|RpJFwVaux=073}(x#?L=nXGWk z_*AUR$fP_jhNhrMPakXVqf8CG*-1f4?8W^8noQ(UX2i;3WI0%FHGM@wXq}N+0A_)` z`=IjNm;-c3R|O~6u}Sk%`oGq@EJ7f>{WE&0(0HvkNj5^s{X3_=^VIQEBoGt?>(4|v zB~5s^w9!aC(Lia@65fv&7m{s?OTS+?N!F^5%^zrRhtCCBE50Gb_UjxznjzGFcvQGg zoR$7h{9z|2N@x~a<;Ofz+50CJ?}Jl5Cft3TCHZ^Qtd8|iSz2J>Tr;jZ_C<%me@rRw zQ9BTPj%BTXvDG4|KJ`&Zr{L8xf z5tnouvplLFj+x#h@*tcJM7p6FL0Go6ywY>az%02sswLjyv*Re2jlcvF8U4S0W7`r; z4l9Bo%5u83PW%fYQ*F7UpHN?m{AZ{<)g&zNG_;_|0Qacyw|7IT{Nq`?`|Wbyt|rZq zm)Q?|4Dt7GdLj9il`T_Q28lq-<)J{pw4x-&4sr9C{?sru#)6edfLHkm8s_QAKJRRb zvtuCCqRyJ-FL<&~_|dKX(HwvLd_mJeFG`+QdqhhH?TcMghqZnj@Ltux6DrTayD9IGvX$ z-{6zp+S+fj-BZR--6qt8AoZ4&e9=F!Z{my0#er&oHrsnm9Pj;a*udhn2S-W*K&bKJ zmuCv9=y|G{dG`K54eVw7(q8jnADgNFW-d^6i(SJ2`vwSY=m$~_75RkgkPB~9Fjy;LDVI?b4;&!(>&8%MvSYujTM1>Wf}p<-0B2 zc27Y{fSdpA#J?NZYB?Gd*+L=>3=pzp`4x+J{di?lRCtkdvj!9t6kA(c28Q{+(u4*! zJq?;?^J+MZe21&7Y2wz-F|t};Jx*6U&+!$3Z9m11q2*06gQI9id$JDBZnN)<F| z3S*wnKPfR@YCSBE%1L*ZUVF3_0zmtRBdb{gd`vKVN!TTrh9@P!s1CvEU`XsOhLzYOylg{q*YwMRA#|{=xB&{W`zq3aB6>C* z57KKrrp>3iz0?nCmd=FB*ENg7C-VDub%A$xphh(5oQuobY~F1OwH7kg);9KOG^(F> zKe|{qWyWYOIOuibcaU?Bw!Uhw6VHq{|C}}C-k8>$HhOovcc=F_a(B1v?I4MX?{f1} zYeQR`%VLXPu}&%ZLh9T%Ko!31BEir6`+>pUQFgtDO?(m92vJj#J*#O}lFHG$R&PnS zS2|}F0H7^wn3r#HZqvQF6I9=MaAjl+gmeVVA!81$UH*-5wf;>6BhhJL4duZ(JoC*tL<+A4~kiFK42)Y#mbvxUZ z(w@t;^mV6m(8mU7>iC)Ya&;H|c<%I!pWk**@coM>NP?`2>MnQ;Y;Scdkh)4{dE#(I zc|ETtU(<&NXQu{c(ZX7o_iLB!X!SIwhV6(73X1$J?x@c+aaK?KDG-J%u)eQJFN-`g zR+jKX%Ma*kP+KCV;`27IcAEt#%lL3sifFFY#*TrVUTObo)7`B^(7H(SzG!G^E0QYz@erdwjWT zT)#aSa1HL<^t|1WoeEr`Sl_!1c$iw+t`S~_1U!m&4dAWT{qVMv$tM{-C$Aop>*hUw zv0c`weTAplnJJ0!Dbt>uS2@+@#N-)3gLq>VhESA!5qaLu3mAkLfe*g;-*p1j407E3 zu}%E{9CA)fOkaM49qbMoaX6C#IdBBL|Erb$BS>?n`N9v2dJ(d^I~U^QIpd}AKd&20 zBXt%fpIo$+l?HO*LxMwwHxKhPe|lz@f9T)U(Z{YSKd7TdO6*(M-aOz%R#Xv&pA3=k zw-gXHM{`)(+kvQ*gu|uO_F0!mD0ASox5#Z?s*>L1q_Fj)9`|VJOlb6Ze9SO2D7ArX z(`T^4^;ua71ny(X5=#~4^pNX=_>jxRGmew18+_6Ibzp|ao7}%Q^Nk9R2^gH#St~|P zB=uX%axtFP%>~P=gL+?J{`Jb2R($dE;j=a$duA<<3GJo!mAK|pCks*2>)EM6P?*z& z^>t~*ysxestuCO;GblMGBtV2|X;;ssCu+62F*Yw07WtB)egXzl##9uz$~_|QA4}Rv zdI+cED(`%gLxcD?*IQ{~s{clp#BVCI)xbokph534YKua|<(>S}nCPv-;n_DZ@(a}}pbubl7~F(mDv1e!eKqLxRx{&d>k)Q*1q zKo){MTBJZ7UyoQJq>k6s&b{BFPc(jN1i94fCi;&3NJ0Z^@XZd9XXpMrftj!>+{r-u z(<@X@<2}=Hd8)Nd7(;$-+wJGBx|WBK0{6QnoNP6;2TAjGBp@W5<6rN_>BH79_*Az7 zX)?gAxf5dtd0Kxp4&OkiaJ^Ko=~)LrGNlR=*u*$XBP6_wpMG>I(`G)sqt(I ze^=W`Xf&_pg}(L>vF_DN`r;QLt=aKz#f4YNq>LX^PV+(Uk>=q zIoA)S@u5N%gRj~-+pjatdyIS*PC&9yvEb5vI!m+U-d`H}gb3QNA#!Uju>WDjsriH$ zOz{m6Xz;G*6%<{)6&=JF!F{H^sZYx*6rD{PJDIOhxrLLVNr;B>&6jd-U&?xNoS$7! zbFR`Yy!#jW3__Y4ly&*&y2lSEAfv0@I z$?JnZUHD?h0>wdHM9F|<2K?%f$QZHHvmTF&`Mc{OYhL9{|1A=5mVX<%T&!N6bZYqk z4;R-;ID>6H`vjP~o1- z?e0E$W03%uOG*6)jM5mNVzQ37CdcGiF{Ve9f4Xt)@IVy+$nU zN9&mAYiaB0M_z-PwkHKMvEe5%UF>(2RfL4Ns7y=$TTqKQOND4doK&y*6QnEa9UUt_ z#7^>osRr-JB$Qrj9_<(PSoNiMr%$t#VHbhL0;C!_;d3tV1W zK=wx!Im?Y24^QV@vC&WxZd7=_G@nVs)M5xk7LGmGM!y}Q3}Hhm?rv{pJ_1J9Hi%ywK}|g?LAMvS-rlbzdpGkl zg<$23k_9+X99x0-$ig`RM=j8T2zd)DXUWy_ z6aSNGi)-%;lULUd-g2_Sq%pcn)Vp41yfzzb zTokf(9@4PlU(=O%=5!Iyagvz^6P@7F_;z@zQzc9)0PATFeHw_O^8 zNz!ligY{K}g;zK&t#eF(}!LuWq z;sIFHU2a8l{d$)h{NQ~l`9#R?4^qUyB{noS0EtAF{CEUO1J2*JX$KRpRO|QBI+sZY z&_I=KWA_XzJI27J7-+ch=D@hdTi|mreXOuPi!eHYJbRG-M07u|pA%?HB9ETiakO*l zvl`W*Cd@iaM9V6+427~NmufoFS|};Htt<{V+=&?V zb%6#b^V$aewo0k_npxT}e~v=$g(=;$E5#CK!$`XV%j!LllLHhUx%Dq~zs(nwD(`5g zvRcmBR4b?QaS~v~j~p<`Qe-7)|K{I#oAzVA(Zh$B91sfi9+LI}u@h5&x3v;7QPUQH z(*#~_=H~>$?GeB-xfqaZwl9(8jxH{sXbZt5ukb&~|K9|UznJNh!on$1#7aMd$98ZS z6+|E}pEEoqv(-LrST>MMI9q5J`xDhk!Wr!S@hNgA7EIF#xHj)3kL9ZZIq)e3AMgvI zTzt?##|{VxSPa-hjqkw)fqBvI%oY9AB=YtX8D=Nd zgew)5su5A=XFsUSLz(gwxa(%8M%XyKDhTP)J(70+pnz?$!GlWz9VK><$u-JpGZoOHgwv09>`H+a{h< zt=GnVlfm>C8!Sv8ON(W2-)Jw`)_+!YJ|nl+=~sEM#`K}E_8Bp9AWD@k_ zsxK+=bTu6fxv7WNM?Ym464jnn5z95s^4>EqW@ioLnf30(SH*6>+8Zi1(AMy*1ZBC< zGChEJtPeJV2!N}sh0~|;F$k}`<&YfGaym;9@S4U-S9i*%Jz%rN??|WAfDdtSAHWmP z(*h3*b)?3Qk>%~r(p64Qx>STN2mw^$uJHDaDSQ>!@v^NCrXOwQ7o%Sa#R+W{&?}F9 zwI_#|1niv1#KeJ$$?R%5^a9)koEbJcpw!D3* zMi8!7f{)brQVCZ%apO1inA0+?`0sZN#6Q;-q{aoAS(_J5!pSN?&qF(nM^vEVcj|84 zQ&QXEEp;9pW0>v>MR0j1q2ZeCHgw&J?J+fFp@1BdI#YnMuv#Py@?j{q*eSyrnQuqC zhBvphmrwTmiG9?#KweU`k}#j0>&dTb^2^8MGY#D=3LZ}~gD*E{Y(s+VvMoxg35nU% zD|`M+0d!zxP4stm)7M(PrZD+Gs@eFKMe9*P;`&4|o6haLVy*aMdoXf9Mwr@S1y{l$@OM-PZ zk3hlDCW5be8kZhJ!9zvXewg7%$x9iqI=A??>K@+d#ZMtS_G@~`<@W?GXai}(daihJ z%N=qKz7#r?_^?6#@~}w02Y|}6uv0Hkl2c&VjL9c(ZZ(0PHwM=WxwowSWEse%5H+~P zN*z?jUw7y}l)w5cRX5!}b(3cfqoavAd4$4Os+o@+$eSLuUbX3vy1sa3IJKZyKe4E) zX_8rt z173h|*-a#?)4CVS>sWlS?d+1HdShDC4P(NcYRXui6nY4zg?$LbQ{>bo?Wq{COIol2 z^+5@Uuy*mWnrRl(X+Na!Z%TR9%_oXU`4!DSIiLSc`n19`x6t*XMEkYHG~#K<4f4ik zDM;7RQ4##u+A=|WMR&uoCD0+9w?|#Z)Yl(1Rq9~!Eytt%q27%PCJ?m=^Iey_P1W*z zW>(^ua>M%IFFeWpnO>8PRZtN?cGy577m|Epz@!zz#)<#GDKAM+$$b=jNxOP=LK*dK zj;ZsP81{4GJX2vgyvnwkZY@vApM`ZN4bhZ1I-Ne0f_&)z8ZJrA_9zRsGH(3K47@S3^_%d_u%k>P(?XiR-~Jf@2NMvIkQ{%|{O8k0)6euyhn;EtpNEMj6G;ea4C|U?C{|5zQ zD4R9q*(OG>O%^(j*}7ghfsEi^1rq=&7z1k&#lotu$R_O(9>Ow9(x&oa`b_!z*a;UC z?Gf1_l=YS9o^oQt)WES~`P-H&ovf&Pc<&oG%=|d%uZPfEl9Hvb-jO+lx$Noh*Q@l7 z>?t49K4)3;Xev_3#vpu%_6B7>uA!@1%8tR3B7fQ%{@sF+b!{+RWVwnE0!X$H$h#LB zEy$dBoqN+PK&b6@>!GqevEtqo*}LB9m93j;P~^PffPhvgfONP#-z@DteB&w1=Q$OM zFMd2}s2Cx(ono6|AO1q=>5%C?=?Eh$C@PP&G6RgbP{o1C=2{nncJi0y$6vwS0254C z38|Q*z;Gza*hW4H%dSe;H)7AwP*<7LPS9r@Y^UFiJ%XQBkZS0}1${QH*V{F8a0o5#yqAcv ztJkBsU`8CC2aa4mYF^-wPo!IMo#v9|@qD4>=b4?^)c|N%P|OK-fecDk z-y<85d_+3)?%`2sm*9WY-gh_nlwfGCw)Pov89&5#r+0-4uP5{FTJ}Er;fo9YB8kki zciaPpHW9nVE$5k?)ZU;LP*#qG?1QQzUi88Jih$Mxjk0!Ay-PMTtD2@EMWG_2|G{(n zFoG(OlU(MVA^-prW|2WHC#&|cbJM*+EH{(|W?|QK_duB;cAawRoP=i$Q5Dj>`QUsr zH=EQ<^FOP@H+60I?cD{NP9S$)xrRPA2?yGnva;RB-3<%7sjhAIw2BWP^$Xre)sRb& zpz`C3EUvgM`7F^$0zY}*n-c*r#haUDd5<{As6+O@q4)nMF$czdDIplo08lW!k$JCb z1-A9qXNO&7aj|jwN2vyLjOxE*gp3Y>-BaMLnX#pZvU55V`(V)}>vPhNTM-PIw&{t= z=+%bNgNQQuY`a>I6o$+p9N{ln6h%dP&QOK7tQLQ1!x0M%PJYJnrRqn<{+0dXf1Q){ z{_Rq9?L%bwwQ~Z=N~O3dEh%gqGw@mR!1fJS|4iO<)l{3pS-GGfO&%_Jj#P5dh}oYW zvRg}B<}Yz)RN8{Wyj`4D2q7;Ts|l-ZhddjNAZiHTecyRh=g3aCLd@G;AD@u(n4T79)O-5) z9I$ucO04?iZ-%`}^?GCXJ^c*JP_kGn+2s!WWUZ)?&QM&9`@_PXY)QkGg6rVl%3?iLA$D?`QO)Bo+&YC7R*df&kv8&fwQBi&8u3>-#K{s^X28cj+akzSOGx^ zGZMK)k&0`)H(vz|(B8C4+{V?iJr9wf<$cE$uc_o>dUvT0={V}rzRPUAii$%KI@;gKC$ALp0* zRFjyt-qfAO@t>Uo0Bjp>*tW5YbOW&9D6jQgo%M`3O^@4H2s$wPbd3wDrMVpD1Fpz} zrS*ePNB$9LB<*fK_vOXprj@b2DFvn@$PAYPxV0_Q*vv0ImdqZTCw3?PBedbX*Pn&e z7pH)rp3hKaoL7k@6;jW%{e)hG_>ISRug(`$DbX)!JJ2O%oh~Y+huRA+zk67Cjmsn6 zGj35J450m#8_377a9Ci6MMlV)V~)GgoL5*J=sm{J$#X+QFE=cA2S8_OXyu^c$TnkU z=j3u8D&ymGX6&;N^t83Dnsw~K=|vLfr8=Pr9BZtZ=2eMdNfnAiPz(pH+PbtmzU zTj!JMW|sg@4rgVvl)8aCZxvbSPuJSAf4T7Q(Snxh?Sz+5ss@9<0L%$Lo+195M^_0?dUAFLUg4BEORse>AX zhdgJKKW25tDEFzJ)eyYb{I$Xv;up3aWNB&1>Hilv6$NCeop*6kd%6anHT(E@c_H#n zdgx`jme9C<9$sOPF*DHQwrBv=Gr=h5X8Zxgrnu`_tN^fj{oKCBD>J5RU?8N-M z|HkmQRo}H(iu#k2){0&xdq<=~e$W0m;2~*a%Osqf#G<0c^o4qRI&JNlI%U_iwmKfD zzAJiXEoSJwODFH(R6+8T2qVkud#9UnVVs<3MmnitJdQnihNTI8%TKE1fx91knab#? za0R|{>&h9t#Z&+f zZ!~eXD2EGuX?lf4)!uur9m49ts$#f8xz5M$12sm|VvGqftOXw_Wssq%LIgl3>4L^n z`fzQ+K+{Lh!iqwzLAFrb3gdg1Ef-1aJeFp7cJQjl&8m=h&zqEYVE^rhGC+v`)jB0+ z-{W_asKx7Wn3Rj0{W~pZI0etE@uHLp{>K6AGHv9<4~o!j5KB zp1wQ}%`$tz5R)q@9@1dqhcg&&uA*VZ3&%l|TImceD$)uPEA|OKM|z|zp=FPN=&M#w3q{a?AscL+f)`8k7LEu(`SzgqZ8rZ0h25y@jcwi z%43(!_`QjG;vL8pVgBvkK=DU3qKp|fe{_9Ij-#!loJTg9rHX{^DbWWB7UH%DzDX~#bb_`U?SvhY01B1zUm8%e#n0iT@@9o_j#;>aW1?kI z9gA?D1B|S7*tSpxQt|gae9t81eV39i-Qc8GLIy!+*QOcjs|&eF*((bMT>&<^mU>A$b zc-UO06Gb4YNC$V4O6bVx6KNRljd zeeILZE)4#cM_y=8zXqu%;(llohT;CY()t>S{#)L3p`@u)9PS<@S!PxcNHn04c{Np=z zz@7KGS$9C+O!+_@4LOx>@FHW8tUXqY4&;7bXyXT2gw7Mi<=4!aoLT|wfbX>%)|r*4 z$Bk2Z|Ah$)I4e))Q}#S#y~W69ZfflGLO7L$-rRo*rOOX2W@&EkShV-D* zeUg=)Kl!x{lRFZfjlC_2{j;Vf6(D8`Nd|4Ui|=Ku*D+yYar@G_n{kBn@obwnc`xjc z(?U<~zZ?51hB#dOIxm-!n5h`a!Vg276;i$K?-`UIqGkn(%R-h{1AkiOND%OQDo=b2 z^ybd&XCLb^PE7dP+q4M{=Nq2VWc}-CuI*@J8R^%!9W^YSyFFQ9>a8DCdea%peB2v{1iec<04lpy_G0V!wFX? zoWw(%9#i@AiwJ?);WuVp$b-x7h_$%e-F3*emLk&wY1gy27A}2tRQiOM0U2{{Tl$6Y z!SCbJxNF2#>ZH`$Sr|{8if0{PVPsjWL;orn>k{ctalLOK_Dy1vQSld8y6roBMAJQ< zWpQ>VFV@cY!>!%|Ne3ioY;DEhRyTw+O!jyX47hEB;5XmCQs^68ZljM@sD!#cHJ`hb z*kY#t9j-*7s!!oqki3svhe3EUNf`t?F@7kqXq}JWXP$P&afvRkF*%i5u{>;@cD0wO z<}JxPBLj-P;25!L-?SW$$o6=LX}CGCj!l1dP^v9}W!o18aH_j8REpAfR>cmmi|*+X z>I;l(Jd>DSqQa7uN2olf05fia2Bb7pV(6EaLRGoD#VX_)H45zX-S;2hHNqkY`r$-fyqb!dN|Rd><}3#3CD z+|H#qnep+H6Utv@q1dVcoG=N3t?7mZ?)Qr%co{WFr-JvI42h5r)MQn*RSzS|Y>fl2*E3*!}1|$oaV=QPXvq-z$oHCcn?W@$7KT@b$jRG4v*%h~UUmy+# ziFWz~eIA*h8{atDWCt+(gTu)0-_#f+_zL9`tx0qLMDKOIall%-E!wY(Y3Sx*ttJc) zJ&U;ssrX3w(ytlYcCoP(yN=@{a`%)}wx-I=H*r-if{B!~t4lP2-z*f;@tSG0FT2GO zAw!2hBcur`N&X>HUtrK%>MwivufY#;{J06|i6lq7nQ)@Yj|}@uP;kw#lHOe67=YV?q9;6rynKV|k~)%N zIWIJ+`n3&*Iq^MT4g4@ggNr1Z5q0^qv!MmolFvR1xUnczd|SmKQIq*mGi>fo{nWc6 zQG06I|1&#T37S80@jq5@sqriQ_Yr!9G*V6vdpzq0P>y=~gzcQJ0 z{&J%ugDFg7@mbvY9mx^|P{&nM&5fV*$^O(}A&7fz(*6id zezeG_;JQ8A9+77cK89_|t(LLyh;MdVC7%cv|0l8@8$fTH=%>NTH<-Qo7F8q%3tQgf zd$;y9aBI6`GNvIyQ_f!)izQz4ndsRY(bF?OpGm?0>NwtUOuO4m+K;E`5Su_~ry=0} znpE`gLZh$>^cqu!>fND~LW!gFKWckskXF>B?1vS;<3PA~^ApYyIvJg5~Sj|#acQap&F#yj7v*Ix@8wbegfYvq0D9}t~8)|*kZ zwBCa6{LO!EEuU7;+2vktyA$94CYxn)2qx3Dt&OJ+wm~Y- zP6VUVzn|b19ZLQ&+S>~`&DCoeR2H!~DZG_J=U$=rc)E*&e2Buk6Ga{B@>C_h2OGj5 zBU~qh4Do6zdy7h4P9g_E@s!G(2>;Hl{Ejx>F`aj%cKMvT%9pTHW-HM|T<%52{NJ!} zT?lQMPF9ni=*;Is-=KGT+{%$wffFW=4N%^fbJUzXX*;U*e6hMlp(K>Ayv;&&nJawz z-nj^ENBGVUB2L7GKz2$kB?pdd zpio9zWMbjkuRkAhlbslCG3-HEDOIytV%Z0OK9|RhR7cxMztXzTC=9&N3q z$i17eCPvWZ99T(d_VEskj6Bw^U%LsChkHR5Zh}I;Vs!T>)#QtR!U)Sr@U7H>>O~kE z9jLhS%ABJtYdph;L|{fRb8fbO=6NdRmyn=$yzN4(@}nyL$)LY<1Bbc(0xQKSc$4pzuSBh#{lAGU zc!agSW=gb1R>x6ryF_mlR9<7kgb)PH$92w|O&t9i;u6-R4bi`!*vZxM)q1MD$HT`x z25J{)ke#H z##PlOBF%w*)b>x0?kq4ZYa&sHV)njNesy|*Ri_Sl*!M~|@pQB8b7}xBS;k?PTpudr ztAG+Zf^yCi=jSLEoY$VLC`S>FsKuS&vg#40%%FwX#gmAVX53#^lhCJcfXtQgV!R}Q z^a}zz7e^)*hk|@vE=+hlWq*!VD0yn{l{Gyf)&!&Eh;NcPsikF(q`dD)BqtFf8xUuM z-gcOUWae%5>|=O-r=0U0G5t!VnH z-870?Gawx4~W!#d*F%mYltMkut(~bpXgv@r~-?eH<-T`!j>Qm&A zx6`x&&wI6BkKUPw(4s+j2MEx{yO8X2gSJds%9sy)Tf_&3&DQXRIC~zv+9<+-!0juy zw|P9M@zK$;dK2?le+yE>Q$IC)0ghyG<<(I;(_zknvd)anP^~VxcpQJbB906@dwYuQ zy#(pU^+({#Cq9WSvkpT9f|7ByQ_faqd9CQInIY$;Y!YhEb@vBnk*1>Q-vw1K_@|vypF{K_ z5~w$|iCDCBC6K<8$fJiSp+kF_6XI|PZSSYuY1rDo5nXUrC6U;j{x{z$P*tib`9=h( zG|lwm(5gJfb;GNRm>Or{AX({n&RL@y5aXK z5jLHT@~lRfRJ~E~6Zk__<=FNpqlyBcUp8kGWS0w3WMm;-{-plAe0ZF5AUc5z7?yKAa$0mCRrhS|yG|0;j zggpmwmWEY!4}3+9JT!}K>;SI@#t>7LC9l|EgRn^&aIUN{B{~efX@z|#4j-CAP-Cu> z&ZQTr{NBplr&`Hd_)jmae`PTc1=!VkGh@r z@px$TUZv@&nG07n51&IAwkX8XRGC+m$7-CJGW&ldDgVq{J4kpiSM}gatp~j_7k!S{ z;KB6+hZJo`I~GEZ&YOr8J@JqZUhN)k8)L>d1VusL)WU4UB)MES3|3oakp?D7o8JQA z>Q*znm7HBgvPYQWUOHyTE~6EdM1;#L=>Og54Y`Dr5EMv{mpF$8dkY%S_5|v-Q_FU9 zc?`sS+9fgnh52$PQ5zQ7K68>=vDvfp~&%xEdG$Rf-) zip)tPvT%=22_R@PzM^TCB2h2i|NcKN0HP?ZqX#rvvba7)^=QeEZy{L--L>zON-rLF zR3=|8F!j`VJf+XF3wrT{ZMAwAuko$g$CLB0Kg+vo4Dw-HiR{KAgfh_8QIE_>8_`F% z`nt~dvvBvD*)C{=&#U2XxWq!!QDmS(3UvW)Jp*Tt?%Mug2Thr6@Und_COP7noi($v z8hMo=z>5oc-Ysh|E5JyufhhW$$4%LjZy5I(!dD!wlq;`693G*?wvG=HYG9d!4kxTlL%2yK<6qSnM?<4H5NMOr%#30#nWNlzHIPXk!MiG6K%J>q)psEyk*Z% z+gS~~$~bQoUoY2+q-_z;ENk^$$Ehj#|Hq)oQh%)kCMEd$jWrqEy17~OwC(kWubY=z zj?9#da-%(0WAvz@Hw(KDil8*Y4FM~4ni|f=UI&l5JN-qC?y^u*jtiXUAZov?12UJU zD%}Dc*KLd^1T*TLi?4o*>p#)a<#8ck1tdvmRu}I_g!R{Ipqyu@9$Up=ef6(!ztbsjznEbc$HimQ4 zhdqC>r*^N|^3tA~`c{k|eNZR&#Hrm%K3Hx*vBWJ34g~_y8fVV_Rm!-PD9N7>zF=hQ^`R2r3<%flEGj-h8{kI! zko7vuTC54o)9p^{@F#h%5TeOUPIQTt$f^^9=&J4Q)Ds&t{c-~#oztvvGU?S=0qWMgMPkesmG`B!8Pq;2kC)ti#u*TKN>@-}J zK^_g|aR$CElWfs3-7xQcIsdQU_vNe+m2g1Ir4tm={uvU#@xy$@&F0`my%&Y=p)sqd z+)r~Lamgz}i{-_LGPb0ZoCvN3DxjW|@K)S-45Y|M2P-)@MMXAaIWFXue215T&grQD zSS(cXKWW1XndAH(kw|9$OA~|*#=E|Crs}6FO$YG)NDj5)y)dfV2ZrLwAF;gmg%QbaxE-Kj`<}d;hh@rE96o%=^SS zXP5-6S}C;n{xo^UY8Dj!3)bs|(%$UNf9MVcg6`F4=Uj8q6I(quhyDHonJptO1f zI1(dfnZ1oJ706hITmF7gH1Rq>YaDYOUhpzY!FzC!7yOKvU&+dX!i0)gq@1WJ{=;7!?0*c^t z5)ZkFqrvb%{blrbbYC4tBB{lXG~NA&6}PDgAxjFr zLQqQ-&I0YY<(`rxI^ti6$?CBiz!(qVG{T9c$ZOR~1?r9~jn)0e>`3u1sNzVO$s=Gkgh zWfKnjB|Jq~f0aQX&pCP6LjNESxE6fmyd5XwwzXCO7}WVl+EGFJT2h=MQ*i#Xr%0afNG(iO}FZ1538OX#Q1UN=X4ib z(I{e}e3<()t2;Tom9?VGoT~3sc3$yiH&D*MoT&>4_KbY|0!1R0E%^{M&wfK?h~E>aev!KeO$fhlfP`-oMK8yxI+iX^CY z{Z`1>4ju8Xtv~hxN&K=_(#k*eyj>dVuXzpnwOvBvQPsNzn?gtq<;+(7-ChO7MM4^* zp@MD@r*Y`43;D|a-VVc|Nc;|Iu!-))&*$?BteF?Zw(o=lBH{3Fz))|49=-R(*~*&} z4>ID~Mg6f-%_HE6QbQARXjrYn$j^v@5vK7f3fLEtSES#IsQ;T~7vFfAwA z8iv)zRCU>)VPNfP*LIouGJl1JjiglSqET7W{FdbOB#7-a7Kw63xa;9u=z%notv8Q zu7D6IiI~wEXd6fN(kH?dBKq~r&w{MlbE&Ru|!*A&`!- z+ER4LHxY>*5(aAy$Y;9%^BP^;1le@LG@s{`zB3xGo|WWx?>~;)0^V6$lyU4W8OFnx%qm2Qyv)&ijuYV!@24IMEw3vQ{eB1780w=&h84%Z^Q^3ym}8q z`&D+AwRaKbI5EZW@J(@GAXIpW3+07yK*OmkzU%AiVvUmkoH>k@vA8=*ZNePi8K!ZkEE-YeF$(VqRsv2P&L&UoT4i z)GwtL>vUSzj*f1g^TiJF%BT_o&1J+kdLwcL#vrtH;uzofNZ!Uc;y8HyUcDk~U%YEP zHF7}wmez|j6^7IG4!>!Y$f*S6zgNIt_J;4yI9nI-s~{+Q@=Ko4r!i)2A7q8oOulw% zl+RQ3SkiaC2*zp?fa>ftvKLIerKnf`cJF^eY@iabun+D0;;^3iLG*Vg6%39UOmn01 zn~!2mnuAk~&PI~z?i!0c4QXY)BYo78`Pb|)disCG1+!5lHjg_bl^9pC+6=-H-oHuU zFQqNnKyF&GP$)tCZX;Ov9hkKo@#k|PI^;E6J(zR%D+Yu#>scH2U&;Vlp;<7@ieb1x zoKTrg2By$sG^mcf%%+Sv|vq`^E(J4j7Y$tNm0|QcMbCmCFbazA3PG_}n^i#pQV2tx%FR^QHBR ztEEkD#!FInm1!rDHFhS5C=784ZHn|YlO*#FtR#PW>jZPy$XZ|yM7Kd2|l1yuSwj1j!KA9D|q$z!hXsVW8+!|l2!^-v~0 zp@cU`{w@i8l_e;`p0U|^ThyGVcgrc&TI7j#yzAHCka zT<3Ou@Sl@*QmOg?VwJr+7vxsJ;gd=uCq{}UYZkkqDmC&5w~#r>>;p3kykN9n$ZCM1 zpcpPBiTOX^5*ph(1512}!YssU$BOBi7QN^z zyuc!x-h(Sp9VD4zsq?>e6BI**^NuJo=^1qfMq0muDQpw__%lR_I55{Hnz77>7{Ucd zpHon4d|>AI-XYkp?GmZt=IJFi`PIcPUxk&2FB_P*(2J_>$goBA;9$72=omNs{~ryT zUv=@1KzcS)RU_Z6P}J_l=jN?XbW5&|!!Y8-+H}lD-09AkosxjT1FpBeT%tWC1@>$f zwqdWr0*x29?ky=hVRIZfdNvksJdIOiT8?J;{!To1$>-Q~K04XEZ}V{j-APY9Tr>S1 zc#Pg`qZFVW_3ET{vOWtwa4r6Dyj0AvnnE^ST85YaTM=fR8io6_%;3Y8LDI#xV|z~; zhK_On|Nn7IoeV`LKPUBkKbl1E)wBJ@+^WxU>d{b?0tPRd5Uf)qZfLKzz0e4Va_g`t zJm#N=x1KK#mFHN1!W38g8?1bpwz6$jj&w5;zA?cy zSbJj7WOL)(*v)30nKAlP9&UvfwdvJk-DhL_pAvTvpM~fMk=I?P(>Spen>8H07g}Hn zdRad=s9w{iqROEJa5YWyX%;y%$T@$_eXdD}7EGpI2xktLe7Hoo-p+YbQ@z;tdIDjv zS}GH1xp!*ugK*8L?kYi)9uQhIQ8T6EtV^a;sc(P)i@|n2KCB_=PD$6AN&>1iJ+4si9=kWcWs41K*4lw4d*Q}o#Svlm6he%k zu#P`2#jzQ={@2SnXz#6G@sicK?*P}kl`ra%?oP^%16{W(bt^{rAPcLQvPpt(fyVg0 zi`dAhy^q`8*+apdH$@vx@sis&af8<^`U#NdzbO0mn!4~hX{Om}bi^T^rpYupM)x3J zb9KbXyEf`9bv?1M_x;3Wp2d9T2BTJyAwY|}7-83RB0@i?Q?#^8`LBX1&Z=y&1mouT|dX+GDbkJUY2Bz8di+eArL zGwIn{dNeMDhx&s#Qa!M`fp*YKtowW>x#xWMYK}^8YOy^hUeua}AkZwN+E^_*w+5ep zsF!YReDN$K_yVV!>t_1BIG*JrEyA#xkq1KV22h{ZBl^B<9LbgSAzZcEo4z`a{RlnI z{$a4-o8Be3ddSuDHz)C{@m_nTr1v52+X5SF;yxt?(6ub>hNEGYxw9J&^!HBV^8JzH z9mJl8)`oU-C_I{M1IB)HEM&<^k-jZ?tE)W%9V-cqmzBk$R1g>S$xFXuDM-!rDF@=Z zMK`JrA?^^`u@t#9b22L&b#3;youTVaQ^*Wwjh_izVeZK4$Jv33Z=l!k#~sWDiO!E4 z&PMvS-&h2HVWX_U{ekY-{FYv|^bz>B)bVx&j+>lV9n|o~FOL@voS;wWx=qnNE}nM< zA9OXISY7a^4CM4@)V!=MTJsJ}3t5KAI(gj9K>b}=i@VAS*72&HprEV#2NIo}7Ue>} zTnuu6@8y}pWJ4j8L;`QoNg#b-z&qI5(2za-Lm2&H;`TNrewBSfSXNNNW3>B>Veo>6 zHPOB1{nl!f01I7y-y2s4RXkJ)JZ4-V_k-L1#~I?eJS6Mwjl*`OdiTc5!#tY3-vQlH zW>L**V&~!;!<5oz9th)-4~9<@!zYp5uTwK0u$lBl_Guv*8M622nd5ah32p2gMl@~g z%%5vlx~RstpFE;>BKKkDhB0Q;EjW0i)y`xSLXUda_a7=UeTRvMp+x0wSd}pS7X*O4 z`ukP0RGEp>Jr5nr!+;zQ#`w}Rtfc|}8!3xfP9QQ5S+F&(Z!Gh>+%Z4>b|44s&@BCYzu=1$pjV#Foi*An%J^Mx%>%_(j(Kz4@n34|NvGZZ*CY_n zE@5`B{g!n7@rNYIMjo?W#wT#?TDE7q=Tq87+s1z>%jM4GIW}WRP@&bIOwm1iCm?6h)?Gq+#On+7M1ULg&#~Nqi=Shd;qO}TUy!1 z^+}RFxz}=BKUZ?1vircKmx~pXzg`B@t_iu7B z+X7KgfAkIT1O%M7@g|awR zXQ8hS*HtAtD~gPCpALTa?#3&9F<#$cXLAYy$w{rtFKe>ja)*5ESemcDoKrTwJ!on| zQ28OhHRK@1;OT`P*V%F>c2hxbWuvW+TY*U2_F?!eiX?2`O57*5o*A<5**IZ%R;v5( z&I%Tdjdk)f#ze=Zk%0BIcjbf&`R~{8-7o*SwXb0!hc#xloaJ58E0zQ+wM@#yXY*@# z(&p10;8{shM%r3CV9NeUJcyQb==r4v39wJjw&^7J^zQXny1Z?3Zwh*5cq6LDmdJrU zOwn;AX~2XfNv&^t_aN739Skx%p%Cmga`1_h)3mOL|Km-+?!VKC_Lb~X?~@xfRs&Pf^$__pu&m_Sxfb6+a;j7J)UU3DV%nw zHybzMQS=7_g_BkG!jP9`$BR+W+{3vjgEQFmzi+{FK1YTvf;rdkRQFqH}Jjrqqd8S&Zh<_cM+mW zW~p1JA?*ku=Q4Jc)qh`oh+C{LtDn`1seRWNbN1GXjAl{6m{maDV)k=+maljp)m2_* zxI>4c2C9&;GS^iY;6rzo+9jFN!M-Mva{p=@B3H%h47q#}a;c%I#K-4hHxrZV_}wNO z9&U){5r#~&tHtjxXrU3;|L3$$2}AMo(;F^3%jwmwi|@nxxE2G==8%8xQWw;j`d^DUh2>{}iRD z##LT0oVm%Jj@VY@_jMRZ^JncYqw-oVzSA;^=Wj+JLm1JsfbA>;)%Ch~x@&*$Bg+fJ zb1V1TB~1SLuvi8!2`0$1yrI7EUrN0){ zi{GNjZX?)Ea|MvNIFx8 znKV->saB||d=TTPy*h}mDacmPLrWc_^o)Oaffmp^`M&pHeqydy(MT#5s~47B`FIis zr@ApMTbL=#dxB`M<1cjlmbHvv3Cxf|pGbes&lG-=E)+h$ zPj9+9n#t9aQ*!BGzj?0&3wgCx?A$t&DLee~cA9WxXr$<%lTVm#=aYS8iVM+>BkOMc z0Jhb)rI_>{@*Q@=2>{JkU$(0atsM!EPeqZOqk!nD*Qcl#uenqCEvaqax#%DQbXW~G zS;NBXWc2%)Vts<*#t2mT_@bwT~lNxGMl-Ug;xov{|FkO*{UTQNL(iAjKMGO zyzrw1CZLOws;s9j4(3BV@fzmFm@T?SbIKhbl*2T14Sq`F@K zp;~kZJOd26$F6h%<)z7AYFNi-vnR8AGti?1wD&bPBk8q&3=``1FoEF|a46CSe!`80uR@5kIB9%}J5*7a;-BF4bOd~eO z0ho07mb_VCqZap8_2@P-(HNT z`kd}IZ58c7ew;P?pIy%1BF*jHUadLSE(R;B61p9cG;Oc4fprq@>XO~7+XDWN=3S>0 z=}mq%!&p>JrbRQKfd`x0gIZgC;cQ`{@3Gv6O~WC*h} zAh~?a^?dd(Xa}~^UWN4rP;l4BWDnP#ub-nAYb}H+LwE6<-w(qig_)d zRr3ZeE*UIsyem4Y9i5cr%lgf5BF2g%Zc63w>TbUMF1dyPH`mkNXu3exq;##lE zYMVh5{jq+HcMSveD%@)o3|C_Ax@|_kJbw4U&#$75ybICJa8udr|N0pfCbb5pb&`AY zR!H#uS&X(a$hWOJA8t{xxi7D3qcPh!cN>nT%hML6Cj3f7ZvAif{6Woth~Vy@Y4Yv* z#6Ks^t-uMa8$f8k-qgNbqdbZ$hB|{u#p#K9ucLVJ>y5KwzmqMX#|8(>%(0*QOTUV3 z@o$LW0H#08hLu#cIR_b2k%haQbA+L~ddh_~S6Je-%rp;ytv_&X5;G@9)gRXbK zHzqtc`D#PM1|xgz9$@%9Q!V`*oIP%B2>d!^RLR$BrsW0V3vJXyhT6SFTby{(lbIDP z#-Hb!*6{|>#9>VG?z;@C9sG?8iME2(WlTX?%RwZ5Ovg7bIF5e@N67uRT(|q0^Bfai zE6@@4lo|4^*>QoTdRD7xa%Kj4eG-151I8T3@-$+F8PMJ@)!f4=Dpod4L5A^uD=chF zJw86EiG}PvfM{yYCj0v?b0ipfCko#p2KG3*SR+^Ejq4Ca!h4`Ns&`M_)uPj_+sGzM zu(>{)ajh=+nMy$s=Ntxx5ozMyFwKh~mQx{|&jh0>sXSQXF5~XtjddBDB%#rH+HjiR zT9p%A;(Wi!#a5Wv-H0Vh9b~qzQ+W>;PS_Z@W0ij`;fE9iq-N-7J+2(7S=Y(AEwqD04Ch`PBQUL!G zL-G|2O;L5S`}j@NlfVq;_=5ibM563_MQf}>D@)1I7lS=%Y-}N5GE4ySYvAKh93!DAFm6vD2 zU?u};qTyhSX6pn@8j|qa{a%>60z->HEh51X8W<3aj`#X!-Z=wu)^Ko--k?I7uCk`Rz3caC*BpA2)&j#Ubd76P zj(|%ce{bCF&4F)lsez-{*)chCK!0Rp&!05W`m^mx!zKhsIUhrA&O_#b)>u@6%_DHw z29x;t3`TS}e{}LA9xHQLF^wM2sh!;l2J47@JERDCE)es^2290#84!-|aB0$Tt;g1~ z1dMjnlAX*(DQes+B#5Lw`+}a)E43Mgj8>-YMldv3elE4RI*y~M*(DotI4RdF)FNss zErEAWf^nIxH>`u~vEGz?)_bO+U4bAKX3Jq(1e2ZOyC1U)ANHWWP9yiye#eJp6AIew zbF?1aW?JC+pMJ876*Z>Xnk@PShw4svSM$hdoNf} z0i`_UWHWhArB6fe3a&Q-QDtt!g~( z9O|*-xtZPi$~+RgX}UG?ZA+#GF+ZqziOyFp`|vWhBv?l2{r)X7%I&yUt;o}AA5r{E zmK8>;YU5pBb}DKZ;DBm0cX_cUd-c?bXUKnj!4!zYWT=pnJ;sxli98ZMdg`s6(5mr* z_*Hz6E(YpNyepz#`^di75*d3XBW*9v+fUzn(LZ9?3E`_&_D6ICKEUE%@%IEEl2WF* z#gCmLkG$4OzPo}$ZLO=xpmdPU-`J8$h|vMWV)|0Sep8;kPqe~EM85V(x|O9_B#g!; zNpPxh*U*8}l%BzvOac#5Vl{9Bv=?&H5q;R?U5&eL#llMw+zvI1o#1o;q^gI%apTkO zqj6E6Q)3`U#d7`zOfCSa-_(jFItVFnTwG1`ZvY6F(^eAv=FEToY!TP^ENP;l>G1rv z1`*Ehx9Xjgjr1DGvX!T87CQP)PqRaXw+?FJOksoK0wqV_dKw(7T%4Y7vOP<)+P&?L zGWJ|Vc##lb$libqNY}IF1REQZ3a}*5U@HV+(t?o#3K8tt&*oy5lKZjJU7nI{Jb77{ zlJz-+5=lPU$4LO+;f({X>}F?I2sgn}ya{pu%*IUW!}HHWb)*n1+|#huw^3nUHnEp3 z_01&r7#Wyb84UYTAHRCwmtmP+p6?qu)8>pSL7KGbmn1?CjJBVuYM7gJh&e~@2}IZ3EAp+y$I6cOq{Ce^i$#R@#XXsXGV41)H4KXG6N4T88j4pI-2JoxeM z!*rE>6DyEWa6_|?X8TsL`gM(60jryU|9-bWx<^p*M98#?|}$G z^~@i$C{YZE5yu(WbSH7eo)%{6v1EP7kP#j#=mLrO#X;lU${viQUsQY2NZ_^S<)pZ8 zG66KF&SQSg_~!5(%7aKWa}~m|nc=c?l9P*xMp$8{ufz2*cR!Z4^bDOu&7Q2d!BvRV zUH*z2e8N}d{xai9sLXUxs8S4cByrJj!V_eNgjHEF&mjU%%RevMZd5#(g$1ASStb!9 zImjzy&=J0_p(6j-nN2{%Ey`>u{y~^I*2nd3;X`Z%6U+ssNO0}z0}uEK(=UU5-^xyZ z);gbWX>&H>*gJ6n0>~#WsB#h5*sn}m%Ix9~fZ1wNcA{LAd3kJAEze?b&_bz z_tH_=I~R0jN=|d1eq~C0z|RE=dSbp+E)I`zwzevjAOfc;#!4lTC!6EFt}d1i z97Q-fT^D~gK`C?dB9K@uNT6fcJX>UMXNQcEl6jt$f!RRVBW-4Kva~E8rP}5eCMCL( zj3s41*U+6x7Od-)uoX<^0L)?%`;NDU-Ij#sYmY!bz;(zv@Ch3Koz%#@-<=FgLY((Q zG+3O|TrG#k^vk;qfwTY%0q!2aTo*_SZy1Uwj5MsoC*K}KF@V%qoR5#^t((2mR-M=)wBip0AF3=yVd~*%_{1R3+u6=#HaSXl2eC7_vG3O7e{4s*scC)FiQk++9 za(2AeggIQ&+bwjpEL}_&?{yK#Rjc={f$#k`wyJ5v-F!gzNd?1dsPp5{Uz##>(BIV3(;WUVd_!QXoL^8d=CNfkf(uK?Oa8lw*;3f98m(eqekXvmgSxnYdHB1l*ytd*d z81gKm9(#-y6jqz3Ih0MKnvQ`g*@hyTR5qMQra^mmQT!%a_x@0f$RZ?h3y+T(p+CcH zY>o}SG3}X5^pLR<*7JE(P`q&=(t_z>;Cj;IAL7-IL4G}Ne-n#gTisM(?D!W?XnJwC zCFa1E&;nZm6pqv2v{tj+IxGJs(l*$2Ulo7cR>GBt)uxh@;<8CLw|^00^Z_?P3&9cV~wQrrrn8^pL0s z_G&j_{L!v$@^pb7uo&aDr*}=DJUm#?Ktc+q$sotbc%tV`RgncSJP$sfWwBK;KYs;& z#d2AXYM-jTwGUk)mh*`UmN9bHT*Y4gRSvU7xbs)U)I9oESFi^_Ce8n5|IblY$Mt2h zo*oV_50Ara9U?^hs_9Y0AkR+KbQ4JA{1AO-sfCO^)lCR&*F~z^^LO=oH$sr()8mGN z>Iq}$0d5w0Xoh&xc`KDM6joZg*ux_3wwag1g>^Klu1uWJx8jPMDX?)p_uk(^XoFwcsMjc&ZTE?=+^RdjDwy|A8z?$0%sVE64_;rrei&!4H9 z6dEk+dNsnrA}<<)im-!D{S`EF->(4M(S$B}wTd7MBAJaS86uhckmOktlfoFrmy$p| zXC0VExKJmI^HM;-47^(<;h}Ez1XaYSpy8YbbK0v;23n0pCm%`JrX77;#2Gvm8u&A2 zl)!#qjq9BX9ch7kZ6lq`(@SqFmyFg$_xeV$Hi%5T<>*I2>zF5GS$93~HfnTjRdVv?N+u7dGJ*WAHej6VHPsg%@~p;|a`Y zBPphD4-+PG+|%(S36^%M=N&+EV5iKi?sE6`#IxbU77+9O0mQIW^Z@#Mbk=m1D(d5I z#kFB3W*{%W<<6J}{mheynk^Rmp+I?I;D&}iLWQTzeS7zqClpEypRoec2C@mRMZZBH?R8UfF)`-R zoLF-4#}aEBu9F6!H<2B?IMvw$e;i+aP#eKHLq z}(sa`W0vXfj={Q&W+`!3*X{V&_i|u^zWaXJs*Rb|^Hk1262}xzG$o^aeV4IBR0>T3OFT>vP@yUwmADf6}g4AHrAmrhe zEV=A;ZU{TV!rjUDqhiM$?dT*FJ`fOPP%yA7q~t7g$|Omf7%b2cM3UwYFx-d+1?D)Q zRI8o+Cj7-=x3V8H1eiL=#8+Z9og8%eJD*NkSq&#P?(JN!iSuvIHP-XoEAu=sP3R@U z2LHs?BiB`1Rob)0RmNIcph@{=wDwV}rH2|}tRe%EX4B6l%=_4r8fVSAShy-9us(O}C@fLiH+O^hpH44_#hJE~?uk z5KGsNTd_(vyiLDF(S zIZ-Pj7Cr{pS~T5Iv57I~my~FloDomeCakOLSyME%dF2Q%yfZhXjh|^qsG7T78zj$m zJG%q(Sh@8#!at8>`(4WmDzp9Adnehnw1}nOaa2@O2y{yk#XLFgFy)cLrBpS2^P9#N znlsmav5H6MDw8t71@4c%+B9=&Kyl{EBpz{K08l<9c&BV+C&e~ zkjpUTgn5ua2YKh9|f%oThIoSkgqxW%!)OOGqMt4>R44~xjgIkl2<3B zf99170txg|Uu|>2sT*|G{z9rrMs#ulGdC9q`QA;y#Br;p_ZHGg&h%@E8TQf9QJNsq zeDnt&xs5Z%ca}8gEBgpu&hG}V-qm0F**DH1W|ewK0L@~-L;Es5Ahgv7&}0nA&DGQv zt#M<8-!(U1vb|GkwhiR`cbAxV%e^&RH}R!#jWY9)Ej{y_$7}rk z`UP-3>SUKX5hZ05tI8e6DW*eY$RN)M_dvXOC=sE zB7PrW^Jt^3Pwn@c{wIu>5NkwQUy(6UaJO2GNZLz9lrBNP(Ir1@e0q#HN_m5ms;zX= zuw_$7Gd^>Nt=7&ZxWNQ-@(Xiso;g+IvGX63Z9iMEG2~(Hf!&& z)LUC7-;XfI6#;jHt0!agF&;p>plrckm1|GUniVtXE3NNid~RnA5wbz%wf zmDS{fJfbR^hKBt7$&u9*GaUO~$s@duEyGith|nf$p+r)bna{E9PMH}Bd}r_FQ^VQI zWybMG7mKMkW}Ew~Z>6Z1LB&WEN1ZS*F*Y?!7EZ~H@{C*#Khw}YgATQgH#$j3hPXVj z!i4;CjKtdmy|KP#w~($w?}L2peo~nwk!7x=woKJdu{+I6sIy z+3?7i(a-F*%1=PP*|buPZfJg9I8sDfEP0ghXtsm-$3NJkfd--x)hkCdP8dI}mc%&4hQcQQI z#uAKNnDE-z@uIqb>%>M=Qxntgub{(f2l>2``8Y>_{FLfu|B_H95AJ>RtD3pzncr~T z#inf^F-aDs*D`hF(w~EN0CwuR6ZGm)`D~j&7zr(Re^mU-vQbx$&vjT5BF@~a_!1M+ za{e47U3e)~CoGYdF$UAP(RIA7;60O`{7eCsu4HZWVvS%7DK}$t-P+~8^;yLmR|)0 zcAZ>>vVDKzp|mvq@f9$EC|NFumX2+IZ{{-%2NE>Y-iF zivCWe(jmwxdN?w=8+LfImi<{=CRd3P?h9c^dzQoeZ$M-d-t&8W%se9MH zU{BuIwPsr8awz5?ExH#l#K5dG4u_XzZ`9hcC!|VfCoY#K>R7Qr&RL|edht*b*Y{G< zLoswIg)Tl=KJ46Oc$A!F3S)D*Z;}7H@sreP2C)2veN?;n_C+9fCDU}Ck||W`AA1u> z!*;jda!EmK%7uY3%+4Fl$PV{tgV7JeIB4X zDZBxCmUcxZ*B2)To*8xsU>NR7A1kN4?(lDe@i3P$l226&r-qSSqJE~6Q>BAg!{I2u zDcq5tOirkaOcvXCgCS9Gs6%@5=Yb0p6Uh3mH5(4m(mYl3y!@R(a|U_VqRp@o2lM=aikdfltU>X64^4&f zr>RD=`p`Tg&dyfKCWj-xbkWYuGlX*)Ge%_dcD$CHSAsb*kj$Ef+nw;IEjkHbyBoi7 z%S%eFdhmmCuo2T<0oyYH-H>c$nfmE;wypZx3-N?s%VmiQ%n$RD%}DP*+q^!~3^tcj z$g+H;9;Q}ncV9?fQx{7^Gi2*Ap-kWRZ2QqDm6{i0qZ(XAii1NRv(p4q9&~7yHPzDQ zF!IP~3_l3kW%H(H%EB?__@Bm^G#+ZNAeIyZ6PQ88>7CTjTy)(qzx}+HiXJ}p0zYt? zOMEHxV94+&rLuNM##4*_)K z0={IE^_aIB^_5U|TMsYR0t(2>8206|tek!#nIVmiR+mn??@Tk8x2fMA@lx^fpg@)l za^mgNlO9raO2l+v_&;9=Vw@Dp!!^e&c4w>Wdv=Q-BRGRA)q9rhF52SJz-BcSAt8s8 zKemY*sNOAL{PR&TwcH;STZ$aJ-IqxX8C+i!&schX-**_~R!rfwb+y_lQ&&l_kV)P& zlu-%s_=L@Bf+D}YII{fK=X4>z?kkaZ^~NEgVSie$Wt|WXI^unH9%SLI7h`a@rCOWJ zQv(NOi;}PbtE0&Zo})j6tCVsv-#3JMU6O?C9iQg(J}Sx^SaU@fJYFI!?|&ZFI&iV7 zM{8?6F7Gl&y^@i~567lK*fHt+lw(THlmM6V_UHTpBbz zk;6xo3q?R3J>;ivQY|LY-b3=o9Pp$qYWi1BsC3aGiu!L2cQ))2BZwbce*u~B(BvcE z^F`U58|Pk5tm_{i&eRFB;61_Edj_t*G*g0n)?w+stK1V+6&03TiJ&d|reMpU#;IkZ z$vt6U?Op&>%;V_SN*na+c!4f9xHu7^vWe=Gr zYT_O+noxv6(v#fRHJuv=ND`b8_rL-V^JHxk=F^0~hIHw^gFJa2EfbJQtV-1Jrt*_L z=A&urI^AoYSFj1FG#izA+3e~d{u}D-mAbb}PKNz&quhRmqUYp3VNMEi{hiVT zWfyM>#_lr5WIHQp=+|@bcW`(d^sxqMtvAXID07G)EOFM(&QG!-QzMxe6pV@=wJnv};z1@cwx#NXzR+ zoLpWk4pYbKR#7hxGRxW=oF-$ClZ-b1u>8{HaaGGM`f$M~Ji3^w*uJ-RNRLU9j`TkC z+AWURd7d~iVHhgNU0?D(W6Hq|ot@^PhGEDVvOyq7&!4TB!S7VY(XcK4G?y$8<_L%) zvcD1ZF^V}w4Dk=pBI)FR_-!5~cZFB-s`>R@Dia-b{{G+(ruT5_VAgRUKVkucaITCf3GQ`k?PW z+Jto`QVb61$`7yqocGbmbjuFLaUSwni*~Qa^_PnM`meV|!O45tC zM_{gN@cs$Xj{sAF*T_vf&k884-Is}ms-El=(C9MkVBj`svK=!a93=T6&k4N84EiF} zt)b~LQSVG30b1+om?3L9FNAt!;n(iUaRprrv`Q@(B!bEaLJ}kOKDC#j*#;x7l5Yt* zN(kF@ny4Ju$X;qZ?KQry$PfowF6};hu)gdaz#^xvT-(+s8sy>2y2&4)&eco2K zD6=u#dH@luG*;s4J~*rS;X+^X+(M?$3$V@mmiP)Wouy2Syo>UOo6G5Q$tOxUH1HlHPlOaK@S9!r2Y` z43E91%AgYx)PA&84zW2Yxw&WOl*Q}Gyp{K$?n-l{qvDI5R=NF~CfP`;!SCPcv-|j& zEKHbs@zRz4CQ6`Q&5JO@CVfNtnz2D-Qy|E4z0r^jRpM=B1IgYeK%p9uq^{nMz#SVf zHX;VPL_Jgm?8_q$&K#KR4J6dQ|Jps)&`_FKNdCz~;Qa&Lm-oE=A0PLadQXH z!x&>StR1R*ciah3ks!bp_5yVms8ro051Cdbg*-9`P>GRIsRySjggbA&NQwmt>-?0I zD@5bgQxwRVEs937(%m{)YJ0{rJ_kkVQjRe zSD#gD{LL=_mct%FLOne|?Qqz@7-nhSWni>D`}A}dABxHPF3Vt@=l$yMo{m+w{R01J ztL~hDCy1)*wD4vE-c&uro3f#kw3fFbzJD*sma37~X> zkpe3Art^%PbidAm?`k&9%^5X-stbH%TsGin??p~V;|OJto(rY=9pL(3{kmA|p=3`V z(AK(;X9+fGxH@D3)>3=)?#=%~-{UMN#nh1%;hI}Rn97~&&q&_QO&WVh?-H&?R;;fU znQV-Pm2G)Yr7o)$;Fgqc1j#F-AeSYg22dZ0ES2gBvZwbFX>U2zK(OS9iR4Ck;>xE( zV@OfWOl*>(WzraL9R%VMp+c@Om-BtleL5dPw(Uv83_X&R4h zebj&hDM@Xe_x=>ObkoAo-{NS0fsT8H- zt>N~QL zVIMt#DBVVdez#TII=mH`DNVqPer+CYDnqqRs`2_iitC8Bl;AkFKH7Z z=|mUT^8H^WaV=AlVww@^kbvwhcy?0eI&n0et|ou_|6}T_Ae2-QA&d2m%7q($dlmDgx5o-Ert{zUA}Wd*6?re;gFH=j^@K znsbgh#+bR`3uTFKVx*Mu1REEVhp1Are+vCY=gk69*(q76I~>}@t`;u#4y^X3+ z>M-Xxi)uTe+V1PEc}&RZ`cqsaAAye5Q9q?*3I=07z^)uTjb>jcKQ!g=W>ZTu#qaJ6 z9XEWQUFAj>ALW$lqw#KXo|ff`9~;*^FJ(!Rd($MniBnhdX%@B*Q`ZH159dQEOE{1qS-chPNoxPKhdRP!Z|C0X=+ltFvQM-na@ z(yQhBV*=7iFuDXBRsGKd=hMMWbI=VegC)xu;+YA|s0CCzb4I`rmQVyL zS?p27M|~*m-RrGLHi{!iZS4c4y2nYh%4B+7$*xkN69(4R5;L7~#5crHHM@=DTXc4< zlMqVmI^uky?##JYXNYhZEF?Y)33jCO5WZ^&9#^-Z%P#Pk{E zf14c4NKMp2clX+>yuQ}OZRre_ue-z%D<=q0996E$(S633e0oJ? z3cIWDA~2O~zYJd!Kgef+#U*k5_C0;fLJ#fjGANz+i}4k=C{i-syClX>V*tG=d<fJCY6i-BKYUfqzrbV-UN%w2tVHD5Su(T+j z`r69`5DGBo5pd-Az5AzYubo5Cl*5K!<&n{K-cW-nIDhw9*0l8G_{MxH^2%w*BL)Uh z&gaZiX_yl`7W{{H)ur9LGRtMi6aCuiYW&%4QRv(aJFG(3ZKXd8i)9Q#rd|kcz$&iq%X|!h=wc+#J z_`puf={?C)5eKJ(@lxM3kV{31&t@m3=kzpxUTsBUH zEK_QPD;GnhSX@xk^J;@>qI(Bh_u2Pg1@yzcfdaDs%rwXlF+4`97Z3_D^={Il_Bk2) z@{js4I;ns8^d>OwS?(y2((g=PFb&;Fvs68`pS;jAtjqh#$F7mv9A5>mp{gc1+hU@J z=xcZOJ2x#=oS?)F>W~T+#$w61?9Z7uldd_%ci2)mjOHpJL+K55QpIb?^P~_TX6y>j z{#uMHfVoaJ?4$%Kj*`7#6y<$E^@bHp25Rp{nIWPMK!kcU#j)`q#Q|*CHzQF7lnBk6j`suQ0# zcw(9>oNDp8#x81aR0e^i$aCw`<#D`Ch6zqey3PyK;hd23|7fqX;?v4tM;Xy3`ULG- zQW1$_Z-kFWiQXvTr?yWwx@+J36uh!2I*qo||FK?7h5U;pDtbe(qHM!*+E4W#)ixg! zS17w8ku>%7BhoR@0Lc#m856Bj8mA)B4gyg3IF4{6Fh`w|(nkpJNGeHBVq~$5bhFE; z6fBvJ!2Rj=i^9=jDuSb(HWp)gr-4DBXOMmf4wz;qqVjYyxd;a3NpS-c}-zyyS&q=_$_7g1mZK4{iQ~@`cgrJ zO>K8NdFBZ1)#8DU18X;5zgY03o~7g4ksCi6niQ8(0Tggz>>mbM6VEO5EW9)48`e)O z0eiflx1FVWewnWJtD+ib`tB%4%cuU%8!rf5Y3-#Rws_Xm7sP&2n~vw&{aQ>;jkb!P zM55a?ct~?C*!chT>;dN-{fMhB&gIVz+2^(Xlld7Ik#47hb|Hq2o5%G3*rX9v*KGVPhwMJESZhzup~881oywSC&!cla&^Fw3Q8pP2j~#?@j}Q3ai%HiY22+cg!~<)q-1k zei-XfYv&I_i}(1Lw~hj+S2on?C5MlRCPb7?nBv*cbz`ZjRDvfph$6;VOCCXZQuvo2 zo`pp)!hM1odF}qV9QmUc3_6}gazH~)d`v567HV{>ff0%47IxwtK#w$h_NiirMWnej2RcRdynt_m1F zZ~%a24e{stajtUs_5wb~U4A8J$2*jYei0jXjhYYx!p%7}BKH=~`s}F^ks59f->0qx z8p;XQC%UPea*0OTuC}>4k2G9U4ysA^YRsSDS*z!^3Qi+1o1P20_i^3G$J8~JDdC~c zla+RhwK?LL(8)@d(KM{G@=mU6IS>(OT4UZWTijx=B13OBXBWV7uV1eO92|Uc90WB^ z&_Wv~z!q;UXwqGM1U*B>zO-S=3CpI9cx3a2mC~XqGnZGULqyx-Rfp$v#8s3#X14=< z=8&2aE=~wN5PZr)qjKAlXu6-Rp*6wV4M5<=Qw!c}vQ;P6qQOd#DP6UWM?BMiDyjIu!E1u^eZ?Jir zNHsr1CSMNth*y8IQl(GLl~FVk&2@u5RA}H-*Id$cJPI(2^zRAxP5DH;Q5GLudsF)J zY4y1IQ9rYs5~=17bvS4#0^QR+L1CxJ02xK@>En^7AE>EZ6PRVRSh(6azmM@=yr^c- zY4+|OA}7ha^b=h#xFZuBR#DmZDGVANNtmKEG7CxmDLb)_Kow?YIfyoY^Ng5#bd3ky#wWD%V&~~E3DGz z)`#{bxN4anRf2}1*l>mLsdoZRvv>Z<+2WD^T~vtg7w5oPm9i|snvxeZWky-sjjlFD zjDMY0-LZ|$(b-J>3t!6+t#qka0muuS8p&RtmDEq@-S~Ct8k^CLiDXVSu{WF<(hVbC ze=EC563=R?3Vuc_r$p`j*qp7x+}r3e&z0X~bEM=1@279|8MTjtqwDfqBFoap1_$e< z;&?=V;fhD)j1cQs9t{|h#^zK#@%vf|y>^s1#)V!_GXR=u2eM6U4fOTIk&ZyEQdf(M zezS2*R&`V?@F4S(OK@_wL5nkp&cs@*IuRncaYna-qO!$CJ&IyI8#%j_aeU2$9iEov z_JiL`z&T%CnfL2>W?KaWa?gXxa%g6;Y~Zyw+B4^NmUC-7DU4 z_(rEbiX6?vc++l{C>y?y1SiRY^wlD={atf_OY1>`5od-V<68^q*U;D8u@?GsQ`4LA zcj{SUlztCUsFRR4_xYHEE*16E^2C`-m_WzwEyJ3P>LgYAK~j~j6?G9_Bf2;quADJ3 z{%_LZz_WoG9ssV2Pdku{Zw!$*70GqGq6qSA-pX4TIx5WD>q6C zL7Oj$7`lO;JFwCVc}CiCVL5}8cbxv*=9P;rej}H`CnFcLUyl~2%HgwcJ7qnpRwYpX zspS9X`9}jG1h61&M9aEDIA&ggvo)L;uYYOljJuVYz0#;jDb|uw#CIO7FM6t2lkK9P z*D9F2kyLpgX#VFa?v7&HQFPpO+J!Bit?Tkj)?ho{WP%Q3&7L9W=(dgn9f76{8|gYS z-=?0VvWwXwT5z=g(hrKNF|kK_NKnhQWI)gl(v4w{rb06U&=nM z+@Q0*q)u^V%{w}xB+(dh6PD6^bswA~t0cLt&Pnprh(A{>o>!nN_7SSDNS6H{!E772 zU%yz>7SXkb)G4~b__;??vrxcVbM*_^5k|;DM7p;tD8v1#%->Sv;RkAnhr;qHRmSt6 z{2zaB2{?7qH@0OjcY<6?G7(*a-u}nK@iVbDVnts*4s`_OOH*O<5mI3neSy@t z?BlNd6ve?q8oKn;6$1Q4fd7<`ck(Bh=yGhD0sx{a4-IehY3(0k=+lZ^%9r6_Ki<(i zvm9wkE86VNuJ?{CWnr(XKU6nPMTm>$({fN27RRLsQ5DR5)=}M>X6j5`+QRFwu<)Tc z{F*--+MH1Nh;g6zLnT}Q{W-%nrs#Ut^*>|9L@am$+cKie_~v~7THGnvkYzpj-?nmr zC*JQpj4IVY6hRb!dF_QdpBlX1uQRR{S+F2<@Pf*=1}X7NKRu>7-ONLo<#XOXubz6H z3`yM=;=>KHZzsnK7t53N3A}1aW+_hI|5VE~&FKESrHacQ17pEH{1=E|z0h@BgbkOb zr19#|{l<_Z{c^yK_wyM@dC@-%1(Ay~*^{wSwZd#61BN8!w9pNDB6m*Pn4vQ4H=3G@ zX_cK%p&!=-_?y5C-@M61Z6w(51Gq0%Gekse;#nJBszTJKyAyez#}+y22|5r*E`{Dx zG?xC`uIBSwb5t-Kx?MW^J6=>cgHJ^C|NQXeg#B4;+pXrITsUKf(uP8v1JNM@;-04WBwC<*O-r91J7am7WsFqH1B`80Lov; z=px=kj3ACU5S)`eG%Ih7qqcN(K9yZp4mle-myT>obW$IV29L{fK!&&IPtNF5YIbo} zmb5NRHCc$54#_9i#QfF)l?sGMJS@$Bmj?rqT^R0xWpStp;1gnf0PM zl5qhkFqckZsP4E5-`&*>99jc)j!Q8_M$aTGI@Rx5-;mKMix|aV&-b{us?5Z~Bk5gK z_TE#Mmz^FYBJJQyd~zC(i%O_{M5uwWiar`m-}!{2Nu72ZpL3qxyeW8!i*+HF0iHL0 zfq=%)w|Jyb^#XB)a^t%xS8~K9KZ5J2!u6#!l!Vq;l*Iybkacj3%Cvn}X`V`T~LfevY zW3IkEW|1B#QIpeq5t`c!mrHu;#`&s!f{D+z<3M#zlg< zE!T`+7mcYZL?ac!pNIJ2V`V6EM0edC2JX{Q*gG=1bJTh5t1|bs-^5=@UtJ?6VB zw?B`Ki#TqFio=}r`S7H!=w@A}@K}IxS{B7~rY~#lCd?NJjC*HrG-7kAA zv~`0J7OyT`#Emc^p)1_;`tYwS?Dgs76F%Z|HZUMA*}5zG6;KMjJsJc$*UO=-JN@es zg3iVaFkb%pBe&jS<$C(+Tm~>Msc!IGd{yUTxz+)=cUhqCI=5`s0-RBRDW313pgY-S zCuv)%U1LR|qMVcyUcF!FBrzkh8|&pGurH2Yg@ok@0d z{9m~&3HLn=h~l^=_!Ap8Gn!^*vF_GruvAr5ZDwmNPZ{Q_%r~<{A5WAv-STi7eAl*b zxvH7e^WCioMOr+)T*VST=~MCZ7q>jRzd5kBmCs%`uCihpx`ghr-drR}~3J>0-S(*~~!8UxRhK%aPAD>Y# ztspDmH8yJTX<;Q|oV<^wo4j>$njH)-^WW}SW}nk>NH$-0jc#<7iu7%)+o$T7x{K~S zX=bqhrgLL@QCU3oW5p;@WK%_Cb9UQ3Q_{|lr3IEGav(4Iv|s3H z{0rgC={pyz!BL|@w-yt{m}S5GpVx>JQvc#i*Wr2;I1@BELb&&ioZc|7QOzC!&sb~` z_ONj)Q$p&b-emu4AEAO#&1P4?szh%W%bCy799Qr=UN!hWlBVD2LIQ3>4v%~zJ+ulNpGskR$?d*9kQ&V;|n^IT! z?4H+d#S5C@$r4Qj2m`~_w5uBd>(*qgARAq31o6$(UbG}&MtBJy$D)Cm?H5V9ZXK-r z_%<`u>&+)ZrwQeA=eH+q6nE_(jlBQB%G>av)}xR1iSxfJ6R~`^M1iq*sgC7cUXq?x z-G1f6WemeXOWiG#8A;5|{*9le(r7iHH96f~n?GjOADfstzsLGa^HE;#OtooVe)Kb! z1KoA2Z&Rqi$Lsy3CgJl6nYVM3NA<9>2cUFXXy%;+%0h7hUzeblFQtf&4S>RvdDf=Z zv^OzXVO!HYT`F#EqEws4N974|IOc0&2=T{mhS_NMYnEMyCbTO?!kzlb_R13aUW2U$ zRq4lpY5R96A4f%Oig{%bG<@@?b3ULk1*(BT1+8S>s*)_CSi0f+v`dCEh`bdZN~|-Kpm;Al|+@ic~yCqtGvCj zu|Y{;v_Hoylxe@#56FZG(irZ=^LFN%Ziftim&@q3R+F2prsHt7xM_lE?*g$(nnNIPMG@Wgdq=9}7KPF{hyU>>5*OemD5J#P8-(jqqAcZ5%jjeWc7x z1TIFm+X~DveloIk3tsG9j=<1MyUvceX*)mFj!LSswB~M1MMLP}_PSDg&+R7h)xqcd z*M7IFnZS~$iYaLo><`;RgqHIe>y3TjKm_;N*chRmrQ)3eS8C0>FCigFDZIA_W#G=8 z*qUyn^&w$Z0)|2Nq`rT<01GB5kCTq4z`g;?pUT9F{TtR;D$CB?eW1kzd|H>oBgGz; zkV~Tqud~8f$=@td<-U95Q2o^g^DxItR<#tUl$pbPsMGO0$T}kd098-G`l~40Ibk1 z=A3$yG$)SzAKb@WZ%NG&0(@Epl2|(I+V0xm47#GznOiSK)YL2v;ThCRrfOi{st#^0 z4ulVy(R%S`zZMLj_nweG0j8`I(9)PU6Xn@$=>@{Gk>gU*`rr;+u9yx ztnHskt!xTESUNkOfKd5Dmph`#ptgi?_jGj9=MLtM<*C9#$dSr)do{?M3@a}y(`)uv z2B-2!Y2E#W_W|d;+w3dnjXokn=CX#39ZFcYiBpMVgpqZ`f!~F9p#2^2riFvR_Hpp_ z)m2kdvo!jVMi)J9R2%uO)#qwdL6{_lrf=&us9O>eZan6~#mP3m7^2T~ z&VbW}5b#R7_Vnxw?#H->zA2X?ug7=GKN7N3an_TqSkOkFrGVK2auzE~p!sh_4P3(Z z$)AKPlk=9Pk(%V`Q=w>p?y=G zfbomI+vumHsMND`e)r^d?y<44+vB8|1;3kz=EGl+5R18d`zQD9?d_LRBbz7NjrSlb zahLZ#0F9@|&qohtgq;P#cgYweT<||=gpVkIezTHM-(@&YGj{*8r}!jK7D@-n%_KpHO)9+Df%?7Ee? zz_ANg*i0W^ELeN(6zVf;H#WN%7W8KHCQ{&#m(!$6C#h@AYQ6RNO$l~@Id62Y30okR zc$H{4WAC8AO)7BxLNhxF2V9j<(X!1|iiZpEvT384svESKKPQ)gl_+j)oqDyoU4TU< zNVE$`qo|?9(AUZl|LbjQxTOS*`)o@qrX+5HC7!YdPkqO$pJdY15y_XDZTGwoNZ1|% zDQ*owRI%aO?;v;GG$BbvQQ7g9$l79Y#dQ-<)}N zH~N6#)!OyhV7g=H_Ca&iaEZX>QjEmH%&dLe+07!wHK<4XgsPB!yq?q?UA|i0feiZU z8yS(2NbjFGkis161;$-J;)&DTc>NX`82U(5sb5v67iOyl$SYZVoBAS}V9`CDis%^d zB$y!)vY^9Krdq%B7P*)Z*+inNP*4%8T-!WmZEZzD`8|BrPT(tVJr7C)U5dM-@Uv-+ z(D(jMq{&^^?{__tkx@6eSZN-WR1I9uZQ99F;ppG4^qX=gcP%jcIgUlT z0( zIzOhynBN8Vr*hlR*2+Ok7dLQApcsfZO*Z^8VtNlU(B##E=A%w)GjZ%oZM%ljzm&cP zow7@sE=N=AFW7%ep1ujj4s0n7;&`g=xnt$cO#l0(Cnl0{w;*naVvEVh$f%6^#ZdwO z(*yV)fDjM79m?mu4+Q_xY)nM);`1$m!C;Gqj^h=O9G2CuNJGe>pS)*S5;@cCMPqVsIiT` zjcL7cbe7_!ivv@AZneZC+wwpA-f!YV60wHb+m3{&kI_D2xuHdD{}iDuw~;DvE#UiUXr@nt!(Z$54?i=1fza zIr-OD)QP_(@!&77?dQlC|A2HUkNi$^ZY)zGx>h&D52+)v)zo~i)-@s%c6N4XGAdB0tIjZGq`-jepCSd~i(Zc!2%Qzz~xb=DU?8fpieLs1FC3r?Jk! zE+rhU)+zj9rQ9EWE`7myYM$=8;koJiXSYX@@%|{LO&?@*4({8#yVr-IgUk$I;Mj>k z9T7HBG-GkjbP)<`&#K9MqfFan2lE$hxYx9J^n&u}?JVf+C1TH?K=sQZFp!ckKuams zLbJoeO4niCCRT?Hwn}(H7Y!u+LjjssTN2DZXX9hYkr{ zbu(=C6}BDs6o)h)STJf;6GD1^4L)I?NbKs%TC*@Ak9*0UwUtOF;RKF6tVf+ z5fP|_gcQHmoiHW|z+3Cx>`&!q@t^KV=w)u)Vq+Jlj94jBlUR5W&pIUmB6MjT`9Ra! zi3C%ro&CWVVgH2`&f-W4c!yFC!4kU($AxRXfL?j#=85iJD4rVKJt>RmxwZPB%=G?Rv;-&R{+A1-iBW@3 z8~}r_c#JXz`xN&>#m%et>-$#(voK-BK4l9L<>&+4#yWhy2UE9P+Lm5f9xjLf za(n^PSE2TbsFH{$<^=qSKYbFaNc49`!H_Js|9!LbpkTq&4N4 zX-ySlW8>)=X$HpL6n`eoO2j3Hw3RexAqYY@ZaAMAgkER;VAihPNjA^m1GOlyNE-z8 zX!*QDyQ};BSsUP1aJ;QV?e&{isJF;#z7GU;6qef|2iX+%W!vwB6H z0MxK+V`R3^ue<|oOi@flv+{=KUFxLb%{KQhx(t!GzrL116Iv8L_B;X3!!1cVbp3*! zdLR!?l2*AFJ(*GKiNz@vmn-%h9{5ILO?9THtx@=Lv~&Gx>3IJJPA9q}zTOq4 z9z*U6E&UFE@$=`;)lNAcr?oF2*)3F|v1tkp;<&!QX%H6&<^__^V|7}*UQy>;iu{^h zZkKSfUn$kTDE>3nVMLM2Ra)#ab+U;oA}Z>2wqqz)U@`nWI)8gaId3nR!(s@UO$(oz zB4pY$+Z>pG^ym?1@{jG&g07DwtINx=85s*jYQ1~2+`a1w1TGaD$`0a;*hQo$RBu=g z59o;$F5fNEM$q7e=?FHTHS$MYJsCM}zD1yoNQzHZQnt{Th98H|(Ng;Ied=4!XKoT^ zClpgD@|R~W(PRkF%<1Y|H9lk3@e9&S!|LDTtWH6>j##sggj^zmj!Q-xOV~qJs3N5_ z7M;cZHoickXY7-}mBedAsMj|?NHKvW9ayXrH@=j?cf9a=iPPP5Ab)?gDGm))nxa8} z1_mnjJkNH{2=pw_Akh%?3@%$MH@EYlto9TR%j2s}cH!H@(Xlc9i45QC(`4S0co4~= zNx0!4X_*7xyyNwx(4KXtvb2CRz3qHCe^p`85B2UUZa3%YIN^v87}%h*J%dOk<>Wr? zDNqC+lS1pj2X&xh%o@GF^A;5$o}|h#`uV{V6BE;{D!I7Auw(wAESye-n%in@i#1+WF5yWgJQvkJrGx+l<$$fv0{OQx_Z%WvcUA0~jinJwQ`1VmZ4aLp% zbxOZkMD}iF@cDr-i`5u|Xeefd8Cw4rRx*f5r`}?3b&U!H8FJ{0EcHH(@7c~%#5dnm zi!4X;wVS}Q*KKm^b~{{ISs~Eh?W~C*7ZkEz_&~%igp7<_@5)dJ(x3!+&`eO2V}MIg>Mm3{uS9(J3n{!= z>r-`DoL7%=SJ+&RbXf@(9<|Zij@2jiVmv|TZec#jG>)6k@pZ#nx74>2)V##uttSv5 zy^;T{)u3HL0t&<|B+OC3xA~TJa&~5@={A_*3oK%NVWm>Qu*s0nZ0PHI$YFCpcQyk* z@+A!o0rWPC5EJsht>C4hxu_Zx0>1@5MX`9(a}Vs) z?H5}|3lx~GKf?X9WJX|TK0*|bo~P+$0NmYfKA-E(W1ZFGb;L5%;PgL#kgdH>w}urm zz$|p6zzUh9{kFT>BIiwctp0BnbM;SpE8}U}ZhDzzY*vAbcX$|bxm9^??%JEc5Qjaf z_=P3qx8w=kCPiQ5-;AEtI~r3MS4UX+rCZc!m8vtucN-ZS!!6w$Y;LZtox>)(+S`o> zGjzcPz1RM*mKDesY^tArZ;~&e!jS?1wawtL7jn254k_v9l$6f#zRTs%;0Zf`g@OP0 z==>ZhfZcq6kDp(+&5xI>HrVzRZpAyF^IbaV3)}h~NEC->XK%J*+nL?=wJH{*IN{;p zp&tg{+p5;r)^zmr?t7Vg^W{=|#G9L&p=YmN&6l-Cl7&<_JS9es1Eb{)3FD|5)|EmpDgkgEp0M|k|l1haN^cdkK>5q~iG#Ma6xg>$Mv;o)et%Wk&zB$NVw z%cXH@>Sp^Gk-b!Uojx+R zV6C)S+20xII}6rsqSr{)9g4J~&k;f2HxG22w)5!Nz?bit<34zUNscewYYIbqMq@}K z;_G$(%Y*`aS+DoofYLKI^pW_?N>;Y7C!x5>#Z&2dY~L5wy_*99mxBcisMcm$x#FQG zq0P(NJGDPi-(R<5p7m}mK4#Iw`1a;N0mP4sC?X0jJ5n~QF=Xib0MqNm8_TlG->{>>2{7WU1mI9;MqK1gJ_!Z_4JfS#W}Rl6-mw<#Jn zaYs%;(PlLsfkAT5 zp9&S&rAN4!vQ|;E(|VEXA`yGOx3_l{Lq}?CSWbjy4s}ORBUQ-Y0MR2OFuu1e7{Z)ROVJF#nB9^&!8_fb}^tO?XB*KcyWOXFQ^JsD`JE75Oz4-TbP#}~tHX~i1l7^FP)*U7S9 z4m%h9$B{!dx*p;)2)W__jp`LpKjx65_a?ry9W~1|japYQ#H{|^pRK`)zpBEcPPQyH z7gQ#fwn~lMY*dQo^F>;@*RDjRVAuGx=Q`ure`Fn$LHDr#WCv&jOuF?BC}0Sg*}z;w zRaXo}fpVcm%D~{Du=55*)4+U_``$z;8q|EVj|VHl005w%+wRuRc(Jn+UOctj&U6(& z!D5Z|Mc|Fw<}pqfy%imZpA$a=L#gFS!4+t%C(ANZzl-UZqc_eG^!=)tXnV_KW@~_YW z6;pxZq-4uN2r$K?P7++9TZgw! zP9wY1`b`ZDj+3H!C=@!&q1ttEz&)T#9H034)d>_K=r)) zOf~TSSkU+7+?=Vgh7LDU<3aNW+zbWS*${{)W%-Zld^&|6()@4s+*|Ljdzo9mGao3m z^z|`9OFM;A!1EXln#xzHujfH{{pJlEv^(qmjGNp2_OgOT{x&^6hmhCl65OTADsapF zCCOq*xN#OiUIH6sZcAI=-)}YP9)V5TJH+1J`jj0lc#oo@p%oK%8C59afqw-HRx`0l zMvDRLa<9w7;i6h{L9g5Mz0X5KpYmh~x;i+GHP2fvgucVt?=H2s&#r-!o(5?V^|+YV z#kTv^@uT;zKP4w8WM&SUszT6)^4Ev@Y@gsd`+&agDl-@DvKzVIn z1=UEG27>w!&K!}6dYV^fRJ4Ykokxwm-@d-I6S*MN+E?fWvO}DBEkh-Scbzs&%uPWG zF8}2Ma9BHKWbLB9mkBbKWOiJNtadhLO8TI^BpP3-AMZx!45I&kvsY{bK7e|0D!$U@ zs*|yP*XFkh$_d!=@)78fI=LP*?7MCa#k#_{Xz@^+v{N5$orU-s3ps+loiBY66>#&T3WkAD99GM1eu z8vmO&Z~o>oWczgDN{|5?QGEeua1c)Na$WhoI6Xb>>Rtji z9n<>DXFq^DpuCO}D)d7K^^~Gu5;kT^A6S-FAwXrW^gN-#(~IN`DP7&xLu*u&lqu%} zgngH)M0pzJYR857u2$egY|l(}2!}hPFO}vD-;)dXs^%#VH#Myg^p3-`vy$;UVN{Aw z6Y$jv(=yJr|?P0p!zob==}*^g2`w&;ai+r;^N(?q7NFu<^N`xDI)wE ztOFb_ayJJbxWIZ5dtNlPyc#2{TVwU;4YpS4`NiU-I$v0PywBJ-4YR&)Ob-yG=WWXY z-QHa+=Dckg5FfL01!WD0A1W19RaLkbwl`QpUpi|Zqi;<%p0%iWjNJdexboxTSuqrDMKPVx@eq@^Y|PC!SrT$Yu)dolWZ3A%O$fo@K77s>a}F^VHNAfZXyiGVYG#1?|nc4WtU& zkLF`QUsa1r3aJiS`L6=8^36<4oEV}6$hhsPO~Ffo^McHYYO#oPaApZV%$XDH4(G(| zsYGPgTdNhSg4z-yWHTYuNQZZ(8_F?;3)|dQicPm-BYY@5R`#SI&pgLKj*}$C(+po< zPuVhSVo4iXOKO39A1O^QTyKGu= z4V>3G!{FrJ*|Fl%j)(-%V@F3qSI%eYyq^Zx$cRo2I`j$SCU$ebo16Cs{|x{AI?Cer zyO^IN(CTvEngSyM9T#~(rAJw32`~ub&gN^-P;-M#R8c#B`}~ek$nTbgyR@q}?|V;o zcQVgWX~YqD>YkpS>W#gRDP-%kV}B+V6l{K`I~ZGm$4HxLl&??007wR7uXG+J7=v3d znvjs7xoBr+iV7Swu#rvJZeYLr`=3Hg`mKF}AEToY14c%a_Y2=K0v8-eQB}3txQhwG zM!p1i%xbFrhI-9)y9_f%i^ow~WF(qYoLN-^NV^mcpU=C4;yf%Y>`fq&YP|d~IEhp8 zohzN|3nm_^g95~gpip%%WB%q02GV~f-Nv~xUG1jQCx5>#GLNs|t@%2ByuY(dQKwg% zDCOmCn62F-WLwKy^w%HH5~V3~`xAmeQXuO|^X$h%)4_({<#JcdEsj7UCC$X7n;Yr<7w)jQ7b?Dt(1@`a9Zxg?XJ*Jm8xE> zM2Ge+(Nq56-X1x#NcG}d?|P5#ljn;QTtrWCk>NSEX$VJ+%~YonbFgn}*PA$M`?J4= z{CUyI)$~iN^;d2;Cmp+-Rj^XL#F&cPBZU>}^8?x#awdn!75qyG(%tWlOL_aNL&E2G*NkuV-S%7LyU>3FAzopj<<-?yUS3|4+n#2XS-Mu~ zz@K{S*(_jT#h}jk7)mtt6j(Ul)0T)Pbv@s0ke1M{KP*`9)j&ihpccnFz1V%;bqh2$O8);m+MP0iozQe&oY7jMn|&0mYdP z`eDJL*XGw^q@!`hcN&UCQEK)B7(7D(Z*x53G}Tm_CZ$3#(`&T$PPbJSJOnqd}isV6|ty%WNz< zIy#`H1r^51>MA&iW-Cp5TYVp^roDA=7&=~WtFNzjQ1BGc17IKcaGT1k8NZKKX`VlS zK2vR}E0+lh0{8&nA?2h{uG^%iu0BzwI}4hn0GqtLyj)wGee@`JZ+1~80T~_rcBhy* zJLg3M%E{GjWo6}j(*=|ExwVc?iR%=&vZJ#z$Qe8OQ^O|=Jg-_(tw5rcYYEDIP!ROH zv4I3*sM<3A->mH7;9+Ece)i+r(GpGlf#j3^uqW+qyHiJl!kY~lR8sphHS@i_&fqaB z+>1ClTlva@^ZJMf%qxD zZ!AYW4c#ZWfFbtI!fC{SuI|4%ozF!+PNv69;gdEIUR21S`en#UYG@Sa~ z=*TIZ^7F_MrDi{xX|%4~uRJro+NgBtG~&Qt^y7;R44eB!_0fy}EykwQzG;q@%ggKR zwGjq}Gu}BKX2InmR!hZs9UPlarGJncj4Q8{{1Q-&)heAE)H{G zKys;Ed6tdezaM7FaJ_TnueCh+Fl<4}Zg$(~YE8^(^}BKx6yR0oO2y-gzTEa3eF^|L z9BKA!b}bA}nQirTwp~{q3kHW1e1M3OZogHQB9F6K!WmNi6Z)bH*jhW5@G~hkZtl8j z)$s;rnh(zauEOGT*Kebtkrep&qM@lNwSNO7?GzN5pfm2eJC)~sVF!ImNHFF8tVo+C z{LtigckL8NDttegB^oO9;FB*)eY0HZU{H=pUsbt$RtxqOf%!oI8IH?MANxb4pggA=3JV+f=xcn~H<(V83)&taZ@>s5-3 z7&00fZnzl0U3M4S^kEZ6ZMT(FT(yrTZGQy#v9ij+835GYiXr_2RX2Dd7~}%T5WpsR zEJw7LmkmKeaejU-$aMI%12vo?<(h-wv(SbsckOtnz@+i#CPG3Wc1^r?7V-;PZceUrdVNfr+ZsBT{&aWCDeiH_9B8F8O);Sp8*7_>T>vO!4J1-Xt3`HXE{9eC&|I&uOH_ zE#rMJ^Tl|yqOw!41kLB2%gdr%-F0^?;t0FxHD!*W3xZVzhGepmGC{$LUNc&lm z3R>FO*grS`$RHXdlJ#S8aj~&AFeWDEZO*!S;U~%8_xJbc?NjqFO$j5XZ9oKOl<_&~ zCx8^UU+qaJHCoI!CIkiolevwJv%T4emWzCstszV>&gi%}MmM~N8ArQ}FPFf#`; zc^rQkN9il|m*egmeWgVOiSb>vR(gCqJM?EAa}IcTBY&`t>@b2H0I}%eVsg7WI9MEF z@wr5X-hE$^C{^b-`O^!0G~ecc2`0kkeP6g7SH#F;*oZ#{B4P9coWcKIR#9;X9Kj@< zs7L_-I&ofA!Q*sV3scI`LqS7Z#i0WeZ}<;nr6lW-A&`cG?Ly&ww)2D#uikmntwziD zbgM!Z6(ai z@;M2Ki2;~sJp1v6&SJI}Tyg6{3ll1`bF&cm>0X9EfY03bR@;dcdZ~)c&{{JKEt)r@1*FMmR zA|VJ!OLvz@w*P&oF5W8DMi{m{_fL3`APtozYAtJ$nu zHPE(dv4H8&o{i?p{sW&yM~ZGpwJLB(vL+hj=#CE0K{QTPywQ-eCNrv{hL)Ow#z#e( zBE6x9c3kd4oIJcF^_uRgXq`vBB8jWWf(G;B)+?3_lc49%nQK| z{6^(v?MJinHJb{V>7qCxne%D2xSm&kocj^6zc1~Qq@Y=^Na%8$K3?W;|J6}XH@435 zRaJy~9wdn*pNN-5sBWrGjdaqzNtjLT8+hQX{qxK1OU+oKvwn*;X?iW{eWG%0lEJL6mbg9yG$JZ#7a;U;h%E?C2 z(9ktYs1>f`dhGygl&YN*fP6LNpg9Ay-Qs5aBU?bgTUQT{DyC-e=U9RaR(c}JTe)UN zMh;f{R&XR59JkmZu+yqdMx1PIm+a{qxVf2_w!teG&8{#mf9pge>uqs;Y6kzB4fO}$6EpvL0@4WJUAQ8s#edOXjkOK1h=A_zmkKWPEt+`XGfxxIqRq39;> z5-FNo9h-69W)CA1*h?H-y&ruI1DFBRYC*-XzDO8N(!Iy@=AwVKI@A-QC8`!HG0?JF zX@LK6g1cU65R^A%kEZhV7cb5G<=KpQ5u6gaPD->X#Bi{Fa9WUD8o97``r!r(EYr1x zV>cgCkx+G01`OAH&-g+@r%Qfp`V;~zLDOw2`i9{JZlT#iriB`bUny%CC8O z9&Tltn`HVX;sVZ$IqDWH^0jcvwbu zH?vo#q-|RvUX6vkTr%c2jE8f>sYJH>WG)cfq!^{?bR~m>%dQ!8oEuC(?ih5~f@hKG4D#nA!cFvlLii(1Qf~qBIMuY&T zd7sD5$|{?uK%dYb9sRdSsbp&Qa7k!n^?A6f50aqn*4Q;PHh$b8E6faFT^sANZ|?aH z8{YhuzX!m{@X0KGM)}`<1ooYsyG>Vs*-2nbr=o?2CSq zGhl}suxIp5mNx#VKC8P}@LC?W`v|J&E3l0umI~AAk9A3lcfk(}8OZsv<}HBe6C%4) zgh`JYijq1Q7nno!kt9}3{+Wf}XRf=;*4?KtGO{PmVgA1-%9h@%yt|#%{0A+IW0?Os zIF6@NkKZ5B-N(tKPHv0rU^+KT?#?5-Y%R$8#ttZ&6Ry)8O2i(1(|-QXqP#l&yC?yC z#})vC*?5hBg!!V?4LsW$XMNyzCLl;iO}!29her%DGE#P_zD2gHC2g>&ap*>1$f0AP zpt$Xc;B!kT3HoBDQSLJs)nb+k?nVm_1=)a{0-aWOY&<-N6hv?a070agnVB%pF4IoB}dU~gZVN8GR`uTg7mxAn{D^YTKy>yt-q z(lo`c=8xcn$;ilFy(*q8|3rJVo`xlSf0?_xy9>%Q`+?5_fo0nKfU3iyy?^A}(IH|n zsiX|BoW>`*Jeip!;6SIPS*U3XB*Mc>YH0WkC185Yf)k!>Tld%Ds4ofDHvbTo}gWn$HAhqx(yYQ3QrLPl~P6mwzD`K zzX*8xc2x69hBXA!7`3yT@k=UDjPO+I-hgQ7SmspAIQD8V+!>2TVH{p|yW0ho#2=;nbCIf6MRH9~tYKJof6LPt8$!2L3^O^CokyfSziN)h zyHaa%uXEA>SNd)=PqL%#afKw^+G4NeSNdT8b)* z)o;+rPc65IxL>c%&ZNp`544IRf33;&0p$mRm>nD#!G> zEQ$1Vd`U&sx^i;7nem4*$qbWbY$VxT2FI|(-VfMroYgFcdQ2Y_wRIH}tMLAd^Nv?k zbg(7M$lDNj^F3iX|7YUu>24$Fh|YGVc06#AIN3%F@(^-?cg~C&Kp!X^SqE4cOff%> ztJrJ*!iSz&ude3;VxJ*n#{86$)-i#S%q~ zF>$CgdF6+Dvie$yTI!Qyh3T<$k#rpUd_n(Dyt#_xemIfsMH$TBpPiBa*wZsLDZDwd z8ro~!9`{d{`sdO9iCr>5`CIw?v;8trMhu)lL>)7|0=*QoaaeOweOy?Y3XGna`J?)} zo8aO`xX^*;7B%jYxA>DFsjojbXyQ!-)FN~AT1uN*!k{l7gv-t>Wu6iTkPMl*k%4Vq zkBvlq_VsI~XqL)kERI&yXQxl-VP#4QE!DTfogOHj9O2b}$L{@W^B0jz!~Tt!3*t4H zKMVMf61tI-krnp@(k~nw8XNgCW^9t5@?l+qr1$)+^L)%|#~v$LDgXtdw#y9|rcn-5 z&#+Q5GOHd2?a@4=#3;0`Zl;;!@f?XxR(KfHlo@{DsrK-x>?5GIWapBvhM$=Y%rx9) zo=?jL3BJV+Ddf?YUbJ+K=Gr>bpI9A-i5W(r!)H^d!9P z(_m?!RW(g-N#CcEF^KH=?;HD^X(u{jtn@iggr{jvYFm?kyb$q)e--&4>Hj>>KaaN8 zKRem-G=M>IV+$J;J%D)ACQ_}aKl6pJOR?a+n?E#T85y?v9lXOBf4}L zO0DI5@rkMrD4qcZKG&4Ml<@wq7KuGY*WHW`a@?OohQN*9>GW5$q*9zAbeB6gILIf& z{IBoFJfL@F^by?aXqwzkLk^W)k&`P9U5E)k+&!#Msq%5(3i1<*>ONBr0tV|RQ0n^F zqfa{J27~K-JdX)49oXdkmHGfi10Uh!@e=>v77fx*ZVw3^WjY-{zWU zgZ}khdAsk;h{<6a;pv0Xy7+<5gS*T2g*b_Vjb6hh;&Im}JE=yyIODs8fV$3lQO51M z_w3>VE3A81W_a?Qh={Ki%f;DQ?atQ9%1J+Cmu7t=cZzg*3wx^GzLzIR?9T;Mu7-xj zbw6V+&_W!UhAzYTYVCufAIxA_TU(oNNx{a!>0UV^A|iVKJ~V5e{-20xawX(Y3hnt; zLw4FvYN8k)IW`9d2A*Q`(u}o!efmjcbA5{%lOHL7;$!DWx+&A~CvLoxU!TTO2)5jc zQG}>5a1x-px7M+7O9A^LdglhpT&t%TW{3#cqy?vYt4d6qdXOZJR))AA+~f?x$37p* z5!-aCf|65gh%N2IL#A0*8m&uEZBfJC-PCoczZKWx9t-lakyfORco^}YKF`a@PW^T+ z+-lrG1nqq>uTf?;i%y-cRN)>Ae(TS6|LTo+da?wpn?t^XzDY+iz2MXWN0!_BL3Syq zdr!E^ReWWRQl0!bytnuUb_r}*u8( zH^$m9Rx*Jv<0GG#ml?(uHfy_p<6!a>Sap9TVb_^qtv`SEfX>@$wyw0gI*#*qvFZqD z5ghhFH-t{W@w2b5&|+#B85ys{OX%(tD>Ubq!kEp1^dn#6A$_RBlFNc)?aYn@tc%Vn zHTb9G0oyO`6>opfwcZg1iKBF5mWmItg{v_bsf%~u!C(veOsHZpa1q};9}`wH>EuOb;C=8IvYSzpfr>CcF?2FYm;c14Yc|&w=Pl%G0yORbYmIiJo4_?f7)EbT%|}Up1L6We`x; zgdCQG^)1(6j zo9X+1dHOB!@--s_y@d}FXRKlm$8D8kvL<@|CRWM)eQXtnE?N9FBIh|e+LUQOwz^sP zXFI10B-D_f=KbsnHWr*l3W#oU?+kMfO^xibn@ZyKwwKUV{NNKCAAab)ymwr=u+EDU zxh1R@XNzoECeZ(n762f<8+HgQ_&%XWPZyQDd3r2_?+<*O_V3y!))oG)b$|sM+{&*! zJCSt_U%a8qMZ*Y?W2&u4Z02U&J|nP5HpM>2bk~vbhQLSf?X$I;}v1UbP0LpwSiQUfqD%SZ@>Wq(0X(3EK+YZ zSD?9oT|OcUFpm(=eI7;)N+Jx=Gcl$_Q;t*u$G7K(kunsOZ%Y{@8{Hy`apdF64-e6z ze-Md@7WRE{akM8#s`|<%OnH{r{SBn$=w$}M%Khim$uRJrA=qR=pG49#yl)oK#1Q;h z%A9B)zQ~CII(7w*=zVNUO?=u_sC1y7R2YgGNxPk)qRqpX)ik4yaqCY{aeZA6r4YD$ zPz`R)dj2d*Og6y*kmc`7J!%RTMq0rykK-{o`TqZZ(ZYud6Eu(B#i)HtPDwwdiaR3L zMWB@QV~vM=`#u)6(H7x7bUTI~9{vP?@2q$rP;NVJ{sY0(Hw3E`3)-*#s5GFBjkB5E z6LS4QR;W}5gttJ$_Q)5QU+j5b9JF$O-Vwq0K2zInw+EUfFrDG3dc+v$GgLUULeCg5 zL`Ooa*z=-vqu)`DZ?WY9(Q+nN%sV=akkHWMZ4ZhOn#tIV7zM59-YQ%ckyxq$HmKtf z3dGlni`0-+fi5!20d-cDeAa{1&~1D`fxm~AWC;gRf4*`r6=#SW!yfsrMzlI?TwTc~ ztH=B{Cc}=Fj^o?V81346ZPT>{4ud8()(Xzb1jy$4j}GO__^s?s;Q8~nT~SkTeq`_z z$OG)q((<1-C;{QqB~wKM@ze>9A&E-WE3+q%v zQ`1ilQV5_V+|10xP`->;xm40{Utc{;=FV4d`>@L}KrREw{KUkr_N_CiyFVw(gOw*6 z_m0ZZ*^ZHJuv(4jOfbnrK~i2`QvNvsf)i-plER_)#ipNEV4 zPg`Olbu-B)ZS<(Pes}G5J+u0E4GCmBbes=kZP{M%qlYU_zSKzBYVR=&ZQrJc1(6PI zz+tQz_0J79H>UJCH$I1ld(;*H|81;1X0ChQ8B6R4zsG+4C+_W1J_+Yf$52&WVov?< zhbpBk0H(&P6>@cVcQ4oRYCO;XutQ8t?DJqXlrPNX@I0;$9s-O+lhcmAi-QsqE&x7) zs3f6xGBSVsSX();A&q)#PK(J6+_29%bkIlj^Qa-s$@0Y?XDRGP>{E0M49l^!fJcP; z^5qK#kRiEGnsIJFf>c$}V`N|xi7Veok;s*%0z|Xbn4Sl}ee&5&BciDdb}~r$uE@@` zMvVb0n2M>(IG;vykOrzqmTu%tdCs!0CvWHO#hb<+<}l&r&YOz+ zlc=dsVS+IL@Oo_952f~QQQd|#0a4M?op_RNp7Ieg0R>}3&;IX)P6#DF@#~QAEP3b+ z(kbewqG`R(W^}QA2W7t#9Tkvm|EMgP{ThZN^_3+Pj>TGN#$MS>Z{Poo|KMndUW%w# zYVA{|dZgguq^#V*)+)*`FxaPj#o%rVXz6HM&z)8_^C>!dT%VyLtW8%rD?D6!mLvGb zkH2F-;UR!(a2pR=KpiWix#AH-JQWYi-Rrsw+OT%X=r)vnMv5>Ww)c-9fL0zO4+3?I~C7)}P zEtFCpLHIqMJI5~qIV~nG%y%@T^TSsyA}BO@nr~*D){o328ZDfg?kLD0k>^y9Qg|*5 zd5nI4XS%xieIB33`P{e9!V|VhfS_^P%6koHc}BMx#4)2P4>K&lHUjc6o!>>q*jRkA z&8vZl%8$&??@=QfngTNPH9vo9diq~|uM#!7jc&-`%MoS_&3kD zp{`b=|Qgl?U*-~Br%ynQ@h9z>i zEKlrej$EMijxLmCa6nI8tKi9hdVauM@{{Dfg^%iuvRu$9Wooitujn&`2T9~qn218U z1&mW_&42rfAO4if;qKaYubsQ?Of`IWh^LybC1IPh^#G^GJ2^hyS=%I1RhG?HfH#a&(Go2?MBoaYH|d zdwu>hs;G<(;DR=y8}U8*985v3+N1SfZfLg!$emGV)2I zdgFAVR%PgIx+SfNi|k@Ybnx$E``W?RGACD|gGxq{&&w|VLwA6Um#G=fyLR39GoLkp z)9bZ*d^w}46mf=OWLe{u%PVW$jctW@#Oa=X6t{#DIID(VwS;x`kVKhcgQ?NXmGxTF z;i`&)9G_OI!9xN%t);J)S66?mDX1~w0%F2Xt=)PB6a%y8qgypVFJ01LQ?Ao$IY$33 z7AP-g%4FZY3kI4(3g9F7ORo8e=O(^4(s~&V!XGBiQ~tFXlqgZV78;!R7NM; zC6v!I_D(5Po7V4hbYLrWsYCg*A*x^?h%Q;qlW*)sAu`31trf($t?)K9|P>ZlcQtFZwWf=?(g4~ z!cVSh_7ns4ydS)n|LRG|+1NVtD=pR9WAxOarKj@ALo{JS8{L1~(3ko=^}m8dV>G!p zg8tb7Kf7K;1jeuK2#_#iqNwB6@DV4y(^Jl8YAj^RHfxik(pUd!Ho%;S$j647mKys` z{_8uYSDQ|A@1vcA-Zj~U^yZ4`SITHwd)s>c-(>{WgcL4HT$&S1B&Hwl9bG7FEJ<_U z$5A|(3T=2_DD?Cze@K#2-jm5zBr5o$cK2ah*e(b8-p74| z+c&}8fHKa|jvM8&y7td^1K<(rUrkDd-U1UQj{Vj(y?mnhmF8EckVotQr^7FfHp|c<(^$2mr zmn;eIk^L%AWHN8LKAgabWXnZU^{vP=s@yVQAW74#0O^3G$8h=;@>Fm{#L>mY$l&*5 zrvKhr|NiY%SC50>S8TaT_$yRRt!PE?A&nDFC=PNA1;)9@9Y7?+@Rmgt%dP*tloTM% zO7%VGn>blmhMixhNCPePYYdx~mv(avmB!WTbl6o){0{4Q?yUXj3^*KquS-~x!Vf7M!;?9+F#QAvir z%>n#m-_Vd|m0^e+-8BedlZ@p^2_MTJl4DQ?-VRcBL)(EwX59OVkDyek6bDX&|6Ydw z`fc1+ptW0QeK_Op_sv2>3{X@B&h+<04-f;y07R2qdZrdr+3~N{X_NYq2?)%Q@{I#^ zD!?bVcXz)F8sV?6_Kg8fNzv4F)8pX7`SCIM095z__?F>cCl9RywUt7l5?lv>vfsRU zlg4F*N%Fi-zxx=>`kv}91V9vXj#(-hQtqfJ9^O+i_tvsZnzO-NFv6g6{DLXd>e(UZ zSGrI=wZ!h#AKMu4A*}z`u>O6I*(UEYV2WCe_D*B@!hz_d=T!cGJ+lkpB85tJSI_1Y zBgDP7e&I9=0l74=qp901B4hPPQYp+LB}rvZn2%)MZ6xU?nsKZ_wm_Kz8u~i(3Hu+> zoj~4r2PBZE?sqo_KGB((*7HX|0(ZZei_Y(CsT&3h#Bg_Zb9HUMzy99p;X*|tB)Y9u zzVMiWGL=c~aEOwak*(q=nw%0i31VYol|Ix9c_9F2Uy0h0gSU4ZCq4;@pzC399BtIy z-Nk4s=}WFUF__Fe(D1~jrYe{P;SOoKY|S_Tg%dBYx^r5(_Iyv9kl9pODLsAtE*J9W zoQlIApho5-cm{di9!+g+6%ulnCBDz2l!y>M-Po_GQEJvk@wh2mG$TWs zn25+~rLpm;{~w*n;IuReJv||%pSd1cn>0h__t&y%Tp(`4?WCExZfNHuC9h6??uWjqwOMR58o&ekO$7yo?_v~`X{UQPzt)F# zevKWdaKZ_-)qbn*C#Tc4};_cYeNWV!~=?^4WW%5GRYMeXmrG2+aoDNUQ#^AlOAi zrHyt|vhCrB_5`|&Ja&}JgC9rQhdFvR%C$A~xIU$m>3`J^|JkHbduB?o%e#x(_J=ku zE-o6H{H>J;+q3Q384zC&vKV6rG9bXNu4MTP3%i!=czfS(ZJGJpyEQCF0_V%8Pp?(W zv{o|r=Ne}xCeFYG1^NUW{w(1v+k4MPP>FW6^~0yfTG~%F7rk$^RaDl2T-W?)9AF#M z9iLdat%+3PGM%?j$jSe}-CrE+3=pjekjx8|3o?wE1&h@R zrsC0p;u$HLIAr*5=KCx5F4B~gX;n;wxVXf)xI<5D=2|B6q-6gp)_|fYtkwarw^Q~b=bO&fPo9Wov+?i*%qr>V7!Um-Lptsro_7=AYjfgHd;(pb zELoSG-u1d+ry#%HetoOe5> zt6`Ru;5B20jDPeb+Y=$fK60&5DW2FlW7g=|IbFkX2ubCR+BkA$P%h+*O-Oh>27G6H z%5gF;!T(Tb(Xo#{ZrIhVjfr|zo#m0}28*C2zbVIdcNkuccXmc`adV#`5&J3*i;k9- z+A2gwT(u6!o{BUL4X8g3l6Z)l`c<~@*e_eJU)kMgHuwAKzDyaSmQYgtK-ti z69oT-Mb_wI$Z_?sEmfMGy@-CGN>VZe!odHD53&DJ1mG5#&(<%}-UttiAJMA7GV8YX z-fuo~+WYP%&HpFmFQ!t;WOdA;@A<1m@K(C>Bk$$tGG=N)*h)&XGIw}w${s!Y~ zQWAQ-B!vS6+1Lp0kTo{)POhN}T^Afbed>=GRe+x^cr%uoZl4$5A3IU(<90T2L@5zD zU28Fr!7tg?1~*5OI|@OSm3D4`X}iC=YOJfDI620qm6;nLLw#yVwAi%wIl#eXe?dxR zbEdSuI_?gK1vA7fRaZelsj}%YbZ9y=(fxr6QUK0yI4-u$cX?$32w*f80wpXLJ|X9U0{dQh%b`L(9zM^i}t)tmq$zix1p z4JED=exM$H7;xy}pE4Mkm9c2%(z7xQk0`IMuNkS9xat+_wv%UP|Cuy+4*$|>=FTUn z&RRPwCT4wkd9u*~eTT8`y55MQl7pdWD+EhIqt5c#_tx~_Trjlf}c;6dMUXDt5J_9yb zYpa)zk5}xTsX@=251-FH_awDw!`q;pDOS~+{nv(uigv-9=}2PPoMo=W4~G?)G5&$bg}lM>m1ekCnpw6Y2y&9|>Ei2)hJBA*?f z4o{X6GHADV4GkH9|JaHW9LA4svs(Glql%U9xo=Q5<~ngF@OrA>cFtvGGW|) zn`z{x7glZ;JI?`!WOyCt`4h8gglZjM6D&auBne*Vvf3 zah0U&9jBKJ2&2ngAfc@WdiG+K(hna#2s&-QPZup7D|$8{PU>s^@ykJmi?>5*o)9~` zJ;gW5F3KEWNSJ#vnMqRJ_jO{MfWX{yl7rx`tBdmPw#*T@3s%lvyl_iNnbywOtF2Xj z@nX8W8>SGe_$-OPgp+fk@K02lrLW)r+z0bQ|3o|yW02s+=(2IPe+0MJ8Y0>*Ct_+> z7saE;Lr?@998Da3K}pGPk2~e!Nd$z{775n~l?VcCZ0U0nn}YI_6rZ!#^n!NF?t=dK zqT^TNZEYk@RP5|Df`Y|G+oGD9VSM_P0UN8*A6cdhOf5@l)tG?3u#jm$*Q?fHq2+UB zC9=SXm{_l}N@jU+F#<5(<R+HXd#_>T`2fm=k|~`gE@d z6Q^ker%5VC&eRqd)%n56os*sY8e}W}&5{AiJzytsbk=$Q{yj0#Zqi#`KAK5W{1gM3 z55%%a$Y^yf*W0WR5XfQtjYLyEkWj@=nKIS!I>Q6#+`b@6v+Ge65N{UN-?)2B5b|Z* zA3WSY5T2+jsj7~TYe`GK0OysWqQg-+p*RDMAdiQ)qx3Bz={+)({~;wNmVLpb3q+~q zN}xy94lw%pF$u{-)x4JpstfSGE{k_oK0XI$+!qzo2q3F+Dwe9R>UP27p^NPcooXTh zs`rS%iI#`v&aieC*s%xC;$mYb9FQRM#h|MbJh#+FU|)FjGfg0Hr(s~@kkIvXGyz2B zOrMA;DeX2nvDVhrUJ~9tL-5zoG@2-?4b4IF8?Yudo@S(`i;Y#tG0?xcE&=Q?h<1JW zUR5H)?R9Ma4 zY|6AImP)94-3|KPvQ@5P5oIzP7&xQ*aINcUzG}*;0ex)A9HtA{xY|kQNXVh9VuF2* zlzmSG3na03IG#ujrfcH1S%^+g=d#*<%-=SbKiLx;MY^Glj{q5}%VVoY+!s8HT3(4m zRYiQijD<;`x3`yM?JDp;z3WfnPk$q9o0viR7ipH)(o$Qs7%i!Kl>jBBL^*dl?~2#f zLr1yK-fTt3mZK~86A1FnZqq5g@QO6jU%|AhgFEOfR5Te%b;`Rz7_bkB1`}ViTBppK z$B#$F7lq#9;B0_4so%iRXe|$BGBK{?#&R7MCUxAVCj9axFBezm*qiTr&aAp^p&M?2 zdOZla|CO%4NZF!1oix(Q z%1p`T<_eJw)u4Vhs7y$kB!}l$Y=<@JHHiA0eIA>*b%D-Oy~5ozDXf4}bLJUxyz}E5e2pu#GN; z_rh?6W`4>MlHfjnfdlf}9$sCK9|^R3Ud2I6A@tH|T(dXC+j||K<}HJCGG-VTsX8PMwKC5aD<6PSj=NB^N3z-HT-kNl9t!>Ut9q;new>JVt(0qg2PL z{<;1OBIPO9rA>O)t<>s#B7``z!xJ6W@(TrFYc~)RNoSN(WTH&S<74_5umzp{s z6%EZb3H4udfd8{*+m!Kv-Y|PMHcj>L&@b;~gLS6arB{ORf#~^jtLn3$APKi}N+iD# z6@V~20lo!4u+1|Vc|CS7^=g|tL8R+Q-p2cLui7`I>7;~7n`7%_9gA5jm&3!(cH>6- zMVmkHg&%xpJr&TJy-a_&j)=&Zr__#f5kPl8;K$?U?oS z^o&oGIZ>BaFu`fo^``Ffl4@k>tEA%WEUP+`-u!%qmltK>qxxB|)nFUL?<1SEk`!89 zAlbMa!ob4Wc`<74bbk+r7BsK;t82}XSkV0^?Aniv=V3+o{s}~a~4()D?8DS*r3HV_mq0hmUJNY()6)i}4hTDK2J>TxbE|CIg940cJ`{>LmeEQobEuL zCZR*zW8H(jgB`D>PgfvemJ~c?CtJ9Qys4?0kx}E9xe#Jg> zRx^c%-ip6<|Mt{9cd?da%8-4)VDG0TTGKt;Vg|U3x3<)M9xl|mwVpw3_wKTC(Rt+~ z*Q;?O459Y7m#=Fdq#PYBm6TAS617V4V!#~hrk^?0dU;L8#~)>6SiOFYJK}xn?&WH@ znv6cWFgm%24jnFsm8T4Kayuw7SlEn^K3uf>Gm*cnL^h{Jg^lS|1|YzPbD(NeEIk*K zS4#v~v2K;2o9)kp!RS;Cz&?8KHzr9OsFz0kIUrp+AZ6owoi}0b;oc+=6Re3zK#&RU zTeo9JPW^5+OWWw~jj=vsLL%ZKTb^C(&SwxYanhW1eX71ZvL6Ns$nhQZ1Te5$S1Y z5*#QQ-6$7l9-UGyxsgD)ELwav3*TaT35wG|hC*vT?)C+j$?z?3&3Z&x{yx;%S?hTQ z$;rznrl+qv@*-ZluPn#uT=$JIcaq0a0lix8*HsQ^6;C=-*k%-P2*6*tmm>WP85so) z4bIn2vatSo90=PA6TkoX@gqOpy=S5m*x_84u|cU>U2%v6VLU<~*2cg}Te9Z`7B#9+ zYbW8t!WY`w#5d<&^aD>JR}&SWL`-YH3IYorCX=$})eXX3n{uEIFf_y6#N_7s?7&r= z#KY3a+`I=2hPT%X=DF72B zvpkR04`Td6#-7s1oXjc5SLz0Uu?UTMD=jx0KdtNQYq&rodCDy&F6I%%!OhLZ&CTL! z`m*;(v(A%hpvrw)fN}Gz3B)w*XYLP2)13KRD|@x8&xm@862p*br|rwZ6!hWbmms%-)#q44w)D%#Q1{&IZ0E83b{!$~K|-6`(2Xmp zBn<(J8Oz7cH*zW}3%k?kFCuzAb$&WKXx~dgUT8X70ao9&wGV*l7^=)glp4-Bvlfj> zQ|&lOB~RNs{ByV67#be_URqjZAQ~Gl>!`%6R%hZ82=2sU-yRT&I4YI6Gbp{`(tPt~ zFIjf)d~dOxUr_K(?kMKBfPereN3CP^KXI~LuC#=)m~kg4`PdoEmZl{asFA~`N-DY^ zlPi6QNSvJ7J}d9v^IDpjfeg=+&7}tJfYq_U^FmP}_&=a3%AA-#BVlpJ3oBD_GpK`!_*$axgD50k1K>l<-BN|{jK0b@3 z9_Wo4IS)~UPxXhsOwBxlEGApPd$HIv0TJY&1&5ZVYgxf&DrSYHriOtj5-;#K$F@#^ zm+k@_!aGy#D3EdW8feORR253DFgX1_U(9b7y-dH$cb1N1j2Qo-Jd3^ zaUMc3uNrIDRVU~QkXt_&E?6g=2gw#G1T#1&0WpYyEOEGRB!VP;Gf8miy+*AULF zpDJ2#;v<%bB08Lw1g(OL2eH(_1ce8Wrm9dmgxzB6c&>a3_f>x#ffoih((f&?CJsnb3ig(W^6vSmx zBf`W~(Q+)R>c7~&C2#&vYWy&%`LHV3W<4(}P!CixY%cqc4)Q>nqqoD!yDq;Iy#9&) zhpBHBgG*}Er#54!TMpxHbBG%(9GiD&By;>;*XeV>p0kA8O=!LEj6!O2-{IggKSSza z?LZ`p^!MnlF{_3^vM2&1A1`!k+N$vijDtvuBo_Sgr`B5j&~aaGkcU#ylckBZCmx$*CIotxWzAjr^U11vl^-yyEco5hFTS0e(j zI{ZUWnPeg$;z|YgVJj(WuJysa73&TN3`Bo6Ewpgj38rSvhvLXS?7KWn(Vjhm+#0ba z60sKi^YX+%=j^fHq}3&)Nlirs&P{mVvN9Q2*R@38h<7_41T&Ewh;$X~jYl$BtEwGH z-3+^DYK0dX>{@B>4(FnD(CPv%Es-EFkHh2gk3>svb90l>??Z_!PT;sT;2?NXKl|z( zJ!hJKrt9+7+0Nqr{{FGf14~wyCJruc{|SMZ{G4_6rlp?K2W1P3I1?~>#y~-#AGFKF z*oO3cnra&E=NdQ2&%(fcc;TH;B%S{y7-^A6#MHEatYN&=6ZfbE0Ox1D*+pe#hb&1s zPdQScr6KMII0!#b^25;OMEU)hhLhHKgS48Op@V~$iV9cnQMZ^0^ks9mZ)?n$)yJ~- zBI>t3@)-*jJBJ}7gV0(vH*8>w7Up5+&Tm$ILwT3ZEEwpu%ujXIpnpGBeAN zuN1XdU@jhHq@|@p1QGddZR-FYeS!s}`=xA0(cGoSg{W(x`M<~C@IP}Ry&Qn&=Dkn> zNS?yM#01&XSTs%WQ(%iqsNzK%sh56PVy2-P)<*{0LRlF{C=65y6NF3yz*G~})XWE7 zEo^S?kjH)aB5oFHp5NctEOoPLi>vPfo9&zDt#q&o76j#_K~zCa9mhZS($cXwIlKY$KTo0`-eM_llm9F(Zhai+xh^jH&Q=d=mN=F z@V@m6*TR#T`~E@ak2}77j&g0n2f!l0+o&NBHYjk|ar+@nXmgvu&HR<|;1l0(SP}xw z?w5b^Alt(wA@xM(gL}*ADq7O?=B1s-9xbGiE0-m^M4V0XDk`hUFHg_UE?X=;YwEb3 zp`s-}`mh~;UJBw3G;22HBUf<5cs*SoLa>7VrX|L&)PVfLzflGcw@JbU!nOCEaQoW| zbndO4BO{Ajj_w4V1(sc0SrRE1OZvH^Y8o1=caJs?4(3~~%4G%5ZmUPyPWPMJkA_9& z)hbs0eeNK4&l9=rEZm=95_ zvATN5#@X&lj6^2LQg2p~B}I3L{;Z&(qJj$X@?JUL*lKG#1yfV;(RiQsi{~yfmbXk> z)Oy!cnw{@HfozY*pF=?Xu)k{=78&y4!%#sP$<=M&V1IVJMrmvAg#&Z$7zs$KyQ_yu zXS}@mbOnNB|v_J?Kvb(?mx(m04f0b{yqJTmpg9{Ht zwEUj9oLpRfgH~6i0m|_lq6~0sL`$E4jTF zy%Y_4rE9m?l$5cBg(i=S4Ny-4Oy{ns)-q+T-Dv-8z#fW@i2)EXSOl$8qdU)7k_P@b zuCC!gB34$^e{F0@WCe`a(&?$0iO5hl_2RPGUkl!UFZGsxhM!ui+S^}$msDI?!9*rc z(n#a-IgTOYkUGwxs40b}eTjE(X>vDTb(&H0WKR9!sgBlC?8n_HDw)z!z~ zOcM~m*G{fo4E5Lp%$1-hqeV}CY^8SFdmWwaX8hpLkdW79@ShdLuaVUEFIIuz2mxlI z?rr);!PQm4#^$sy;xw^X0hkioTbA6PO-2J~`c#_2Gq1Apb(1iDDc|_fRFKN1CP;NV zrk79t5c_^;IFsLEX506bnA2~JXwN2OKe)nK@`aTg$qg;gJly}!Tn zYOR z$2qZE+ggiEEXt0{pOYLL8ylg)QXj8YvzP2WK7LdK-5*_etB0@8-=EblY<%wKOq9!} zpRso5n%DN3?_S1ueP!KkCM6*`-K*sQ4q#`OzijRN2D0Bj=W=>yp(PzgZ`vI|FC9xE z?E8@6ku2f1vvI7>7+cOpM?-7Es^xK`5(p3B5~c9p(2q|}PLGclX{zafh8?d_GsEwzI*%Ml={_@N(i+}t&w zG&knGf%BVQu&WNL)IN5V^k(b*s*$gI{r>9ux=QafU^M4ur(IU}3m-TNzch2F_2C(F zr!L!fKSHkyZ>?yinWfT0_}4*<&iCJ7j1 z0eG~ipy2S)y3yk@?#tVk4RyT7!jF*#cP0)FqhoQyzryxQM7Is&Do>u|tW z+jpT3WlCJt6$cx;uF>F`m?#S^?d`_*{M1x|ye*%@_Fp`hm!J_S;oGycvsya-a{*vg zh>2Z*#{wLP0pG!?aDq`pCgP=H7nO&O6Z>%^eqef$Z}In_EGnlba=V$?U#JW4MtAoJ z`d-IwA^&hZv1`}-%i!A@R^P9yu|p|hsaaX)0JH2o9jPMX(7}eXy)VL9<^NHOfHdJd z><*nAuqam~adtkL#+r`8pe|@_JyrI-X%_^e`=eO`o*P@Uvp1gC0Q*&>NSRrgxk>4K zsOmO+SMR(Jsw+^SZ%%6U;hS#n);_G_JOX!4gwoP&lLJmh3kjtW#O!WBVgZ>eIu_Q4 zzo|s1)Zn$6ykgWgNXY=Q zOc!i2lB0t`7OxPvLvdreJbc{#Y-7KC<78(?2nj#-C^Hv=`ryRp2t-M0AqPHz_AZP@ zE#H2SmoQiZp=Hb25O(8yDLbOD%a9j<-{1 zebH;pMS#^H?-xzRp#;_;P!q|^5EqLckBl_zFN$d-;tDihV^He1{9cs?XTZN|8pwnZ zP%c4%3Uz@-jU;5bb~BRl@ye~lJyRDasekBEpGaG#Dc0O1($CV1uSya1jV zhu*W)YEh>>mDjJ`B_+RjHMZYRfUV8e0_AjeUIJibNI)&(_uwi*`0={6_3O&4!`(x2 z;;qGYi`HVlZm_d{@B{|`1=#B9?wq>_gw;=mjRc7mX@BD7CB`$ z0Bs@1)@AE;GmYnKJ_Y<%oBefl zY>=0~KCP~*;ay!=xT>p1(cth)*g`3LdI13n#Xi8o#{N=TdUmIM>0NL0ORKd`x1Am^ zzj!;FL|vzCA)5mF2oNAIv+k#6G)qtayew^Q&INlXQCaMb^18vpP3Yj@=dBVz`axKu z_@G}5!R@c@xY0K7ZNJ^vHhKBT6nGCJqFe<5(GO5Ja8tjtFw;o}!vecC16glQB|RR= z%1YyZ{5UOEqM*EIGOwj)XYc5I{DEP9d!hU>!V~DHevVoSzja+W#a^!4u2L@=ks(QO zzx(#2adBVA<^B6Xb!m{WI?Fe9xhlQuO>um^X#gY^og*ZqWMrU~#lqxt68>efZ*N;7 zAh0tCpxKvpH#YL}iC&k#{g=_un6rMcSd3=v?d&)w8{*WV>E2iV+j`C3`EH6SHt~hVb^rKtep%|7Vybgn(nL|^N zLWz0{kFVZoir87DGPSFAUT@9bUDks}75%qw)ih(Gst=X1V61QK9_4@jpSd3hdYv;~ zOMW8#h+t`GXz%B)k|5Lpbkb}m?9=(4P6+$tnP{{ikRAA3AL=#a|r5<*n3l=sFv~O33C`^ zkMs&1qJj&9Ehou1{_+j8@pCra&}t9CO%4d5Zkt6#A%O0PjZJkRPHsa(e&3ia2jjda z-trmTY6K#-E;vd{aHLC=G|hmo%>XSa;FS!yO=ja;TCaF%$lRBP_;9>be^^$ zDoIXMH23A-;7Y-~D}*CN{xVz$3l2erv5+0zog@Q-eyfyV5VuO`C4~`~O1y%?@gQ7( z8Q3f6TK~p&)6W?aRuNGZ{$=Hy&dNuYuuZ~* z)+s)b8N=~z$VETJf(=HyS9ZwS|5f(Nb~E)GN9n?+CrL7uTP6^sFO)UD^(X0g6zX$< z^%4sNs;haf6}?hn!lL@btrS5W^ikDsHT_CKgTT760exh()mdeWBA`zVN z`PhHjy=81Ald-KR$NUijdljYUcyOr5sSx6mR3uJE80r>N5a2jpBcDNmNvaUCzeeX5 zGN|G4#O@^$ipmS~)wVmVeAxD7&V?(LBz}0pt5+iN>GaNN)Tof!Ukei(fuMm$KkDf*Yf))Hm zbPi?D=wQf#P=XjE;E0oRt!-)i{9>5Ay5gpZO zR0S2nH&a?OaT(3Xg7`UzG@YT{CPv?|UmuWjx?e@WF~`K8p2fi_2>lWA+t=ulC1LE7 z7aR8ur!}PGjq{`Q=ZvF)B{A2lePu4ltWkVpLQ1GU27eyfnl$W!z;grL!NTFcXETLI zCFPm);}`i`>oN%`h!=3WQX-FNL$tZ8m<70vVqxdpCMXHt#>2@-iUi9)K8nx=jWtHV zqrN=VktR%ejY3>}wff(NT$aV*&<3Le#Y}SD->k5r&w(&=R>$-2PXTk6uZtolhlNz~ zgB3cbsMKJNwY~ZI=_DT^!wK*Ck$!B-ANNsQLLke^75x+ar-x+Ws^Jn zF(^<96#zkwE-!zzdG^--jY392shG+7`V|Z#4^~!QkY*x-1AJ@55z{@~eimz;AP~aJ zM`mN?gq|W#Ej)dSETL@(hl+$SM645nTUJaLPmgJa$%^@WEI;a9)EGE3yg@2g$SV>?BJE!U)i;nTgEt%TJ!1s17==iQn2{O#+=RqafE)PfTC zBxCrHA0#26Q$`D8I>H?1d?hKviI9XRf`Q!A;)j}q%|Zo1U0)@<2zS&V)F;fJ2%f8z zJ^Upg*iqRU){yH6VC>=vLdmlrIZv0vl0-lo$1^sS<%Da0Rty<3%Oqhl*JMtJrphI$ z!S^Qdvx{wT(qqf*6YQltS_vt1`-^ven5KfEbRj_)2s+PXHb{7+UD5Hsb9!^vMbv2} zlb^KTD@hJwVEi8Cq81LfkR==1A`xU_j!t;98=^~sTy<-F&=ENxus{VPg`f;GnIhzV zC*1F~T&%O~lSaY3vQy9HdM`)Q<7sibYng>f`&85EvYuGh%Mel_>2iPXvKW+LkUL&>DnQJu-Wf5Qf|y^c?4W!0HF7L0d6^esTBdp7Qta0Mvu`LvS`YG=4H>+XBpr z#KkO;nTeG(uei9p^H*6+g^x3Nq3h{ioUD&0^I$^Z>|*hedFZ7~Q7x;G!-@oiieAI| z_M*VzZfhK2Acp*G2@938y23%yAZ8M{;FzwoUJez;3TJ)(OooqdQ-8rvb}{er*CJ~4 zLI-f@P}f2|2S1s6wiHm#px_*|hx7a^6qcWjvxOZvTumEeKoDPn&+8$6-T_3CU5P#7|%L zL22SCatPYm95L2Q4F}@nBo}P0W_3%#g7iIPFL^n*SMBafIil*lD1O>o&h^dof3k)@ zgRELNE8_m2HM$|%@6E}Iv8XXIIGF|s?YHwLml=Nq));FY910K*)Dt0njiT&DbdJh0 zf~fpxjf9IWh~ab0x(2_JQNuyUK}U#ntf=Ttczx`uj2cjvQmFg=)@?P2gMjKixifhjt9`Q$3KG ztZDluhZ{9p{x*$o!1$3n#wosW}k&O?IYi~sbL8uYEr?- zjdQd=8c4mhu9uDd5FKsnl864h5J!J2LYGD2JkzwaGr=RgNogrFaja9*I>^4XK8i%` z`jR<_e`&(Qn_z1t_&;$i4})UHMHj+pXlN)v;OxY4XF4A*z*Phi`xcg4#W>j5p0z&! z01gfidXhT;5h4Qo#fQs%&;WqYh@oJN6wwyjKNoiC!n?7gDbJogdt!@*?00sikk9pd zt?#68NYj#6H?;QwKpq6a&SXHjUapfYHYBeAgD()sSC zl1(-Z)4Z^)Q6lYnf<^7FQ|XE(88NYz z@Jw$F$B1v1frU@UifBNapo?4e*$93u=hrB)USi^8+%b5>ub9#@oL&4_qk2lZXJIw+ z(K<{K>P3BkJ608cR8L)%i!XEy=^T-_uIqe@0dUON=b&iY0?)7mI zA<)ttf`y{&b8^}jNlBU=-)^_d0QdktG%T#4pFa!#>6-QJo+KD>o~zl&JB?dGOw0nA zX=zzm$=5v?V)tA5=jC5T{0iqDU`(93Q6OhOM1mtq3 z?_*X%!sO22RB5gGa9XR`P(P5bJDj%toBs4jPph^hs`8NPsiz@=wA6^aB={kTt}f0< zc&z9E?QOi)s!p- zO`@a!-3lA#lr}bQF3!0)I$DBJ2D^hGT=SWVW@X{yx=vr1h1Ng_&I+I=5);()->*&s zf*DBFYHISfN<=hkc`#h6b6K4?q7LkTm*ijje$B8JPr2-m5PFaO~yu^h8Qz zRK~&Not=8ORBI7B>NJveZumiZ_jo<@_Qp%(F?IMa`1w8R18M0yNZl`ht_Ki&{{H17 zvTqcY7G7}RNnlg19Bv=4I?kP*pgX%@5Ck_g#OO$pQwJR|n%A1SqVLam;JMxkiC-eM zN`w*=swWAuKWc5_*<>1jQD?2iD0H6{Xf2n*Ek~-J_;Y|~h9rYKP_)C_O-B0Vj{p^{ z>zK`TNhMOPV7or?-Zl4Ghiu#kwovSRhNkL+JB1ylNZ!)HQ#V%p!ao6?Gm70sOdk8= zPb9XIEs6Vks-Nic=?`o^JJUh7!v&*NR_>9Eq3@*aMw~;(*nX@vQcB-a;4;+B`#2HqEU0 z?g6T#RqFzN_Ok2^tuZ*Q&&efX=~_EHIOK^66$7+4T^Gf3VKlt&n1%|s>vcm^Bv2vx zR}TlG?Icv-6e^kCAbmkC{B|8L7OVNkp2;Sish^Lm6O(I37S61roqd!Abr1wGQ7b8& z`FPla-1l06t+#2iZ~hTxuF9%e5@#@u@6z1((3RmW2ODNo}f7BoIyy*^+uJ39+} zVIuOhH8m$@XMyZJD=8^0lV|m3YELMo{xhPKk^^c!26k$re`JlDMqdDuJP`Mk#&q7D zkZP9KH#BgAK@ULSf|&K4D?qCm67#XMAKzWOC@NwBcq&OvC%LBPgg>S@>0s%4erzn~ zzonKlY2;w%Fijfe6{uQ1-uw@oR?uvb5YR=pE4~_mo)U0b}Fb5t5Eh8pGvK{6X7Q)Qf-3MC=wTg9XfV+(|T^5o~ng_f8;qNMcA6Y8$w z62q(N?(>T{q?BSfmLX8PIvks5V~jFbHlw|k^jD=UUX?22MKxZHEB{8Fw76_%kETxG z5d_ROSj`fVrf>I@E>#U-h+&%-?HRjvZyNDa)OggsPTsM`Xau~$ zYA0P$#VV4jP4)9MsHZMcEp=IM2RDMOQWwn9%d1{FsxCa2NkObOP-}UmGbF(}TD)EF z!**ESa2Fv?w5dWkHvhX^VO3WZU|- z<2E!Jw`JBaW3AQgaDe&iJjy>QUUc;Ns!92q?2m*C8 z^`fDx!bhEJf$sf((n|VRVRLRIPrlJE2#tk&ig%6Z9hnrEcxG za7xjvV^Gq(o|&~r?BUt%Qg5JAdC5;SP9>bNmrdW)TFVU*j^*Wo#ypgIIdjRIhc(yxR~dQIZhHwx>*Ptpg8ZCdAxcjF`QaZeESQleqYucmD%Me=Qv>XaCwr zV^47b?atJq*&q6WSaL7hdAWaq#Y@+xo0YXjZf?Pw7hsnIE+&7x>h7Z~m`j+|zXfrG zR6&?PQ+9pUTRCzO7xz^|xiUH`!e=#j7N{i~ZLekaW#A#8+pno{fjFss^EwS6K!VgG zz+RcUnww*f+E`n&|44cK!)dp$S5YA>?&y8g{Q*bx%27=%VrYBra+=+3`{Yk~Pj5aT z9zY$P3AC^d49aOMlam^nx_64BGyw8F3sgC9goA}If3h1hBYp8iIHjlB3R$s}PD|h$ zh3w7~2Z1+FzEyu0)Jx04Fr3$yeNN_1fP;29*r!261`mPf{Fk(jjGBn7QmL_GDPETh zV6nTrm?p-lOjttQC9_W^Xk``Is~7&*JBDK`s8YE;Zs8Wjz%fT{=JCEG9%b0M63(}8 zQz~_BPUm{#f560M6yV91u!-lEk!n&3Z)ab+z^uvdLHacZUGf)cwxJzaMx%V?XfK0nVAQ7q=4@>1+6vtBX!P!NfAB zvuenU@?>xLH_>m021iyFxdZ?KqZHxV2{c9xjDH!RppR%rFW?nbbDXXd~Eo&h*M#HKOg6{%M*W^S$BYojk zovvGN7YrZb<>MuIN`VYU3fAwUd>~+FuxyWm6N&nn0)jv^-MO$PklO%s?%`etNqnxx zY<;)t(GK7{io=T2(}X~Vpr+P;d3ovMZTJ$ZFnByL8Pe3y(rcS!1W+^X&B}9+rXS>$ zwt+E>aaLm?Cws>Kwzj@2+OoYA@&X6*%byxs#CYGFJYU2nDTb=mCM7j`bTmt1Vh1k3g*>iN^h&z1{ABFbtK1148%xqERR zyMCXwk#w()#~6|J;$~9kG`G}U7{|A854o(@Fi7=$_i!|4)<%zJius^cJbt>uca#3@KaNm*`IL8 z=DaWVtj-(y@ZcfMU7151{ruxMxt7*tql1GpyI5b?qJb(dYuHQ&#K|uHS)4$jY`dJ0 z7kk@r_ZuMjxeq=CX7_{iDn0Jk>4E$d~U zpsEb93ueCj_1lEke7SXz^J&ikA>V zpoDP(_nKM_idSoz4aZf*DCax53j+B!w(`Tl7k>qndi$b>lzy^0wve3@N?}UgA^bdM z*4f9Jj-D>uzUBdM^>QX@C@+Xnx|_m%$$v6de73YysxtWBMexHmk9%$loEUoO+x zNvHdC9ziqMXG)7~5q<6!&ALfzSwF!>;}4=xO~bcTn6WCl+Ey}(20KkJ7c~F8@5+>R zM-%jQ1bFr;98rl2U|YAv@<|s_=o+ryom-h^grqPva?+gyWV#D&UUUopqW#h5uC@KO zoFb5*(HN$wG)D#*8mH1_0!*}j`x;7)o^ljG){AA*r7x6D{;*V|nCwt*iZmLBnx#Bx zW$gB@lP=q%g=MeDZYB+n>5E&lGIs6tYrPQhNqRXx5{x*|Y2wMvH94&>+k0rp8hJ?L zgAq5^CNfE+T1u>Fg|l#VPE4+=bec8wo0f&=5iupTV!ik6{@uCZR-TG4{^ZCchiT{3 zm9>p=@y==ba#`*K`ZLHIC<_hj_M0gk>{=amOdWxlpPR$K_PH32L}(B-*;m)G)!I(a9u*c3}%yEC6Gu`G7$P| zJO4auv%z+r|Av}BD?bTO0_rm5e$t~Nc#-l1xTS%<94QBgr^>#3Y1?-31IVHthCgN3 zRI3&WZi3NR&}oHkMV@4mjb7d$(|rP7rIE>tk7@e7Pt+KjaIgf^me<?=Y1FBEz_+4ak1 z$BqS&!O{@!t$l6jB=4?M>Jt7ku^e=J-z?|J0!MnB>e*-a2?~#l5}s8fn!foy;zn zRzLRdMM-%xCCyzsARSr4{)7xxOdi{C^MeK^p*K~6P%*lQ{l6-736wk7ITT}7Qef|?i z+mWl0YBdc@BKGL8o?|aoMLUbR?bBjx8h7rF$`_2@<{ z>r)Z)cw_a`Qrw7FSKjt6yyYffvvO}{?c?7xtsKRmc2$Z;eT7(} z_RULiHK=Z}LdQdh&00+(Zu4dXSAxd@@wX2730W14j=oHrU0(dV9$l^IfQadbrzqq+ zgf7u|?D%=OsCewqE5sHUo{QA8CnXZh>yBe}((fFm&J!}=X$8XmM+-1Vrp9xs{2C2M zy+$P`(#)uuX+vfLbyLXB!DC{#fy9q>@XE&I*&HN7=B4m{-j#-iEm7tbK^ZTzbTS6h z8>@-|Cv}S5YVy!iL`Lk;jorsS`kqrnwL&@ivY-6(Mjxt*sCL2wgzYXH)SwS!EuY61 zU}N|NcFY6)q%o+O7N~xZ!_jRB0`A}Ul_GjLJD&EFe>d+2v=HEQu#qKldups_8$x3g z*lD}rdPwFoj^|_^za3ZSKF|+6>mdzyn|r zYH$#AF4!zBe#kDe5)la{kh=eAaiFU4rMUI<^6@quNXR00XY}OIzK5Ao2+!?MGRdm- zo`Bf3N}VQ7N+=`*nZo-Fr?)q-hSk7jxYfpn)V}T5T~B#`ak0tnHrdj3O3Zq?41>g^ z^Wl6H`knQmquTk86d2sQBWdINcTdRZhEUmTF8---_j4yLBasQJctaHllclnS_MCF& z1K{#toWhhmz^2!(+LEKOVhJ36cP5%kf4vC%hPZ~Iwezdad_Z7^CK|G z6t&GS00#TJL=$Hy+#lZCESJkvpn*H$f6>f2k~>R}yvcx&=qEz{=t$#F756Tl_0#*( zL3(UjieLNj=AoBOkTp!Rc-<<0{WJ6d4l=All7EHA@G%^*3>|~Hlg(=QmEvHugL z4Od^bA8JYr(#8t!wK&v7{NBOf5S%ZPXK&7Md03O@fVx0}I^6G*Mt#rYn<0TsArIRR zH>r;Ze!$+uV8wG&Ot0<&4;YnPYd}qF5gs7=Ed193?bArn%O&+MUmkABftAv@H04U$ zpHD;VAKuPSn3Z$9>%8eXx3jx_yc&3f^K1W*&fal#QeO2S1mz?()YoV1eFHaAF7pXl zq9=Ps3O(jsj+sNmW+ZQH4{_+zNae*%s=tGxkbV46fLb7{X~b6@4`h*$e`PueI^JNy zw?8y&1Wl{Q?!AizwLWcn5o6b1D03)tQcmpSpAJbh(;=b~$Q1lC3Kcegzx4Y`-T1W% zl#2VLNe)SaiUfpFCdhjF%OLd-C}H-iQILAb{5$w@y1W ztEZzKQ&cl`*~f8CyyIdMy6F<$spsmJc_E=EWX^wni{rVmMq zocs%Zqq}QeOjJ~cTmg~z_;vnxJPO6tEC$EBYz4ZORvh@Q6>mj1x1q~@hm{VyNf4fHun2MT zk6ng_`m&%(c;A;zmvb!C{UP-I`2PLTCoO$#px}hs?oLhv0|V84=Krl6e3$6sX3=1Q z8I-Y?vzwglY0&4wO04of5ts?>-+6CsQ{YxcVW{mS+=Wl#HCde7%W#zz)ZNv82wMsY z>XW@fg)4YW+KKWvM<75u;{ zLH0oq|7}tNj49vxdI4W7WAlZ>hi*4J@ubfK!lNQn3vHMTwSyp0zzf?eAXs9 zyW6AEM}n%7#*9uw{X~xFheRceHh~Hr6{Z%YgPD*4kj#T)@qzu?%=J@z^=cTN9D%@F zI>IutCrF>vVozz4$uDyj-7)*!VpB5~86z~?o))MS;7M&j_c0!@#!I8PHQT}`2^^7; zrpyL-baL*+6@0yE_0q92XKOhPG&vM?d*m&_;CLFrkBS@Lj!_TdakgP^+WUqxu(V8? zy#`5{z4(5-rDCAvmG}&`?Ow!Vq3C)q+voZQ&1(8bAc{v#D#LaN*M=|)$Ix#gKAD^;hy;1s>aKi8d@XKogMS=;t@-ljJ^?5pe^ zSbh9qvG$XrJUKaebS(4LFIJ7>ruCS`-5qQ2q0BX`=4Q?u`8ufH*hPA@Kg*y&|qN%4NX{Y6by`Ph0%)>&U+yA8&<@u91k#*SL2 z^?voAr^$`)tcm+C_Jv0F=G*>a7+l@ar@UL5a0bP|L29MI|MnT)!o(6>Ni+$+$?;N^ zc}uExNo=0-r$sxJlA8AgcOiyU?z>Mv-lRIMSTC@(1WN&dMls)3Q((*@OZalbZs>D~ z02M0qUhLhvCAv$_H(YKJuv#SD%E3=?I*4(8+EI+ev90<)*YA^swwk#9W`0HN+kWQW zW;6i#E$3h*k!T$UOrM!J<&TpQ9gb?SGr}? zEQF>8DWq-#LOLC)sRl(z6qtav9rOew{Md5L-sFOCrRb|1OHCHTt5;^{W2Mxdp4e$jexgSmO<(Rq7+=yTcm@SDTu7>KXw)jeN#-c0*G{NadIc-FR+ z7x_w6jbNJ&q_BV^7C`4q#I9}K+7WOSm`o|s0dLp;`mM*bP$ZYaP%{G*tdI*M366Vm z%APFP&qvQK13Em|{gLd0{N@at%yTO`sqj&~un_`>==Kc=VaQxAJ8M zFGM9X9FUKMxg{aXr1s6MY_DfLfe=M;(NtKS;KwwYIC}4jg<%|gd-dlb_u@TU@d_*^ zu9U{qr~gnPp6=@5twGq|fVR5?v+!#1p$U3fy{}ELX5jDjfO`;Zv*pRmyXV8AcSC!%a8Y^>y2QXUmH!5xVA7#2m9) zEoHf%fcGPYLT;)vd#pYm^Y=v%4o&Kyi{VuRv+h4bq)Ja>wX2PR$6v(i<4hZ4RQ*eo)Bpi-hDUk6F`f(Oh~HfhKZ zm|mSi!vVg4!^6WOt3_G{-qTJ+wKZ7(TPsa|7_4nQcTqVwwvtM+)zID^!ez>X^Zut9 zfXPr5@e1nBv^{V#tG_UNv$$V^dzJY;Il{~-m7xmr`HQl)(YgKhV;OMAhll*o!r^Qnk#E@~YN z&xW^I<|#=a!}3A`XN!4z94w;RebWA=9W?kPSWRQ(>341oeJ1(7Bu$hJ)y3gtL`=1u zm)&b09e&V2v!)?4(gcaM?k*QC(NsYrlu^xJqSHy)y%r`_zK^c`#_p!3ueiCnAuxHgSv^1@VlM;?&^@x(jtE&aKi=;e2(1=@ z?_ErMEqWZTOd&Xh1cl;UF8kb~_?{$E5aGIS+$EkR_`0HWhm`%dI+uN3&fELG_pz8-f~6s1Ege$w}U0b=6Ej%%gCX8=)_|SG_DO%cNeYA#SFjGA$rKKx-;NK!q8D z{ho{rLS8ak`h)1l1udJfuV0Ky3I`rLU2dUFO9Xs{5fJ^DFqYUskQ3A$H);Oc7NM!Y zDi=?W+8(o=(Mdn3tLr9krob$ zs_w|*lMC*d*s0hP?!P|zy?T+%c09MCL>WM$ggqddhHTQ6&ey4;*(qpa)P1!z z)_vbP_wMl~%fMV%iK}#YfZSv0fP!aq6WC(UCg|7 zNFCwEU|C#!F_TW0ts31*0r)5!lk2-fk>S>p?l^4^p_Uv8K@ zd@qumek9DQ=|6V;U0GEoX+ut;u*@{f^ru@R;}`Sg9x8x%wOs9sK~&0kTA@>TQUx&b zequOmPA*b7s0GETAA()Z@qgIIw)tUJow$@bm>5JOg^d=+A$!WJyGm48GP7Z^fkK-%twkS;|Z|W1(8VYlX);J7A zHkcX5ttoz<=kF^x`u44#(udD@xg~O@${;1Z6(pP8HgD=%Ivnzgimeir$e^&Ap9Og* zOta{kII+K|Qx&c-K)}#Bqv&xg{!8E|hXdDz<9kI5IojO-_fi(0g*@>il2kz; zNrL2fF0OQUn;gE|k(2fMNByr=cPokW(jAFjW2{GP6lYy2y=52z(qp{)&)^|?J zZnJljV%|NJI^afaT{*Ah__!($e18*9@N0FFdM>w>ebpv;A>j1k({8tT0gQ*H%e6#q z_gn@Jzh9F+N~LFJ-j^HPf6&speA#h4oR_yY>ibX|LF4-yfl|05>(w)pJxZ}-m4iw^w%Dl1-$A}$%HwwFwSfxk6;lmGOVmd{lE|FS=~YC3Y3pda8e)A^+F zfkIQJ`_<(Uj6e#p^+Ld)=EpAkyLY-~JF+_C z3vV0T4}PsvvV=LC^$Nbosc*1Nk7N`)9Jb8>HO)v>45!ny!<{(l^--u8A|xWx4(y`d zcKUeplXdJjynXm%kft>A+vNHrL?=v>RX52O*hay3U0q!PKUWo<=DlAJ`v%N~mAf5B zJ&}p-K6l5Al)iVeoj?1vI-Dt?ci!i2kcx)JcL5J!9H`@>{ubUJCMA_>rMtckqB#VT zCVcN_550HPJv_4*QF}^hNwzzvV@xPXbA9H+&rk~ks8I1S^p;NhIB+HSH-BAUc-%kn z-F*3N*WNHaLbVfmE_DJHjlv;!T};wQ4Jub`esOAaaTPQ! z{#p`;+C9Y67EBy3?n$X@$w_qzQq^mjU^ezM=$+zGf>>pYu znl%^H~|H=w2<@I1Fz=f2!dskXo7E;C3AwSSm zL}eR-g69J?wz3j01FWjK4_bD46cyQMX=&9{H@f_1Y$}^6Aok{s1dw|GT~$5aL|dha zh=>5x*w^PQ-$V1wn~zt$9tyTd63k!9borbTva))=n@$**N44+j9UiC5Rx}?y+;&>0 z{cZhqukX9DU{iGsu12oox#Ra_5TE@LFDLKkEK10Dy_)BP=YL%bu7qX7i(T_t`x%rs zpAypiGC0C#%@AAd1`NlH=Cv!}b3He;snG|Y6!^g+33rI{WVoMRwnn?S3AOr?(Z)UtEmRofn3sDhf;goz$WzU&QK zoyBBrd*&@fB`RpU^L+<{{rjK}C$o|`cwD`aDVkEDx4I3F(ar2ocnp?-*ZD92dbg|{ zR)4-#QR(6T)%ijF`IFuKIjzo%2uDqO*CvCcB(rlHQ&SU@{A`n}HKN1&>rvn55o?W| z_rtM1XY1t(^nAMv6;p3MZdkQ&@8+2xolqclkmR( zdoD9A<<6LJ(Lk#r;7zGo%04gYMcBS)*Fd#4l7t0Is@f;qXuRNw41B^o8PAGI*J@la z=Go2;T8F*_G6KVRRyKm*5Wh7Kgzf4jiVrs~gfwxOsmXF`pBPY(7OVu*@%yQF3lz(r z2vU9{ZxAq3qau=mCz7t)T=zPuz$C$?LPvsdnd1Fb(7AD;oS?xV8CcD$okM2T1jca% zRYYtWe@y=cOkxPd-jj^!2`a1l#=Gyapf>GZY3tO*7$6r$DL&2tGWv;@oFb9Mn0*K1hF2e4@;z0{Slq6Zt zN4O4_r%lCZ=s03ZkL)+v3;|CuV{ElI^rijM`|tEAOWv289rybVXP1|xA=h&zvA1vU z@4lf8>He(C6!P#raLNAF+4(|b0;J`nbP7B7VjVI+f8KVnU;`xP-_^;KnA?y0FGYY? z$@%%Y!QEP?ik#l;^}=k2s8cquNbdOc_|TZEa%E%CeAs~V(ea}&Hk7rgGxLA(bk$K= ztxxyRDInb-oq}|CcXxs9aB#BsON7A^6vM=Y&Dun}rEMa~RS2)qHtN)1a`j^b8dzv3 zv8So6&R3(%@EPn&TU@MYZDVipqfr2^)7R-xA}WD;ij3M@dYZp&K7a>IAd2)VjPhy8 zP8S82<)?8*Tz#w;c*LH&KXcD^#|tufMX1=**-1%`(|N!VjkcO9S@>qZ^yj>uC;2k1 zk1TZfqyibK31fn|L?p4Cl^{kG_nZ|ML@Ju25i2lfVlkpzbN9h~0~^$@IN`Rv)oOuA zc)RsQZ24SsJa2QO!+**pviIZ$KAM>c-ff<|Jamx327+MG(#lI0LI4WDsKs=nO+=Jl zbOtsMAw{KUp6j=YSoPTLAgI?-)pmXqCsUB~exkJa=_30jr_5Sf`eDfGyt#X$U~W!@jjX)bTvJ0wjMn4y2+!EQxCmG5|98Ow%*G?U405n^wCeLXnHJZ4 z#DOOb!+MHu;|mMR;-zIYMULt+{f9vC;x(SIchGpo-(fKb;Zl#Ar5S*h%owJN>un=u z^ke)Vc{7XhU0zx>0MVRogKQ2l#LT5Is4zG9mPQc_Yv^ATx?mu^GAZmf%g^H9_RLH& zb+mUGSH5_QL>()dEA{Olm;vC>Urs7mu=5cqM9RJu-)-YUKFvGcVr<|liFVm-G{lpc zOdq--3K5BoCk|rz*2ktei)fZHAL5fS-$}5;M~MqHV46P=kAe1CXyNMN8&3v$w!o*x zscCJ5Mnc63L|AK%_OTj0X4?I;X1`yEBg70px>{d%2YnhSs$4=>#l}I5qpCDH0%a;a ztEkI^&LycMBa)AO_Xa<%yDh;Zsz|)e`Dxu}>|v>Wpys~p2>ZpgyIwHC_x9WB0IJs`{^ z9evpZfuNzHM&!L;7zH%|b{wu+g9I+ed-gJ)LNC{**1=1Cw|AzitE;ZA@N)~FGUP?O z!#jW#U*=|8CV}cK^Tc=HYR>qix~%LMex#HsXt~e_-uc5I{NU#4d3*c&&mTTg&sDs% zq9?H6&ieJ6t^c^~!u0t(jS~+fX=*bM$;BA>9C2npZqm{mzf5I6S5#He{P2FdI{7uE zzsqy|3H>=>ugh-1-N^sWOx^46A`%!j+Yu#Zs;d1QaD1U?foSMy3U8Fj-HlUNp0*7Z77DQ|-!c1NCFheSDCBv?da@_4=Q zM45&;>Jcsn3#PZ_5d!*S2)SMq@S6^Ay)0r4vak;8+MHqVEt8FaVZ`7APOX zWqwh`(i6Du8O5{`O9|S$u>B$cc%meJY{Sdpk};Sj);tW zK3eg=3@esHY`$4$xf=rEYk%?B%b#bQ?0WhO;MXK5h3g>*3bDR=yc>&YUo-s|uyVa# z9o~q7F)9}Y_43`M4d!h`zx5^$#j+qLTYda2`C!0u{0>!fTu&P`TiJch#o>i^ccL}M9ZJW!%Z^F$MezA5q>4=370tY0S9Ijkhcg2@I z_L(Vym17qZB@z(Nq~C8-{DzT`x|ahLcu#s@ZFk7~U0d@L*w~Q|B~|B#K$>hdIVwGM z{Q|V5hpuq`-fb#v2u7NhH1H@j z;T5lvKNyK)6-V{}U{MnL;$qhP0&0&>~crxRMhWZD(gZfMr^l z6`?5;E)fEticJwWXxttna31jKlQ^g(NCxiGx1WD|pt1M9oOrnylDXB;1iiPJ0oy+f zgOH<3PY%AqZH|nK&t%V^I@&y))(Vr24qNP7RKL6+XCKZhgZ=n3*m(;-uAvJ(u7RT| zBkf4@4{l%8(f@Ob9B&)1NC!@5WpX55^OmGznUjG7n>2g2!Z&ik!72=qZlaQu9NS(; zNnb@laq~3BPtn}F_;0%Om?F2z49dRzhBl;#Y=mkaJIjk+u;S(Vq@Y@&Quudt%UsmR zYfoI4(JbT0e5S^9ilj^ifj)`hLnwuOB5JdJ zxe$?PM0h;u0{$F2fqN>AF}4ax97EzYuYK_r)#7jdS0USzi7TtD{igZi)k1z{{V2gy zduL9vYG#s+%u{5EA9dqDLEJc4-$Y>MPS-O3GZw6Hzsk!q1KagsQ-J)7vyn;Z!Tg4) zcmge6NL`vHWP@0s1_q$gH3gzgVK%BZ9HHYQ{P2`}q6X-J)xT3a@Ccy;PXbFHgASzd6h;qL@c$pCbYI0Y-v+ddX)DWwM(_l%3n$QtvJ zQ2z`HL1z$e%V1K9>tG#QnO<4JL;EbAdkT&a>-mpwYpl|WebD{~Eyvu3N1%wwwNq6g zl|8`ujDsLmj|$kojiRez%c!}DFvOb?-Ii=X_^ypeK7j%|95?Z#Hk^lAJ!nWAndLuU zTb5SL!Y7t&Fvm*B$u!xKurB(A5xAZ9Y$0ZH32Q(B{HQH@Q|1&JXDt!fE_ekp^#sBn zd3&mo9d&gI@IE)nffFKK1Xuok{4j=5Qdkk(l2EwMqxOpz-e?dFt_sGgl7j<#4?F#& zZ<6v!rDc;|s{o)Phlj(GpwZl9nr*6|5A*p-qOBwk@*-owCPbsw@?KSTwmbN_ii`bQ z8V`FRRpK{w9W9^tV>IgAz|Z+{6Cf+yI8i|Y?=1s-;6%`Jv(Ns;m~AgT$c_JRd|M>j z^hjF;KIto;VB&yV!J9>X6k1*~Rk@X`ssr1FcCa;r>by`oZQWPTzO(2U?QLqmBI#lE zzZ=Syrua*nIm`5TrcAFbQ~&Q7yK-61j+if95(O9};~YXV6m^QAbJ;0X311IVh?b$r zc;#6-`p-l7nJlEciTiAJ!CopUHL;vdeUnX71CDRI?o-ka`cl(a@Q3g`=24V>p=(aV zCxX756Nx{ysunSV?_G&9-DXCOqMD0Y%RKT{#>Rkm) z7>OxUcmT#ICp48dwj77mxbtTLba5OD=6;>AF26g;!f&q*dI*|JB{;x-sife8?Z=u* zGa>*nufg|e0V%e&>v?`RaEA|p(74jbY46vS_A62$I=S<_?sHGqf=a7}g4A&Gx8;U* z1@TLEiXcjzaHeDHTJyaP4UwLyGD=!HFaOEqyke&m?2rqF+G>mXC{b-BT7J zsMeMlW^!A8;yJL8?X}GtkX>HgZm;$bb0O;FboT2TBh>r7N$TA3@P+-`?zQm&q3emu z{VKy&+9SsWyQT_*W@vzrC>@>j5H`@kcSHYX<)tw=xNqg@ILx&$7S!@IaGP1M*#7;O zF$aRuHnJ zS>taM6sY-K#{m6{?X%r~##->~b^Lk|KFC%K>#AaUc6Etyf_4qn>#y#I3!|sy>#oCU z8SA%UBqx3+t(=Nr*&lG@5wH_O7m-)CKOp>k=9gd76aO0$@B6yR}Dez7S2IyEv1Zo7_#qAPbVFN z)q4MQ8DxtPyT6*{7ttPV`QW@PjA(fSJ*(m^;(ycWOrkWm1i%18?SjfgQDup7UYbc7 zq2l-F@kC;>0!#Kx^PYWHRvFN_@5eRq%l}f>CGZIwrjQ2S5jl>roFQIDmj46;RR9*{ptBUI7GxhPKt)TU$`Tn_gqkm4x55gi+8! zNolnAv*(!4a%L()DoFLQxMOI`P=S;YjZp4%Qr@v znqbm@0Nwt+?PR~`gN!Yj1Ymr2_N)ute_r^Sf93AEx0Fiu@)I7}{WuBt@~x1t{8=H( z5?*!{Sd<72E7?tOJ2y|f`rN0Me#ZWCjuyf33As65rSwBAxXA*7 zxN_^HK5vBHY2?mY?Y~(d@Mxpy;S>h6o;Aw~A!G{qZbwGE^9YIX2W^>K9UB zod!-UOo*%Qa#2XTa?`Bjw0utxc#81jDQr9U3KO!ba)E(y5$t2U_LLU1-V0{wEgt6{ zrd6hr((p8|kfCwR`f8aTbq3Q}xt)*!e6pCBm;s08t?SF5;6N2bW|BHs^Cju+TaO@| zHd@8nv@_;(^z_e{#lqi=aLl~c8Nib{IzGO;9T1L7O+5q0gDzt(Pjq263(xj{@pGg% zw7!=IRjuxmGHj{fZ407pHxjz$QQ-Bu1D3?z_j?v#KV2LrvspLvw)L=X=rNObC&MM6 zOPK8CSufJ zpG^g*{>QW-T~49!#063w&#vyV%<_N=_Fe+)$lhmn-1pIF{9)l=K5c z#haGBhobuFTUyYV4fVXk5?ozf0TCuH(r}5%!SG~m`%64{gwG#!v(E2`E1l!g(_aDT z!jIA&$9+G4?mnypER1k3-Ci@Uw3E}OM^F@UWM=T>PE61NJkd8G2)9o5yw(GHJuU4G z(h?F8Eqr&P1RlX~aRA8}{a@2*?4O2=NzVj4-oJPJ#RC6d5*#7&&sz_!0qfp_ZtHsc z8uibi;oBA9e@K>{?ehitU)lIQ*uy^(Xa*(j=l(7dRK#xf*VPX(`m6J(1U-YiNPfB!Wm z;myB%jRATPi&&Pe4R;NS*x=4=tZLamN=?sqrSsB&?Npqy;HdRO2|JjXJO8ap?DI zaeIzAY?;)Zwh?0uR7<8eU1Qf*oxpAhTkLPH?G6eVU{!th8VWI@dw~)xKlW=grSk?U zXDixyG;+QT&1p|p6C55LE_N)q4QI6FO_phf#A;{VSH?}!p0GqPzV&`spDd#^e0XU2 z1FNd5HWQnmJ>Rx^_RDb0vs6A_R^oig4?RO^pU%uO8FI@(o)#_?;HoJ#j z{0I7JA6jX+Ie3UN?#yPuCr{9lu$x|QPUg=W!A;Ej@RtEF#i_}b%IB5@4cIQ!9_dC) z|BEAqjPvf^{bj%{r{x-As5rykTVoOhWY~bP5yeE{woI_E0c$r4OB^-mWdIV{L}D?+ z$MX%jpom8Wd0K2;-e)i-;{NPr5Yv#uj6&zF8p)Y*#f(xkZ4t}U@br5V5i0@>%}G!% zIBU(vcfp6clVhdKfaf$Xw3opPCg8MDeFbFwl0?{;P-ffy1yrI3?|%wQ#p>?^5GvHr zShOMLZ=3sph$862W3!|VU^)KPNswy1(c~yT_8Q_yuAQ?`b2dOgF2W|6#yFv;$Q<9R zI%dO>u|$9IQ51Qlmk>wWk5AFAj$rc~CBt9d+s#cX46A=*+A6jK^?Rbu+eEJ8T!2MfND}BEL`N5gR z&ETu_Z(_TUPq2p$nt9W>tFsY9nPmEYBj#=l>=zOL?H2)70#jn1HR8^-PM)1kUW8Qz zix4OH5a&SBq1sy;sNmOg^)XvWQY2#^1f(&syQuD|oRLZ{WxrX+w#+vmR zItJ=Tc@Z0ozTzs}29*;{Lks$<)fngOy#Q~ehCQ0h_JE@?S-)%AiJK;7QxqDBay@8P(CT2hl>Biu>%tzcm z>4T(7GZitha|YhV_Mrtm9d%uiDnk_7<-IO4a4Il6H`RW=?t#rznt@%6fjDT~hRt)r zSM!|_4tuNc3q;}LGE#}*P+ z?E?0}AXP^U5~Q~|d~DAYc7qkk=Kv|b*k*=0(OzvcuI|($hV&N=+qFC^No?mIbLGCx zg-tWdUid0$ASM>nW3%*r&6G8bRuU%{F`?PaOhdScuKZ*R`g) zr0s1+Tsl5cG}=wF#@n%9h8!TRo82OJr*?imr@#{D%0>zS9sR~bJqS6tS76|Rb<)*) zyY8<>%0D?HlMsiB+*6xq&9r?kI;ZF@-SZlSN)=A6EW#_E4kP}fK%ZC4R^zVLuo+mqp0W$d{(F|&v1q3s zCjZ!dKN&{Vvb3(Evr`~+f~N-)wlnN^xex`YBnIa~8U(~W=lOD{@<9$DFrwJcXAbZb zun#8JvSvW2<21`IHWTBaSJ^F$Tg@3Vl9_K+*x@izP)gZRFzMj#$LCgaT7cAD;C`my z^>&VW_m=U`dZ8xBXx}e*LQ;`LfetJ^z*7Fnk$^3N0!v^@3G*Wa=-UB zB@5qJ?RO3wr4N^2K73DH1zgbku-q8hynJtGU%jlKUeNz9M_iv=AQ>1z>|mXr+LR6B z7Rs6TosO#dTf0+)Nl6{7zgJnZxi3=fAM8sfQ7p)&5 zWOn$1n1|~*#l8S2r^8B=vK3(bUa+s}^}4=C0Z{0h*_cpYpXY6HLg6$Hx{)h|VT=kS z7lKYfI>99wADz(_C$X}2NRJn_4UCLCw$H(u#xpBDwbjyUMsChs3BLf33iSQ)G1Ps1 z3@&=9f{R`p>PJ3JILR|_ZFEdQ&t1WEGiDtlp9zt%E^x2(o>Lo4+xurJWufpfu3Yy1 zxHjOrPCMg&vfP;?h_A6D?C{1bcvd?RKk=o`4X)#ul=c+baS>gl3=A4%6Y@cYi^!0} zL6^qgi6N6(yhFcU@XdxidJF)EwYN0A~p;OO@n8$k6 z!;9cp{D(MB4HHo^iPONfyK>l+ncv9Ow!G4-JP)4D4Nz04*x&@ngz?i7cBPCcS=F#L$6v>2SfGQfUe{ottxsh4m1oMGkf zWE)5uFEN5VLr<|WirXWX)pwFxgaQ>$kECr)=&^d|l8I zI29EiB`IUTj`82Tpn}iMb<}iOqy7a^F~2B8Jf%q}k2$`;P1Hobo1jK8tTwBeMzst; ziloxcnSpwzjQJ|2DRnk0@we4{zi(t4YU|Y9jqtw@|3VCN6=!areM|FAqgouU+SXQx z(6%=hzp_g|tV|Kz=9lptS+lfp2Oq_vX2!dhdXJSL)kH6{&VVs?I}dYxF)t%9jFHhfDR5KeDoRf1ivlk2;rJDq)HtQ8$EKempq5^m@TJ z5GQ=o5ZEy$JS=np>LI>mPhI+bA{3)mNrYe(<0O|9M)@N_Fw{ONu$HHSY$+UB>`kg! ze=A(jyfMdsmc#~vPfU{8XF}^8zcY7QH#%{bbE&i<)mnQ^Kes~l_$1yhSO%Qma9R&) zn8XPT)u9gi?|%`qF$lUix`=-@(*-(NeNWnXld7cC_VqbOSq}qE@|mXQ>--6T)8LO# z_+{`(l{RIHfgWxFvnj^p|H!&Lx9nsgAR{9)FhCYvr>>T4*1~DC6;Be{T?V3c=L~*Z z&qNXIjHNhrZI7fMcf1_SP))k)M{j_nkRUJN=hKzy4h3u@zbj7KOxH3Kd{A>6)C4<_ zx6%f+2eyhc-QfWyqqbder(s_T1+kGTVts^rMacE%IR8mYWt(r0kln*RV|8&s5s0vE zUoSZPo_k_L-8l1vf$A98xRNo7ncKMXUbG)PxT2z_e(?3ro@0!NUpU%^d-HavqjmSu zZwW*ja`QE16)Gp9RE@NQ|T zfKx~qYQ4ck%=o{x8-`fN$27QujXz2wDXVVEm*E|X*UuR7j2g_>C=cHyfyKn@52>|A zCb69eZsi8=+HE69+sH$EY7Q04o^{nPFF%eUHlf(+5Qj^nZ$~NvuyVerJ(yo~AlAP> zGYM{dq^FVj5P;VtKtUGFB#EcmeYu~InwUoVH6++gv&if_b-?ne)0t(1^#LEa1zmJQ z)QjS4)(3Amw_onTP-{868od9DxmJcU*VbB3OHNPfDjJy=*J`F=Q~uX4lJ;8HaLfcK z8Ff3Hz@>8K4w({qYGxFG(Au3CV&M<_kB{IH%f!(-&s%N})&Y?2k7beVH#(ksmuah} z1=*fb7FH5aI7a};iIJKry|#6CSWy#}g!PlQAU05|;40GC7|YKwmhT|!v@`PZcZ&BO z|2hOq2^vT;12M2@_olR`Uenex2LAnJLyskH?@N3OugQWzSy@?d(M+9I8G)qIDElI5 z;9#j(5k#-nRZ22dyOo6Q8uIeufYWjD7{h?4M$lj8$UB{Q080$k$dPo}XXTUlMVPC` z-2>V4&3fb*E$OoB)X@Ow3$5+3d4q@Z_3c}u-&gHmy~Wouv%jsaSZf&X6ujc%Ue_Q{ zmNaOcAKIfqtVT?2B*zYGpAsp*p)(T(-&4We5T6q9zXCVfKy^wFI~=Cdv)ZS{m?>$m zuH+m=R)a?rSy&zcaZyFpQME;NLc2dvQ*~?H^?i&)=q@ymPB=33su_MB?IdMi+E@{4u$%@jkR z#`faRL0YVI4$j#yLTg3!l^XB0an%GVMZRY99rGlt$$DqX+@kZzzDhlF`gDC(tvFMC z?h1GS;K#H==H|Q{BS8aFVZ!>w6h~goeBRO}%l(Hd`EWp1{o{T&zn;Dj1P6~FPCx_R zsiMr-%*?4ln$)K{y?%PwWE7yRyj)L{|EyP?N)_hgo2LcFNKv~T6>AF!_TM;SCnbr4-06Mhj3Ga>a|jf;HSp0n^--MSik zC(%kfit&8777)6*)(#@g!YOViWS zKaBpKdBnF~4IpJ3Yd}VfCFyNMzteh*xarLoY+*S1b;#Eqkg5Ck8g}Jy!o4J zqGCfdqT>)>rEO~|4!NMfQDpzJHgn>%O+j$bK&6#`r|P`ba=TUQ8S_gG2sG21;s52; zmH90_J0lG(#ImfV+19G>eqACo%#feQNM$qSqQ-f_JIss?0qrC+4&*k~)I!=ms)FA& zhcbq?l$Dn1+*7NLvV`aAj@J8D(C7uY@&oLdh?g7OOU+0}EPg|M{wo~4-|jMcH`3gZ z8t2Jl+7D-u<#Y|26}cb%`8LT22S~`~B|?i_7JKng#eBy2(DeN!J?&3A1~jnX(Lidn z7r$b>-%AJ*Z;nJi!H;D`Se`P zm6h!mFtXLx8ToBp`5gan$%e-fk#6B$$=GlX2Uaicy4T#Llx2CgHjUxpq090b_&Gv1 zK$@X@>ykyLTlD7HaGKi@xZyJK!|3Tj_$7_=KrhKGJv~jUN-vI1cr64A=}q0^g`?e^ zflDTp>`)T3)r=TeP(Twf$tNWEP}AN(vuO$!v5N3cKN|?+ zx{=fp8SeK>>JG@qjwfEzs-9V?Z#E6Kzs@TkW##T|eDdAO^b!${w&h%@yhiZSZL=_qPJ^XQl)rlDoMcJGHI z&b-~i#PBd8=7SydwxUv&yOjY{@!{+|^du`gW|pOPtFOCADPg$D3+P``TH3uQxO0ne z-=PelaZNLUA3d6t_W4I(e7}8qnqzQ7R^TJP)VU|yBs-?MDM-`C^70ZF>spn>GhR(> zJGHR4h(Z4USuwBqQ+c_|Qg&)iAe&_P{%BE$v!`cBFYFgo^%L|*iB#_Oz zadqW}u(l;3I4Vu%hX`QND74&dFIXQ~8+%=CZOJF|5aehZrNRInD}MU2vPeCwJ6S%Y zKw=gBURxKhixG*i$p^iYhEnyIfQKV)a6f^+^fCLzcfBAk<29Qz!j9kVngw|GP@-#` zl>HjsuckW#@5EoFhc^$!%EE&L(G(NiP6L_agS&)nJ`|XPfNv8^2?sy~{mb(T0FnW5Aru7(! z=K>olFJS}dCa}TI(o>UYVmkzF-DF^<>&~&b2q8(@LM$xGwJOV-Y04VYjUp$-Z>Lz&`@WWsNH)4e2z+%~wH&ju2`EkdFd)bq*@G^q&`Ld~FX+c&o$!t)W zHmYY(3fA}e{OeY#?vu}zoNPrJ-xZIANmsX5csCAXl5G4mWUH&$tBpLRsM-JN55y*4 z)vJ08oKTLls8`yztKy}R#!AU{heJ7uQnjm3Z6vv2FRk+r^T-J#DxHNtd1=)i^{JZG z=V_Pm{Wn&@;Mka(QClwPNE{upFEUwP$Ubb=sOOJN)1>3F^@`IHE zMx+S~$LhGRI*k1uYT$?I%=j>=qzy zqZ!(nTa48$e{?Yy_0&XYepJNvpCDmtkvI4F_6LVNV zH;&B56>>3hwv+AWeEoapaxY<-zf##*t*(B?VU!mnTKJC<2vV@KAAk$y`w3a#YH5`; z#TqzVTb-1DaojKMaMwfRLU@AeSalXW?WFAM>jRbYk0%Qwv7WpxvQJthYqt{8gr2B& zw4Xu6abi&P%(TDFW!cMu-%muk_V6$R4B}5^EJURW>thJ;(kp34i!2XUdX| zeEl^e&;Ej+xsZ00{(ZL%*p8j3K(MS$9MsDX#R?z>Fy-q#?Z2lhe@GoEYo~~yRQtEw zxg1)jVqhXS6|AC|fCHpm^S~R6%4t}piS_3QC*ka5$|ROlfn~W{UN;4iMk8Z*g!?D# zp~TyWlu55IqV z^pf0|`EIKZS#_V$(yB0g&L@uK@sS-P)L=C)vr0kj(a@|gZuQPG(*s24M~0d4HCU@4 zm=>NZDF1Y+P_Y>q&gZhl&|op5DA{K&d(K12Eo1*0h)OcXSBC~5KOSCnJ>FeZrMi&- zhkrC1{T_}ZXH$!_w=Nzsw?JEsx}#%H(eJB|C@a1P*@J^Wvb?t8EZ&Fj8*0Xk`5zwp z9A9|(g{KWAv-oYsAzYk?E&9#*ftjC}*Lm}2T#=Ri669)>-yXEgdm!6>-q-HX!r6KX z_`$u=mKr=XGdR^?_W%;&Go6;<@~D_~Sjp^KjqJxX*<=aG`#2; z>up&mrxH4hKuq1QdhRzx**pdrv7*RB(Fq2h77czjaFzGh$@sce^gzL*wF+Y5K&igc z+j445xL-n3Ye+=YR5)!Z@+zbVXNk6AG<6!OYkghjScgq%(5+FeVL|93etvGrZ)$pp zD&ZIo21Y8(1#gmkqMDrVV5uZlG2_I~uu19(M|HXE;o%@SaVaIlP(o`DTdNu5LXP}^ zA>VT|~KnsbSDI2ZSqB(Vv?)&oh6x!c~L zXGY=TW9`hsP)}Ew`1559>p!wqFssL{CxwZBAWx^1H^NWTE?`tVyI$caDt=Ys%Pqaz z39rBxgCc)N)i8J9wr{&!R~qm_Y%x>xb*txdj3dK5q|zphIQdi8dv$eFL&Kwn(t*~+ zW3ZP#7-@R`Jw1JU#ciDF{mW{_@8$|zv3Lc%HFD&ts4UNXy3OC(I)KWlupKE(Hgvt) z(vBkXsnEwJ2pil_-t(n=J|AMy0L?TqA1bZV$b3($C4?U?2R*^hLA}2|9M~RtXx~bB zy4{GOQO;_!R84N@mzHig+n|LB96RY)3+piQojA!3SOYCyGd56lCw{<3Mo94^_%acG z6Ua(X<^ywcfNR!JDw|hYeJATMNCfhFx|*|HX*WzVqbBueUfRj7xX&+D4Uq^ zs3Lvz_r?zYC!OzHg;K788A?dib4szv{X`ZFoO?58OdPBq$F@N*pe={1{s)zaWq~He zi6rT7%sik7#6Pul$NMxmn~#NRa{)M~o6Vs@0`qpyLS?P(&S04u)o6~Jv4tl;j5oub zx%ohjYu^ngKLik|sg;Tjky5I;A99PHy?UnD5JJ)p2*S2EaiBW;C(S-@!0~kdqq=)Nw{)|3 z;@i5oIPLk{O#AXE841Xjj!EUe;ZHJydVesBi^nSmbl&bgY=mRc@S_YRy&Ynq0{}(M zm#6F-dAZ2H0!;@8ZiWtxt=rqHiG%7!-gj_2Yw|2YFMGw=Q3Qh9`{mV8f$v#=UWi%g zmSV;zW()b z+x3g+w3d72IjW>gBzuAQVzW13Xf#yIeX!0n&&b#ubUNFx(-ED9UsCZO9U+wF?vJamU3ISkYx~anO zo%MO?o^G@LY$b*t6f#E4Adu5@V>zaF-0~Ynn~} zoEUX>u1?%Eq6bcoTOGijW^Q9ZnLGsO40}a{d6hXqk10Gr#_8SQa%52J{2LDMnGE3I z!ov9&>A$VrhS@XlS51bJW({O1%+^jZaIX1G9jf^g>v0*I!J=Y!DPs7yRI< zT5c^c#*YFr{Bi!?R$4YqC-c{*J?O6Y-8uOZPG|d|Kl3Sf2QSzlvVe=i=%_tF;Nzpo z=pRGPZ-x%mm%C2Cd0~L}$BPblEJoO9p}zhvx)vVz#Tb%jpxlh}C|;O}b(zPN(m{{Y zB1zNAQ*n893i}S(RB^TfJ*ai#aP+sfL&1HV=kiY^_Y$a-qbsyS0SRllerlEJ)pMar z$X_JmA9@3INauc;RZj5f^l0$VBZtSgLl0nCjx+Z_Tv0R@AV|AOl_b1SDADnN8O^<6 zDidDQk;A9+KPkbV{wtS4F!PEUS@Tjv`n?S#^CF=uv^j=o-c8k&F1h64w0^=y)b<6_-OHNKIJ09?t$d)#ZozSSziP{j!u6^{E?n znTdGwt~{AVXf`=#boVn!Ok<|<$QD)wI4GH&-|8@!Z%z$siY@4Y&bq_xFg?qXLR7oP zJV;$PL}BR9(_V^+rL&&!5Crtl`2*Q_MFk^bYN$Dsl)hgUh+$0LS9fUX^218My#O>^ znNCmqurRJ++{1d96I|O;WUt#4tR{w!%QV%C#LXY}FIoh;e6`p){#$DNHLV`tr#3Sy z3~yBG6r1DRS?dh?lz}8PIXQWMH3S=o!nvi zrgtTU)P3lSU}?W?u)70gZgz+ZU!KPvfYYweFD;w#L)5A*my<)rK1bgmS0`;3M$sGA zHrB9RI5Nl*6mcg3x6glr?13==0nkl~jMV;0$Z6gg7^FnA2Z}!)Z|)hmPK?p#4Uqa# zR4Qi|^@kliJKN=*e&t?vS5gj9Q5L6%v)s84RT(=o)G6m&h0W&aqP#Xq4Xx8FCMxnH zXJI79Ku7W8O`>Gg!SHs8GJ}y1kBrSRo81MU<*OFM{DYQPg!3(C`mnB3vt5v!0mD@Z zxjIkxw7HSjEs|5(QXA=-hLosBPJ)vEAxKJfuY{$h^_KYF4JOdGoJ(@c=NPEs3>h)n zysNPz`Y^i|Wv2cC0g+v26M6A%T&($&UOq#4p59k`XrNGf^QMNcv%3UZB<7+;8Od`; za z$x{o9sl1?8TUBfeE6CcCm+H{$h5G9%z81=3q7#JO$4`burxld{s;bk>~pv;Xe=(8QGiLcn)S# z6gbm3^Mjf!MZwwEUWAk(D(Fs&4I7zzyq=;!U|k*O-5nfi&v4e$FgQIzC1FDaHg%Y= zk*T?IQDK0HI?x^5%IfTFAp0ll@Wt56(jcGj)eK(vFNodTtVYwKshqWg1$3OdCU_&a zY|B~Pft4DOP+Lt=3!m!wrTQ4JDNF;~&BKY*S8I}`RWBhH2Sng-v6d1a8KT$fvJ?Hb zLuOZo)9qJ-k~3GdYJPtMvx1VGJyCHA??tzW8UTR8lnx(t;R9oYpDp{n@V>;mf+^Df zZVQi-vsG_4TfpmAjmaHwdZTUBVm|ApwB~d2;|KU_*Vn&|_9Pqo?`H$3H3rZmWhT%yYs(FZ4Xcq)o2qun)4>RyJiHIl)3bol+|@`LN#cq0U=Am|!aaOp z;nxw9s4;|9)8SKi?^CZpY&#V8HB7TK-CyqhoJsnYstXtK5@8kTI~@msij7{H8K=Hh zrM(sIF03nxEs-lZVW6KQ{Mars+L!eCJ81RQ4+=Sq*e<2Ek|NMhDLpgb%G=+XOJxiK z^<`0%!mXJ!AJ;&WYFrNX(UK%c(a7BO$Ih0}{ z+caH)ZfZoc&d}nt^L+UAGh78+&0?Ty0?GDz0By?#E=PKe8oO5S2q6q$5VbH9YTn`y z4yE}HpV9dfwSNen9JZ;|unH2s&$DX~0E^EvJA#Dz;HJO~S&UlnbM*fB$xhF?1ceg{ zpc9A7?a3;MXq#Jw9zYqidJ2ol{Ka-S`?XNftyNEx9AFvUOBbZK>uL^=*w`e>L0F{e(P_jh)<+=$uBVf8K%qEjpn3LEb$idjuQ- z=-4ebI5{4#+PwH)ffrXd>u`}G5gxN1NX0g4_IrRlKh-}40RWS6ZNnCglDU{F_Rbnu z#mge{9)I6!9ojfEZ1r!a3lr;Nta=n58Zq{K-fDkhYn^NYu^-}rMt)*RM$k~L>ob}E z>J5VVa0>mvy2Fnrc%Y#0>h5917$)%M%aC-2n}c5ZwM5 z7l1KBsw`_9E!Z!uWmPa*_tk#HsOvQaW;aYh4QtdV4r_I2RV*$7ty-xMxEwkVG-6OU z8xTQ;A;9K=rjN=T1<(ud2F`m&p>je_MJTwY({mQaKgJPaxdJ`#OAu!0FgU*X&*los z+_C<|*p5`;fA~>t8s#7aQKJ{0g8y;<-IQQ-%wSS#*x>I3z9V6uj*s;r!$wF*flp;&@y;D$Ksb!e|>V3-1?7o9kO zc8#ur@$}H6FvE&TzDOuswBJ}2uq6}kIXY!XoehY4;s_ILXKe3^Uks2}DL3(<>Ue#= zS%3RufBoKE0JX3_`=U{T{x$W>>g$a^4g(Fd)hQOb)&mPzs+VRTchH#Az?e#(t(rH0 zMVz$=EsykTk@m@=mmhtiOA-+nHsUKTouY?2r(?=>4@i=VnLG{itBC+8 zg8}L&gCYD1+H+3{L44HI)WLbpaqG*dRyh-j zXVx4?AR*!e zmYP)J#x69XYxpG%CY#C+_EUejvYoH}=|R@2|(3&-fM ze!Vhc(p)8p&pf$sy`UFZO`j*~cwo+uqIuv)vO%Vu0Yv5}0%w(MZaFd~mr_^)n>leG zEerLsxn7FYO&s=rxB#A4QUCC3P>NQ0LI*&gy3jC;%xkOcVAAx7X$e-cF|6pOQT+Es zb;i?}xr~`)&CB;#b4>8vI0|3cu+c#53K~R5)Sis0UzOnjDVQ82u=5~mGHvl!WDmlv z_uQ_`EWbLxG6+<#x57dLr`V;eO?qr8P@UcfAA#e zv9=}PJhHl29RnkB%FM=ox^ERJ@>-$^*`(hzYe#5}qu|gi zQ|5|W&w*R1a;8w$E#qCr;b8qOH4XQyVx0Nwrq{E!vTm%MGShQGq`SrX5l5nmKLqIC zZ}>^(h02%|oXPaa9D-iPD$_!{~ zpfU3%U1KKe@fV=D=G^171TFdsdfUzIrHm!I8Zsfr`%em&K7NahfBlqoGWa1ivrw)f&;uZ^X4L4qwr>(RU#X*@HJ9vdz{tji%E$jAEluV5 zO3!H<57^HZ@>k*tSbnEY_YN4pbB<-(6nLGw*eDe5C^cULL?%)#9-(SgifFSkWnt%| zSvvsf4ge?-^^4>#1`MhN4?vP+$C7Ej+Tdm1Sf7K_?`^_Ac#smzb9sgcTZ;j z1~-69SY`bE*X1buR`zcY-g>;B*$rvm`MXyexZXJAXTxNt>-|Y{MpmtlJ##$spt+NQ zYs>0H9l=RWl5F3ijgat>M_p<4V$3<=AKV^48j$A}9GjgCE)m_M@dip#mq+Hsk*x)( zYFz_8g1n5Z0HKc5x*Gc@;~?KPx^JR+8}=2>&!aSveBvIq2SX4x>cx-Y~TxkI`obd5+cOfk;oo0Gf{F0FFFjbCx z{aA%K`t~WNB}o~xFNU!5exfVij25(UOIQHN>$)KRMH~U+W&pCSs5Pl`eahi=2=Dp) zo`J*VfY>H)mzAUp4#f2JE3o#)jP81)O^R&)M8&1YBo)8{STrq9ce!~N!1nyDDhfG% zU=%6|o<`!9y&}mxlcol}eLp8>BMu2X!~qeB2loQuFBu9gw&eF@(LI1t_qYdp?!36k z$~zR%e`%$z)$%)8*!k2}4#+eEJO1L1YrC*P6GF#%MN%<pT-aEd2y_=&t)H9!8rP9Mr<;Jr`dMC+RI zhw07m{=|;%97KoZ9I426QRLT~xPJhz$PZEtrU}JP>W$A)CBWN@7cs2q-fi*C{DA2; zhgh+InVF`28y9P}6nYy+uH0a1#$%1^kU@)v2lm`9DeDs=9uAX5Nl)j`S$x|~F66FJ zyaJ`dv1jJcQ$l&q>8+q)kK6~zoo9UkW9KmVsjNWk_VaQi9y7Y^i_N}%S$)0d@M#Zo zup|?JV$u4iDG)sGmvdK^xhwi>J5Nj%e=$C^H>|Ns?|%F8U-mD|b3N!)*_Sf-w{?QP z&yPNUKzRLNUhthB+i~Fa(xk;-9Sj{%s9jF;s(*T!9l)cS$K+oLoD>BhY?zVJ%68tu zQ}zl=saBC)4&boe0Wk#-#&{lmEzftqsJ*kY#*qY^u1Vk}H%tiGz~afFg~P?(o=A9)sC+pb={L}F(ZtOa5YrGx z0~MidqRo(BO^gl`0~OPvp>qPsik3`ZAFao$vSZwBvlWlY6Q5PD^@C{(#!^7I=W%NQ z9Y|q%58&(gK;EY;z|@f>uz>o1eI4xp-6C>otty#`H^JWEcQb% z!tY}+lxOa&0I{FD`l@nYU18?_6&I$H#qieNU5?asdkX76z}4YN^Rpi?nC!tq$2lxK z$_SxAcK@#bkl_uhB2$t~$$H@Lxm=gWhloFuV)q9>8$#{@0wsW;Ab`SqHUKXvN0$T* zx%O^`!T>6Mf6g%T<_^l5-DUa&tWPIOJ)irxg}qO8A(opAg@Hd4u}pLJfbHCOxBG?u zA_WbTLN?2dxOt6ohdDSlzn5EEZNCWLjvpP(zi}xl83SZ)IsJZU8e;)$;=sE@2C`C{ z&d2Mn_2Bz;k4XR>b+JKV*SY2e#uTSw*L!r=sK|Y|Q zD4&mu6p;R?_-McCTg~U|o+hB-S(rhq2gL*#E8x$t>)_2r^Kv;gfXTk&$+Rh04G=?$ zts1EZvN8Jy1|8dEXE1UdHD|3yf3QwD8Z@(w!rQ2!0X|vr2aXGZMMd-f!dVBd3Omeu zQ5M-Eg-o2otOlj8d0Ufj<7hJMmSA%wo8l9YDgYjG@Hr))SmC@p6Axrm-f8TUn{%_8p&@CUw8r~@+%f=kTpVx$3i~y???SYr zB9Jl3d0f@3<|ZHzQH{u`sHnrBJM9y&VMEz0)23fAa5@a?0@Ko3`nXzJRz@E3aCx&H z(wwj=)n)nh>(?IBx)MKreKVrHopjY(0F!*_%MWSrpp^%M!JhOR?^MqWjEv^wcl#}c zP`su?;rtAmo!2I1-QAH-LTCU=_Tsx?uXYnp^HR=>6U&+%12+ZZXAM& zxAL=`4j3K!4fdXIEORiZf_%%m2g>Vysu-D&Yw-=dnqHy%w}T8U-CIAOo#yiLBwifm zO27CEZi_Cb;{2s!dG7oLNe-rnm|B2bzR^rd74TYRW7#>R0z4WyCh6;05u`0mbBob4 zzPRN%=CEv`y;K0iApU8&XyWQY07>QgzkeX}th5-}JneqyG<`2e^)>XE)Hn|J=#7PPH@n zDf_<{FQ6Y}?=D?^K>tRw{?o6&A1iEn{^z{^`(}#V74que7kwp*svFbx>OYMGb#t;N z#8$}O#=!jx|Nq;JC}Cgx+o8?V|LX$QT`45aDL0dy;xzbk-@iy+f14{RNO1EbQh~?N z{J+i>_4RRYnI*n|;QrT^jlZ3k_0VfICpr4x2B+4r{J#Z+zQh@Yx^gd@F#cWZ{?%W9 zb{cY_6{Eja{6GDF#4&q^_J1G$`Kk zVpz<0H9lr%Tk)|Z^^`Y!knbq_<s}KB{Ru-4J;CsPlBb8ACy~)j<=PEL}VZ6K+y{ zZxJMtY{FMUF0GCyqrT#-b2cmH1zPKBXUeW!X{wk|E4|vTr|*FOad>mj zpq$fa+7n*m!V+Kn=4-o^UjD+Dj8h*~Y)R4ZNkX-4w}(#RE6ek5Tgih#oo_unEEbx3 zEl9|)TYY?K{y%*&a&z6rBQ$wv0~pQ%{A~uADa3F5Z!dOLREq0dBi}E&Q^o^)zlP7i zLHXQ^&LObj77wWCivQVo45;>oIq~Q2C6QG>0RKIIH2{)@;zi~l4dmxqp#asFbbIIK%GC=% zqu%84C_^RZ#8xVDDmB&$Nv5aptfW9i9WV2wLp67!J}DV*RiORfk{6*n$OqijyZ|PappOPNu0ISKxWaVblK|@6OGm*%ubT z*q#7Kv>vPUZ!6f@*^Q>HtVjULV!IhX+Ri#{2I95i{@xRSOXgX%{CyQCe~3@eq9lR! z|>>L=^C`2r75^t|7KbyPo- zZq$8Lt6o=09WN!O?a$V_m5t5cfF{7nX|4ShD21xQfDgPZpdUe$LdpM{v{RcBOjMEe zsBo}GrOH*bx5VZK)&UN1p=OL!iB7p?P7zi&$yRQ-O~%OPkPYBn1+FO8`$6J(fxO>1g@d$5lN zxj%rf6AE;ZMJ)o68Jpz2cf6TyzDamz5UC-F(ijl_et9C+^WOi%^ChsyR*@6Vb**QM zL~vGLXRQ}oQuzL|zS+li0;wY1!7$5z@d+tbZFz!zRUpE(xa+JRIfx;`lW>{{9y@58*ViohWC||iW zmSOSE?>}i_oaed%1ejoV&qC)m6z68e4|vM+AHR9%MzJ8vllO z052~&I{)Z-h0{@-MWPua$G27TuEAVOB6}XZ#8K>-sn%dDG+-Xm`8_a|74=h_=_Tis zt(~5TWbUpMFCep!C*+h(4_p&R;~N$qC~g^@`tnrtQ-i6Sf07TPvuDvFrTMDFj@J9~ z5M@~yxloV|cvFb1g);hK7$wL^p6f2!y7_vLPPQPXbP*1^*4xsu$6zQc=SgJXMB_^j zv)saC^nKrrB}J`NXxwG`?$*BH9`G<+wV|=?E&_3hDfEDkUke>Q(b@toP{Dkj%tyFV zJW2-!S1}oND5)tBWfIEN!U#8X+1cgHr|Sr^3{Jzhk+KXf{-l8@2~Y=je~CRJy_I8A z5Xkgt=}23cL<^@MowjWt$ikFb?7XjNXPhzT#v>6uTVTp>t zqIGE*<)or(=+}fFXTv9fYJVgB#Z-c?xp_*DhP=#cu|IWJ2lT^*an+Hly@y_o{?R zc(Q7uXf)^AgY!0-T08KxS~~S$BS8%Rs5|>KjelVKD4CtJ#@s={S+e(Y(Dfhqc16vM zPo&P;JB1u(;>{bs+YnQzjJb7O`{>TtrF3-4N@7cZf zdmPTR`c5q&_agsJaS zw6-y%(f!z8@qHdF@M&iaX*(I9cQ}ofVKlKiykCNl<&N+)DVp%M$S{SBHO?kJ0eeCa zL#tSf)%5B+PdY@Ri-?!}fPR3_-<=n`NRDF~*%fj(s&?g3(UgCa9)>7ITLHwS`C4Nl zXRw!wXfiI4x3zl3ZZ0?hb&9sK*etu)8t`g^Hn$hW1&1+~G7;+mxK+U4!Bd~XrDS2? zcRsJ|kfGb(l2jmQt2^;wn!On%Q$`o+fB${liiM^Kc^^4>^n_TzQ_26@G}+1tFh9J! znl7w*KXlt>zIM9?S~~|%Y@~)8G&<$(E~>rni%uKBoP)Kx3m0fCv#@!*n?`i`%&&`V zmhI~C_&u%kY7Vw+tcTbv95S2HDJaF4#RhA4E}d(t%-z88h)zDudXup$U=GXJ4NsZ_ z5`&eMYp0hVeA-@MlB5fo67{)*-l8l)-NxrJS?~qpvx-avBwTMM$qGbm1z5g0!mI`O zUOTSnLW{izt!H=`>56wqG&%Wb0#HC|pz*0@7sCdxKKuQP9?scymY`q1+`ignM_UPW zJ+3xcydPNpn5vfk`&8xf5Atrx_|Qay6Ttp^>tr>s2iYy!i>`U#%ioTwTG@<DMg<^mK(Vl>{Z+Q^V$Mmlnn zi|&W%Lp{GtD*=Q?o_Wp8EcTat^Kgq9KXzt=BhXXiRmM3nBh0dGE9|6(w_3r~6BIyt zFkRz*4?kI10r)Om!~V7Z9Q1aA?K$IVvEr8IjR8T-4j9?@D8LU6e zjj^aaZAmW$WKz7glNJhHd(S5>076q?diwUwy=0MVrG0SM+0*^mBY;dXsN}hhaSdJ` zFWfBI6m|j|VV3#+0M)@uztFybmj|d%#Gr%LYv3Pqt?#o@^)k2J#AhmeRWH z{CSFyqBmDO)9IS^ z!Cpb*d?6b46CYCjq6TFpmD`|MXF(uT1)w&F^*@-v7E`|Rvp-cSFB3(%jw7j&CUoF(j1upJqU5RE}3 z^yB2biS!LW6K{vZUIlwwEoGuZ zx%y`#5oa7p;rYl&b4^jgL|*by5zQD-BI4k_d+5yASi~Fcg;-UZ9A2-foOuQKJ?kDG zC}eucaMfDmPkK;@?*E)P%{ChUIW`fve-HD@pLR4cAmXr`SLXAnaZzK0s4!hI4wSL)ENYYR_Jeqw{&xF)&twE*e8X-l%@AW`L9g7V}{G^T{{nfW)f zZC4leEgw{C9QA!D!-HTo?k~)vF74gD!YIG$PO7cXi>6V2ncth#eq%}yQ`-P`3ZJZiYF$$o7&0l8#VG$KoxeAT3KhpN9=RLV(|hSb1-SeQz&7)F69 z-F6Q(8g@(4V80Sxe<0w1b5t>z+^|aQY3K23%uv-MEl@LX8SH+UygQ#suc>z-*9!A* zW{&6axu9IAxTQH+Q;VS~p=UM;}I;7l8;ZCofotI$43@f#T? z)a>{Xkv+?B02N$q4CLbbiJlK`Jwoo;*6Y@3~vq@SrF``ru*(fleyE8 zCp*HaWAj=}E5k;G^aE|!m+b4#lP6nMzWOx7`~g&Kn=H{PZ*OZ2g(jPtPR z=A`Y{afcSvlXtyFovty(BMla+zgf|-!_sMWYOQctuJph9eP%`5eb}4B1(|Z{!vdOH zf;MN54EgHEK2`PTsv4~G>1A$>Hh^pkTm$yIUutP(Stn;*$VYP_n~R3&rhqHn4;J7> zY0I7dh~oQHyxQ0EPF1MBu~S4URg-f5_@%6-7Foa^VH%?@X~D!3nRTT{kQsMjvcb<9 zwZY7SqESorq4I4IsIqVFP5X?cSM@~Fep)4cB@NaIYSRrOFsi&S zwqg4X!@KTWFcG!X412+V9*<^UfEi}pBp4%G8}>o>lZfF6-HCGu=R7cPsL@t_%(_K> z?js~$zU5AKV4Wn#{T9tXOOE1$dD414oa zP+PH}FyM%@^^Jjum?((YfNesRB3-(N(D9YeHNcg=>*k;!;0tJ5*aaI!w22f!XO{!* zoeH@0fd?G~yGEfdG&Y!}YZ0YsBP;lI*DKB3X$xJX$w%0Pigl{zQiywE^TRE#Jf#}( zqfj^V1Z6mAuJ&B3Rr%Q7V8&cOX=c*Jb6uUSSa{swCd?d)f;A(;{HY`v3U24l z2)=!hNg&`r%qq_7wdD!Esx-Ow7X<+%?dNlf=fggVr_Vj62dAfZ-7mxfRki@F|8yfG zBZ{YAG0rW!e9>GOn3&M!<{$txZ~HybHX-i^BoAE$9!fbxD?%R2L+&2Vw+A^sV5SdO z*nOV1B{pudoh}Bh$EM%-XB|#{roKj^W?G>Atm~@hynkfOtF~)=?}AGd(OpKl@aC{T37c*%QC*(u0i@Z|$qg@)X-N*?WC!L3%HnWR=zpwLw?{ ziDNPG^U!&=wfE9Cv-)o9cHb9R;&u>Mc<8{skX2S&-!ZrKYfAQaS-qfPr`p1XRoc*Z z!t%a+gB%z_s&nM8VVe6b#W(TP`!kd+LO!dSidpNwkVC#W*xd=NS41uQV_L&5F6##lw~M>O=43wGkp&5hJn44m6Cib# zxR4BR4i*H`rt50s@iuf8f3*)-*KT9bWwu02#`L;=ljwIb^whtcM;*8H2W@KB_NH!p zvj$Hix5fz~{OIlTSz}CzBA`{94Gv`g@y9PKe&Ee3-fDLETi?ZVeY$Ht>!GX}>XN~D ziBfO7Kq*5q_)08QKR4ZqsRR0M&1}E<>CI$k%&BT;Iw!8 zk~Z6(K9xATRWDhPb*_i?&+d_jZ`5&ze;`A@jUr0Cn;8nZ(cl4lg-t6ObP#vBoCmIG zxjdR;yoeTd|EdKwZW0pV%c@mp8B-=@wZ;X7dItI(@A9`Is5cC#58J%UIY$!4)5|6k z{-j(D0zrng9Pz#dVn<9vzUIM8j!^(oZKR4bgPAtTip3v{a}mHl=HHn6yciiU^zh@7 zo}#e-EhhxmZF%1O%dmcVm9M$Wn1w@$e5`aH4wU`p;+NGzfK)y~WkZHyb~SrB{}8`D zU?=u9DnX(4g6mxtDJ)o{Ryen_M`t(UQ(GZi^p&fJFXKhp1iWZlfI37&blP<4j>lw> zw!oGh@Hkmr0K%=3`CfmRI~4+GV@ZE<$hn;1lVX*of}juQ)&?WsE#7%Cbl496e0mV12!mvDUCD}~`TExVI0>vjGSmxA| zSI!;1WUAgn_+F{07wAzT?a2`K)sKmuFh|y!n)V&}qPncx&Lom5Yd_PiEXE z{0%A~=x137wx{fzt;m#R4~d#PrDN3ph+jVF0&UH-PM*vcK?%)NtmZxX*jXLm=zJzK z#Kc+Iho9*6@#6eEBBddTIa0Snn|$rcJ><)qP97RGQfWkq52bhQm_MNbVtwPaxY?d>}R5a+G;kXJ^gXz1Wd|2&)X8(0oL)vL)C>q z{|?QepZ-h7@YAQIU$^m`(3-E}(*(ROhiC8L0gWa_8tKJViE{A_J(Dt`_f;Nh8!hL3 z_mFcd&|9k9okjnf4J%-U4P zGOb6l5FIewS`0I(fM8Hn5&Rae@zV-ezcw`2L+JkL>Id(1JUYWrxQZUC{nlYu(tDq` z*6p5#kfxl{PUy#UZNN>6VJ{)MkFuq&9S^Vf)j(gaua{S~n^38eF_KV=J6dDud zP~%&Mg12L)klD&z@u_E7z?cS`u*(PnC1tfMkw9v!nPQhk!X7Ov*Cz%h=kYq8US6x7 zGb}(&$7$;kAX#7B-24Lc3&7lWe&2T8<_2`0C)LW7q;__$g@uL1#We`=@ULDn_^h0( zh*xnkn%s+Nr(*C5sp({;BqAk|cuhUex_x$!eV%#gzu_H~-B-Zm)cD0K7yVpuk|E5MU z@%nQd``z$?Q+m|beRb#t8Xk^8cZ=y?n~=)I@f?qxoEJD^sDkT%WUZ7a6M(- zd>c^2ZJ0v_y{n!;ePGgy=&pC{u!aa+3e2pT3P+oLy&AAKP5!u)-lJQ~zmlq(pH7$h z<&%DkTCH|Y7y??h^p}Q0GbI%2aN3R@-4bm!!XKZ?Qt>c(>N-WV*mjY^Lz^ZS|8_UJ9Jz*oXUnd4YL_i96Sr?k{?uiqV#ImT1!3s z7~R{Y`}6{ECg(I>f7w$)U)Qb^^~M+pxXaBd24 z&11DrFYZ3%tCO>r*fyfX zNZRKiYI!a!vz#)fG}h6J0cjiw0XuFOz6_Hkj>zcIDpZobK(#uj%Db}9V4_@885hZT zLl=ds<2?gvad!i)3$c=D`-GffITj`cIL4d8b?7LJ+;QM2~HuVVH|=G+OeV~dFrzZ-ShHfg-8QQ8)G zi4FgHsC+(|k6deK+({ivf@n+|?j^Nr`oKiP)y_y>r;L_XkvgFu0Z^8RGrVjyOt)HNstFGS3UjF%O9}`- z33K(a4kC^jGKHcTvK1Om<1#{Y$G%fVHuj)UeJ4_SsY+ST4XeOMP3z^XU>sQ)Mv$#+ z&|YgtkD>Xoog$xBC&FJ-i>$8Iq&CEg{wlr(*mWB#(#7*;FToShT=Z6H#nDG0EkhtE0q_eL=`yWJOBU{^ z^U-m;641c^a%VY=1(EuuFr>P$Z1((~a0~zJ92?){+@Iddt+MSWm^_RCI)y*I?*X0o z;ESF9yE`FJw{^ps*FruBl)Md;Xh6TK2Z}M>cLB!nWVOwuBy;QT*yLI#zD=apV9xk-U56Yps$E0HOU^O*U5=k zz#1IqD+k*-HhlqiJ9;q3_w$XA3{J$iNY5^-PAAeP3@EjKQUsGwZ|RYWVVE~*7|-ya za5c>7jnOm3Ly?vZpEyDKOj+aogubW6l3fOl&KTxVj*>GI57J`!C`~uHjy2|d`N}nx zswo2>Xrrj4H@+}Tl__X+X!|=y-g^KZ#Q1P@(oPyn5wyT{0c#RcJVX;qT0rT;PYwH(^<#3zmPps)pp;nb7 zTIe4o=TBc^;Z^g`V40_0i=~LSx4Lo{>K!jaFxw6U=_8h+U5h^{qmdY{vqUA*qRJ*D zbpvuf+~*$^xY+WO6+*F`8y6|1MGUld*3HR660(ShdJ}FfTR!Znats+%ZVg3t#z^AUuVWMQ-C z<(gXe)jN2kqt>{U1A)cF&$|ygmmR} zR1~gd+agTsxP8RrQd@*Rq9s{9EL|7Iy~}9%H0G>}s7w8?8R{IpgR#Y!v;(d{{WC^H zP~8>t;5=$LHC7l38Us*DK5wmVmCQ1cUVZ~IJf{?>zOkfyAA>jkAu-j)Aqg`~@|$e6 zdgWrCal~|ns-j~@wAs`l=H840gmoj<^+kzy41c1=Xu*iKTADdxjHK)%LY0n{L;zt9V#~ZI ziq5XCfu5QH=Z|PmWxcB&gCyxYwD8Hzd^tmAA1)q59$eXJ@d>< zv;JJ^i#)S{$=n>WtY?B4ju)b`Rt&jwWi_@v$mVt!YqEOR(*AKx#FmxE!@I~i>$8L?LP~h z7Xz^M$2If%%Osb;q+&);H=x8dVBNvz5jGQ7m&?}vv6K*ld?bXSRf zo4@OpH>Qti^rCIeOOE;D>B))TubvkmP~r1K1W@LEt+{9nfetDw>hYbp^H#(9J8)*j%RHMi^W4FRPGcT$YXxc|fM?^M;lv4!X5 znX6y#mHx23M>>WPM;0MNN@H1=0SKgVj6N=-b0=a8+oG|g2OJerk>W2TQJ8X;Tkm%TBt{{juG~L(Kk4Te ziaqfdaJcCEpv0?N>In-Yh%8KLek{fy>ZSVd^Ym@NI@F$t!X&5V6V+3aS|gk!?XSGD zf^7YCX^9!Ua7#+bUCB=Whp&6=qzocqu`rU&#n%S4jo-I8tnlOwbA)ge@TrDARTW(a zNAu}i*o8S^;U!^F#kGU;{MHoU%ZIq-)ljf+m8c8ld3>-Di4R{xgo8>Q)2cthfoKP8 zL5Sx0T>hVEi2;{jd%ET+YPh7bfdSDhT~`oMUMkX3{sVt35}mpxejFuZBudA$-5GIx zTTnuSMRq>~M)6ebEXkES)tAA;K{X28)adpw2H6HlHZDl;yz~Yc?U_;`m|Ya-2;e{wbNmsTH1lP#*NzABvR9st`}R zArOX(r}9BSzSYnyhJhBfidB(5eVokJ!(R$WqAoamRGv^(LzEaUZsh7sW>ti+N=R?g zqJoC#vl0m$fWbAB)RntN%t$D+0X(X^)4c&Tp4Q=J_ho=XjQA@{C+M#fP+;X@8&&WAM z2}}3$*B;vxhQ)f3fIuL6E;C|`aU17sE*Uqzkjo)Umkeu!As@U^}x9ry;$~aM%chu2lw8{>U-oi)yA~2Zs z0#P0wBmm_Ka(s?{v!NZ+9AK-tL6ZH4x}S1@hzmn#rSpkQhXqn)pEgR7;Q0!O+x0$) zw6`FkOVe7+YC2hv<0<0{5cE+>5tHbq7GtLMze+UT{)LFICyR1Rlb>4CW1%Xh&*q}v z&J}MyA=q_FO@m4*F$DqSSY-0LSD$R@TfpzABZ-EI+IxtQsbq55PgMZlYb&KEK}Ds= zfe8c>nS?WC`8Wa!4GRNMvFA(Co4|)x6%_(80|TX#L8oCrp=*acTA)lCM}wo3PpY!_vy!oZHXE#WJQBFJ8=;zAr7c;4-N6o2!GmD~-KoMoohIzDqrA zQk)8x2XbS~JUH^@hWv^M3Fs_z;Caoz{*bx102p7AlM^SxLIb@_V<6XIxzLu}9Vakx{5(W5X! z$^)_~S~BjWUW*%=Jf3S_IEc|^lHqH7)z{Y&A4pbnu%%y`eB%0qFSF+t=8$n2XBqyb z;H;R#G(N!<2c(or7fadq2~P&ck5W;j_dLO*bA3w#a1o}J_PcA;3uKAiHAik;57F#A#rKe(3LMx<%E)5dkow&DHwTB7eFQ5yw zBF=ZeDgc?uP@-9$6H@uis*0R4Nzxdi2eMOdzzY>(pi5V(%&s+fn z&9tgno0;bbKeDjP7eVb&?{D4ST+6?XO=hQKOBU{augH)nryiE(y~ zXg;Um>~@3_iqi8tx5fdCh8>PrqW}Sq*gQufW0&cOM$&{+TI%(4CKlUiX(5H_;3FZ_ zS(PkGzK{gcU<0klC89K?hW38mN;pWdnv z0?+3>GJNblO^gTu2~%JR#_{dUP*nx;H~JG)k@vkPkHR&m(rp)qO$t;ASWoRn-;!#@ zv1qV1e<8KK@X2PK*cov=%9uy9e{HMDa$frN_S{BG>&>UJ{Kt~i>rQBAwZ)5IFD?l` z{q~(6x89>)myWAWKFE-`(z#n)Eb2T;EzAm=EMw&vOFhB;6Obgv<`)($;uYwNzKy#r zO{T0eqUbWBw4%qwVTwNG!l|#$6WFiddWG6-Dkx}Qu=yTIR$Z0PM z17cS#%UC$+4@A;Yd@oU3anZhO4(#eV590%1-^zzs1*^iAiDC@_V1FhRc8OE!SBd1m~l0)qkO*~@^t<5s0s%HQkply`7dSEpH9!jN*NlKeu6-!H@ct&z}`Ne z{9J0-FN*2(Su+A^l&6T@O$YEf-}Wnm)&IieUnku$N(tq6?qF4!1HLrrRHmCm{Z>Hz>_X)YP-yfGcciwVL2p$0m zhaX5gViX|%=Tus{_$nZ0>z>1K8XgN zfOqiL2Sz?kWf~MoEY2xUM7nnv<|2dkuR~GbF)P5#alPp&BGMl+V1%z%{2mXyLRxPI z*R76s0jQUDz;vI)L(e3KX&-kV6Xl0sT}g+Jfw`akT|ZpdE@mfEFlmz!S0K~P~Y&HChQjejO*l|eENB~as?GSqeQ*f@I=U*C{)Q(qzv-hKLjl~ zb0z~eN8d15s!#C{56WW{+@hjT^?#;42M79ti6r8=yj~^Vl^Dgd76x9QD+Sg!fjfbE zd!R(h;kS)#08K)kM92Djrj6=>+m=#O*UbHE_w1P*1o%(5%n*N06qm8&!JZAo0q0NjD@V?b8(+nS|Qq+B7M zngy_(`C9E<7|f8*%<)Tm$yXRmkUV1}EMIbL#7H3d7b-zIh_44}lX4FERE#+(8d9w> zQpIs_^;*)FN4Pb{+durou!KA0!qh%Uy$ew*lM6%gXO+5GBw%CoGAGoDq2Cb0u-<&C zIthXSYdZYGCo*9ylN@a=t&jLJsZ{;g!P@(1n<#w~o~53ucs`Ur>aAi1PF1SMIh07h zX8tZWCv`xZ^oW~lnY}CSB=rjlUNNl`=zy!7Nq9Fx;%I@fuV+5W2hP5-l1b$Px%z4! zM#Y9==>UnBQVl-dVB13KbH~RFb-mII<=RODAX_l3@FQ^s*Zsa^zvI_ma5oE2{cY?@ z#Zf3$1Qs~H_#Jif_GWU}yM0r0KY!;3N`u->0qj_BpO-%mUawFo1~P>dymet?XQEX3 zX1I3ECTtYuDn?ugP6K`&D|0VqF?-fOucnfRZ-VH zd__RIQ#vH1k(Q9|?(UH84ngA5(jX<>Al)DWQUcN)(%qfE?el!kJHGP|0~q7nbNAVM zuf67)Yfd8Ded5Id0>%N*Mp6B;$PfcZT)njSU~xe7(i#+2n6@?XXqXhT2i5>AHn4>z z(K?b|ro)y!R4$VXp$N^3=0tc2(NtH*gOgXSDcPJ~hl{B=1Jpt{mx21tx$1`H3N*zJ ztIbB`+ih%cuz^EwG|zUM{1I{N5b7>nFJntfTln8Mu=+~{FqO^>P4s2`WUbJk-{VZI zn89LrXCE+Y)qn}>#6}^m(-s_v(TzBdZGF7r{|5g1&G=-`813aLpY|#n^si-S&Igok zL_MrtRLf6wT?E!E4(hm7IcG?)9-zkk?}p!$NQsXdRB@m6w1{Q(`yQ2d;XTrvnN8`~I1F2FF@Si$v2h@b!BXS3?g z7wUr2xBLPfq7zY5)+K7C_&mYeUVboVxK*CF3oHI*M;|F7*96F(Tf@T-J41?)_{|5bWV$0wu{F zZ_}4ArbWZhxD&+l#`;L_n+5eNKE4LM(4YSfJNTOd3}au{Vb1fXX6IcYOTca9U9E!R z$J#l78Q0o3?%NpNOS~f#UIkG|%Huk1hKsnb(Vm3Y(dhYdW~I3GRlSu{T+>qJzvSTs z#2@4mhJKf%WmDc8{bRto*%AV2U2@;fB%9_qJbpS-b@1%YMny+2P}x=VKU0N3q~n=w zYvPA3j+?jFuUDRTRZ1R!p>tF7k`;$9P+Sy{40Bp?-rCK!qgk2MK5uJe@i~*UL+Ho$$la_n;&hAUtszv5kbh$f(qY8 zb$O1kdw*q%h@aKNv10vt@1eJe*3%?mx7P0vkydZfyfznFI51@*95-6-U8RW}!8itw zEz;C`bQx@dAQXFxBu1B@hslH1e6d^ij+vdqRG1)9Y~(L$OPg_4+1FwB(mcbJvh@8s zswJA*b_0f1Uy6iYuVov>%8_&aqEaL~R{KQJu_#Q+p4tO?A0k*L_tDjnGA4ILiiA`` zpBA0L`f1q4KRKv!*Q-Y#%5|}B2f7uhr}4gGYhsNuL`V@@5z~rqs$IvLpzsJoVQ2?( zmpysgg6!&EDxu$?fxgINezU;|v2_piu2jfijb{$me{kd83+EKW4*?HbREY zi6j*TW$Fkn$~8G$s*kVxoRl}-NXNLN^0Wp1p0DXWYM9mk$J3HmhEHF>*MLV(b4#B% z_pLyewv=gxEl#2cQc!HNG;5qX;uT2q`(>ho<#mwg4`Ty=o%0c%mQH#Dx0y4^P5LE8 z9j_nYGU;_V3f6N8c@?M1@3op~CyK?9(+8Px<@Y%T{bZHn(|4ANh;c{nZINU}0nPY2 zX}md+w-87~k1VLL)k{=N@_+tO3!~X5{q@_&JnJiX)4Hy+#i*&W5Noy~soc_19w&|6 zH_~78cS;!}b3v(kPhCB36lwEU4ZkLpR0Mk}6B-Vq9iYBb`UqEXyFg`{J2gk%SPRkBXNt_vG74M9H6^gC|b<7j`%!u8uP38-Y%oxq;CONCY)^ zskxV^DESbKX4M)`*B_d%7W_}pQ(t|atg_mAXF-xMjMwrFS4<0(nJ<%6?Cl?nyzQ#z z^e1uBw)eieCl5q3B1P+j{c>Vd*xq}28nStmB2K6!S?)(rCn4`z1SXo7XwZv5 z2@)_d^M{BUc=$($QyEYBSLpC3_!n5UGvM=@oplrfS^EhXzZRb9$*Zah8wDb{!X?E} z%1)V#Y{tHh;tDFvt_pRwbu&II?mvYPf_K%cJji;C_|$y)o? zo%RjQwSPJJnwj0?ggqSsiI>|g?oPiz;S2$vN?*`sR@Qe6fs|KP`d#E*?+k{&Kk}Rb zd-ZF`2llj^(dUP%Eeg`uSCB8G_y&I>t-)tTrp3gd2@rIFu2!FsN|V#ytUdkx-zy8C zed`YX=S&O?3{?S-HbB<rGH5YE>aPx zJlXxMq#IK&i~ng^>rsm?Mo+B&#Zl+O(88kq^=EYdr$dM5A)!G(>r<@1LQm@yLF8EB zJ^!|IU_gJ>y7D;E-`{`O*!ezX2uLq1sHyuMR2%vo`#fKPJm+Gzy4$}~F+Ly2DCK(H z=q{fXzCUVezfCIKeZ0Tky&D2LM}F5!*XT3}PAeTN9N2BQ^4$9!_(bPQbT~*MKjpdG z&p^_4R^@+r1H8hP)Z~~Me`CO6M!WBTuD-h&5ZulZvJGx>sipmAT9?oNh_3itmO0!V zSPC^ZG+e!E(Ph$UE3R&SXf?bliYOe(@bvcbKFCmTrcbGBZsTfX$<~|jpa^pH7NH#7 z-IpbgK|gHa!Z<8Rc9G2X4X)7Siis*KrEw$%EGVH`QaB2!FYww}obtM9M22ZZogc0S zo9jwTk3Q&9q`*WJ$F6$9C_}#MG($L;=6Nv|*nK^ZN1aQOw$xmkGgQ^5jOt!M5AQ*} z*X|hcr*u5~WZ4@>4V;(c-%%l-rvB1z#*g9}gJkRz2C_s;gKa0$XRC)*?14)!^KKCV zAiLl_ycwwym7~nC@78Bj6UU)ig@+>!3sFLO2M{!OO>)3u^#IsX(VDH7jI1sZ1cZ6C;4NP*3ytXq~%BCBFQ&BHSYc3=Z*KfdQB%8 zk|rcpE0+zzpi^vJN%}MzbP-gXW53ee?hC1H7nze#$AZhq$5bf2GvWjIwgeBwkV(4= z-_>Luem|+O3gxH{G3hU>$|Qw3PVG#CUuGqEE-;$lT)YM-xT`1d7ov_($9OT%A6qBn z2r1jY@VLYZ1DG*PKxA=PNV2H)Gd}Czd(cviEtn`y5|4YAT0z}?f_jxm5;GN!L2>3Q zJMKXbSh_B^-eK+w0)h1*;UOhdi=n%O>QiEYpP{U&b_jp(a9E_@!RLwN@KzeUgkVt5 zO}`&sZq2ky#HWcVoZjMcfA-8;=bhdF?i6eZ8-k(NoO7RSLZI}e{i4ne&PnfI)e zN&j6p)-!Eg6s5(;70-S`TsG)TK2K=95-(p~&Lp=Zgi0ZyL@oRUReg(SYS&azp3G;N z3#|{aL)qmv7XV6M1gC^KwGV01Be!4M=E9=qV4Py0Ko2w7OCdw|R9ObfpqeyP;c4Kpiq{NB9_RFezR)BxOXdky-2ydTs zkAR>8hrM=v)MA~1Xq4p?W~Nw#n3hl{zRDdTmyQK3gYC;K_GR6v5KQJSe|H z!Nc26VKhCEZ9YR#dc&pwOZZ)mR`$}azCKTyZ0}_rs~84HL1_eCc(2~wF0%Vy2n0T_ zz{SY2xSb_MFO%;oeQ!>Awj9l4X0=kMnbqUWNRaoHhkpE4_fr*mqqPkw)-ny(M!1fJ@^X5i>=kj zMRe>#8ZUlW{rY43>EgT9YbD;S^}Q*}>!%x-IV!1Aok8!&mi=OpGX7RAGAwoQdbeG$l)rXkv)wWKJ;c|_uNj=!Upc^M0oN$T`!TfgKoXVp`;H# zo~xekSXz=z`~;qkJUXk=NI}>B>!B;6c1LOT`A+B5>!h|`T)VbOx`*edD5I@gv`9qDfZ+{mB9H+a| zJ8vdw>iMn#ae(uX-?EXBFl#p_M?@IHawI;^e#Wo=!V0V0k%?eHzBlmDN1CkkZzgsH zBLtC`TrC^N=g#2KxV2t>$bW}%_;+@1j5dJzg!t!xswKGsCxcBSV2<60=u`K8Af^St zhP7o>p$QFQmJqCBf}DvoPLtO4_ujq9(Sx&KfvzhZUc;(nHNa+=#*vP3Lw_gnPFRIU zK?wyr#;%K8W3ab=WdKbd3oft>lm+vqgumd3@Cd8ab*)A=y!@oj(ClL3*4PA_gPL5K zqo3Ht<7DN)Rgc0}uI=I4{k>pL8bRoPgzs)&MFwk9X)+zV+v*(Bj zD;;mvR54@KV2%Y2uYd_8cs>-CeKXf-|4@d*UaxX=(vdBAzyGXTW?!TB0qa(U%bZmk zw9uHdQU!4k496W&1m!#Ls)M3;(9-AD-x@P#2eW4fsgwiT{02IDgRrImEw-x90Bs9e zOy=pEWB|R=YEG@tjARbz*^E_+3M7|`TslPjr6z8#b{I%$mB`L7?zQFR!6QwwW5KKm^d&Jjg9L<`9DNQ3^kl z&luI<*3wrhr|~^qU_U>$M^9~UfzQ~kO@5IK1ko(=pthMLZrnYA zJ42#TS`ama@A@haRyvM)7u|!`Z%l<*|7|`5Vjs{$cDU6%KR#J)>wGJB9ZQZG6i+wF z;1!He#4Sc7$D@D&yL%OOXfLE&Hd$IA@1n(QA=4byO@bokb2-7+Zk)n0S&VxLs&&6L zG{0BO?4s`DW^-v}EVG){aapUkC$&Lp7}bZo)Rpx*zV{wcBE*}ZWEr(~V;AF`Cy8jR zYE>$~(*{xC3%PXr^T!&VVT}~(A#bG|yc9;fFxqj>;*%RkSyufpgLLueH1Nx9& zR@)mk>371;8##IgX@nJx6`w^X^IjJqi!@D;*sj#n8_;KYZq3+M)Kovbgun&@XmJAG zwA=?uO)vIEBRwzAfnl^dd`eru){1=k@GKKHo7zNxfc~888pu|FLI( zk14#$W6ZITr~epFo~(G!st=LIsTpuXF{wVH_zc(v@mvIY%h07mzy`L>qe1rdHOHgv zzdAAw%D;gBdEnUEj+tfi9bdUkTv^L7Er-6P!b7WylO{6H#;Az;Y+v>r#0mjRKr{vQ zs3nFi6;l|C+T6{j+phgmXV=8q3h=w1tR7B-{N&{1P*5(=Q7-!hYkTYqgf1AU&l!3F9JY9LH3{1{;S`y!xrrz9Xgt;mDJ?gkqz>H-0$l= zORAEJhk-N!WT>TuPv|tf)2&q>r5k7zR)CF_sf@wq`F!V@|7zCM`*kKL-=xVEZf;JU zo;pE3Egbr9zkl9~U~u1GH+h9l`Y>5^v~)885UG!TU^~XwA)N$unG~)Uon(+N17<84 zw%a2lkWTHl@)!9nU>cY^!?kp&m>MT(m14*pF-$$DR3gTu-dU<{p&yg!D4EIM|(waoMiJx;tN zIzPV-2sj4D5ues~t`=4<3t0R%(Y&tAb5JqkdBvLFIaEi7LpYqqUzE;Js`r+!dQ z1c|4jgTrV@p5Jcjutm`XBBbfzYzbsprUG`=^uPpj8%Uyb0Q|A@FRH^L$7whEvz4ps z_PbGHpdViJOxJAVCSW@|_&iu+Zr|7;SW63tqh`=3E``^(PP0Sz=~X-1pm$eF^ffhSi$ z7gsw=(Eo#SzPw9u>HNWLAmDHuHf^b&_R>R@n%WH~Cg-YOmQua|-8h>jT$@P29_r?OkA2>(d@bU{|LWk><>tSDKD2 ztkYJ9_^X9}kS@{$v=AcNLys#1n@>MqTJzQll0gB>cZu4ZZYv(Ib?7iQdFa;HTRt8( z*wLZsb0J}HUd+=W(Y^vjf>Z@Fl(Limy+uPSyo8~Jha%Xn(siWJlI1Y-#CVAXaTC|GBnHAAmvD%;X zO#hf)lVfZBHEq+}6VZFLNBG)}r~PZG_fI=m;eP~u*?*8%^zdP0GkHv)<-@V5bnqiz<6?xFfjmd`u(C*Qo5eV9U1Y5gRnYIPGxI9+nCeyv^ z;|G53$wO&J#eK5XnS~xwo|2O6EinxuxV#@C`GYptCS%(s||fV8HW?G zYT(mfR?0H~CkKtNvgSye$%)fm5THkj))^+AtVX99>>16mELw*)BSDAo%{T|-)3=Xh z6O!XmjM9IvmL2cYXvz)ft5_5qZSzv~L4(&2f?{5T-tU64g7OKXCI2b;TQy>eMI!4W)L)mq zyS{fKmA!{d|5brQP1`DY&$BSt%VP zYemzbeHlMNx>8v`gAY^y`(kVil63SrQhz^5d9>?{+jX01zqMG4)?phL5F;AywOur7 z5a)X}Ct>%rQH!rCYA!9sD1T3-um3VnqBgohQ=lt#Zcm1BH2M4^gu|e`Xa>xp81R`i z?H$2X{ENIlkRKMqr)M=mdn)sjr*p)y-|-6kzw6FzG(5WXE8YcPfeH{NYc9$5yco+) zky%A2I52f|JOMI%w!bd_qyaUwi=yMv?NJvewvzvG0lWt?vJIOylN+DsvfGaopD!-a z!mzu)Yw2DH9D7}ZhJX%_V{CN(6Qg&VqyASekWXV)4~yG^M3I@VNmLV``s zX4<>B+@ArGcVG;Lr%cYz&wI0Va+K2V4S^5vFi?%q)zimY$5|Uc#y9lESQO)8yX0S1IZ9L}C0`o+8iVg=#NPh(Xo6^x?n{-^$AwoqxED z3T!87;`yHsH-dOKT0djJ?Yi?P#lZXNGrEZwbH~G3fT90wr)T9(C{bbfNO%xwbP#Tds4dupN%XCR^>aUe&L1!JEm&wt88^&c#c`y{BZ?YtT3$ zL;X9vF}Dv_C-5tpvX5e1dPD7`*j)IM`zjd_3bMh|*@-}YAtiV1}dUfaGArX%(i z@gGA-Huj{%x+!gc@9_v^kolTg@qS_o7mNps2sVqDD@e!k)j3>~F)rXB!OKnu2wdC% zb^coUfn92ZtI)4@oqose@1at8Q%-+Bjc&6MFaf+~_!eerCQEHCD#e-C?@F`~3dett=Vl;hiZ7%Zc{w=QH>y4A`z?7l-G=SGs=Uk}KZAov{Qo zPZ;s7108PN9-k$$G7`VqNsn%Nb$CCI2rT&H9`BD^x#{uXT-;+Ns6gir92dA?uEx$qjsj8J$r-TxdPywtS@wpS3RX!jP5VxbrA=_)zYfj@J;jTlW5M#Y6K zD!dva6(nX}xC|pd@e=QLxkrCP8M~m|vVOhy*b0@(QF+I>f9{3zR(`T7z}oKfgvP$> zY+GfafNlUbkDx$Nzm@cxK;PxUOx4pgsFCv$SDfGe=~-#N3y4*oh2NV1BL0QE);$qf{Gkos7B`rb?kXm{j^{lp$eA zl^vN|}N09~1R~2dU?9t1aY$D*NWXa#zTkV{t zmxBQRAd|$khh@gj+npF36gW7ZDJJstBQA~iC6poynR`0%c)4YH`H$N-q!^R(s5pkn zu1|){nqq#Qdh#0cgJ*xgPiQpm7O{k7d0I#)P;|5A7=7~{od$0={^>r%*eu8BLdclE zZwPnrvGsXXq^q>1(=!l0nx|yt%NUBN9*>rGi(TJV_WDC?q7v(O2TR1EK``1(1RN?D zu$rptS1bOmTKhd{294*9_1XAj0Xi}g1~L|cajPEOhjiMSy4tTtZ}?f7GNxDjA6$D< zUB-dh0voukL5tsg)k^pb!P$L-osKMusq_#%0Y?OE*S?eO{p0qp*9R9b96gQ4$7|3w z_vJIa<;{{!_NVO}+UqIL&^}Uv&8{dSGEB-TqPXbQh%Fb3ev204kzM1$Oy#4~=AcK5 z9G97;rD7WUE$HV}Dw`6!xR@CAy+6D@Y-KX+;GiEMMuGz_#QWlr2I%mjVu>j!jgH3Y zK1~9o*8f!L7fC?WMm7ZzI?bBx*9F*c>y2w0Jl!AiRP3LBE zgt%6e;O@Wls+FKe19ffUeB}K#*tjWj+uEL#JK;vM9#`u=&iJ%12fmC9x9Sdc+ui*L z)WRR#X5=HibJ~48=y4)$&$IQvufkEjWmp(u{SDen@NvzF_*{1^v;D-x@+7m>bak)C zWm)umPeZuU?Ruc=dGLC*TV+51H$EQ7!!?&%&Y*=ExVzgo3ZA?=n>z|NsFGDwjI^bH z`&Osv-q-~Vf0wluODrivKaGzbuZ28U17E!i-12!LE9)_2RQLOYOALF?IwY7xC*Ju22QSvT1~+voVzvj4T}}n=Zdp|6>UG-5 zPYhzykDvNt%?S%6h6Ztjt7t96DZyip?Gc1tdS~PqDR%VX%7D9W{-ns}me3YXHdnXK zRLR@yrs$km+LRE2#Ni+%>69VE`{~<%z{Vb8cLs4|JS@l{dxppok1Jk}S<}XiU(ukk z_HmbSsC4pmfkaBC7 zog}3CzDK6c`y9qtXhbZl(%=9_KkEt{WM&75%ZBfO^#8mn^g|TtH{gCD=5Uw*(MKdf}P+2 ztcmCKSRrV!VWj?oH1)viyBer%0wetpqxIdWV`BGVEB%&-a95Gq>yn34acapg?cdJKBHB<_DtD=VvYgq@%z??NtJlRHJuM zx4AE>-mkh{UwwB(L4^C9W7HiOg@JMt6iE6jwFik=K~j(V{z~h|Hm(gk*N1?gXz&kyt)V^Ow~*+)9NHVlSwExf0A`%1T0OA?#FLLAW zTfT9`S@-HXzPxJ}ct(efS@*Lqifvi0Yh1_tsUT^2pBEC;RcJK&{OQNJ2<c80sj#x->hgsgq8 zoFR^CYdl903^Ztj?4IXaSi6#oz{HX(;Az6S+4kw7Xq0#Rxo0xuhDiM$6TH;8!{VZ* zliy#O$X;O2%{J(sH#;}W{jR|79hsNtWdA_SWvhj+4Sf^QYogsLctwLI^mKEcNI!!y z2K2sxu~VYZ^CF+Cl@mFJ=U&M(Z~;BZ6|Vv*5~6#n=~Ek=OSZSk-Gwd|cC<`EO<^II zb@uDHrK2Vga6r&%dl*L+s?ufQiXn8N#Jn_mRf%t)MQ(S)>98E+b^hcsA&F!qw< z&D$@ayZe9FC&5W>CnN}Dw&`>xnkXRJ7EtuiM|ignkXiVJgoG4r=UP3g5*?tF8nFnl zUlWe)8&!)Y@(T;=j_EbN(=o76<%WhzoNhg3WGr6pb4$20(Dmb!9n4mXmiotiv9c2S zHfKviS$4U)+<+jN=Fo9FVkLJ_qibyZ+|$$3($W$Uu_XW#073+%3f)E|Ub~DKu+X_U z+mwaw40ESM5pgp!FbvsyV2njHYL0lXb^w9X1^aYiF%#husoq{uiRjn#0)CIt+~GU( zHdQpaz`#Y;7AIR`4y1BGB7M2zv2H?vgv06!Il?IayIAP5kHgf#96Aj(^`h7IZx9DN z(jCxyq}0e|U;J-CAP_%fFd(10`-`&uz5j-6GvGwDwY7m=5_8FpDOF%QZOL$D)m(NcQi(uPg^*EY{I|QD;L0v}0#l>2!SCS>C z;G0E0K$&$e?f~(FK4r+3YhiDSOg#Dlm}#Mt36>|MC@3nXzuO+WIwaz&c=PpfRlc z-w<4cZV8E2mq$T=`lg!TB8TN+t%3epzYkSlig=)no|E}qNSpbXh@2nZ%gdut&bNAG zYssx`r90eh3mu0a@VXzQ_RDp5_?ZJMjkk=9@dIYWebRu0`NVhHwKY7f8v&^J;7tMp z+fI;LvOE8fPN2bvt1?e$sL*|;rYunL0?_Nzjp;s&yM%r(=59iPwkiBOM+_O=>7P#{i#;|WY-Rd97QPKh%^WEb$)@fG^$@_)a zhhBWc785(Fr7A;VZ|@dz1fl0P=B>nzTbf^m6b@~t)-o~?quZ_fl>su*vMJ2jT!$?| zK|$OrzK?5>EQb#=6g2e86v-#T$uK5HxXmv^%O>|8eV&j)AHte3GGOXU^F^N8%-ZYxxY} z{kyIakv;sQ&$rvt#@(R?j$LrqD?$ty2oX!nO{@Hw3X)>T_#KoDj9Mp)aQGRtDMJ<` z8K>Y>B>ghNDFRd!O89yQla5C+Kr+s4d9oU~(8yiIM@y?40}yb^JD>~Ro2)4G=)26H zEs@uJy&NF%i=NciF`1`Y)4=O;wNueijgYUL2dw$5EYQmguC?o+*&6Gqz4CIoUF-z| zVc{omUTe9z*+}R!2zZ?AjZ6`92OY$k|K$FQYwL6lk2@X6bAcEcuqUq6yH((y01{;j zebGdcV!)ZE_(Gq)<*0?o|K@Kxunl;;U%3{;o&CfU9*%S>Y&Z&sCRr|$Fy(MlQWW#} zc+I5yG&{nILd6R6`Puz{L;LA-2qr;bjuGpu!=FFOd7;4A@Rg73GzQt;zE@YyCmuM+ z2eR3^lAiU`9oLq$cMj*CZ9~aSGyAA6Tl{>^8wgG=FG{u-o1e9-P0|#KZtnsN^?99C z?Ch4BoGgJ|EV9^!bF<+60dn=iNM`HRF~iW%C}0YtX_UF`j&FjB!C0>5_{0QsXG#-a z`lTQ^nM@R|P^JuNRQU%0zQUU~x*&D{2d00$h@Nw*V+Iberk{-?#l{&BbHo zu}X=~6_h{>JpaOp)fsn7G%mPUt-Rw|%k;ZyUi&Obnl|k8SCTAqq9e9xu5XBiC2Ek8 z|8`?hL4qqS3ZP5XB01j|NLKvrAI(z?`FyTKTip+J8twgPErFE3-_va$UnZz(hKQVI zKlAh2Om_l{)Xo0mlq=vd@bmp~TPD=x7t7W0N~hyr2Jr0ces@fp=C};Y26F>Se=uR` z$w{p%bm%p2di6}+0I8vmr*@Nl}7{+!ejBJy{xmdxv*T9V`Sa35J!GCXyzrh&Ga zzCP8Z??znTzhL?M_ivD;+<;UCuaN{38D6ZNnpg@?T2FQo}V==SYW>oebOzAC84p`9(fl&p|Xm&x)yqo-_ny0fY3@OGY5PLrFi z7-Q~y7zd{&b_xm#9HhrXhZHcB*kk4?^2L>v|IW`Hw|8|PRjKZQUapgDGUIZ!DKJWt zH`8vYtGk#~9bN43+g|IH4Micm+bgRI>o(3*09-|M+u85-7dzPb*tkfyrRog5jJ-fF zrmF3%RKeo%x^tz;W`;S`I1AvRaL8L8`w@_DE>UvKPu~!Ne|9Nh=&Hf|XH0**Fd+<0 z8ZfiHetHWB>3f}Q{*%AYi666U>SH33y5T4S8YT@BQ(4tE1o9{6;9zm7wUHz$E;1rC zG5Lt^hcHMX)zlJ6R>|4ZY%g}!hlYmAO0D^h)8gU`l$5@MJz0rvQJOp1TryU$qoKhc z*#Bmt7tid230H5o;9fR0?=`x%M&aDtmTxAzy|ns0DKm4S0^PUDx8eP154KAs7(-Lj z^ExfE&E5zEMLs${>8ZR+7a?x00`ff z6lL*#@<49+vlQ#$0|)o=>Ttp3(?tI$$f!Pl*yeaGKk_NADAUDB!W#&Hb=tqZ^;)VD zj75ig``<~;*T;@h&1PR^9&VgB55(O~W;pR-1A}*jWRa*H?Ho2uVApQC%@rkff9h7L zwR{LQCeT>rEs(I089{~Pzq&&*Aqd#(#>Z7=D(>kqP6EKP1io;3+S-Sd&2^`tklS9pWwt=&IRXwbc@KRICOhH#&B9g}qzD3&9`6Wt2?KrI>yg$n z;LBq;`cLHx0{Qliu^VGSk1*>^vaxokG4$gI8*2~ys}hbNas(Jfv9}c?Rs$dHXoOci zDFGBAA#33xSzR=5BsXA75{M5gY-GlW3D-s{X&OQx|K%s)i|mDIrCwH)iE*rp)`QC= z6D{Gd@GHz=6vGvHX)YpBomZ?d(!0?O$8Wp8v+wHL`OCry=V+wIyM)6QsMyt+A;MIt z?aGzR^&mSZO@A?Rn$s;i8C189{$*rSi~#p2kBZw<)Agyb(j=ulC&E}83pNX#b5t9H zC(slYUK;t6=?mHXiG9nF)L-W?ifuQw0E?ILV9~!(GaNmFdffEUn^>a!J9nd%h9Dba zli99xxSVa+^gRD)&>;eRgSp#q)4nVk3;(h*n@}{8-AnKHd%Rv}obaE87iS6^8tgav z*S~(vIQ<30zeh=ELWV6GO3 z56w-{hYQ@!n>O)^uz$gmIv+;e6aQ+A7g1QrrXEpx4u%B*rfTdpR>F9abvqmHXDAdu z@pUHs?zhF8*B3teF?R%qFJdRgFy^q3JeTBA#WtLD>@F+bID8haT3J_MEf90pD6R80 zExpmo8Q+aAkx8P-DJUq2{bgire|o=&W&?*9MKFXR{Wq%EH0U5r{Eh&JLGcl44Syxn?hu}N68dsQj zk8A(m*R{}xa`$5~la|3dgz;X|P<*sM3}()Ah<)hzusMa54b@$5@o1U*M@N4TAMcm^ z_f!VXywxBV;e8s3OZRq-FTe=bMpDkuMw0%x+hKqC>XYd2^-F5%oqKP*e{Z3WFWHzd z6k2?1?*kMt!oSWe6I3S)BJ#CsJILV8#9t!f`I*FPIIyS2_ZA0F8*x!LFi(5yYZT>W z850zmpN=k=xo}OrlRKA%@+*{0jQwD>72__eEs3GfK(a)DVX2!ViivC?GQfbPFv*4y z{y?5L^Bo2I_Hs|kO#Smw#NCoOO|5JyPkYk z;Z@GB!95!&{}!B*4eGD_@^34LHQZRrtgCob$bp~wG#W=W8Wn%D@tD3LMPrz5arZ$= zaX3CAM=IcYn@pixTBrOGB}v9oN(z%ff||O}L(rLL!)<;)NI1Ja=l8PGw6q!}Y0fvr zw&nQ<61(jc;#w(=f)X{p+BZXq$=Oyi=d zv=JgN0!)|uDMOR0|9TFTCuzitcR{rhgynunED^YUW;RTJwq^#LC%riu7R7Sz zqQ~@ua}M5ePO+Zvc4)T(@@O_L?E?+6^GxfF3gf9?5;1uhqPfPbr15FLP1C$)+Qpo( zkCB8jsYnGugI=Vxmat)*G^Ll57S#i)T(SP`D+IW9HWNZ7>z3?Mo*upkZHzdP5(SxI zS&jm*v_7+ahT^HkWc^R247A?i&i*wI5^1Z|c& zk`=3dAZHNpVNzk5KtxKWsS7q_R#;?`rZc`yI45cr*R72y^&i`oA8xcXeSiKiPWv`V zA^QupCLOliuuo5aqVwqjHSq=K^dWu~AI^zx?_`MUfSn7$^!%fpC;{ea3jQ#k zyf}y#7N;q8B`iOYjnnkfGR8V@>H7vYBQ~P^RTKq@D=QY~v}zR}bWZs3Z$nmjnV-JT zj|ux~!i8?IZ+6YcBgVk~OLPBs5r14_{XZ^1q|O8u%0dnKaNR*i7edgtchuqPZ!X|# znc1WrSofm_U`F?`;^}_GL?Fd^$SpF=U^qG&fQ(P&PDDaC= z$q$ku!U1*wDU4ut|E^9q6<#rq{+1pG ztpV{v@Xr@T^}l4fBt_p~hKK~x=(-*2F9yalsQpTgjHgc=H>D4YOHGs(V{c|3ix(Et z`?I3d8H*fR?sngMAWny2TfQ)(_n2!zHdF%>_am$~UPMgNdXMrg76tRd&}@H{&c>Yp zLkAJ~-#L4Th@3c7$ln}ET*g~Sf?Q$MyaEw1aN9FY1gP9)Lp_-p{YAw1$>OhuKNjQ$ z0YM=in;LrFFyye;rPl~BD@yGt=Gub4r__%zJu7p(6&F}uNLD!bA9xr{@0vHXs+?MH zj`vFFc{aIyA^4b{<-1$ZT+Ob%A=iVLZ-$QHX`&@F$}BTH9@$CN#fIwU#(Hj;^27!P3Vd z_$wx?Oia$y?nFsU(2R~{$(a6W-2bMsE0U>mTsEY-;T*z7FFR;Ztj3qe`(`X&T&!HrzRt|4>w~BreRWTW$n<>jq&VFl zt=ep`85@18E>uGy7egbeCtaB*O&fqZrSb%(xV6(NXK+U7sA4*&F_si41*b+R(IqBd zz_8&`q%bgImLPCm<^Ti~}25Dnjmm zZP5SsiXn~|y>k3e6ML*K)~F9`8s-EvCfG=8J#Wa{*~Bfa3}h@}18D=HDB*Zce)<@& zPE|6)AJ`dUK#}2JTkF0g zQ>KV=qyzMTy8P?B2G~H#YwCCg@FIfHEZ&~zxhOWPq{UBXLx1Y^D;vJKTn+iwzDeH~ z)}t0&o1%g#@XIOVCZxD(dE$v~Xz=%d$t-0U^z2m(m##A*Z$cvQmEt37n5n1#M4{A= zH}>;1BQGZds(0mG9kT7EE2>SaYN9=zk-=~zY+>(})An;+JDKgxHYVl(fvimB%^sNP zy;Yo}PM7Kd)r>>mYqrKoPzuaZRy{`yG%1v3H8i`BGuk^A53N?=x-`i2QDtdNvCUrA zFp~I%|D_89P}={l4>P$cm?~J5?2qJcNb{RsViIDhQboc_<%IPwivHgDEY{}0*_E2B zXk~xhbRg*A+6z~;uw|ng+O_?0F0}h&Mb)gh7-?*GSY1yw)2a(Rnz1*~Yd3nR!5p-Hhx;ipUt~tXGt!1_QN#dkfu)>UknMSs%bRr;L z#G)3ORZ#Ge3b%bRlAEGQrCP^SA^o{teZPcOH8H<c+9b1quc~Z62nk*_g1KwaoSQ;}kE$y%*UqPs z9H9qU%#5|*<0VbW(l&UQY9tXJySPJx#-(E?Pkp9S1ll#se-8)gW9|X!Zr*4%o{srD zN0yw#XvI_3oht!P^7h7jACG0INX#P_kUnNWx?FAcfGJy#;|vs~eO zR$d>28X*tQd>=Wb3knm{VIG#rH{l*^#L#@XiUyxKI5x;wTyQ=|#WDeI6vp`r#4Xq8 zksTN9c7v43m4(Tjb55a44o>(7X8KoufHFRH!LL6Rs*HsHkGH>!i)wq{fN=~&5v4;y zbm#`@Rv1B$lFp&KyFo>C00C)fX%GR4p+ls*ySsaaj%RVs`JUtN|M~o1Ja3-;LU9=P zUVHC*-Rq9)y4EQy;q8d=QQ2#rk~&yf$8snl^v+)ce(w5I?gm<~qq@UKDlzQg_$iw* z)!YVCvWLE!dEHwsM<`~r5b9^8?u1|TN$iKd;Ns(V#&Q<8WCh&{-uD6dnw15u#(r$<;6ncz~hQ#Xl z`Gy~3twqxj7u~{9{Yj4RLFl)}beUk7?_=^EMWDkF^tz>=6$n%Hw|ANG`@G7^)(*6r40B|Lg8%vp-x{ zx_k879);W$R=0H#pokqiAq^g1X=ovPs7o5GnbF6^Gkl1Geq$^AA=6yc`E;x%T#z~D z5-eQVTNVb&a_`}{UrVGUsN8+8*R~0Kcfd--v(q*L=@+vBS&N@9vys16@fT(#<<`I)^Hq!$Pzt5ka8j$85Im~_eT9aKc zM)vT|qmRY`q!xz`2_(msx&ld|Cn~`*CeRlOx4vN`uzBGSU;3s&k)vK16b~XnA|@k- z6V?`<(nk|01#e8plEvV-TUN|5djPHZP?aMxYkA>6wq|zs&g2_o?8y*`y1F2&+kZU@ zG;-r>2e8V|%-=9qV7k#o-oni@oI#y6_T#~^Tf>}G+MD=@@C`Bx{*aB0is!o09i)p( zSUNTw_3TzF6d+zkXw8ZzI+<0?O3q(&6?*OqIpf?2D>V&dX6u1&*1mvJ*M9khA4XFQ zHzw@21XwyoBZn8W?y2AzJ$reO5{VR3rM0!lUM#nJE%%-Z0#??s{9ve&E%>B6KflIp z`wfpq92Ie9x>YQYO5#7Eg11J7w-x0rv3_pT`0=C5H$gM^$luMk`#31^0+-Ke(IhELVcdzewPIo{s}aLe)IJ^mwcf_c{|-jZmYi4kxMeK zx-XBRWO49rXZf~4=*(f2B2J5ZiBT@sy*%&RFFr$KSz<}8#TM6u_QE)y(HMV6S_>!~ zXpN1x8Fed5p+AiyP5q6toq5_yl$9nzVn=o7pH^ti&FeO3QbRZ=`SL@fnz0R+A$$$y z9Ma^T4b(Tx`{W{n76{c`C37y+0|bm$RWihRt-?<#YIupXoPj?k3MH1B8l)!GrawL$ zXqJ8Q`ZF7JiJz1)b;Kl}AKh84V$oshbcnnWp zKuen)lJ3WBS-@mBUnr-Rjgm1nVhHDBv!Op5=hQ4(EE<-PP`$K+Jkxw;jO+YNJyy)i zIpjY4{;%Plnym*2PrrJ-37k6s=Nwgo(8Xlgexbd(Zz0tt($1Y;x^eH3WU_fgu{u@PyXiY=-CJrH#U8^WcK-jq* zraQKji5I4191sR;GHX-ZfYA2h*|XCkh z``{+W%?9>oAD7f&nqE`I&ektggnK9hyF?y-sPGf|#K14vTzV2(H0eV{l{`+`?k-YY zz)kYT=ZE)x#&ZeJsX#Llma+Y4bqS+~R7}1fNPg=PG8Q%&wdonRH&=RVw@P-!hi`&# zwLi5S;bKcqU?FGn!CO&PLR#gHrHbR0av7=1;rJ_TU_R!>Z>Byb; z96m=b!#KQwI!x|4d+Q*6REHQ?26r9Da8(e(TAo8W$rH>3g z>T4?ER$ykRRuec{Bx&Y_v34au9z(KfXbG@NU~ve6!SFz{qLB~pYY*?AJhZgt8`S7V z^Fa3jRG{mlgl<>N+RvH<1@IOJmEKTl_RrF7`4=;E-oo5`1b;b2bae-?9P*9&oLmMe zb=NB74gX|rI1rN!-U_w$6q~ct?YSRf^3XB^$(IymVyGCc-B&aOr{Q#93tzrrtuhy_ z{9(k{^2kADPT}pt0H|Z8*w{-_Dh>v5T&BXXC_(1$H1*-zj^pWHpb=oqNJ*GpL>@og zKfc4xXbwH)duE~0Mv}fbCKoAp$1{Ca?MhF{lUkjBM+k1?E!8ji8K1)q+xTt@QD>-q z-*Dm?kM%U+{QS7$joB~eWOejg0~JmwZK^}Y$qnatf89GM7(WPE@SUi(?4a}wCgs;_ z{Z)OHr%|`JLDTr@)B|Qm--sCdyCLyw?g=>-ewY}oDaprR#DjlEhlcjN0JOY7w^t&A zI#q$h^_W~-A@T2GRtUQTzom?foo6+9%e|Xof7OMruWI*`{qr}~+(>EvCrFg?>=*HW zieDil@1N{8eiGAvG0SCPtSgW4&k)f@1$6)2w_Q0W3D*3K@|g!j=L_X&3^|7ZAMOKylPNFfTkjpt(`v#1eMvzi zK9C6ju>(ieKv<-aeTBBS@ZaI?^`~ze;`+>rG|50oT1U{yJ`f-f0qD1)-0c;ecY0a` ztt@qF6w?g@lW4Tb0#K+(hT$M^NNe*-X&XH7KB9 z#Ir~Eij|FR$LLo=LIUVxo?KkEMHKLp;9pPE=GZPNfTampNFB$(A_4u*Zoi9l3j{3z zW~s09+gGpxwXFN<%+bxwRI{Rg4g7kTAU*idWUzO33sz88K-Z5D$IXI2N*}Fs)@oeH zQ_Ki#wE;s-;4+`DzpJ9{I>n7oEAw+=3-kg(ZyZ!2WN7IiX&ifiy%X7Hgg_twWs>}v z5dbC1zk2m^>_;N@*Mx-hKC?*ajKTd;!%(<0U*)d@;;XG9SUEM?suDmIX*xJK2nhr3 zX0dTcG;0+h!D3JH6$G~{=|VxOZAa%2AiE@siyeG4t`5j-nF9sVl^J8$wA$D^IeX4c z8=7_JW2tcg^r1Z7w$eYUO*LP;&|*k15h)`lSG(UXm7=f;AkXf5{%S=<#dRmk8vxK| zH{*?cvDcCb8ga_B5qX-ZH@|j#FM>xv8(cR5|82vEF)RLs&jSma0EI#cW)f>v%~>~w zbd*I`Tmfi@p72TfobOeLf5f`jD$`x*jHMWZX$v6%Vg>V4!|Q0)%j2}6J**4``sE%^ zR$;0E{jwRK7Oc<~ijmt%Zj5Zaw%{~GtX@)94D_v6M|F?6Vr2k)qSOP0k(hirp4!wF zZInDB=-wW+SFOD=4ckl7Ov@?AtvR9OB|kRnt@<&1+S$4J;R7_QIHzFc51Sp8di841 ztVBhH&|5gHoIH@P={@>^mq;B+3V53v(Ja1^kxqq?e9r6Kiot;ZEk#63Jmc6?=V341 z5naRWbDlvPv6kT2eF{YH(hoI?w?S>@O!~-nrZxgD5kf8powFO=I&?as36F?a+7}sp zjgEHO*g3JS{9SnuIay)oDP)fst-_8a4!z^Ynxub5h?M6dJwq{B`Mv_$e}fi~{|S`cB9c?J@{v#WA4zvfcf?KC}bC93S(TcHsermr#v2R^lU6TTz2nsnldACZFOsSf(*2cfuW%0v>B;oYh&Tyd4wX`3Rd_?bK>HP7Rt%MC?Ut z+2CsdB+ihUt~eBEB>HzOkqS6{7_GIQDE&(HYfc{L10c9LJ8|*TAbjgC_d=VCm~q`} z>@Qw3R{9Rt#W1_SPEqJgaBqobi6?)Eft%>qU17jJ-$FSO9Tnxw4_D3AIo^k)wLziI z2t`&N~M7{|SfL)|c{r&ql?6cA;>J-rDY)60UCwuJ&IJsH@&8qXD+`w;)Hzu z^#IMuZ_G&b0eOGln+mbM;FQiTtxxKCI#xUc5pr2dh>mw)(^QL`I76;D!z4F=_$jC` z`TjMd9AN8&9`|&x)qL->V5>nsi_%0%ckp1mnbtl(%^NV?oUC9GWQvDJO23qKMzk4e zmaGy&7?~~dWB1M-*(8!sV=Kv*M|Fj_Ozq0`NlX-4lC3j}$dauY#&ecsT?sHXHL?R}tPGDyrxa*@S6u_AGqr_P1R{-|1yy}w z_ORxl+g0?GYNK6?Z!+V`%rJ%9=dOR3><@ip%09x&7iUx}S8^dQk_R73&zXg)*;> zLC0h5`10cP{`=j}NROHciV+_gJ9>1#cR*byJw0-Bll)V| zbg|ywWt8jH^H*QJ9y>`eZJnrsii&;uUgCOcjI7)}-w|487A>{~fIikf!4s~Xis1aI3GmDrkK(V{d{@=?Ir}-2-R3zs=;+)RP&5YqZyA&_ zr3Y}pIP2*ERyZOyc1S3qw28m5gq)ngW22a5`C$NklJyJtD!{goieB!wMsxNE(S7eZ z-otOiBc*6!2obbF)*PL`&g*-nfeGy(9 z9BE1R;=1hbXnc{Ho}MWof+Bnn`8e6J+kM_|#`jFcLYbamnfgAi@JVCB12SKYQZM88 zPv^iI5IIlK*2XXb6AXrfJ=G7Us$5Hbn`GmC1UG)z&z~KvWl^?NTdZmcv2k$?nj^+P z+)itYT-^b@wQ<&v#ZYcw2h8};$lU| zbwiUVoQ7D(DS$u(9vKtQCQ`mtDrgX*3WHr9PIPE!d^WaW7fdfni&9V z;ApGN(jerT1-w(eU{m<*rBU>IxD`)sWHyP2SL6N?6JYTAx7tUpce}8MwW+@j_lJ{` zk@Ccx%Rv{K6D6Sl>32}G&%OZL6=-x3T$CBRoB zmAdHz;S{fa>&tx>EV0CP<+=g(8H<*+PNk1(Kil@T8*E)@%u&Q|~? zw%qC7xM0q5_$4vXaqYMx0KNc7%v!P0(Q#2x1ASc7TGBjHp-pf+T%dAThTFhn`kBY- z+#k-!#CQk$ad=YFQ|GS-qxjEaJ58*$M_)*NrSwr}YG!B-5k|KUY=|A%KzY;v3Qz9P z+Jie8LQ?sB1a&_D#lgrtJ9=^~j9Wgs*4EDKB%2#+$ljD=&-|X1nM!8>j?~I{;-Bs9 z00}24b=$}zlovU1E0A9+>Y&Bx`^u3<>2v%vWWnf}#(_@WPVLdKRu^ySw2!BwNlIBqL*e7NF+0u#auN(_5<{z#ukAeZ_7LX6S<4_9r zd+ddMHpNq-8`JCS>#ZYr_=JEYLd#8~lAQhRBkB9nuQPf{mLyA^Vy8Na^L($v({)@Hu^JXLa11`vQxxw&OOD>19HvpMvUK6GU65JC2C+9W#k zOVPO^*9cJnJnVaQ$pIj*O4>drG!ze<0U-7D)un{MRtcwVJckl<5ajM}NyC|)2!sB;rE9( z+R{TR592oa`#If`d{^f%1S%K9!)M%+Of^b%U(|)1{+gq@P8eUL!n!g3GoD{BoL6l^ z@p+GNu6)-AEgPHX=Xs8dg2I9T2>nTFcsL8i=RrYWqyPYX0WASK0UHI$(olzr`Ssi^ zZI3k?;P2W2)Yoo3rz`0BLUXVdV%pc|~U&poJ$ZuKe9))_s`r{nzHGiLpOXicvyr%(tCWmOHbd>Zdee)(x>`OizPLoc8VnOKQfk)Z-o8Ro6 zCFZ=%n}FCUicO(u#TB>caMHy)BVeYmSM4r;4fd8uWB3jij+% zneWRoxwi7z@cV4#AK;hv9S_J`g!fy;x6Vj{n`vIF!bAB(;)RylkBPq;KhvHh7{ z7Dr|A5)LAerf@v0)24ZRGM*m?Zj&}K9Y#EYn<0{qy}@>Fk82mh_Y$#SDjNLWr(L0) zKFr)Kd2RZ(77hdiivW7+=unXW2S9U`y{Y4cP!_4>^v)kYp0lefb3GU0Wf4w?Dxc8Gq#Uz8*BiU>i0^s9xHO6EI$D1dZ!y~ucf88YmREW&%nkTqVjw`$R#xyJq?$IW@mKt3pvq?ABR&v zhMRx?PNfcdNgMIf$1sG1U-A57aHk?QT^1ZWy&XTiLS9(J^N>7BGchTQ!Dr-rx1kJ* zT&0p{$5PT!K^QdkchdnM#2(xAR}frAb^tQu5AP8R@$M`}$h)s)5T_F* zt$1Iq#@)~iR-NPmY`FEz_$=8tF5`(((SYotB59o4FK}Sqs3icx-?WW^NkCx*JM|d0 zaa`tsPj&$zERuEc1AYq@nSgdRciq_zCb`AQ$;p;wLSx!DU;R&?F!wW<(QyGgtN~CD z2v>eGO?#B3iMOlcHdFeZ+ap&CDZNWPdXlF4OQ~+uiFTIVqhl~~SVJz^vS=K1jV!c; z0zflm6BbR+0m>O+zV=A*>H*ns=p)W({jcBwS#OQ+q#vG73PCKg3xddnIE&qxD66Oh z@e>EqM(4#6MQED>$0d73!`Yk(r!0^)ZgFlxwnostKhMcNa%TZ&JBXgVn+vZmzI9xpr*sM0o#ajH}r)h$t(w$pIxq=(f#^t!22rXH! zi5lYOhH{y7jsgi6>QoS7l&0Z#w6_Zga9tJ!%=_)sT`hw^oRyLE%U3fi-HNBQd*ah9 z2g|~QL;JJh#i`*KEfl<`DW6PU%UfFJ5`zL2*2Un^a4o{%M8h;0|528D+4c(1oC$)< z2_v|HkXIWX9)5t?$aZ3w9~~`iAoiq<>DijQ(Drp?;US>+>ziZuiRfQZJ&zU@ZfsXH zXE$HXk00|#GrXmuQ)76qi`1E`T%1?D|FD9$eB>Z|(geGi4w1@YAK*|)V9CqN6N?kp zaMJ*u6A%eK@$!N6Z#ege2!cvYR&o;YnCVj0j%=mF?;>McLPEk|Qf>#Z0s~o8c_`py z3-w4I8fhFxD#;Ob==5F{yT;7D(Y7XeI}__1P$m9WuRam)M{hKQMb6&U^+;hd?>!NV zf_9)*irKAt(Ytt0x7%z~>nQ1Tc*vfb-SyrMqAWJ;P7p4(x)Wb?NZcNU>=GXwJbHBTV!KzbfU?KDBm78wX9W+V}1B3Y-CA#(7gQ)$(($d21 zu{2&w(;lRxgv3J<_OC1-^jXF8Y-UoNZ46a^sJHd?1;8(B9o81x@QY0@%&ZLuDwN7t zw0Mnogp69*U9N@}#|FN9(|R%EJHr@iUR7R+7nYSZLY8FHU3*blQC!T~_r%i^BWWei z+KPw`*6othuL8?<7}Gn8Uj6J;nqVpF14lIgJS0Ium7lUlxVenMSwF%_;(t=E`W!VAAUT;}`1 z?kvb+)1G`ygerZf6~EK!-41=DXCwiua}APZHd7v*kOjULUt1qCtdC#5bduF< zKIE$6@Y-shIq|hTCTLxB2qFrAhF?_4LJb1=%3er>KJMv%d4|0`u;xU}mITU)`g;aV z@m%IWg=&r*+up%}D2V2D40G=W3J509rhfU-qU$}BE}!fJf@rN;dg?`njguzg8(nb- z5^j(4RDZ{r)j=U4;ZcdhfwsI4odc#%FE5w!@~mZ8Zrr$GwXjoHd@fv1;AH1iB=bR? zgwv#2EC)3Cm9pd@scdytokawNg&Zy}hmbI{X5_DJVS#u`153k(d_r7YTisj#k_Ewg zbvUSBAYhCVc=|MKD0;Ow#rxC4tpKx@kk0QY@XUF3v{S^~A^S&1yczUgKYZ|ty3s?I zw9*lEP-e#b2GSw6bMpoz8QE*-NWPA|tn3@cyvZqHxYo55_mBlo-fc@b;dh`M++WkPg-0oh_L9xl5!;P7a z`OEDbrIwDUT)X4l%cp*yCPv4Lnq$}+Zrw5k;cKm8MthnhHZMBqa%Ze=>5n=AabfrU z@98gbdZ*KNz39%-^ClPY% zovrs9J@3{16&lv32kX>&A;RyIz6Uyx0^+^G@%bomoCEv;O#2*a5ID{HsPcjYBM zn`Y$Ll&4eo*3+|UVeiuq3w(Wb2(Hf(3n}7f6D8)hhK69*yZpw+&TkVHj#(23ATqm| zENI)^@Ch5te3s}}@YUl0!?91?Y+rBqqu;-;Ia*@g@E$#gP}(@T_QG=Lhb+`0ijnWw zU&sV*N=go#F`pE?UW~}A3hw9 zBr*SCBGvw(xLJBU)~D73nV`zvc_?xI}e=Tz0DGx!yb{#<|qT+JwX>M zd8lLv`BbSl25vx8>O+cg+`hJmtWG8gu$^H{6GM{Fy+V?erXXU`t8>f4y^cr*aj3n0 z!M5G1Q?#qX2Qge+DeC?sZwE95c2GlL6i&2e>WpqyuQgZ$v+0A_+}n44V`+mD|M^yu>)2r9!<#jDoXC~PF6iOZt8oD)5RgfF+iCE`8JK8W_AIo%J_V?JH z^w&>etM(4Wd1E2no+(SFUX`qyV_SO}Z5;zD*Kg7aIPgTuPr2l zSNqa1t~`-HKj=!Sx_*EkZq3ABsC#<0L@^CZrz=804-v5(8}RKLnQ2c_j&9vM8CKm2 zi>$z|hbxgZ?9SNCK^~jio_WH0M3%#Po!+!&X z-tIXNOPK||ny^>Ynt97v$wk!EwDL)2ao@|zj)I5_*zUm6B)EZD-Zx|mmM{b>56fw1 zvMBFa92J^^TN6~W=fplbs5mz$_cd6eppZ8x@b-h_xolyxW5rpdTxN}x))SZUa#_WE zrNCbUY3CL9Bsj22Qe0g9KK<37?<`fXEG$j6fQ)1E@TGwMeEA5g>Fz;~rR8Au((0;m zuId)A0B(x9(Ri)XnnARVSV~0keO!NI9U}eF-KRQLE(I#NJb+pc&`eo92}Y*ti;F^* zCQn-Ifhz`XnUl9=dnQU0uNy` zaVVI(_f0hiurCel_1eNS0C|%ostpc;B@8fkN>_gxwcR8mn~;uTWLON;^?_0HnKtKX z#rjgN&e-CdaUxs8#4|6+Tkzj_c}<4X1ldeg#(w=uLc%Bi1c!i4)$1%I&-)ZfeD}6a zrIT*mWemAIG^JJBib+JoWoKHn)0Nxmm~f)pb!XdB^ov%REx#atqOfOk3A?1GhbGib z{V-``q#*ZA8WFDdfpf&BeV_-5G@3~*NyViPbc_z`E-Tf6=OR`c$` zSs%&m5lILp=pIg6H(lv^SrmBt%us1+F z&#G10?p2@;+1p2wiux!5%)reD;FtLdDgFH!L1RkC`T5&QSuzK^NCQu7it*%ygALG2 zzJ-C(IU6V#Rvpf_*#`Gw-xU`{CwJZ!C~U?>df-7qtCT56Dq^)5LNO6Yd^BLeIXN|X zAVL8e$Ix!M?u#?*K(|<${-*@Ha&oK)i(wPqZcwbX9bW=qs!ZAV{iXI|l!y%2jBl*G zZ{!Sn({idZ?-h0b1`40{vvG&S-P`Z|@5fy7vF(mW)#)BR5`U*rW)qQ^C_M3)*Cw?I zMy53ZLi#f6k@^zYM`hZHQq+<2hA+SK`fc0*Xlh>?-QW+6h%N8q-TKA01xK&6wE?=W zSk5{t4c`D|0mtP~I{C-Cg$CvzB7#j%Ly^1n7m<+!166}LK(UDRqczYu@UKZUT;p?mIx8REI>i?7*!&`wywqdwuMJ}EADW1DW`c0x-Nr~} z4d4sWmsxIMJbcV&$9`W7SZ9r=Zj%VD49VGSy)Y#3^JlliP4h6w%Pk6WZ!fPTQD2*N zDxAAOhd=@v!+PO-ugss(Bo*919goI; z*e0-rN7n2D0lM*W=a_T`Sg`WD;}z^L1QEPonkaG6sml zhdU#lau2j5-oL*DQ8P${xKS0Zyd6p?+&O*2mXJx*8LSX$VBz&>?^#({ zx&6Uu*$mGDU%pgCrh5VcRv_xZbx>;G6c}aFd6#Re-vU7=Pk~+QT_wNc<8pY2ms0|Y zRAMQ;dhDGE{HVExGiZr%$1+Hs@7;cXZ-EwJeO7aF>u6VMjz7ekKUgBIUa!~42-M4@ zsqrky$RHl)i}nRDZ;hT_Vm7xVFdY=>qd)+ft&sA2zUlr*{z(*zgFY8&nbnE)(Kdy9 z^+;oYArMdK`>AgTu^3#|?yV!;BY?y|YdVGAWlCKK6!ApO3_v-dV z!}q$;F@CGDqBesa5EOu_?DHpfF7|7~K-#%MmQ|jZ18Om{ebg^z)W=gU+z-==X8 zPL-H*24pK`w`;D{yLZL9wV$Q?|r&8A73zn2^wM5`!NI9XlcomdKO9CnhelK8r>oorXyWkn#p%?-9YW zuUaF#&s=oN?cO0ki_8Dc1JX7lyp&gy#gaP}qId3~Uo^OEP1h)8NN)_7{sQjeOU7}e zY%<5oC$nj3hMje>|KvRqX?tZ|WWfG96+p}ibKjmcC-Pezaee!WdAit?7}t8d+I}#b z1LQ;zSu(9XzgdCiPleN3f&Bt)Q&Te#g^YoFAU8D&4WdBYQ1ozv_k0{-$%}y@8FULl z+O8u2nSBlksP#PRCVO!A534w7si^eu>E+E< zFZ>-UdIzuX?@Gs(Z0OctPFkI>2E?L2ee5i*|7fPnY@#%;riS9$a9FjEErCn)@$mt% zzl)*$DLx&k$_$jHtijP)VQ)@_NE?W zb!H+=f6`#uGD1uM7!*sPPW_DK4C-bRNlN*fTNFx45!|G*HWbW6e0pH@@;pE8^GwF_ zGUMSXeL%)DOy&f#);!g;<*tp9PEHO;Shm-RG_Q?OzB3_?!V%DetMKM@1n9wlRYYHE zXwIv!)N3KLS8$+Yb1L0@Zv?;_GHDz zj&7;=r$Y*Xk~+tg>%0;~C=>*djxWwYvV-#`OO7G{j?SP?uyD~GXv_fAp4fCRJ-5b_ z6_tSQ6X_c*1o8QNKU>mLb><@aE@xjvPn3XlecIq5SSen2isqSL3r1yNT4Vs72tVfqH0#|vSb@nqnS4hzMfjv zO6jHe0&^JzoSB%9{(A;!yEA(nL}#Fuqg`gB1Ed9e@bH*5^~XI|`?y1fu=<8wPG9Ug|VOAg^JZ%!`v>r#2 zP3SRsC}%57r#67-6MZ)<_5bJ0Z{P2~SsGunyDG(X9hi z+at^w>*K-dmVzV6CovtMAlPJJ4{!k%(t#3b!xjj1;s0`}x7c#jcmYj{Im!TUkl$w( z9)UkFFmT^P(H85P*y2i~rpYf*X_T!DmNg4R<+rR`&!N;&(n}8hpVazBN3)TGk!57J z!R5FRaoJ=4!vfUA6dZkOK1lHMD^_Ndl97RbK8MoX`}aBTz5|t|Jk|KAoa`}7q9E^lEJPmZvJk{JGi&&ZU%|%jKBvDzy z-qc6=;VR!6QLaMu`T6-&#f(oMYw1@j{=Ezu!B3z{2*OfHNl9$%0wBm7Oq=%2G*Z{= zg*=ev!NI?KJ0yg)dl6YZt6@qhjdiA+i+1$X35@1mtiu)Qwf;<-0;^y^d{vf&8bF6mw+c<(YsJ ztd{Wbh*Qk*N)z9m`uKaErFNP!5236R&3P>&bDTbG-~Hep^1zNXGf_~}Jb3!= zlm1&ce`T@K(D+{@TfC58MK7|AIsjBAH>g{+`FcV2J{`N&nfdI&g$AO8$ z3;74LIw`ci2?5NxiND4@%%TiaM)|87fGMkayVvKvUQ6=N6qTol~6 zq5G2(WGBSrURgR-4<9{>3-zG=mY~8N8y{!YUb-6qRh0L`@ z`0`i`ez|yy6Q)4_Lpf(Y<2CW-rj_V$&L3C)> zaALWwtqsa$Gf9GhfuYnBfZtM#E^>K(00nKXi}Us$p!@{~Y>jAUjq^VFzqs1}4Cd1D z+8pUgK;s1Jbc!4UV0Tj^GY~MuuxPn2cbY>S93Alkev;r5NVBrC8WgH$4S?>Z%XBq5 zktdLnWx@-9XUoPPf?D&FRItOc4@w2!ul|?)WV#f-jIf}SnLHG9L3akSbQKkgG{Kh9 z-owehNl#KMoo`X&?MaGq{_#wXZU0hZ)cXv|&%Zwaa)2z4t&rU;4z4}9siC2gozg8g zPjmAeTwL56H&8BHH^sCW19FX}X(W~3IZ@_<4f4$JG3qXAk&7XQ< zCv%`u41uI5^cLvOVEg{fsQUZ5yU8E3l5e14HeX&~6!QXw5*Ao)#gh z^70NU3I;ZX-`5cn1~sxajPl0u1a@$Jt*)U}`)+RNRJ+*+9fs4qE(+e=je#Q1Pwqn$8KcG|?d*Q?F0r7^vheZq2Q)aeGUzMEPT4^h;dAQ_x5=^;dSBIP5t;={l(1uF6aWR6d#-%n4&y7 zqP#mnWhyw{N2!%?&D@+q(7AQxr}M^eacOsoQ!u(p<>}yB#L1)H_I8Vgk6l7N0NH5U zpMLKoK|%z8dBK)&Ay6*c=>*VMuAZqEB|Y0uB)>(w3vnO4gyqQhEUw_BOukuHWEB35V3IB zW3t5aI`JJ#_2#mTdtt$9nyWMVXO(p`VWK#?GX?-FnaE+Nsi>Hm)7Mk5_@!R_v8X%P z9rq)st$<=}6fISn&KVDXh(ea!TVUfa7lv|uMLiFzy-qMei%WA8yn9jKOKqEju(oti zaGv@(H!?WrG(5kf>(V+q7tdo`?zE=(nC=-cgF6pul{0dER!3P|9^Sm63kvyf-<}#v z$KXmePE|SUkM#;z3=oMjj}O>q7IuvV6>&BN+wqEXj@n>7%1+8sYR1IkkwNZ z4IVbLW;!5SfSS~^P$ikzX8~}~)*nZR681hqBd`Hgkv-=LX zf&*+TAIrJ2Dl2x!j?U$HD*tV;ivA9+jJu zV~+0e7|lN%(7?cQR%|WLw$qo^QhoRZfMKRfx6ccf7#f zSp1I#4Vxp8PEjw@vfoaaDjY)w5QMZ(wO{q(CBtst~_^RcTYi~HOYfPvYpPPAUpC4{%$vexuJ|LgqPvdCedpTOK9h1LnQ>R24? zf%whzTw~tyz$FcKuo}ad8PlHnK&Vd3)Sbw90zZt0gG+e5)V)fCM!G=7o}8}eK%e6C zotoz+Es%%q#cVTC){R%i(}VQ(j0*$Xt_R;f{%UU;uS*=Q5L-=hIsHs9Os`l;crk}l z@RQRSf1*5y$vH|O%A>F>_eH_Av1OkwvE*o>8wV8dr!+!>_wH#{IJ{I=R?d>sp;lZ2 z6c*2;?Y{3Sma3~S=?R8&V=5SNdJZzJA?=T|%H0o4^k!us;}wQ6FH<4Nrl6Q`49)U-bIAnwx2!Q)m7t9?|N&EOKn%r70J_s2N1A|fLGAF94OEb9Dg+jZAMrAttdp<6%% zq>Q1v8>FPWdliwPr9lQ!x{+>>?m?ubyFt3)JwDI=o_Bxq$1Yxb?Iknw`JT@?_qn6q z@+d8#+W*-@QbBXeHrWU2JnRMC4BvWutl!tQ7m?i*nv=vf$lRwcOE5 zsq-nkH{C;fiVq7Hn(cKY-?>pzw{_g_%r-1$G5Q>c!PkDoICRQ7Of6n@TCE$|dD|HF ze8c#t=uU&X0Sq%k#FZZ0m4_q}E?ix*$orHD#O`mF-0HuC1uVC0I{zGC@KgI+ZEZOA zugK%a4-qMJ+|-Movifq43s|JWPv#wGClV3NYSmaeEe9>B7}`Yh&_Dqm!D6kPJoxXV zHPjrg)z4@gas_1<6(m+QCemhdW9eH9tr^3@Bqx|~!y9v)g-BEw)vKM)*&;hNORab7 zF9i{^AGs|Wu$W9aIZ@&?#KpN0n$h?Cf0)|WnHrhcScoCb%#O2>+!jOkRYev%qw9U& zUT~DIIYLM3eUH}^_3UBX6RTGEe0#!xhjyu^=Vgc`47+(il=0v$jo)_#U$Ry?(%3B= zYNZrWy~2MjZmH*eBE5GnOC&LS-r>7z5 z5mzBgk#=LMV@~#`Cj~a8(CS8FQ~wz3{Q2$Y;}o+pwJUdEgAK5my?}PXaJgCk z8`Rl(7jzJCK~s8nUP;P;?&7h{#e=c3qO!><<5LTqTX%8D1y^fT-tyVcqgMLN5vxDb zv~q^5z|bF3JY))kpE_NIa!iejwS-Auly>Ww`H7})Nm}vkgvYA8iqS5FKJIE9wI7jsGsr(?y8?6kWqWn&*rlNaudwu z#*%eDD~*JQ64VG*V&K^yd5& zWxD)bAGRewjEo$QzUWX;w;L()@bDmJFV8uTj$8{liS%c_EDGl3=9v#<;@!KqeRiC4 z0K;w3Q;tH8!ri4yQx3SQ+F+vGSY6cpU$zOS{eZ0!@+DKWrt+FT`$Ew$3sz(~8Mpb@ z5NMqf$Y2A|@r0QDlh5(a6cV^?g`>qwUrQCpcrM%zH>U!YgV?XCmjh~2$oykttU*Dc z4^}Ev$*}dd{uvd2%82~GIidFo@hRXXt~eC077UMi!RvzG=i-I8`(&lVVUygAX@{Xw zDI8ULI$qui&*L3pqJ4+?`RSuKbp81{r>c2lxZ&0Q{=fsvdROODS#-Y*2D@+HDlLX{ zpL)-_Quu1adZCT-PlxeA0D;zXLgw3hdP2Mi!`b!n9?#Fux7(qCk?V1opVf?w_j^?M zEUSaaR!m!km>^X9DDAH3MG#5vj(5s5f5Tn!DqM)I3prRHO-!mJ;?<=&G^WGxNYd^Lywhwaokp$Ubf}4TP!ii(Lx(|zT zMto8D*7-`VgE4N(h~zk_AVJMsw|*YZjJ^D>CqI((9&=0TFp+U*A)|0h8U`}eXfvDg zB?WVWtj66w@sQrZD(EgHkFd7kb^=oq2^VMHp?git>qtowD|13Th5)~fLU*-b3Q=s1zU{Ky&tVZuPm``S~|Ko%4(0pt;DBJi@f=YEllaWBKkG| zH$~|FgP(e0h*{A5ZaXDVQ@3|^nDpvuAS~Fh*IM^mspY6>&ftaDg1w_rRMsxAxl&4s zeyr|j#axCsZVsf$j5)76@9eEa%79u~v--8w3(p@o!jAK9-qW9{tT(OGJ^V)pGZh@B z>U_6&;}z2+i$nawbO&Ql0Rg}+G(NzzT}7I?kWMb%+Ftg zrAoh{E#u~GK1j!DQm$Er%VvL-+t$%NdOI81;`VSu$hgvqGHIWFV_6%#4mZQe{zj?k z45tf@OP2I+j-yD>qF$Bb%Ej;Ktf|A@U5lxU8>-H# zXn3lN#loy%IcnG%Y+SzPJyui+fCLf{sjI64A)faNz1j|d7mBX{+{`FdRd*fTAUUU% z@!EyMJo|Clt~BL3ZMFnH3t3>;k2)+t8r&1!qfn6~i{X4aTH3u0{=b)wV_3&X_gbgQ zEX$Tt`pnX3JeqJGn&julFVKS8es@y?)CUPU=rq>mNSX-_H0^i8nju& ztaUgzw<(`meufZWeSP+k_qB=V9`VOF(thQxjLw?K=F%h&m@K7Wddikx4P+r?L!EOu z8nc^u4E$$>HV%cS`d$=B^!yNujOi`sB4e?k;FA4g&VI9CSok9AN6zTUfRjztk3CN6 z)*UIL(_yqHh6V?bMn3jEO>};uKi`pGmxew$iatJPEYC87R0}Ly zjWSCPygbcHQI_!WI;S;>_RAUpuh+ew^j9OJq6VtvaDcrU*%1)D{qli4ewTORKH1Z>0|M@FvKju=Q z{es~4;uI@9H5K_A%S5IQub@mJ$PKsxYojR{<#KpxJcp3O1Q!S^E2|6(@zT+|50e*xAI(DY1j5<##LH!@P^bpy701$yK^X1;E9qq$8Kqtg2p zGGMfC8{!9mgZ9{CqSw>p%^V?S?-Amg)l1>TatWMflPq!kU_0#OF;&7&5n znBuOMmU=eiJHO%sXcDY9DL`VQSz~!o!v}HgmLs3_r@a3hnFLW+Iv!RZ?LRx#X)Z7{ z`{vW2MNhvYOvd>;-XaM>LNZ)x;q!WIJqjpC&p0Xd{e zFZyCGOc3@sGral6IYa!;)?5X9-z$}3hpc`UN!Z`#vHBTospPr;Cxbt-?8{JnO zfkXg()tL+@!?hQi8bMagXq_L1$5ORVcXQgM@_vs9cCRk${yaUz z>&uR|00x~p5P5P&dhKDqh+1y$Ab=-0N2{Eo4T>Rb5>AXlUjjmc`zxIp2TuYyJHGm| zovIO42Z8ZkeAIl~2mG>&O>C_ld4BXsq8y`y-Q-F`G@XJPB zEHeCyVwRPqRckOs*Y#Vs+~#pG z??Ibp!Mp~Y_(#f!FRGM6d#lMhsDI6Pu+0{-iMb>(^YrP!Vv~CNHY7+MPUN=?zd44} z+K&5Ms+y0BVy`~OzSJEl^~hMcWpf*%qphau{$wEogj1`~Ktv9wS0a+${P9N#f;Lv& z8uZffH$I0O*vpY0KMFbhyaPQU0t@S8=_p_hSz^Di18YD~8iX4&{&f`$qYhZ>ZCW-R zKi*`KA~B-EU)&E%jEn0&JroH%`s>oldQJ-is`nWB|h;v?}Fz63`TN&zt2o zQ?S_e3Ztln(L&Qn+79cBe7jKhyJ6NpMD`1o(M{<-CxO6r`Db0~Wlw%qO7S9NMc_x23b$o)p)eJ?B8+8AGLpeU1j3i!Ybg;k9zCt3v@j(B-d+MtrF9Y8EXG($CcJbbsP81nVEPeI=F)z*0`L0 z1}mm@eYG6@@Wr=h?aIpjd;KPVFt(|a9xYmTH!aeid%Al}k}UNP>*<@x6+7Uq{m2=k zB0j!#ajug6NPV6$cyTL8`}YZ>r($EX-d|m?tk$c4e)Y{m0T$28H-cql2jGqW|1g!VPQv^igGN1vV zTXR?)=zzF0LCj>WNAF@!z2R6uz^#NQR*y;Vz_N@e0EsLy>lX#W4#*#oghcm_ciDwQ zD1{Yh@UsToCQ^NNXo{_U!Vz_&hk-4#D$K(pBR}yKkgmy`7e~*IYp&z^e;ybhyJd(pf{Z5or>jHn=)!-*n1ASd=a$Q8*y;-TWIdMPwWal z=oVx6v2s)D4(a|$MOV;|PkLXOhDPcZ|RJeNy&> zJCH=9_8^Z7|I=4VI{dNZ?6_)T4-wT(p$FKu2DCY=;d_t#RhX2+%Nwx|s1dRZ+t!sK zd3$(H?r#_5B}oqY%=!)V_;cixz@^}8G(Uwvg-s#zqhD=vZI=Qrn=Bq#QC$vXf5Rqa zbz`GHRYHl`BIl()c4|frFn7DXhp``EW{SBPXO_f}pj+axF=D=7m?qI3LctZ&l8PV6 z$@~^HCijFq<+o?!g)0v?H7-Q!hx#+(V+qCRm+tdR$34ojPwUJjZT&j)^2ZOB`UCe` z{mpScmPZN&)?Q_y5|+~IFphUu6aDM3{ms67>&iEe=JV4a^$%~28C_?k>vi{MCJ%<| zsf`{S42~Hm{bq>~5(1&%42n^k9QvtK;Glhl%OwU-OgQ2waVj-{rF4MvnZ|i-?e$}_ z0ESs(Qje@bbK&OP&?H{(nOQePQEBPgP#!-dAR4b4?V6PKSWVV2zRVk1afGXRbF$XL z6t*OPUN2;6DKr#=`ahm!XyV-OxLU%@4BCbE zA+^5L)v7gDuf*NYf2Pc|oTd^!sU*v-B@{gz)X+;?` z&K8`bPxhiNrmhLyIYIkO^#nW!BnYRw&{+N?o32;r!}@rOTCsxZ{9}>To9NqkW&|($ z8*S?5mOh8{*2rMql4(pTtSFZ>J&$=9P+jwQbFr$%zle1Va7Dl#R79?8d`dBtK>SEU z*37-T-KiE*pDq98DxQd_h~`;4kOE>@*MwmQl*Y*=0>V#F`jzJNXUHWAd1W7`yIrc*Wv~?b|^Bn%lQG<@;r(GasUsqjt+c-R(lV*gJ$GL^YG0IPo`ZUhG4Q>)%?FHz=M_@KfM`0;5rsso2)}w* z{Ro4Nwk|CHrK|W42?2{*IpfOFcpQT8wZ?S}VPX4^-5x1%+n9T|LPI(exJldNtQdc1 zKQO!!5)v70?a!e4t+U+$dE?=7U)%8T@MJ@w*VqBDlc^DJ;F!mBd=IB=K+s5w4zaYdFQzr4rk}*8hNK)rxznIJp)H!9_tz&$nn*bl~Y$( z@bPDNa2ZFh?|6evospFbB) z%`oxShIN$*IS5U;oq(x@4KlaokXRfBTXz-Dy~=ymQ!KC9L)^W(qto2>RG z4NxkD1!(h7LjL1I71qWBC*rZA3a{dKD94WQLLYX>T^av`3jR2-K3Bp0(dK(j3wD|e zD}tOIA?fD+ly$EtE1cl9#u+U&2QuN8c7d!kPIUx@H$bQFpGS%!+4eJPy8J(f`gA{O z#`a#^cu{E>esIIp?*U$m-X-l~=T1!<-k2-jaAIR4ZTOOj);f`RuDbS1f}}N^MtZ4- z(*Q1?gF2n%kFV}3F=5HdD~cc~feCF*Nr~&F?C&K#o6boPYpLP)H3=GnYM@|Wjuclr zC6s}9P_NFB_EaBMBOcaUY>^W6r**VBC$_&{#b6Nwn+TbTQO#WJ6%GUW@djKh#2Z9i zYKY`0qb?PZ9Y#LBmOcqYxTFXo-0hjsuW713{%{(le`Gx#_Z{}&ZSg{0bU{H61S*72 zX>RZTrJv#I5S!-y*FuSnaSU%-fi5JzDFJhVerOH*!SH5zLUa03D$3<`Hk2G2850l zIo-w^9T_QF8la}uTNDg|c~?t|pIl3eho?N2U9YIR5qttb#`LQ69wbB?YZ|?C+gnzU z|1J!SeT2YxQ@_$f++5xBekh@oLheUk-UQ|=(G#*l4vQ-1?+xl&Mob}U+_OAv!;nDS z61^H+%z9|fha>xtVQBZoS#-1=k2mMCL%ue`A#ZxnJm~w+=vrwv*X4z6g{$!?CONE@ ziJ`x!{~Rqe7)wT`N(FTZp?++U@5bW$|FBHNQ#qP)>pkvBzn*RdOxNKi6m!+%VywRemL~U14sN}B zux>G+F*&VvG+;uW9m{ul)6@JuydFG2wGRzBpB;4oL(*^qvcKtgkFdvv%pV&Bq}t6D zjCKt~5thv?F1E69rz1Fsf1^i|gW145FwP44PSWeLaU$6Ei8J1DKRZdi9QqA)X%cH}AF{8lF3KVgDQk?SXC&GU#puNl=A%V}TlHH;A@FURTzfLI zBcYO`YD|Jf$H8%Nw9Ue0_G5kwpY}}M486bRkm;i6%Ko2ajUOH`)%ZqffxzQlb>Z4Hmk25laa7$;*!LE(>*zjjRyJ;q34pbwN$+4 z+jsUi_%A8fE$+Ogx(=;Uz1+h>#Ut;ITg}*|Vn0<^i9C$WcAEZlS9#k~h+iHES7m@3 zp_7pO1CQaXO(R$fj!eeg-jxp0ZWqWVP!N@EAyuBa{6NK(|3&7OOFqxc)B&?wFPemT z-a2~WQ|W@x{^%+VBMx?vjv}~q%8P3+3cn%J{o|<gwtSUG`3TwehHw+FkL%$owc-nM{*6mHHCQiIjhTvnb>9`j>~D%18)U`kMi( z$e-o;U&v?gi>{4orE_K%{VaOAoX+1-yL3L6N|kE1qNsW1C0tX$13~kfl~h({o9w;u zf^y38xOjhg$%e8p>&YZB)jfOHBW$$^>i6ZC$i!Nq^2X*a_Cs7f7T~HsY4h2vT)ZGU z>%pn5_4-+Ab+|UEmsjQHUe)`NySJw&5tY0pTA)+jYF|)ZUS91_58Z$UdmvaU?XZ<| z7yyD00{mT)HH|M@b*HMi%Y9$GZaAPD(R6sjA_L<)AG(9@bn*HnB#e>U+~H!?d3+pM zlfjTN^`C3IlO2ZGPVN}J4{ybdtJoXk7=@|giwMyH6w*Z)o{?PD28sRYHxUVeuLO8h zzo4qs(SkRn84$`;0q5Q0m$#&qNkjPHA{ZSV4f8-;xmH+S&a-$-XxZ@V=lh*xQueLO z+`Hu7k9~{;gdaS0ymJ=}2Y?Lf29lSN5z~Z;`-$lLyAqo786rV3iBFxevs7gULU0dR z05#;cnOyJgW>Hfc#t}N=Wnl?MU1d`9-l{!p3wAp^*q`Bwo0o1{Y2(Ytpy0(0lt&;-|~-r)QJFF%HkZ^nEF!-ag?KBJY&5d+w4rS3o7-p|K=s3_il zu5v5UW}@@F3|B#Q?;0O{2&%-oA)+=2vDR~qs<~cl!n|gFSU+Zg*Ix8RYfnn3iWWh* zOTP=N%W-Lv?vV-I_Bj4<)j6s??_xT4VvBHwj~2hn)0NvpkHrz+$3Sxun@o(oZ8`=S zI3j6`v3x@jKB0?6I(z`0wZ{Knl&~RW#>FMwok-;>g!CVg9fe6;41{q&l zL@OU7et0qhf#Ie1bC^YW)Cx|(>q$X@P$Ht)NNN>-cp4!gE? zPKD-YM|0bNPZe5LI&qn|cCVD%By4i0r>A@GbW}WbY7`A6-O%exLMbz;nEua8Q}gF& zu?Z6H#Y0Mgih8Gq%*q}i*JwQJNkg!lxJQ)K6Kc-OA0_L)C`FaX_$-}?FrVPrx&9%3d8#?{YbC7eU4 zY|xKlQywB{srfeBO|sO=K5B7pqEYJmHChwH0_1n_*0fE}SC5Vc?e3U+oo2kL^xuyA zlK{n#Ipv&ZW7YS%hSJ03RNl|^dyWT-T&FSL{#H^C4woTDWXm%FRdF_bN z`FMp{*r!^g9Of9t&iV`YhHrlq>@AN5aV&1maOgLth6$Za0}tf}j(461oY~&7a%-=> z?bGYN`amNvh`%GnH#!Pev+KM_?f2|7-jxX2+kvOexOgCNw4ZJ6Kn~Pj<|t)&KSv6B z{LEi4>_0V}Vtr+Ed=m4|p5>Pj=&nAa-En=}dlYRk_Y5O4#T#fuY3y1_=|v;dH(qw? zguLWb*nlL%^Y8t>Gk!=8Z);U;+s95p+)o6)s=QYU>9RkVs(fK9f^U zp1nAa3jE_aHuiyrM#b74W6&+t4mD6wH8^u@oK2VBU3jsrJNb&1?g<^3K5IWl(DQpV z4By6TSH$gm9|E1rPh$r)P}lj+}%gZuqM{b*ZM8@Ww^fl&tm0FT+XBQ>5d{ zj|BxAY!@e|HGp;jONH8ec5G6?C#7F@`K@l!>-5;wL$AhBzhkzAgQE}WI1{$J@zV+S z0W6}n=i2IyUrXq-T~=?YmY8n8rICPZLdf$-ULU)InQ1k>=ODJKp2hn6#aCyiZP5!J z#*^S9!+tMK&qiafpV5g~Gvu6>gCX)phCjBtBE0n$r`3A%WPM`ECQ!U#YTnE$i zDkm3cuPw<&o8o?I>8^VW@1-RSHSy?n7yFJP9lDKKQQ|`xQ}ty{=IG|BMc(U=Wy5$s z5K*#e{y-eW&k?qs7T%&a3EapXx$WW-+zHnahtXnUZ{kK1mvvH!x#JyEitmO*u?u2C z!V(!ID@;$Q5KGg}hXvL?MwbXX>+K5~#DT=$=dBePK)~`FbJ54GUw+}E7 zOd`J^DDXdIt2jNS&l{4BprMm+i^WwmIvy#c2A0}yp3_Ica=6VjG)4oHQ7=etZQn|g z{q)sw#lBVD)%6I7z|CqyA1Ujm%6+!LnNSH#PO4ot1IK>==exvWY;v+ef1--=iS_uy zR$;r@cPeOvz}e2(@h+Bwf)p`(7BT+En3&hPSsAV{2_>PU<`*}03#@A+f(@1aeL`P( zdq-0o-oNrWQ+i9vUKBrIK>+1oAWa){_)x+in9!hEIr&dRd^|fk4h$~=^`o3l!iYRc zqCl0shLYABCTQNdU}j`CT&E z;%2KAJiyyV(GK2zxir5%w-Fmf8di;wzs|=y;^FE(6%^JZ&2GP73q?7Yxua`L($?10 zXnr3b8=sI+apyTj5Ec>BK&FC{0%5JtDQL6r-Me?Zubh<%TpWA_U`cvUI6l4Mb15mB zGRdTmORUN-C@5Gz@&S|4X=d`Kl7h-y9&BZ7UTWkGsz8>AkP#p2WHJ`{~dVl(UZ=5i+InGE78SEf3 zB)nrAQY;*)d{V;i*4sXy8Ipn%TTFQe+i!Yl$;76B^@mzX^oI{0z>$SOA)4tAFdZo@ z>_fE4ms=;cw=*OJV@!os&6Ez#=*eaFv!0uJo0p<>MF532ESry3utX}y| zftpr-#=M8&C>e2l5?Y2hNrPZbZ#LO zFAw`KD&l>44m!L@aRVfi0lox2wL$7^Fh{>TWpL^ZCnkHb5~2*(BQ8(0og%3r8pO^WIrA|0Lk>Ytk4oM_A(O?OUt4o% z@(?~?i{83bXitR|w{!!3IbX@Og}eXxwXOgK`gcQ3a_}ky$Do;aiK&a_8a+`YO{+4J z2}9FL(;D})GSF~gY2DMpV&X0B4Y_nSKXy;+$4nXle2jP}6~BVD+Jen^_+q6CZ_yFZ z=YQZ+XpoM_iRX<(5z?uizw*=DNm-9H=Huhz;N#o2ll$v))J*BW{`xDIGQi=9;=&nP zeAUe7!7KIUbwqPqbG)Ph6P<+S)OEH}kJYOmqfQ>jY3A7<4Dy}ApDMULsdo=LPG=JA zXE6jEegxEr06Ra9*Cpc0k75!&Pj}bM|64Eysb2BEyw{%b8AvLMH={TZ2GT{@QqLor zC3ZFw^<%2uXt=9AwqY=Ha9lW^ortkQ$_s=diX$K)_RKXI zOZoqQa`4kPf|T`EMj8o4!UenDtDo1uYA?RbeNcd3%E)VoWTML=j`1trVZc9)+@jI=TSe=%ER)1vuk^Q`Qv}CP8OL+_LiVL$U zm=%3#nryGmdEtlUu*8N6s5`|}8wPT3i|y|1J+`5zGjKb-ysGf=Es7(8bgmm7n|4KI z)7|LK(E>-=G+PALfxeZw8QEW1S8Hj+JP?SK7aWWNXJwx2+1tOSI2YbCmFQ9t{q!U% z-l8^KmC3giMFvMEe`prh4|cT|2GueKj_1(LMKC&x1AqpZs9p}fp!W;J44Gd~`O*6weg zU+p#l%mORTQf1NiMT^hPuns;yzGf(`&(uoeM?<89mjz!ILn4b`V?cY$n@RJO4fUxL z4?oT1D>%f{UpD3CyaZJ>oaKFHs~DBP*dOd#3sE_@*|t`6^BJP0m;xM%SmYa6Z~ylx zxe~=1#wQD8)n1Znr>?R5(tdn}ST-H4awXJ_rj743i_?dMz0{dvzY`YMxF*}RbnrLbKvYIP`UX<oOfk;&Z6dtDjtK{r2q}_$_A8(1+dU9v^4ul2llV zPqMjc`|v+p07{-SbBH-oVh**=#@wBfDmu zCm)_l4lyF|<;@71YuB&S($mv{w|R`W*XiN%X#eUjpfrgD5&yPPp@t2$7}CN=J!8l; zw<^G#fW78B=$ciLa4x68?1P=XK!eL9DD5eo*VDf7<5)ds;@69B-l(*OolYHE4B*02fUr@uVe)-Fa&~EoV7p&=l1^*kiTAGxhOxm+MgMN|w774G}yo7NQ9 zQ>f_Z7QsEt%*-r}n>XqKj_S!n18Mv;MjHGsuSXb~0FKz7LwXNd(j$&4@(=ua6>k?VKOsYjr$sO+=RWdS)CMb)@c8X*G0N8FX2_fI2V4g1u%sm=S-Jzvhwgyw(+~3v zlz7a-dM-<0GElo}nOyR46ua3v}=uu2_>be=^j^7=LswN80HC!f|RVe$L*+M-(TvO9{G+HdXZ$IQeWQYC7l z2oxh0{p(uuTM_?g82|UAUy&y!qL-Z+w5+k1c!O*XAPBFu5%idHch)T>2=&nz_yWF| zs@1AJC~`a`A)cL1(r%4UizFzdtAMXOUdbgwiJ=(xsdZy!I@wGF)*z8UZqHAg6tOU~ zzT_4l+#nfmBcMS8WXG=1j?$C&3AAjG^wldg7U!_JxEK>3ukeczj3rsRqOYC>EHCyj z^tmpsj}o(L!e0CJ>46nYDFh)<5oE1=tfqz__hT)SfOz&I=2hZ}12ih<|yST{dxNM8~S-cbrHqL|j4^)2@Dky|+)e8^x z0-Ik%Bz~4qtL$t5=-znLq9LRlo!RvX38&>#`6ZUeX1lGh&Ly&01Z~CYv3)_sNQH4% z{qbDbRL=&mcR-M)a_N1pyV#?#l-P#i*VbTZrUo&;yb>vSh@m*qiLYm&+&CzAu zJI84yhO1X42PGbn%9!MnrI-bfA#8DkfY$$w>5ZzOQ)p;#Av`S#iU>No7?gmZfUyP# zX>f8cTnO;}p6&I^Sv++p@hW^oX(mRs zC#yLx-`5Dih&7vdtrK6X^3Se{KMk8{^R(nw(9$zb%sG;rFA_VMN}KOC)B2TIKX0Zr zSbt8170@oKK^&F+&%^V-|N5IVwcQTuM$(BuQuQZnq5UA9TOuV(J+polCild&Z zwWY;syyDBW2GM7TfIyaWQ(mqg}!I}$JqCJct4!!y710rGv)9H@+{buDg&1(p@D>AMacTG9?QXc+a zE$J+WGr-$*NHBkGo$0q$1!T{AiwQQ|*5j%AO(u15J79SqLY3SZ{U?e+;LN_ke=4Z@ za8Zjoz_b|!W@aVS2tej?k1tAx-|wx01=*yYlG4_aOKwuqlv=+D@9O=QrnqVjk&nlN z%s${`QL~}1zpq*5NmZZ1`J+GRLB@CUjU>0lQ5dH0^E(fi$F?hy-gyt}EqIt*T;PZ$ zd4baE5-Xi;C)PozqE<(O00-MS-JBqehxxz1Odq-MEk{nwPLRwa-7~GPfTb6|?%CVj zCEq>ZXRgy?Bh%5=4p`n<_+@aX!eJ>?_5uIt$#Lkt-AM?LFfR_v$>{>SC;(U+UO`w< zjD;WJj}kMb+an$;Khh|Dv@HgCjU}J^3n<#!KEylsT42v{c8D?fS;BsK#)U?C3%g93 zKE8fKg|%bl^Zgl7Lo;KNA_vK;O;J^B6D<1HiavEFrGId!e}3yD9-`w#i=kTKb+5IB z@|?^Rui`y&9Jw_jtaRB#>tovm%p)xP;W066 z5{d>dAiAi&-gTQZ!HG^1@l`S!IKNSwaTrWKGAaUXFuJ_3V2n`&Z}5ikPvM_7=jYX{ z2>#~uUAo{DGR#UbIeFsq40b(`Qd z2CZK*zlkfqU!UIv-p>%ft(T;SMzDH%DToE3g5`6p{77j!T1MkhoLrp2ZbB2EqN0>D z8>p>;s4PfBlj<||2YeabW6u?${BD!n7xJvg>}R7fA&CWth}g|I4Gj(C{E@9V;-54^ zg>Vvf-4aXK)X2e{K5^^Y+_!+8C|L!R^5Qv~hL)aIQBBe=@OF8ySAuzv*HM~QQFvtL zK}00JgfvwP;)Onc_M2efcSU*Jx^>HM8GicDizfTJz$T->3%CLf3oJ`_vo|zdKC5`F zws6BASyxT_(`CBG7$kng>d6w=1s>mC1dF=->F4+FJ3*o9BsJ5P}gS#hJFyO;9P@pPvj~eOhyI@*R_?N0S^$F9#8Ur6u%Q_n{P4LYx=OEX^;$ z$&=_zz|v=&zX{6I^QohN18i)b6hvFi?vOCwe|=7W<1@;lUkqe24+WQAftXi#uxex}!JlE=l)=O#)NhmQN1h{wcTf?8U0uQ1% zVs87`29VleDw1(|(kHrWyo!+5m}o??mhcTZwTgsyE6F}yk;}?7WSLB8xo6mnV%Xi3 zF#IXw=g>-osYJq@;KnM4t)^Da^yYbRp~)w+@fLp@?BqS2KE$Hy>0^QHBjSWNjNU{F^2my z>v~Q5_)2yG66gt>scwg2LbQV{ni0*rq>UHk#n3z&8Ik3>KlnVD1EE>#-tz8N5|PJ! ze*Wsw;>8=v`7A{S*L@p0Mq$DCwSa`hZE2z$6xH50gifUie)k4dt}9pZDyyqW_-htc z%nTE=<>z8Vv8Uq5o~lbLCf9yXR!LSDjW%f0}CjEpRU`f0MtOKeZO(tZJ=7+Aw}>dv%oc-+v4 z2@qde7Ds{u6wBG3(1ok^tLSGbeXmS1oCf&pF$DOtK`v=>!sm|l-sg$;6HyF;f+?=P zabCMUJeqkgA(UaUC#l|Ms{p#Hpn!lu^TELvFA|F z^g8v{DKesh0C4UC`{-v0zJJ|NOFUa4BvDgC1Xh#q9MqOO*xMtk5MW=t(534A)a?Z@ z;(84I@3`q$f}itS)FxO~tLVS5Fd-o<$j#-VSgxP>%sOvs_KlU{9rii-3T-YKM$0 zToKqh_6l3AkLDDJrns%;xj^G3|C zk#<=9z-DO(BGyezmcX72@{I0+@{;Y9r-BV7LVRfiYecg4R47ivJqbn)8{($8*4lY4ib&u^s-gMZ9c0|@ko3L^_W{f_PoJLrNV^U8)698F&*FDp)#6}Cl~6P=&YEb` z1xN%lYQGL{p**j7kx&4AVT(XW*0XCIBD3gC6J|ZjUiCvQ)v=#HuQ#kdw24j;q(-E4 z8!8?xXuUU7+q-f3emcQrgcof>l7+lS!4x=F z(&2!d|J<)ZadE!tq{<4Tm_>iO&L1X5!7#g3=r@(tdeqZkj@FB1TJphYe%>Xjpnx$c z{NqQ(cB!?I!d=)hi(m|Q)9?D@jFFy&31iMn+~&Fj-8ovJV&LH`I>AS|SgYqFc)3=v zB)o$RB4*1|XZ#x#!=iKaYr38}5Fw!`J{Uow{a;6$;ceUfj4OY?m_x2Ve}m;N|M{&Q zCa#-E6d#Yv-Y+9G z#RWw`mQ&3LLA`{fMkvZ@7xaVBNabU)X9hDorn+Fll2HAaEaax*O|Y-)>tM7g_w~ni zTpgf=ey#29+UedVGx6OHoF&hN&IK>`!(qOs6fj<*Co}KMYy35kuU8&^hoGj`s~IdV zw!nWn!Rv|DPuq(#jY1f!*S~)!Gw^_Q?oh!cReiWx-o>W%-bDE%Sre(nV7Apl=W~eQ z%{MMeeMRZ@Sl5U#U$5SIZy7JAcKdJ>Ab!4OM+%BhAnoFvdyf? zgh*sCDaR~+SKaQ|`L7rpvshco~uwxe)%W`*_%;60!8lG@wJ;Xz3%NJ5z+MMWUE zxBw!`t_c&t0}CLyWj|~s>~eYR_}8XwEm#J zt#)x?0jFcGO$N=o68Rz~JyWZE^7He8pbd@U^o-PzI3Lh`Y~DFvanu+6*Qg2r_qE?U zNcI?5zS*_LHC7shXMU(um-7uUex{6;cz>$E7@IO;Ok@(wLFXLVe9xz1=v}iVTHcM} z=-WMdKRi1Gd~|4s2${o+$`>@iUxCBYqsY*llxZyVuKwZzQcPrXoZ87V7;3_)r*gG2 z>Qqt^6B9>V=R#)APiqZI4;S+?&HC$b$B3A(qe7Zf=dWV$apmJt;D62cx;w$`5Pk?k z8KpFg<5PGahkWr3U_fwkepaOITVB|Z`R#l~d)!bdP+LQ4s4+SUm#s|*g+hDI!Qo*N z?>1L!oVxV<(RRv{>WOL+<|m$>=U9B4|M#rG56?P47cH;L*i4H+w8p)l!Q-K2;*I1} zLn%kJ3yKF5!W-ujnGNQm3#E#$V2seG=u<@_c=ld(K6})n9q}f>n4i}KO%N$DgA8os zvx`S5SwjRl7abO>I@|8{yQA5l4hZ5}9|>b2S79Q;8@!cs*h=2SLNP>yBPbx4cRfpo zxx3z=lu@mrI0#S<~wE;EWgifLU9d*AO2Q^2pXcwka}1) z%g4M%^rEU@sN5HvCX=bx)l-dWDq?8Hl!XB+SnDbTz*QHyCl4OB+Ga9$$ab>-LUCsw z>p{p~p8v{2$g%a_!`xTMGV=+s_G155_)wi=0P`UTYHP7~V)X&|Y;J*$d}jl&Gwr7= zv@CT9aQBaN_6s87Dpf1Z?l&U))kY;B*Dx@!U)-*F^Y*R9M_^eimAmtgA|t!d`>|F2scM0zGxgCbsTw%$PBr)WD~hID&lFng?5u@P67Wo zYw){b_FJ$9hcaWE>WIX~b^=36|AHOB#rrTDLai;K9i%T?b5Q?J>^ko4CrevHoFfilrM3Kp=Uhk|whWJRn-xp!h zrDLZQ#F&SEYDRn^uG}yhO)`*LT)f^XD1?#&BpX-rXM(4~kAgz#gpqI&2Mk#6JX$+H zSv|h85pDSS^IP?ui%oY-0Rdx3j)s|bTTzf8Tcy3T%Hk5cPTQ)YC8|oqJ_m=LYHmP4 zKo_+{)K*qJIJ82fQ{hPcz`&2FHs~dHtMZZ>g?wLu=dRw!#?lhGhU4Kz^C-7;n(RaT z9k5d>@uMOqZ?Z}5?>E$RMG(7j)b&Lxama{|NUytOWYHqi>d*4#7HD+xsMJG66{GGdxBc?qQ=e8Z-4`xg zYte~rM{P$F>X4A3it9k4hML4EZ9HP)*)>UY=wUTNB1QfD1bMa~u7(xrQT+k5fvhE3Bv5nHz!@a z9}$s8EJksemnzH$9;|Z(yj99Oi$5F&8RN;xu}Uf4-U$GA!*N0ywY6^ASzqT;Q(qJR z7b&7C7{0^rsIR*3VL2mCcUF&#M%8YLYEyXL?N{DJJok7fXItyNrQathvGg6x)aM89 zauG8NFJ93F$et+`VSypSz~~sJ%u!XY;BUvauKwK5>3v(Ap4HxKjJK3Y&{Z2xwNM}A?PK~fNn6f-SA%T(hfbB{o3ytD; za!#-bn(d74TL=SLIWdpZ;+#%ehCcg}4UrYCl(Ha&i|hF_iL*}bwlB^1rQ$h9k_Bl! z3Y_0G{Vx~bRbp7mkkLAruwC@aNg-s6{DZy;DJx$QJrTV%<>iNb4*Ct0iHg}*0C6I- zuBxP+ow&FSxP;3@a4g1Ii+&*&)y*jBGh#hOBRo1@3_|v2M^Y0N9cMfgyd3-YgMmWD z3#&r{3L3`MRw0Q*dyU;>WsU7$k+EFhgYoEA|96>AwY4NXAv4cUzU(Y_p6%SEzMutP zA*b!;NMx2btORotr+rdm6rvbXsxGfT8Ms_P4z+V$g@ROQ5c+oov|L3Vc@xM%jOH>f zv0GplR982V*FnCME~xSme)mpVUS4O2VM6f1C+k}4#Zs`bQ4Q|F1DYzI^HKip55dXT zU~!(M%!7=WhwrUT7IzE{fdXN&$JwyTZ6u*=d!1?1Z-9q4`Z>dk7yIXElk4Nh%|n_b z-({~r4FDdGd4g1P%5Mzsa3TOApz?)AUIr`(R`_cAlvz5*PS!b>TfCabHbmzGWroJT}x{X0Mm zYK95yH#MA8RhhcMzr*x+t15g-BH@e!vA=rwt3N9-_gG5-qDRO@WA>IkfljDOls&XM ztNk7-7`*p^OezuiZ)=#H4{Wl{;F|y^zba(vO%%t&B_Uz7A{bFo(Z2SGl$OQ%JcQ3= zWXF0E-|X12kH9<-oX4fr)pHC0&K#@vI8AU`S?07|xqau>s!cGN=FZle(1XpXH%I{e z5NW)R2*))87yp9;eIt)b)J$vTxr0Jwi$g(0Tq{FA|8^mz{Hsq2#-%ieKg=$a^1UMm z4I=(wep;r3rhggbrgQmTX%efgftkZpS*fSdaokf=l?F|-_YvnYO$k96KUx- zJ{w9Is004q(|gKM|At;dD?HJ`!dsT>nvA0#xb*T@c(V&?fDv3oP>A!DRS66^S&d4B zvP(MJ+8o9)uTj0Qv%50!GI!?Z{|S>;tob?xB7Bs;?Q#dRSdfjAZL_GU-%mPbcnW|YKcni8HUn00-;_w;KAwJ?7l7lMOZ6*$tn3mRa|&+6 zhu^dF#BVF@j^`sMAl~e#eDOMp?(2LFo=UrQAtbG04!g~gw5a#WaG}8E#SPyjAOu4~ z7j+HCbrf!5P#T#juRkYK-EE8kQ4P-WuvVitFo=(Ue+J&gu&ZJQ(S$oScuG~*RKIw< zUohQx8LfgFR#s*|QE3Zdi!y0e*eWlB3HTuU_mHxluRVNqPU|uA z3}6`#hCt}OSJvWZJ8uLFHQGnVu8wR^%yP%wh`W@_Hk^EXb!0@b@!^<6)@7cUA1GT= zMZ*YfgTcP<`277os4`8q`sI*&lf(9Mask!s4x(-rUtKxlyZiczhkY_q$EDuTX12Wi z`Si*FX-X^FnMx}Z^&fg3@r^t29%5;KIN77rK7IN$>0~WmFFX+ta=DVdtQZ756biBu zReFNlZ0R3PNw*N9U%tl2%Q;#5SUsVmTPvye@V8&{!>lvCFtm1acHUpvo(Y)n%QPNh zc*J?CK&uq~E(S&VLjL>Q=G>CW03N!u7n2YYjQ+nP9vhXgF);9QP*875CnOLf#q-&C z&muCH+0;e9&~dE-rTNYsGBHWX24SUZ->Q$Mj<#PI4PuQ6ct0rYGdf(GeB1V(LiEbb z@I4(XE9k

a!t1YHZK88IwDLNI0*$Ro0c`?B9w>G?pFuyj=Tv@V`AUXx8zQ!`#t zUq7SQ;KyUGAP+?lWG_Q3eGC9x#r?Rd&~+njK>24twAK3lyreidYga$&d$oMz42hq1m~z)-df~duP{jv zIH+{Yf0%NZwcWM`@*bBtbVpE+VPjy(Hr#`J0ViN4Ag>53V2Fmhzon$%NKyB;FJ02s z+M4!{K@pw%*0hf@W|?eiv1 z7tq#oM~OVfj!UAQoaIPd{|KaUv%jB|;H$kH(sTVY;I8kjXmd^Cyvh}~*j2futFf8j z+P9nr0#R5Dq^`5s+mlQQyC8v90pQ(v#!5iYETtqAZ@&wYhS}{e)Tt#ffBAg)AQs}n zF`r>1GI0F>fHMyEa#dwzQ!=R9y9Vm=6VBFkEHmz*%=Zi*P9E+Ybeo$)I5?M0fm_BB zfB{o3?`PwG!2}8+qv|x885$yjiP3xdzEv?>BixGGEvQhw>(Xm?emGKi}8C zHt|gIsHwTcpv>Qoijr%rr)Q{07m~zloDTX&$Lv>z9b1FnE*#jmR6jLK%U3P&_k9iA zy>)211$n5y>e4E@s8uP_lW3A~<=Xvex<}&5E%~FWl9SC~>&I{cn|p27dlgYWDd0Rh zZcho8;qN@(-QFKC@OK#+udgSz^rsXG`u+P65myw+$wCAlKBtX?-GN8lJa|3hRO1=n zbGJCdef|tPSt%(~KJ6veS4Oy^M0Pnnz7ctG_^;$I{Ht$pXyT}Hwg{hGOZ5! z%J2A_9y$rceYa(mXc$Qx;W)Nc{<*)LOtIZx-8t6!gF!)k^}s%NjPGQzUZrr+x2=BD z@KW-=Y4>7x=}@jVW^+^$cDmIQGVRRif6yacnbGspTXn($NT-@0GEDI5M{GVM;&JLU zQsPe&(*~>H*)%pesyhszvr980`fQwq7z!@IDUou3Yk*ccF5$&#m^dTW+DT-&^H zRjNjbe%U+LPgLkWS2}@oiN`NpDj{DF>M(nAF0S?Tu2^CYk<)|p!?6%zE*y09cNMGS z6~N4wDU*yEU?8i6G(plul^5(HCWO4|zZcQmxoj)JOyd?>T2H&El$4a1WN=VWjm`GV z@sxW{cX#*LdPZW|-s+H&u{jA2&NJ0G!uan#ij>J6(~+08R$ji>v*#vlwk$ReWL`fiIz4h!Yko0GDObyWsH2L-MIZ`KBPWooOC|NeoJ5N*+sVz2`c?~TDutGi z)(2L)zUzSQ`H?pPA;P4E9%vi1qOw9xLf3|(qC=CcZRl25cH1;BlL)iGH=|FAt#gcl z%vkSn5N92`VAk1RD$OrpUpAUs)n0I}*o0rd4kM+MkU;-VXL)gP@yQl~A@e!Y&XBUQ z$bjsi5Sn^-VJ463c_mI9H%rRh4NY5eQ;?~H$6v%^%VNK{>;3vnY%1=!Riwz_gx|NZ zLnlWnoG0~^%+;uWz2q%z?U~2r8{-)_{BUAh>2A@kYTKrT4_4jhf8t56Y6O0j-$nDg z+My!b-k}~fVBN%s=sn(b2cC-S?{8!|-CGU!86OZn|KN*!DB3a%E>?$ul8GF}Aisib zG=`6i<$d}-1}S9d^k>12@%2yms}ZZE--z7|ygLu@AhUIuR*9Gfa~Sq#kZ?g$@9TTF zm)UgXhkrN?MlTG^OdcM820409B3sWyqd=N0#L!s{=BQkD+JYXS*lOTA_+DqXaBA%% zwPNps@wbqA*{Jh$Lz=tgClr*BXtA^l?O#~iJv5eY*49Q?V9-QLX8Arx?a<6lwQICw z6%{WPP`Ts}73I?>^O2gPYYQ_gG4?|;rm_VHqDwgTN#p7THR9SSr`I6=f38kFv* zxzl}8Q{{FkwyT5Sn0dJUGItxH$VHc97d3yk%xn@FmpqQodNcr|3Y8b5h9#h}G#yx4 zo_}Gtrd(*M(v#>5gG4y4X!nKM6xJz`85zT1QeZlsT6lD>>N4TyqX)xcAbDi|!yI=% z(h3@ed0K9{WfhFhs>77B`jgipy12^q%!5j6aU95M;Mx%ro6W4_ZbL5LB1CECe||a_ znM55-~>xofmzxr$j3qT5uN*hB`pA(y%3`KgVWbt0wP$6QrUq1 zULthT#e-7Hat13QXv*50T|E&C;cnw^P*G9)rru|`;*Md>s;}u~UPo9Don&31TJG)_ z)<;OB9fK;Fz>Wk5ON4KrA(M(FE>i#M#@v5Pdoa3o(Z9MZb7#MO=>37~kyPhr-|85b zxxY%SMS_1EF+-J#(RdP^x{7#CClj|@O)s7QA?bay+20r#8qs!@5dBhV?;h<70^gUe zl|fAc*VNytBR@BEp8f9W3Gvl%-B;LU5RPZqyz9vK>$X$^Zj~LP&>8l>@zf2lF*AI~eP}w%mHf(N`u#(!op)39;3Q*6X7|xnrg4KaP|eQvEOm}|0u^-E;F7MBeX`-m4h&-xJ|qs%Gu7|3C|gMX2E&0VNX!Z*;>z)U{QTWF5j^x>INh3QV&5V& z?5FjuP7mT6Y>a>Zr7pCbDG$OM=SzBC=X&$jEx)lb!(~IR(#gD>Ck@iQ7>Nf%&lE`VK=UllI)*?Z;I7l6Eftf0Cu#7DWk*{RmrpBMhnFkSP5+=cpP-;P|5kom%R6`d*} z&6jv#3&}GQTo4ZlpE2$Wz*KQ_H09Q0E>QS0rzVeY7GGcV42M6! zwe3oT#<9c*bQfFO`=n%=e06AiXAX01p^7{}ISn7IM{v1Izh1uSm?&Y zQcs49nH&4TIT}$sp@zYgy>55J1O_GslNb%>7N3-~bDKu{UpU>FZy8 z#C#@6cfzv$8HO^Z!v%$&9zW}5LE~LsS%E2Yc>#~}pT#+o;qp-5@d?0Z)eT4b2y3Hx zoP%}01X^FHnr$b^p4D&b_}0Pz;&FHTx10 zg42|e33Q#zV|vg~Gu4TLY7!W1wa^a;6Wv6aAD$NQ!N9<1wzH7_teAa%`s;F}YIBR~ z`-?|Er#cTJBwp5B`^f*~2Ri2;BznQO4`Ma4Sg(-RmcM)&C=;@4RDc0Z8>4@8Op=`LgRv4M#Bb!xZq5gG( z<<}!3&gT!_7b@?BT;7ux8~B|hU|KbBmd!J~RmOO@hfL5w$xKa`N+ia^GZ+i1bUqw= zVI24@C9*8C@x=LZ(wc`%yX|xRYi$lRseGVan@yF1G4}=0wa}VEU+CY9!OA7P~ui#gmpJJzw9b|@`%>Kk!NQx zK011`NY|P)hntsla`)ABJ0-TVL*d}SDv~nLJ9$5});ClFjeLDJ7iMU)_A5F;1vcky zy2-p^(NqjlJFRv5kTYK@<`-T_8X^`wRz$^$74DING@mk+jB%VN?cFL=FAoYv)A0!& zbsJ7Cywkr)0;E9#ZsXO<>JCSgi7uc*MyhOt?uxt!2s*jI%TZaMh1l^NY zqrfCDWE4)8zRe!+w?L(`WcNbP`ewWxD(6vVrQOh%Z=#DV3S132J3c-b=U05wxhdf1 zTeg56+SE?TWmTs-b$Pl*`6Fpj{P8cHG%07_VW{SU6cRmQ*?1g$swK^Nf!OWdhmx7FLm$o zg3J49M?7(%hpmNlRgf95OZnhk)cDjf#anOu?-8J1Vt#-rU$*fl?F~3y)6Ck2UR&!ninMJ!yQ7$c@7l_DwIUtrjv`RFf+T0W z)YMsC9t%OQvFGKJf!nj&N7C7!1I;h!k-Vy+ZboYgTPi=NX0!Lt!`s+AC% zL?$LGImpQsfFxry&nM2WF^kR2mCpi_q@G^7YVNaS!W+b=N{)|qk1=JYS1spSi%cK` zZS9RsULL2?&}$lY){WT^uZIbX8ZO&{WG4=5!<{+eL7eusM~N@ZOY=9Eqfdu$ci-Lm z?99Y8Jw1IeI}hjphTT&#GAk?p0mFRt3dJ}h>F9|7KT%Oh21yCECsrJ87ThnOoYefC zM3$06hhsdAjj|Tb9`{L0IUjc+d!<$g=^cfMY*Gt~=oD5e`VrG+RLaOop~;e=j@v+O z;-WD|<@5vj*-}@np{~!D>U1M%t;)w&n$LFBEPz6-9Tg++1a_8eYyZ(Q_n<2 z^`GQnX~Thss9)MiZj&ixYq*|y-hr#O>ud3n|AmxZ`e&JK}Nm><*F%=diFa zA8w3{%?=RXd315w{=-nevC(UQ|0bF>IT=s0oN4{pF`$_T+xzeF(nZ6b0SS1byAtRS6V+U988W^26u>%@Q%5 zFAXtbLK9wEM|cST+gYXP+eSu`SQc32s0wOyoCtlx^~<&Hz=o z1U=pMY>Q}`?DQM?2~Jz9kZqR)LTtmVEKVh*P!TLFc}lXG%JZZTcT_ec6F5~mU$Pkt z^A7{e{w_59e!Etw(Y{f*Y`bL~y{qdhz|r&q(v(ZA6lAS7&Mw-xLLtEIY^|@SQ!(K6 zcAHHX%#xr*f0H|iE~Dq<#AN=ECU+GvwBD%w_@xQegHR2qIcim5*V&;oK#)^VtlBW7 zIV>M}RvVK69v~RC)@?aH?znsV5g|k`nUWPX%YvQji7L|boVtYgEUCF^jzJ}PXce9( zqwFU*Z=f8deefAq-+(aTI&_>4r|#zF!{u6gQB03$L1=oX z*mFl{)ooFJuhnZ^pgS`xB_yTm=#F9%XyajV?tbbXh!Y?v!gr&m2*XFt!S3QU_MSiW zbWDGW*>;cr@i`Hh>`_^}TwVxog3Vm0+wxR~FE>k|{CxkrcL(b?BI3x&#Hz|=hKzpX zEpHup^mY7s{jq5z|77frNmUL~5UIh)@B@#Tc+hf(iQ>u0Kg^VbxXbfRcSo_uY({(C zT$_0+yQU!OadoYhisQy7Au$iI{mU+y(N_cG0C-n5WF(0NoW8mKs<-*!D@bF zA)Oi}6&S7>hlYkWkd8G{)9%dk4gkn09>YyRmDxSa^j^W}MMsf}N(JW4)uEoQLl4etHd}%S65TI25Vo#`Z^B)_-9TyHKkkfv=Ai|I>ZBx6Mw=Bn9eZ5A zCcj_|%^`Rk@vyEmE*B|4K_4`bcSMCg!EoSv_~$)`!-R?Bo=S*nJDzxm!q35OxuXNa z&-ISd53}WsK19{~1CJi;?e7+^3keCiJvaKAoh>g?DT_Du;4r#7tSr0(1%t$ul z1o?ukmN>=0R|OvmUAPU%LXTGSBTz4GaEb+K!tB<5PeXC=dgasC{(j0nNe7p~ytlZ{ zd@ZF_+Q+CtVcv_!AkrLBQUmDf)ihREhImAWE~?`sBbrwS)6&D+9%z@RWwLp; zKlJzSyWFssJt`8h-gfJQrkAzn=CvbS)YKIU9TBguKM;_Ve6`vQ^o38qcP=kZ^O5wP zG-7FrQZcN4zH?TBuWYXy-G;If5i0&{V3ovM?kn7&;VFuX7xz~8M-JwJ@W-(9wI%5B zXpfkcNLvKu(qv6l0cnKqJoCtaaY*3xr*YTCYKMI&D0k~}@A>EtI9+OwXlhLN_184g zoni>dBcF#F?}p$ZVy(2b%$##t_ICM<1a4Cjsl9u#+%f!m@|Q|+*xG2TAC_tWZ&ys1 zHZ5j0AtUl1*~1pQr?)o%?h~cP%#ZOSAWfPXT6)1MX zf9Vjmay-a*hu1Q_o8JH9Yi5Qk~?u z{!XKJ&EonxjKUa_ewT`^o}U(`mFs~SDgkRIBX`ME*`|5$EauECH+M}c^9U{2+$|=$ zS5W+J`(G|V#3~UAKgFLqcRsa+)FaO$2*uLT)jwPrS#6cz<0Mo)TFyvREiut8ilU3C z?vOWR9p$n&!w-7qQGaAm5r!@q`XvTh>Zo(lP>~!(T5^m~c^YiqUKA7>KW+i-hRmqO z{EZr?n#n#hdGXJ2ai`TzQ?=(!&mkFgVn?@Qr=P=l!6pEw%P;fQ`N_fj#l=NK;N)ED zjCXsf!Q|_sV{`&cxxkfqy^Bw`kYA&s{?6nOaM{rzmiIYgU!GGD!l3OwjvJHlU=Ap) z?%i*9JUy~;r?wYan`ySftNY;p!e;3&VO7CxFIm#FC?YnqIMjF4}4ZwNkT(XlRVRLHu6UmX>Z8$H5W;vGdDmn-852Q$l!c9Q@Z+x&WK?4666I zbMKyT$ErulFUvvBdjyu2hwGrDUReDk8O>+zwtcxZZ*?4NUQ2CKOvk0W(ho^=7cfB+ zjK93&ruva zMaZqJtQ4~cvrfXpRaG4-XC1E7AUo`Ry0M#iVmXAWk6?vOl^MSG`M& zr${)y%$B#cRW)G!2;BR@odP_(sqboxQMx0~l9Cp8c&tUinLt94luWT{)Vuu_xE;K$ zHHnsg7DkJO*%Fe-V$Xo^Ypys(qsP(7aNw*cX9sT<@AktdJG;>=UJv<5NVHNUR$uOa zT3xI{LG*%bAJxf(XT?LNp#_L+UX-u+&Z~9zmO^|pf%12?E@U2mAU3x%e+dGf z{k<)6GDu&5(!XC{|9+zOYjV%?nBT9zr^1>)Une=+LOR`^Kj6L`F2{Bp>veqe!!fVRBa%zW z0mjK|=YQVhW68c!7W%9^0++A$8z*e8szo~Y5E9Xxg4w<3q3g!q!v+o4?WabJyotDK z9kypyhn~vQ*n$~^U*_)pcrU34u(_sQI+0emIba+2fg9ARN4SOOQS`hQy)PI{0|Hai zQ^ikpMl)qnVpt7dBTv@W1bjjuN^W9e!gaJii>4%Iwj9Pd?ejY^rMkQu&2*>F%rnFI z$uUlk79JgP8kRT~bb_loGtcMe} z>{RYPaKcxND*5;Vd~>4jrF*{dF1JR#wCk3b6y+-OUaXKU+q%dLZO+0e-d+FmmINh1 zQLLn;tE(?6EG!}-ff7N;FBsY}FP8Rei0=tCwMJsNN^jS-4}V~{4v|eGONNiP@38(N zX$$CFFzc*#*w)_F>+<>n1Ik5??cdXlwyU@9@4nsfky|@G-2`q0W~gkIdW}=bIVpq+ zZ3TGsrMosf7oTw2e=Q&Y($Qw^EDNj=>I6mLf|VEz&`3()#&-)YvI}P>Ce}4t_(L7$ zCW%gM;lt|1q3?>6|z`g|3rqOW-Ux7ICpfb=ANTRqWh4Bx0_U%ndLPcN_o^r zp(p;Gj&{~I5jVM@6P8xM3lj1n*(mMR^${*EF5bn(=>4UTt!|t52n~C#rArv66&NA( zknaPJJ3NvD6)V8@Ti#eW=&8HZxY%Sya8$9!(l2mWFFwL&1{U<}_PuQ`_fz@;MU+;{ z<>lze%c{7ru-Pqz$82UgC8_~&cPMZIya=Qi*1rcx%Ot0ya0D0kya|mD-=7vH!I0tS zmk4N{*`hNiA(>uhTF`jVsv_~M_&I43QtZ55hJ%{KGoh(D@|lX>G*n(tFBBBiKt6AL zH)yKzfCOl)l&e?;wjfsSf|>qegpxAdjGOWjLo1=x;*L0{@09%(@9*Lxva=4IM&0=+ ziDD^xkJOmoODx-Wj#zejNJ;3bmph*>YX{YF%x;9$+(2;{q#k&TW}p9ct|^Z2rYt{& zHq`jHJzkR@S{#Z!d5yfqKae(1i5@y)a==(jOK5Qw41h6c}(x0?@1c(so#{K)Omv%is?p+IsD=Mg6sI{MZ|Rio#6-NgwA zrKg2Kz3ut}JcqPKqZ?UiP^1UwRVw?NM@C9JcDWm$+kX1wiQiuO3K6clZV_x{BHjtj zwd1GtTPT@ym0*0d^M;Wi=vnr_%yM|ufsMAdwrIZfq2$+szp4gd>7^F_k6#$wwalZG zil^!pl&1+7%0*x-U`NyPl9H0Lq!b9FKh78zZSj&1@auXjOHN1EIo3h@Jx`k z$=H__bX{$ooiW_H{srgD`h9+&jVdWk+6JqUdA_s*kDpJS<}jh={kp%$)DE+<$*{2(x!Jzh`Oc$}&wuh?ou%5;tkPwI=8w>{;2Q+4PS*D@{+ zYEPZ{iq@HPG8eXX53sp8yAB1wWDztC#9*;#(w;g^B@_p`7Nm58pomWoD>Uq&S-mZgtSzU@Fx%+RP; z%DqR#+)JCA?w4-r+q(?v)eahWGcuLQdgf6Ek8*rIMBHvoUDi6the8dnS?nrKW1dBN*6T(PurCR`)aBrHWl9 z@a-x-Z4{%Bjev&q~hD`*mSdyH3H|&&2tg*J}29YhT=Yx zX>@bfIm4pQeGPc-6i&uHtwXO-K5)my#RYM2_@;gMMMv5Ct*zbC%1TnA83mg^{A*ks zAu;jAZcp7D-`+;mCMtnao`$8vhF3tOmkJ&9o7LcRhf%}OY6*K4xJn_?ncH-%lEw|_ zdP*+8?fhl$o^FbSVr?_TGwO@Og#~cY&}ClKjoZ(H zE9#g=a#RrFlcwL&T>DIdY%shAO`wn(eFQ+ygzQ_JaU;dhk0Y)^HF@#u8$9oouKQs= zBdwEB=ud$%zF8erd$r{exYm611xM%2R^B3p59nRg;_}j2{S8Wpl={zK$mZ0wbeOZw z&prkQ2A<*KN^;m775sh>p-YbwfNnWiC~zlByk)ogGk1}wLFTDP=x7nT;w5YBo8p-p z@_JnM7o!!s_c8pCN%Fz?Tzb8@nqRj+&F|OCjFeZdcq$~CgwO%%*P~IR903Z*5ioqc zJYFO@J<%?lI}d%T5|N8QfBx?0Pl;GJ8;6ls9+%*B=IiSVgyf`ix^x&!J2{?~nhp5- z0`7g-!FZ&wlS6CEeoMdGw?v2MjCDrBDVr%M+`u8B!}sXvdZ5R=PGDBq!$Pz$skw19 zwv5T5^_b$BW)4yONXV_Zpe}P8uUN}0@VpV`*JdOha=gk@p~jPC%v0Fl6-wpcO(E3u z9F39{Z+6YPF(Tc|aVsvg%qp&VJ4Ou!#i)dnp1vko?V9w>8s4!Hl>iIW58sW!eCGK6 z`T03?U(_b%!v*!zep*_>UKNiZe4_(XvKP7mNSVgIsFabBDK+i#IIh1%e~KzaQlSnb zs;z~t*pZ^``)An-vCO(gVpcm~{t-g_kao!?SCPed!DMVM3fLQOYwYOVUj#It?Xziy z5U>Sn;f1U6=pV%0!)%>>Mfy|jefPNI@%<9juBLloCev7S9gn-xF z9Zkqp1PKM)cX0l5zr^M-OhW(Xt{ZO1NG7I>+1+j>xo;SO5%y)LN%k%pKJ=xOq+bi5 zo&w{mT8n9y+U!4UQ*@Un+4=pC_u)FgG%>cW!GFHPwWj9$?0m5+c6C#8ooO6jo+9l* z#$S%riHALl)PW-^O`jC-Bi(;FpwqlUS~~Oo;ES=+yA`jZrK#N=Tz7f;)L0n*OWxxz z{`=mtl{gDYA)HRex-}T_*HL<~3YER@eU(1Oe{j2SI0fz`l=;rmmX+MtGE~+3yI}1E zcp)8*^QprkM^jObI0NHF$F0GvrzWZCIEBj0+_%)<+QK3MQBoE3^trw7j$9Tx2Xn`4 zRtFWLaFeZViFjR*b+zY1d1?e8Z(T%%3IgENPtsw&7e}*)R|MugD{zMZ27OAwMWIhd z>yV}^k88^wS>*if58vCSrs~`;uhrM@@6a7gLnXYD&7c{a%EeK}X^vOf*n6dt~MOqZp@WW+4334U>z2m?2zD zl8|p2WbW(h^y23|gRApa6=(H~*Mp03_SQRE$CPNoFl2@yt^=NI@ z66`%eN4{f@_W1M(K#C{gL>tikNV^@ZMW;)|B6^MU>u?g$l|+sh_&4PDY3B^veli8|Z1usvT z*&V4#&*Q{uvOcBpI;y%_U_#`=^ce@=C?qve$Vtzs#(oDvXiAonavQw=*wN$?Ok@3SqqhAe?NUe zc4Bh!z#grv{M7Pp#s@34wHqjZ@xSU9J>yUFszu$}yLbP7woHn*GMz@9mMh>_14d~h zI@|l(h+x%RMXjf#yxlMaj`Bq}Jv?jHVSW5SX!`usY^voE22>wmBB>lst~G!EdOv)8 z*NchikodCeRkMY?{pO!E>%QN5#0eocr<=#C*z`BXJ3Bjg@8gAuWf~-V*St{MyFGI%*dV zh{iB6X78XqrVDR}EpMv!ZP@S6%>g)5m9}r%Ob{3t+G-3<3K_88qayq$w8_4-&o|_? zw2L13(XX8-bx7Rank>-5kB(-`o1(J1Cz&**r=tV522SNwFCN{4=MQ?BwWmfp>jsOVw{hihB89e^9~kV z5->^!mnNJq1sJ{4jly7$vbnJl`sK^a@^Zpr)A9XUt)oC*A6oMLGZ5sQRrKF(9Y)iwHiuR4Y*9N0)S&-X^ zPO3hZtM;MU>ry*{;*o0i%UZ5b``b`F(>+e>WgpR|-e{c!IRvAh!TyRu$qi#iCr5+~ zB=&)krS%1OtupUbsGD%eMO$fX$`GSkE%&p9NucEXw2WKNFw>bc)tUtYmzI_mEZpE1 za-;G2&cL1S>su~~WVBl*`zkz91B}ix*w-j9@dT@>yICLZw}_U#-&hbr7>mW8!LWJVWd!B@vH_zJ=+2;TgC%U#{U^Ux()Lm&)v2;SRI6%* zE?z0P)Z(izb7NTV(Pva$Lvc`trBkLRrY>x-qAdm|VE%8t0Kl*G)uUbkxB(n>D&Kmj zEq-_Rb;voO;YJKld4c`NB3j1LV&b`A!qxRCn_PjxyJJE~u>WX{ewpcf@cY&f`<4FX za3#%nHv5ghrj@_DyqmDJU$wd8zNdh|5Xv(0iTB z?rz^b&!szRbhlb9-7n7zXsrnAfaFn7@D#H}>T~;itosQy7gy|62hdTwB^=zVtOF7$ z^P${G`~72}EzxTf{b0`FzMf`r-tth5{Z`Lz74cppH`pzIrHo5%W6S&Jw&;%I!L?>= z8S1g0s;%=gm`N3F^g%P1uB%^U(Z}eGW|=;i#)5}#xX`Eg6~tXX&3kKY+1sW0oX?%E z8EPE=sR#DeZOP*lbp)9$}gLPkKja0p^Z%a!w z$AUK#UR+!ZbWBcPOHh1ad|Oaxl5SS;`t|E!U%vdx61?@8&#hW0MN~vYxz?q^wIZ@? z$l6pDGql$L5EcdF$hhlCnO|1 z6$%7;;{sHHCSKRBT?5RA4evpkfrn6v0?m9>$fK?PrGZsjP0dSq9&x)985czOVRGkG zx7`x?CNecWJ$!or2)JP7BZ>qg4yt|rC$N@GgDPlsRqc0gPEO9zk%N}SP!iL7q0`gj z=&r$bxo43|VLw#6J{{l3_pTsvbgutY9sMW3{P(wd?Lv`ZNePL`vdzR!@jD$H^FxL2 zo$c)ba5&2T%oy?U<3}*T04{LrnU6ObNul#0gW3vj=88}VF{W~MM7s_io7-z9DZ_!H zX1}nEwKov9I=2D-Y;0s?2N&mMjd>K|VvtSh3}~&Dk%J}31z8P#^D{(tr2c_v8w@gf zdu1FyNhcX?Zy&fOSyNuAsV0HT+y0e}K9fIt0DuL};g^qtF3)zQY_4VYqUB#B*~}*Z$uti|YdSgH#8syKZB)`3&6R)jaO?1pgc(TAMBFx8u)k86 z@M1yoKyF}<-i_}3D?2JuIW|Jry1{Z{zu<-W}vA0H3oz0JNV z)&G4|G+|G`59vpWKRe%U-3MfmIXcj{Q*ReAnv;EkD1fedCH~_N;E+zrbqj^R`L_Wp z_=lN*xq|q!S;qulatu)mi>=-i9~aje+DZTl{&n=QdV-8nJ`e`r&d$z=-ekcypbQ;I z7F-3^5F|_srKtQ^3h*~0`q%HE{A76uClCcY1%&TNECPbl{hQ1Ovh!afB3 zf6n~}^)}cFq*eOi)WJv=34`@ef3y4leVe)BBh<=@$(Ji@Kl*@`_u`0rQwpsz~ZNR8(mE@HB%9e76F`kWg< zi-Q^3W>UJvt+a;OE0sW>wn6i=Xl-M{-LOP8VUh3XuRx84X77LButR#dUSWuEYuoe) zS*S05y7I*B^ErH_v%Krby)knxIO{@47?2GYFK+sqJ^J@M_*tCC>Jg9k)V&3}_{O(H zloNg?)8Q=vXl8wv78A>I)Q?RC+5RH~MiC>HtS?G#?Ze0v^IyBYMEQhYis}y-v2)p( zNFkjMH)7c>t^VJ?lgT=bMTXdQP`$1o8ajb;e)HziJ+D|!Td~ba9>1j~zcA=e@|PC= z{mxMM^JG(Ja1q-fDb&&csQ|%`pYP+0O}PG$FJcoMt^X@8}7#{omvG?bqGAcXO7WVSUWKx-e{o((;-7OcsAgW%d-_l-R#!zOX-$fd>tGgi^Y_O}jPK+go0;w|(67^qkpFSo z|72PP{WOgEdB|4!GB&**@`;iE`T27c_8Y7K3glknAp!51g$>69Css>Oe#{oh>%WkB zP-Q3m>auUyrZfib-D5{5r^}<+1yCOI4W+NgY!2SOJ=m?8kxKNBPT>DO?{~6oOgEkq z)u;4E^0B%jxK%cC-@iVlg!xUr=}6JO4~d(y$T?VePJs*E@WI}eh1DO_vAjG6nly0Q z_w$7=0_vaGGK2Z$>H6oLU?a$=&Mt+7-6kF=Q=2;!K|%lrszl(kI0dTaf`)AD@r&!J z%vs1ChYLSt#m9fO{krC?#C5ANde9sBieeL8Z;@$#mDNZ*wB1!-yhp%lAPv>J$Li3f z&M0dQukp$pwb=&oErsB6yLFg!{~A`TOsm&<-g}T|!&zi5-Ff$#Ag>-HySnEsHT3eSOoem=cUIjFgmQuP=Lhfv@upv?IICYq!(G z2K{^;5<-IfI9%qoVEX2j0!)N47{*N2UH-g}+k@!6&uBAPQJJS!)@@Y6YBK!Umznv` z`Pui87{#`CE=){Te%e;T#t-$qbyJba4?G+Vqm~t|4D%?ou{G;{8SAW-QSJ+GqUy#J zn$nZtLJmcCudOP2p`!#TvQWM^%SN#+JAc(s>q z>s*@;oYx14AvUY9@UZ-o06yyGJKZFm5sHCvHRE}@9!!}Z?VJaa+MY=_x7ipC2S}W` zoW)egn77XIvqr2p)7bNtb2OwS?1u~-DaaJ5juT`1P7@>_Bb+tNW84^zOY7-w%9>=) zDo8wY+>j0Q6T_eU@70h#R%o$61$)cl)(Uk$=TiR-TlAu-TV9A&2laES=Wr#2Ug9a4)qJYiSL-WxB)A(DM(9w0)$1siWyQ)Xg38jLDHD8+_h=fs>_3uiY6*Nzf?O*#?m8?$4^lM4X$?lj6h?Me@MqZJ=8XH zq>NU8r{n8gvhT@i4wMLQX-!>-j?j_(Md|-Xp8t2Y9NOh)E@AR5{}72J4}j_fc8Wt8 z!IGLd0nNd){EKEZSvHPXbXbrU9ED{V;89>;qbh7h{gHNG85IvSQ&D&a}Jh ze-7~*UztqWac-u3sZ*_GX!V2r^uc z5HbW|uq+D@iZ69Ka#K>KjT07pb|G0NNS3Np-g^nZ7V+MjWUR09fqs&Y0B!KdVP`4b zrB|hq>O$VyuXA!&Lw z!fR0xF%CD*f}jh!7e{~npyU~G2!TRz?#*pX$ICm8F`MiKd~Gh51ZYQ#$?Ii7C_6dV zOl3{#u@e0Z5_fY{P zUo@*kd>BD^g%=eaU+LOyPqbVkYhSWFtu{>FrMG8K+tpMOFDe36lLPqd<1c2CecMav zW@#~nq7>H&R568g7>VDniP^;b2t}CGUK?(5m|zx8^zn=_nlmrjJ0Qu3TH*}k@1-+| z6QG61eISZpL`D=NgP~Wg2^%(Wo_r{rNz4U?$Q2{MEOiq1T#z8wY=C%iZo?w^;yaiH6%% z^l3!}$Y;Tw&|o^H30RKDptJHQ$zXzx4H*S)UfC zL=%CM)`c8rY|t=dm#@{{cBtV<3W_WkQ{kbeTdY|gjr!4b zPzqI*QIY&9aHq154-E=B1@fptFtXI)7w+bE58CSqpN(yVSHfy;F0#dcsaIPx?$2v3 zR2Z*}8_OvbDNhutU4TLo8A(TMWB${p;~(*CPZ&D7ySL6}3?fBf(vSMpol%%+$Oj?B zY^$8lgazYKG-xtGTiSU3&IX@=ldZV5e}3)AYDPdr(Tu;!*C z7>VN$IfpM4`eggrCw{lkc|l}Gn(~TRfoEc|^DEJ|Eiqib%c^!M4(LI&YUOPDKrjXA zV%2CubPxXfd9y?v{}N|7TJIt4VM z{be9>2A5hElt@IFhPUYlk%;Lw34h|T?*UGTK=i4)etkmB^;^A)bs7#y=yp?ZZe5_; zmGuo1mX2m&$>cMR>U=UH%ALUWhTgV#n)G)=M_k)ht#6kf&};mj?iUKCyRss)M)V&| zijsf$U@;EDzgjzEF!=-ekyR#ZeE=WwaM;dHl&4f}ak4&mf9K#1pm(RZDUOcLr}M2x;v3j5w+Lg%j5T6&c@`^ePV1=HP91WjqU zMQN5w!H|v&Lh$VupJcx%nmLhtqU7eg_nuJkUDk|DCCO z;AG-A-3^9OU5_z9D5 zfOqwINEGUjkN=RkqVtAdTxIn#G+iusSEKK_dMq{WbE%*HED_kCWTtKW0Eb>c1} zmJ4xFywJC@)~tr!eoNKadT1m2ES==zuSc{Xp|9CSO+d4%eY=vUPFzXQC^w3)glwv9fIG6a zxqEW)GS{FkR`OzW%P4c#1OG&X+|*Ah8EMpduYiVl!B&p#fpkG_u*>iyad;yskkZ(> zFLosE1Q00*K3kQTPVGCQcr&4tnyVE~F8j)@Zc#lcjKml|Su9o)g1Wg)%vK+OcBUT% z(Xt8Ha|;0Q6D^DN?oDh`L}ElH2p-d7;N*jax&0!g5eT75BThp*9r9MiZmBi2j@f2J~ z^c!(83sOAM3d`r5g$0VHva$`n^-7{PL_}1n=-_#|q$AY>}RY!4BNgLXcr%zfZHzXnn zC5g^iFi&+81M2swc0<&Vm=ixvE~Cq&QC5tY5n-RKox=ntbifXnB6wI? ztd28;W}}8H?!KqXwhGjh!|u+i2@q&SnhAhZGX;K=aM=$u=|n~&O{BT|W1HdbLg?*r zI?BeiL2^SwrJtESsnB*G6*1AS!qzTzAq!XN%Cc3?h~f9=4<{BIXxXx0-+PGi(Zy0n zQ^oUzhv8%o_Z9r#T8=z}!uur9EmH(j927vc*HM|qkANTCb#=0Sb9w#3o1hy_2INu+ zKRLzC-edFF^n3XtZ%^LA00r%Q=oe@O)WHB*3RJ-TYaNCamnH`jdB5!>b2>Jt?|Tok zV4yj&&4`jrR6sj$XhA$sSsJ?nPo#Jx;2@L5W_rC?Tik<6t;0r?ykes{BBtw>AHHdy zceKhS(u_JXQm?X@EZ;o#XY|9D-J&uQgV^i+zQ-YMf^N{I>osEmNkXV#sEC*Zm)q@h z;=OB?#oYCXP)2vioid_6xZl4Dq{`^Sa#{5Q13UQhg@LD(t`a0!47&TS*4n^<9(uiGWXn7EE}AF}8|y)YSb|)RDbJ_Q-xR|c@x{JKYjpBi*EKFM^)^dz4#j)0ZW#Ws>6+`WNnbxkkC(5 zqL!k)a5Txwa;SP*Ba9+o;Of2}K6gtM^v#JR&HK9@{?HY#Cla-gNqnaSspVhe8UiV3 z-z4*AhW@OzuxN~Q>dZ)X<-#QG5pBgbBz_AhNv5+F)NJOUbR4v*CTi=FIUFR5hq3)T zK)YIzQeo^3jhQr0++(F0jA-3o?=9&SnrcPrNpb@>!r1LYSqvB8s&21YcV9D)L|Ba+voN)?o6juW$8%v@wZ{lue7b2< zFe!2o@w56x$Oj_ybT;Tus~-*Ev@$WV0lx%T|8JSFk9X}A7!MMJDFUhaLX&Gf%@o_W z>+t}rezW?s?Pu=STZZRYAwJ%fuKTrc@Xt|jK8E?--`^bg`I)w*^+sj~bS}p|b~0~$ zkO{Bv>b~h4gKHyWv_nLtAyM`0EB(636Q%af^zb7B%iD`^=csGr!b&^j@LGNd7oMcH z$Uu4rn1>2q3peiGZJnF6_-3Sou-1sI(Q&+BLZov(j~bGP;G_CAx?&e6R)5t`5BIq# zwL5dWvg-8_n}MymfPvS$({msY0iG6(4ULAb++r}rgPHQ1u3*FuNuGYdO##few*%#$ zv!ml6(Er)%h}45JZ=?Sv*b8HZF8llIl2AdfCGa=k%L7_jKf~;o0S$Dq%G|WvAWb%Y zU~%{WJfLS^3wux$Gea{X#%R@(+l0NY@)qQ!D7hAXJ7}s(=7_FSW5s`;jXv&izr&Li zK?wHrTR5__!I6~F{BV#V7yms0H&RE_f^5I8RZnyIc2kFlxFKn$2S!YUF-EIM6u_dg zI8LdO>{L&MF*vDg+k2e*xM{vjfJLMas)9uNDy2Dm8AWi(%!<^HLv%BGObG>(+1s&i z7L*}WeR8*5|6+i{8ZJ;3g2~P|yDxHjv;PXwj&oRaWp#HA$p9-|@N zh(vEM7T4Z#X^;~EuO;yN#qlvw`fR1wPd=hLyDeG0Ra$K|qVV-vGms~NZD=$Hh{=vr zPyqqhc=5s77Uiz})@bKk_f0*ssbKJR2@osIRawj&?Sx?UE7@<|rjKa-X>gRoeNaJ` zyT~Q4W}W!W@T$?zPlVM<(PC#*%9^D@l8Xkkw)m#?W>ufMw1-gN}Ai?|jfDPNE0-g9i>pwv6C7Hra zh&S7z$3)16$KrTA4jOz`1l8aJ(A0di$fQ#*`K|R4Rc5+Wx9WLRx)+wQX2Qxd#pjEX z%JS`dY{AP4Z%EPRnN_))5;66iR)s91W)k$)=Sc?qg9v=zT&34hqYZ|Li1fcH4fl<9 zpAI$YhY@onRb?A^>#u9rTZnH%-)&USPdEg}JS#OOZ4`QZ>^W4*F$z=)HUQwvXrQnE zI5cfI^`8?*0ZOUQKG{lDV?z;feKXi%qphxIiiZM%~xF_B`mD)$7*h z4*Y;1GCDbiW3s=D293?Q613r}8lSdvs%O5hFfM1v==ST>30a}jXaKGoPJpwfeSl&* zow_tIY-sZ9*Tvq0b9XU^pV4*D77(;@Kbw!Ezygp;91gUj^4XxteJwO25l(q}j(wBBMt(5T>s%ne zTZ1e0n*&fPMu56Qt5S6+iOqF;wReR)grk7%+wAzo0{#&o93j?|?os)M63FC5J;KNE zz-j_hx9TA80XI8#VCRg=j93gE$mRQH%Cq60m{gd}h>Ar;#YKgoNc>z0ZWurfi$ zJ^7hrb$t*YdOD$`Is2~eodXXs7a*ElXnL*GfRA-ri9$w6L{hR2q))GTTr8=_cgg{n z;mw;jhAB>~`Nd5xMG|w0g=%+~x)$1$?8>!&{nN$Q+o(B9VXUZPkA=5GOrW}xlvHix zmcy}z^FSiMWngDB{=_(%zu7|mc+e$g{|)}vLH#SD)6j4$YUe4R;7|(xoh4q}`)-+! z2QIO#UNrpnE?=|xUh|51BMoeX#U{d|&qd&wD2NRv@P>!8_J0re@MtO1e46^ClqP?I z9Us{V*%3^yfhR+!l$D*WP`i5j_+%>b_VNF9SvmFl?veQMxg=$m!j4HCSvcke+W$Fk> zU>H||j34|ssbyL?;lf$^dL};649IdCv1^XW8$k^W{U+iYj;6rycxXsI|CitC+C*~q zD{wHK_WPQ>!^vX1V-RGvbl zADL7#lTHVMKr%Ystlq{Dp-$-~@X!FVU7$N;LIYzMm141P0!{)z4+B`#e@zBf<{TD( zx&h}rG*GMr>-yR$uoH*^``6B+7aa|IOp6=A8NUjKU9e7A^civc%arGCN_A8i(2wB} zp|X|GwboB-4;4SPaRf=oVd@1|EQaLD5~TMTx-)sF$Oz!gu%P?PXG#0x$kb}aYYUS^ z_(9SA#SI2}SrR2k8~G-jbpI8QzaJk4|3llS%GO(b_yZ&vOCRPcwg6VW;d=XFhNHiQ zEP^G3XC|1%IHD@Ip5I%Rm+DJkJ%>OD#~&022e!|D|5{bIFImyMeSZo2A~x^sGA^9XPGQ38@^A$Alfe@Yb-Kv@HQ@}a>(gFMH(cwr zK4yRAbX}pc%7pxdz*1Sc!MgNC<^2TXgkRYr4Fbhh%-NBe8N z-;|v&br ztD{?3ubjrg!%OeTS3(<1M9^$>itk=Qds=EbHKg6{_LkMHp%ckg@1x<+F6f~ldAET_ z2PBncVzEO&hbZ7i2IO8q7n-Sf0zi{5JRu&SEKp@SrRc048cyu4T|NVOAKMR@EP3|l z*Jt?zACh&Lwh^9t zUA^H=lg25q+|Uke)e(b5s6y{rZmYLuEBnFe4oqIy3${^?4iCSC-YICCnW>ZC&6KW4 zaX528YFs%AsAxMo12-BQ8>4;6$jHD9iphN48j#R}0UA$6kWh1e+s2GCD4zi(H;d^K zUaKGzd#?Z00$9~fHTFi5Gg~gGr%3}$QMIH~$Q3V+nMFy@q`0F|S8Ao_aS}cVY)crsi>~LiNH(dc1;%t z__V7lX1Bw?$^QN?cu@hz-t>2>wz@hekWP)av_K$QrOKcb-#0WQsKEe~wm=ySx*>A4 z>wu3Yp7gnOW(F4mK<0n<_bDTdlf#KbfKjqBh3ndJWm_8`GrW@08(NGSOr*}q$toLe zo2nnJS|2r0djGlx!rgak~Jhs|f8qIE>h>0^~ zh^BXl$fKR|8Mw z;B1HW+l2doL$`0ctO?~pwBP>Po15)&m(Mg19Bm661z9J${69k8^>5{JVc%s)T;!$O zhWS3`=xJ43zQVzx5pLl(rN0<*KT6ZH27`}&YjfX-+*rCDB% z4~S%!_vhy@k-YoYK*ic_D5(~Y19<+buDXDt(Qxu7HL>amO!OWO?-&=brE@VTkcS+M z(E2Gq#yv2Jxx!o#DOTRxBE(LDsEQM-w9Mh)s5#ix8nf}ctlHkS# z|2iV1w6s)n0R{+EX&pdt77)lR<_>0@gHEv}60d=pGJOE_dj@`SAV7RxKfLIr3|p)p z1S@T!L4PcZXQ44LQ<~!bULrhc8RQ>Nd4V<(l;HpN*9Tu&BeIMO`3t<*LKw4=sbfoN ztWJIf`FY5eXA{6MDJU#fO7uYtmw2VRV}RJA>TD)R@Y*T(R3-G7`H%0@7HmV)2tGKE zUWVLfW%M@WF_aPBO%n2hOQU{r`}%5RS+3%f_Khwm$6-fB&nTyA6IR{(X9zHa%!ucD$L=uAsTXK!DWoe-In z^aT|vBU2hE=6&1Kg9s1rmAC!)lO*tcz^?Bb^nY27t?ROPIqgK^1Sm-7w zxE{x_!h{!>mjX10r!9`v&SAJ5xv)`SE6;no<)rXuhu? z?|u@&VxB;d^vZe}D3uxrAT25VlVGY}-&kHM6b`asi?qLrHL*qN2^Y+{r)}Au3U=;m z$|;^)4h#7<(q0L=m`$hdZW7(@An-g+8e43T{@p&{5?a^vk*Auli6Id|@=ouBgvaMP zy5(VuCv(F1eeG$m#mFL=&8Ab!lG=ucmB=Dxa>v1hcHSQ)t$P^i)2*c?5agw&FPK!H zo|=Jqhswk)4SdGuklNe8^MJJAhJ~i4UjN?Q+*x~{3GA_s@Fu5Kh?>WY!f-X9kfm<F{%ehRO@13G)(`hpB|(o-GCjK&j@&aSfYPwGm2h@`uk%e z2Gyt+nPho+wS#~Hd~N~wpuhF!&-Nqg3O;iIEy{Ug1EWGW`4~tZEFpZK!uciV52UAs#kM?^^6m=uf_K4 z@$h>LBTg*&Xt3vI*i0CJ4bxzgt20wFkoCZ&Xtrjw@6N1Qvo16RCot%eK`M;LoJKSK zAthj3cr1Gu(z4ncsaA=UnUm%;Y*sc>mK07X7{_t`(b$G$e?KYM*^mjAX5jjQ_ z1{#9uWtpO(zkw%_*#Zp?1WX^en3?SvZotDQf(Ra7;#vq8Iwo^ToE2mndad;p^YbQHvJ)sYh&;_?fat2@at|NfzqYhg zj7`_U*nJ=cj(}Si*C=1kx1sM50pW!?zyAScK~Mnn%nmrdp`KX6q*C0rwzdOX75uMa z=)P*O*|z<(Hqxqfx!QhXZ?M?ZXr#qy^%q2^d)dl&?&Ynu3srinJiv{wTjV(t3SUUU!W$ertHmxr_QCc7SIH$o) zb#$>fMg0nt3^Pp@(*=ZebiC)kAV1dycDB*Z8VcO&&f12C4|A6IBYWU710Mx1DoYg$ zU>LvsWDkz^89HiR-4$AQGs7}vh%^#;0bgF$jczBFk>G0{!r=h32PC#Dtldp;lnQmS&WvNFORe*)3)ZoWmQ z?Og5s#K)J1Nv`lx)wjikUQb|)vFc0xt6pq~hr0S5w^k6I9lLA)Bw-d=)+Sin7*AVQ zPNoV}cnpV59S+i^xp~8yEvNMi4?Ip?&`Xs=2iK3ki^UcJbiqP@EPeQl1Fo_i!RdCD z3?V`c@QEKttVX3}6@@WUMUx=5&CP98FS39|UJ91-_EV|X4z@2}R*JKGr6o|tPSJdU ze-00cuEb>42i#JMQj>{1`rK@(6b%rU!2!SyF5dCGKh4zWfxvLp8ch9NUPAZu9XXQ) z1!jTmm@f(;4Ju+(@e5pB+(xG}Kr08Et?}mcCIUs*P1!zs4Vn29Q)c)lGx6{8HeYqt zjl^2zO?4rt)PJj2kDa+SC}JovNxVnH3g2o3ixDFmlR!EGNldc4RB_l!Hz8JR*?$!+ z2ziDk#&i>Y=l0Zh>6z+EvDi9XljmkF{SqT~bD+C7^k=9mI zV}?~~+xb^!^7fwwkA*~2YnQXp(Mh7AS?V#GqX<-rQKqHT<@c55z=)r;@E$$9|2h46sB71N3 zJ95?sJsn-#fQd-RJ9=CG<1wk`RQ*n%O$Fwh&mkaO!{@nIV)6Z?*YkTY(Y+WfK{AO1 zRmHu!=*p&_r5RmlPd{M$XGtbTg@r*Nw(B%Tv*U{sl^R~pHPFzOOwMgLXux8Z&9z$# z(66+x+X!jQGBALIMaKh_M10v6n_e)D{_069@UK*VZig3)0-qP@~!K^(EZKkOga6i?4L%5jlVzc zQn>ZO%+x0)JDh0I``Z&?*if#qoO>p$1|(uWuS_8=t*zGcb&I+3+nWp+g24nK15N!c z=_{#9)xq1JOTg-i`<`K?N5gj_YDjbu)iGhY2EZoNlE$g9^z3mU9-AMpU|7cT0DS;;?=qde7HrY z@|7&xejWkoC5OX)LznE6A0s>uoI0h-U`~8z$})9!W~O`t6B`@(EkU0_d8f`%e{6A; zNo)D~n@RsGK>Q9i{@T5j!EROugrEb|*9VsWB zThZ=&QLbDtUw;9j5y|+)e8b@%@HbE)T@SS^c+i&+x_0Jjf}OmW$5B915JIZbCv9e~$oTw@^#=;@6&IG&W|ESvr=7rOYs zkAU&?Lu4-)i!B`Knw$i)imxz{^xJ-Fj$~$|(>i#jrTq|$oyvwJ!X2ZAi zMfU@9%shL=G-+X&Y^KeZ*DSKR@@dlV6@DhD{hgjxhN-{ zH{l9XMGvKDei&~9eZvvFD%JbjtCOaPf~OfTtE%iFsDyV*J>mQiX;sxai#?NvtRGBx zh1&e@*4XvArmi7j;mIK}Sa5%5EA!L5e2!ls|C#4BQN?c?8sh%^83)qVu1Q&)HihZ= z{uOdCpN!D(pDU zd?JbuhSfc<&@ z3IqS7Y&UCpEFaS9YcZK z-}7o~1I-28z?-tQ&_QuBF=pRPS-6&=N&DFfBwn@SA|sD0p9Em#D;7}LCi22$HJjZ8(xgFXd3`dxr#Y%UP@S2` zP}~To0hekS$CRDb=~ZCf+rag?ty(bnzdY2%rh{EkX=)KQZ%*Z!*i!0nYi z8N{lhX)tCyDf<~IjVF$d0Zs?Cb9lpTuFG)>35D9Pe!O4kzf>tGol#g*(ak(P>JCva zvU2RSUC7{U)ShSLdzcCn)5ed#3Q>e#?8;B5WL>UeUWI%Kl5SwG6&DkF;tgVFE%A0| z^v7gJ?PPBi^W~c%zznCP%*_+^2K6*#LKYl|4agf#UYeU1Ha2i77OFFto)hSm=v*Y3d0U_s3?y|nszeD(q=pLYqY+0qoi zGFNd-)~Fc+C=wMF9UHjtf`>M2;XL@jJ1?uM(x|n;6^VesVE!*eLL|?-x;zOvsz7tS zMsO5&LJ{1b@>B|2L8T}M3jfLM9xR_CumVY!n>5y@LtH7}V*x66(u`%U1$jL~6aj3A-}lBJLZiIr^R@!e!A|ls+EYH#MF9)0xzl zL(Xse*M%0992KU4p243+TQ%mBwf+sTXM4Qi+eTV(Av!!=6la1EtJ_P^3;Gg4GB`*( zHY)o+H{wR{He<>AyPt0pB{E{VZ)NX;ySk^iJW8;i&EQgigHTdV+;mNs>0^X;M+%bwLN%b3mxhK` zi<3DYul8S3i5i;MEISg`@h{oo@oI-g2w>eSAKyJDsk(>3tC(P8TpXLckL+C^%rAi< z*Pa7=@IY|GKY>tF=NGE6PC4ZJ5?NT)a%RHf81e5O^8Gag{`u*=+6>WgRp zR#soHW^B9#jxSIIl#ZTB<%O3Jf6A9;wKuysE@|A15fB*YcJKJKjERwv4}}Hn8?<-t zd>H{pOgutQM`!f%2t#HS42h$ZD?0&WUB^>lrFVrkwdylS5CU$OFJLqoC0=L$N7-mOqi#^Z*cx+(e32?PD|73M>IH}e49MYCgGu1ar-D7%0v1J1 zX5Rips;AM zEyQ0MRjB}xnwyXktEu(sOCgSr!BCR7JXNkVMGVbXXod`F#O!d-YotA;8OlIBaC{)3 zpk&gaoW0H1kdV`Xvb0=igP{^LOEIXC|akrat0-Y}Cn#gJR~H=|&J+xPgjnV6~P ztQ!xX0I4%4X={BQ4szwV7Dz!N0{P;``y(%YG?&AR_dx?bFvLsa7i(UB%ah05jr@vm zd2@AjZ|@EeFYtm{uBJdCL|!?kO7q!CaQx{`G30ll>C}SjbtWw9Yt7{ah>Hja2(anY zaLYYJ8UbN3l^B3(94NC^T(`Z zz5bAP6_X%@J0f*|wvv@Rn@^rxPEOaG&-&6TKClzGUJeYHVPO0S4IM5w9OmQm4A(@; zgh4!j<(Uu4+a9ftfH5;RHkS13t8m0XKlPWLF^JW2M=tnqaBy)a6<*7Pg@?ZDXFpux zXM%)1Jp5lEXzq!|(iCB=i}26@M72tu5=qp$ZsG1D$h zAW-XhLhe5g}kBSzqGixkxZRF2|r=1h3ZOm-Ab>hBmYv(bpVgkhtrnH@aU=KcXr zYCFk^2??+8FoEvh`eePb&yb6gbEMx>p6YHTlqXl-Bv%^egu$sZ00y#5W^=Jv(&4`E z&d#={XK;VVb5|-ULUQ?$(&^=9)?J3VT|(U&oVYNgyhX)qMY7-^Jun?Ys+MtNU0q!u zV}yKH>$Gg(zmcRXDgs$H1zpko#U(8Q_MVr5jqn&}VRIgKb+;uE0=rEC7UGb+J)zZ?^C`xVC^5_c!hBx59fD~F?{n?Qsz?bOg zM0j~|g?1B*@R5y`yygK8(jERLRp|^kK_CxFjq6`ncoiPA3{VpCRD-Rp3q3tn_qVm6 z_jBKt-{L|VqQ6Qgcf@J^r+qRuBbGGg+%-dGn{{UNDWn5w6BSMAeI(qM80hTUH#22^ zat!uwHSw)J9pWQ~;na|x)qr{98PNB90b%>Xs=MGM^b+!2S=xm|iR(KlWK~Sh^{LB5 zl9ST_d*iarLUdFv>2BOw$RI_^%@Ao%%3%K#iZY2tWZPr0psPC0Q@zRTMYL$Jzke-& z$;?tBd587tk&>=Gs5#cwl94?*t!mNw4FqtG8R~RG_}r&wXJGZ8p0PoIaN+G=QL1R5 zK_V+Rc(77+y1ZC?1HeL{0_AddT_}}eV=$Zy2SGzCHoe5v%F|x!Q<&%)SFX|G=0yeN zs=?k~gL1Y!ThhA47ohVE9B4tL#%*8F=Jgqg=kE3v)7#dj9?1K}!yN>P1B3nM;93B-e`i1^RT(9lQB!kyck>#eWnf^U zt^IhF=Yk3ihglUFl=RWymg8x|yvF;V3XX?n7O>L4WY<7kN^f^p+r^9h^*KQaI2?$2e3#ddy z{PCtJ4F}>@c6SK~{%o)H8%7U@5HR488ZjlvQ^7;X0@s#CwAv5cgYd4(w|DYVG%@)3 z;VYLx0aTttk%JH6l|YK1a$M1n!AH#(-r^A_F3wB7CtYx35KLKZ6o_;%0o)hGOIjAj zdre-{)mi2pkq8hwgOW<2nU=OOv%&6n$VUbSwYmyXo>)Ii&Jv?{r*@VVCbFk=K=m%NcGj@C}{jm==MJK6@GS-l4UMg$2mX zT>YP6J8aK<`zB)lz!h z-V!JkgArYPf zPEOt%$tDL+@q&FcUL-Ib&DGjoz{Hfsk)1BKCz|-{fqR2X@7m#aP9UBDm(bx~v`RTm zn_@sN4iYqCQr)YnbHjH#+}Hm2fDO8K$`hRH#mxXa=aw|;3&8GmHf!6Xuzu4eqGiyo z`Tf;Rr07qDYnFDGPex4JV8P|eqeB#nRbY7^ zrPIfMzrn(?{k%InF`33MWETm%FK-6o z4;Gsfxm|76umyfMho|XD`u9R6ccD)k~b2O*-JLLDL zZwQbOIgUF2#Jon5ov*yR!3X0r4^Kd}#R?imEuh56M0XV^+K(-k_bTRS@9|bi-VdJK zYhkp~%87S;#wwq$RG7$Sil->=qWPIX(q6Hu*4q(Kchu>?>~jwo%Y?tZgM;*5f@F$Z zJn68p-v8=B2SA}HN*#)wAdJD&b92_8lctK9yKzNCL`o|wnLmEa+4XFjokgn6{i2El z0gU*o-)UZOE#2KW;PT1q0)>odeOz#Tn9VTaKtQ20DMeG*@HgChs=NU%D>Ji#@bEOo zbAS3>L&@7mY&N-X2L_FSh-X0BdI-d^t;7zNCX>K+F~zU^zLc5MV^p zvti3d5R#YV`5w{zfei9HUEt-!@{1QQKuHT!4U@SzR#wn)#GlVb#zsdMR$VV-iV)-D zn}S~~iE1H)FNcD+3I27;C-)J-*UzBfzR=$~zApjmm*J#eij7N5?BbBb8?RF`6!b z@BWZVEObsr)@4dlgvPyCV!0@dA}M z!0?=ysEr!o;PBYQ4?TaXz~zqp34{cFtIgZ?^)62v>&L^xLwV*QVX3K&Tppa9F2-U) z;2x6xZnxEoy;G#sg=^C%`y@Z?0==KoWH7FD1x#Lgo+7DL8M(<1 z_4Wd5r;z;oo0;<2+ZK1wi@!Cl&mjcRrlVJ=`fZ5?73z zSU8m2HND$50sUg&2vHE}aG0g?}}t%ipn9edn9&G7pn+@yFD z3V%WzP8x0?ruPJIrc>JetE`W_esE4A+H2AUQyU352seSE6x=&VgjgrXC=+t#!Z5cH zP0i3qx-Wy2SaA$T+!-qa#KYN&V>EB?VgGKKxTpM-2t z$<7p9)i$KhnU3R&17j@yC3HJS-_|fc8A=i(E)VYX%vD#`l7NOXNT4dq%K?>B^~8WT zFPlsNI`+>Wk2 zlCLy84uvNp%TiPXkivJ((#h$WmMPM7N^>uxp+p+xSqX=_i^zz6HoUXvt?fb<(ZKWJ&S%3n^i=%h12^TVoha-il z&0hXJx>Tp5r=)}vq4<8SZ%qvkpK!yBWVFyQ0Z@MQn%wk}BJfWV(4OL=|B+0SUPN}i z?N}O>eKj{(SZEHY36c@=5F9S2(fd1&N+U!N_7OB52h;rGxUjRz`Mb)-!C`xI9*ox? z(1}h=yn;qd1_CS@%8ERGJf_2~KegGj={4eHgM)V@xivEFLqlnKUlW^}Bmhgy(;(LE z+W2%3KlZ^fz3FD=xAgCFL-z@S(j2DcvwX>4PVz;d(_O62rm3sOe7(w0nd*3gnk%2p zLCa*PB`h2t;y9R~u+n8bcR&F;%yYG%nhr7@rJ42W#mTe1xi>ICs~hfnZZhq*FrNr& zzypAEzG`*4*gVGR3-bm?Y7idt@!nhxD56bP(5&~X)Z2T(qM0GU5(&sU+7;q^*MQiS z&PBu=lw>Ka*F?RYisox(!99Z)+_iFaeA4f^Q>d!&0X@Y&ARr)wV5ETG#?I~uBwqad z)Y$uM%5SPTf%P>5YktW#o53#PJpRNlMOroZFQUM22s`G?-4Gg&#wJB2{!AM4r}j$t zmk*+2i;sKC!8W9 zQfziy2h;WuvH%~bKI1g&Hho8dpkUZGtlYylH>Z&SErjc_tDoOBn7pc$^V%=GC^i(N z#p(X;cLk>>_#ZIi$pe@(oU4vvYX9fOSyY^g&e!N@GaDNlV`GOs!-;RaPU-2w5LMtk zRuI3jim!;_TjaqU(oWCBM8@aL(=Ds4TwPJ|=jiC~zSVb=Qn(P2DClyL%XQ-RdUj^g zY=Rh+bXI2;8ZXnxZY2@EckORAHc*qw)0ukLxoO<%WXy`7kfQC6w5)k0`>yOqZm;n0 zN}NV~Lq86eK9OGq4&v9R;`J7DFIug66=$kq`ks5mK(LEUE9EwOkk8;UzX95k%T2l z^)yD~V1byj1yCxiJH`wwWc;r`Raa{Ru-kZXGTLj(1`OSvCaH%g7~9g1+L{_Kl#_YU z01>bQ_oA^p&3iHGUh>d>(BT9t(A4`h+E|3kP%C^?u5c?kI66{|R^RY>D&TJ448_Bk z)|l0qv9Vig%kC|a!c`ow(=}ru0E7vMRXJW&V<+@$(g7gwymNMJ`ypFe96$CPj;p(O z?^4U&x$FP2J?-g@fGOK^)Vm)g%zEm4jd)tuW2Kwf@!~3M$Ik}SJxfammBN@5zar1p z_|Q?6do`93qL-Yt_-jQ+=nJw?$U3Q;Y(Uad~i6S21X*H#X z^_deB60WbUSsrqz5Tg2Tj1^Yb*W>dYT8~ID#gYrwDQ}jf>fYvLU@ZK1+N2K-8r$0^ zWVF?^N*~i7x&G9=Er)W41FV!A)l`AaAAmtBnK^WQ`m&HIaXg}><(>CMm9@ZV_J9Z+ zKUUT$gE`THla>$+x%s1&-w)}>zBlG~Lb9l9`YA-roKI@ky~4jDR~}d3+~fc|lY6FPGOd|u-e-=u=ZZ#}hLc_C8_def1%v5ns>=6YsZ@H^n;Q!o zUYDnjHLp-YV0`j7LK;$L9%Dtv_>kRcX-&?~jxNUKd|;V1Ft}ZosU+l~koX52pBN2v zg)F9Ej`vKP2{d+}ssH|cNz(l(C)q^NuUl0@wm5iU zw$C@y@d0s4dpIvo=PO+%0U)`w@W0RI%7CPA%|IL5bN}6o@*~)HtHKm$XlNY8a@oVy zr?M}$-U39BCc9OCvTHMS=xKJl0{7R1PRduhM+DY0G&zk`Lj#6aqp0+zW`U!~k2EAN zpSzk{S;a)CUeB~I?;}Jmc@==wpk?S!pF>ys`rS|FALG@mQ|&%dzt=o_t3|)WQg=T) z`6bTg-odzr@JArBauYU&>u3J7vPCEjxDYTNZco-L&tC%}AfEO0Wls0s_n*_<4JDtK z`};qU`$*3uJt)f0%+)U`@QQ9{|nysleCf?3P#RQ z3i<~1xUcc4{M78?-ZvuVG%;hw-SIpQYA(pwB&4G!2f)9Jpz6ugg{w#%?K|rWk@z^D z(LBx3V?PM+BHMQ-I{pUOx6Ss%U%l#UkWAdVeH$Jc17P&HHj>Mp#|!lFdXEFXgg#ei zXNa;)&&zIUY0)ZXN*LXQD9$JvMFe<|4R()z01nRC`T4KSL!gY&%kRt?G=@Lueb|yr z$2;{vi^lwoLmY;Jl%QY-lQ!|FI-9@AHcFo-SBK8Mf;eXc4`?dWa+sDS+31n)4W?Vh zeR>mT)IiVb6cc(s@m9!AuZA+NjM?qEvG0@g$Okv~V>{V7aAcmCMC1T8UiwZ>J(mOd z{cAJZi%oS`(WU@S{9fPpcBxAat`2!yU-X%t%0{*hY8O!x5)s}KF*c6)8lM@RSzR5g z&tz1W;l&NuGZIX;R+T{)lBkqDe%Plj|8Qq}8?msInZLpE>=`>V^T7A-fF(#ToA9n# ztLW%_OgfT{q>qj5`@|B5ju3hFadhrJ5Pwk7(Rn=f4=2mbk_IA_ZMrNP3BLB*J3D_0 zWz>@_DJw%pq?X*Vl7XuZNu;mS#b7o+jy#G^eJwATQub->ss?NRXYS3eO4^#V#0fayu zB@5^8TEFJJANQ*v8#7({=mNt=5TJ0Pp-QE5%zrO&$;U7WilfdYPn(x*+saRZBhPY~ zLN?NN%2_NEh{E^ZsnFuAt(iqF{0x!OZ0nHf?2vNeIrl?)>_rCC)1Gj$S#Hkq)75nc zsLYkW@km6j9B!hOIXRB#tHT{Z%IEB2ZyzJ~r28!=(1kj^ZC2^t8CL z#254@dZvCh%`(Sp^bE|(qJc4SV9%;-W@IdLGG%!T2H!=l0ytXqRR-w9>KacE4BY-MJ;%m&s;p(aBdd1%mhPQ99O-JWg6@|} zhm(pFQzmd1Zw_0eq^JL`cy$1pAm^KF+e3K;S=q~-YBL0j=kZW)Zv_aJZi%!8_#hq; zoY_?z8G!|b_8yO=Cg%E{UJ zbI+=S!(Wh10W$*!RUVW?LD)}`z@GI10;GWokr{q|i{Qn`OVSVLJ~Yp3+uIFRqrs5R zL2Hl!0f2!YDm1JiJ$H0;6c+*XI6Q3Z_xk;`7B1uhDklMI@k45uf#PsE01=QE@YcLE zF=gdqy=u0b6ucTybegH94j;^9He1BiTXZKquDc-$KR5`ZHY(2HFbQd2_}qbi28;~I_FGE~X&)-DDn)*~ zF(6kw?e-e9LvQ7t0E%kZ#Ndl`Xti(`asRK8_mA=)iWwQNKxV863yx} zzZHES)kC(MT`<2xpn9(1T<~D-Ter8j4AU5mOS@&N?euYLz!f^8Hd!c?m|rdJ)%#b@ z3Kf~r(dkjxp;DSehrhWWAu`mS>*}82t-#dbAIsY#y^iAg(sb@u&r^X08+BCC&m`X7 zh!?D!0<0!Y5B&Z8+0FY^$hd5WfM=3QtC*^S9{P!rvIVFH5#K&F&c3jE&t$D+rHjg3 zjO-;uj$mVBqokVG(i31}dd#-ZxbFu+4Gx<_xS{6j{fQ`VK~$-ytDDmI5Y?ZOo!to_ z9lfd?{%Uyz1=RbmTn;xd_4J6%5W6601x8~Yy^L0|Arc~%$*|TXe`e<}SKUJ2z(6{j z%pX;bI@0C058TH2$6^4wJGKoKVLIfKFeDrt)r{pI)o zewwl|#s1#fI={a1L~Kk~bBjKjoZKSn00m&B<)FaR_2G}0=^FSY`8zPzO!e~<1@~nP za-mxYn1*clsf{wTu35t=tD&#oYhErcjzS?#Gd4Dchqs2X|E(3r=nbe+?uFN+Uxs6c^W+;2URY43>NEEJuFg|Jz$>Q`l%|J@Y<#eWq*xhGb}%=a@h* zWo`}#0VKp`eJ#EKRF@kVLN!9}-RZ!< zP?Dt!lJvjJK_BG&lF}hpBMk+?ma9R{WLAC%kjY%5XVlj`Ub#l5xP)nr!(%F0ECfTL zjerl^Q#kVQgiC2)a(N}o=`m82Zfq#O(G;ZrUStb&&y^v}* zDwrBwo{DBZd>a>c0tT#m^S&F*&7UARWHS2Mdi1U!BE>t9$(fIea>-0d2@K#g1CC+Z zq7&?z25*YE@Ett);?(N-5PW5%h4ab~ps(-lLh_V%%XEFv`^Mpjbk8@3+je&A_Yj7L zJ~mtzfRPv*k0ULN8?DP^L^9U#Vmy{D6A#=qG!%+uN)+^RxAXG) zbS3^o^NotMbZj`eFbRLwq;)KjGf}iuW-5n2@S&wFXsdaxK4Hjb55Iq>%k_FYT;fGU z1SZru)n#RxL;^mSB{dl}e%ay8z6Ugl?XkwY~-tq$gR)tokk0L_G`R_CL%TouAQUWrvxm0lrcJ?TcuR>Rdb!Ty7L&an7 z>pyADZ3NV#sxJ2;zJ8smb*eseJ_=j`xA{sd+;{pUVChbSwO&_^3yUn3zN5o;UU7va_F$6U~L{*w7s@chqYxy91* zGUCNl1>pvY%iinwkgSm}rWISf7RQ&h2j;$~f5Iq!f;R~f0nx4Ro}@WB0VJ4LyEqSh-_FnOgL!s?{fBbqG}#| zQ|0#`>W86+-F0^;4`uAg>Rjgy%H`!(K*2E)sHkW(N<_uSQ9$zhsotJ0ee(Xj_`P>= z9Iv|TTmW_L>dFLrJjCZjO(C;GnA^>wG}hT_#QHq}8B|6M2t!~-EAJ&{qccIOu3iox zSbFw5sOUy3R24|Y9{tOTzd*UeQ_u6;>2UD!JNT*23JQF>d&|g3*vP24VWxrKxEg$w z(vBD62tE-#eq3m+OD!M(`r+AxVqgQmT3^!&?=o!!{cFf1fKU-RloTm+iAoSMmKt*s zyR!1dyiXVLHbGAi1trk)glt7yH>IrHX++1hJy`RZRskD3I}-RsJdL|Sh}D{?DX@WL zIu}FX9O(0+)G=D5%~Z;iPG{2My>g`S#0h-dS_xUUY6|;bsfj}0x~EoE&H?N9y8CB3 z_Lp-TsV0rA*&4RHZ1Ky>w4~^)H)i?MgbzluU|C_w>yPFOR3v1+EwQMHtO40g_kno$s93bu@-#Nv{!+Wl$ha_TZ z`eiESpS^nd{?CNqq(KEmz;$xwvzLOat=5ex{ zi1-|v!0j>xt(MDv@8{H1xIFBps}vm^pvh((qNOE0uxiEz`P^K&#Y4z<21mYZ>TKO< zok(g;YOGoCktF;k?3?QH8<@E3-4_VdIK^77Z<2G3=Nwe5V@<}4;_6q~>MP+ndhs&qD%M;n$Y5L|LxsHgpMx%=d#)8~_x69XMyNJRBRDk>xdln|d2 z{Ky2)yG@5)`o6;OP_b?^!3<0ne)0WR9{PuteO_l&f6LjdbSZYS*y6tzf`6(1P8-tBj7!OTeri0PPO!3X< zfCpFL_c!qE3@wNeP$cgLkeNF;r0OvE{9SsLuSJ@cKA#)#GDYR1!*Vw0Sr*zud_Px5 zyZnx!Y`(ksiq7-Iw!EYyYuJ)4zCt}a33!z4?N83mc(ukDAy35f<~s4yp>svBoyDGt zzQ)G-G!9||PIS364ut8tWtiBzTTM`TerO-M`16>aa>+kF-Yh)n_RN+iElzN`MfmhI z{~M1pKK^k}V#1`zZy$qUt_hNyJ1`sFRIl>$i-@ia%|j!60wp8!UR1fdphfl@nD2IX zcTZI9xH%i-(#fJ=?Cu{Pl5tu^D$q1~WzLB2XMZC>lh1!Oj3<*B$!U#ey ztOv(#9s}@cHC=cWOe{ndo984&AJk+j!)L4&~$xHz7b@KPf>~|>`PYC&dO5+7f zyk#LYZ-ShKwu4J&zOQGyhK7j+-^@U1f{dV#zVmh|Ep4@j^I?nb#AWB&*#Z8LWrbow z6<#b3`-XzX^nbMXbmT?a1v*^5*J8*~wXbK9gCxW<)go4wuIh7uyfjiVi2bx*jb17! zPkUa`qYH{L6)7adTi_c|E?-@Y8hv1$zl%ISRW?jc%gD&c5X^V5+4tCA0RyqrQc*FD zwuyY)5!%V#*La$A+x^HhTc048h~$nsqvF>u9s)~SP7ld6PU@>(4etSA_U>C>2-@VM z>6q-w^*H$a_N_TqXY(KBf3?=A#bU@f^`($z=)=5u)Dy$^CJt&jeN020#wcCDlaL=Y zbcB*Br>i1S@X?sB${A!I=0g$tqqVi%)hu5(_4EfT3rnP2n{W+qt)k^JuuA>>Fq5V) zmG>FndFQ05XngeWfSwA(>6Qx!U}C@znDwkFu3Vns;;5~y;nCKB2RBh#CFAolpo-Ks zHOcx6+3R2(DlrQO~=z_uDj21TMr zMyNTZNddw~qF^o6$33|=$S5`%26=C*DH~!z(ew`D@Heqs9!@^DY=3n7QV-6~mEvZMjLauswxBX9!lZqA%CUCvKw}jEr5FLGrQ=&grk~? zLy$RsXXBd(rlp6k=NkSEasOgx9n^RsWCmpTUG`<5B?1x-P+vZOcHKaUi;b;^!3@kV ztL>=ZXd(@Bqqy}h<83hc^m^#Xi{==h+__QG{sLC zD-Ugc0*cmU7}&;2JR0c?-|I0Q`tX5g%_5ryJ`?ybv7dHdH?KHOLP3!v=&Rq{^mIrK zOzM)9(lPJ+SSPNs8-F55)kseo9m#jO!WumZ(Tky4S#c3E5^xrRKWE4&?kz+d$L9F< zc0ol&#pPwoKs!`s%mxkabf~02Htt?O$kpIWRC*$tr$A%olQb`lgByK+2h2y7wsiNP zXYUNtBz%X;>V1w*8jVfV)z^1)@({{M>ye+@wsx#oPGAMu-mbale*eJW6sD0Is#IeI zhSpZ*VPnBC@{)7xE|^pg2@ZD75oxR{U6x|ht83|*Ii~2?dTr_TVfb# zDJedBrfHJ6j2RS;byEi8n~%sSC!NyOn9>c_Mcp3jY<$EZ{yYggAiL@)0> zrr2G-3M^i!ed-pw>_~Isl{8?%+1l1ua}!)OrGO(pSdX)*2OraxW>53!z8^lyZ#X%@aZ7_m8m}xiDoQSKM~e zY~_In8)xPA7#iQ)k8NE2BH-!MuoWDCijI!fq1Ix$o7U3Nk(H4lVdkvwDS(}n)CByL zYims8qg$5!OsC)au@NjB91Hf&nvTJ=!(KEhxg0|COx)bcXXCkS$l{$-Q#4PXW|ymj zhnEx2x8UIYq^9>p1Ebu%>@;Z=Wo2FcS~m|C2zhyHSJy3G4VGH}9``lS(*vU(*(JJU zJ8~>G2Buv{A0M(oHmebLZ0xy!2gq4s~IxZV4Q|I|46xHxDmA)P_ zB^DiYk`wFce!#?JUtTW8AQd`a`75rd7%DMPQi6$u^uFr#Y{p|r;b^%B55pH672%9P zTG&n0!@qv^Da{N8cW&VmJSCt5F`O)JI1yD#C*9!s^4ZZ*q8A4)vJdMjTfPW z?2q~Rso2WK)znpJN8sshkI94oj3KRtI+O8a8Rwff=Mr`I`i@AoiZ02c<#^qc6b(t1 zNTTG-61aVp1u};>%Pp88r$_>>NKdEOI6WN~hOzIaWkc*_i2@EEdpKdF?`*o#EGlX& zDw=x#ekuGM6!cfS*znHV=x5{Vxg(*($>TL)Js$(R-{nr5rJg3}*Ao6{H0t z5)#Wt`hrI74K0SQ#aQu;6h)3TW>rN+r2rEhC1tl}MO6jOysA+NXj=>Q&ziq@$`af^ zI6mgLf1zz`oV3PhWw-HJ)tQtOA0K#VV_&{Z8ylxXjy9{?u8HXTh3m!@ez(^H-*}Y+ zf6SbBcEBqSkpLb4)zoBOmU6PSwRN*`>w2P#ifpj@^XES6{e|G5LMCvk?BFn1=VFAN zJi}X#pP;8>r4xQEeJ#0kkcjq$ZT|36Vq$A~@f}e^Jf`uCyscV%GdGtVs;I8=a?d17 z?f9rDG{j-|RE|b)Y^D?T1OI~qHCIoP}9h8pb^88(zy`VRh{4YdMe6JS_!aB!@wtsQndh;#fJR*&-d z>tSvAi)(h)+RgaCyPiC-_3XNyyr7^knm9i{51;Al$t4%$$4%Tt!|O3E17{|I=E4Sd zU{-~O9x;0|*NJM6BWB6A{VbXbtt{66e3Qbu&&uWj z^7eNKZ+xO*#xOqms_u=I5H>ZIgH}uy<{^}eeWV{+%u`FIu{XcCcob0n@E5# zh#axCWrfRFXqzXC3BRMK@7}f{uml=`D{*8mbsyF@TsY0CNT5s2C zkMKWv(4GAAGYkSYXRsC(#yTUGlM9B2m{fy9@%yS)uQDX9Lrqd>Whl_Oi6wrJLPk{ zB(s3tgtVvSYsdVKymdx@@wauuv_akHuPv)DSC3Uav8~JLI)@gkT8z0fY zu1}1Q&Jwo}@QTC2!O7du($(Ew8Id-cSHWa``O-E&66X%WUBC$|sBJm^ue-UV{~7hC z46H1wDA|W36KDPW%4J6I@o#NbX4k05+Ee1V@;xnXYN~2#a=kjY!(rbVk)nYS7`d+( z*1lLaI|*r`<~fTq0YbzSMKvZWDpSVPX`7qTODfcANU;Psi zE(RiqyI4LG%g(O303!g z?r}$SPDU_}vq+Q~Ll9E>U~jrjDl)}pW>{)!qIf92`uXtWvg(wQ`$USKnR%!Ekg<_? zIAv9GPZC+}QJaZ_qvJTfV21VrPs7A-)Rf<-Kn8!;pwC}*(`QpjDXx#{S)Xc3>g zbSyFzaK0uafJcC-mDTRz;_AWzo7-;W#)i!5ki3Dbio^bjs<*cRKEAS>8?#X}!UF$< zQEx=!JtfV|O9D6rnqhU#&Ar+v8LT6j?G7$meu|OXhnxC@BzAq(%!%g>VquS*A@U>A zTZ>+*t?W;P?5deJRkjJEF?JNe(bP}ovF>dpk{EP+ig#aXTkPi|BCIu%UY9LmAtmJt z>B=qiWc!_iLN~0bq4mX}fXDX5i;NklqkpfAbWV01xeh%@^S7{?8yU%QmsV0L0+Sc; z_(!yvKow&uDLJ_uX~HF4{W2nAf1jBrJwNoPI=osxI%UfXe2x!Yl1 zzY>uPSl&3ZILGlY*Y09aq{wRVq%s%ySM-u7K4JSkZvRV_OdijzJ!I77+eaMwEys1GH+V?uS zHoLf3d3wJ2+{$j=(4Zn>1e_A8?tHTx%$Ui-`c0P|P z)gv4DHsJQNrzcNM?iJP6Bf>X}OYvwoPgFOUP*7~KF~dpuWhrvBKdDHO@#kb)Ji_B5 zfk~$tAv)e*QbGbHMheh>?mD-BkqmR6OPmZ6eN&2iV$ zn@)2lcY%X$xlx4{D6>9=dORebdq(@yg6%o@X?8exXlnXLSI+jvqrp;6TV)+lppRHm zql+keN8pwXW+e2Xai-?h*3#L(f38}Ux!Lp72?<@n`f_ze4(sWWlh-#8WGKLrmmgVC zqr_s#$eM%6`ws^JZf@(dedRcXH4q_VKFNV+a37lz3(EvHpk?_qNf;AiK^Nycq<0c< zS~Wyhl42@BcC@oI!Ckpk`V2L?0Ar}8sR7Vb8}SBL)XMgR<8L65rfhg#+Wf$*kugPtn@K^yFV}ZBgHDOD_a21~aA7EU$L-oeNmz@P(UzB(o?(#si#<_#ylO%Y zex<9cnZf%jiJ)k2d$J9tkAt-Wu6Sqtb@$m6uqsfbI z0fL5tf^ruev83+49nBY-J73pASlU>A6v9@Vc|*!$Pw|&NDL2>G*SGQ+#}ZK}IeF2L zjuCT>kKpcEGw}+pe+wOapEqH0nI;6Q{fTk>+Hw~7(p)bg!Py`B%1+2sfI>TWS40~#0|J}a&VYRi2mTBBn;T!$bIMM zr~2ZB<;$1eUYDAZFV%+n-o6Dltd1#X6`-3@#9Dv-_D$va^IUf~fB!SDCaUBC?fcm* zEDHb`HDpS<@6N~~?CtHTBV@FT4eFxfN?!ax0eWd7+3xE%;DJevf=2Mj^pzP95U}t) z%_jb^j$;>badLT`F4ldWvZ_2Or%{R%ql}=WdWhA!)fq;9x$r(bTdH@a?g&5n4T>q7 z$M%F97>TH>@A(HxS5#H4teLmB8xV0bnQVL>gv#mG+kk*K!2NtIE@g$04IN)BqaI^a z7nryqzC^nUn$M4n&_;ah>+KE7PD&C&{GmOPEs^)}!BEv|9UV=yq+|BIgcgC0&+B~C z?fG*;NU6zpy?RJC_l%kO0V+n6%oDfWIY)c@F}81FeiGnpKDLatT7aClI0vzCB`gE& z?cNh5gY~YqPa>bmWMGj5wzLQ!UX)LQb$w8H^Vc{6jax(+hB}6bfB;luE)4Ptl*W7g?%@)Yq(Tkh6Wm0aD2T5KUy(#c#^k`thFan8F08DS z1s3V2EolFSo`I?&<95J z(dK5EwKX;TJUrOGM3qp*9H2Q)DsbIzC5y$GQIzROrvK)0FY&IaY0hkh6!dx zF+Hmu9+Ok#X-N^*2K(cawGV?N=(S=;#r<^{hDJxx2nZZk%dCW|Q@(@5PS@ayI{njB zRC0;iz%fvE`@Yq_1)HJF$g2xC*X`xa$?E$v80nD6Pr>rx%{T8X4wke)W# zyN%KaeOu-A6aRlp|L4Ik)|j+v5@9mQnb19j7ccDLVIlwQ89g5J^HVR^9Wz)&S1*6> z8Tnq>?kBEbKMlM69n63K8Kxg3H}CHsd?ZddKS!2`^Iy^|E!B>SisCDRMDh9kg9APq z{0OSv7bq(!YsrNC_v5(kCf)p+U)DJd? z*MP(el4pbnYy?>cQT>_Kk96hVNDRobvh*7s6?%wN$ipzPTRAA@L9RyRw=X$E>{JJX zC5tZ`1ia+rgJDi4D~lPS+S=Y;sZ7pHOg!y<;YyGC$kbejl5AsR!`Zc5iWrT9R`2M*WRapd`wKf)z`;1C0(B%8EJos zb#itI3dU`hJi8^DxSxgckgTXU+xKEDbbr57LcVMH7UCWTnL_#?W1)>i8rSNN{nF*R z(sll|HS@E>olcW-Ah2XyVP0RIgocLRLJ$c1lm!NcXJ@-vZM9NKUnjCI0|XwswbhMs zvX|FD?fi!YayGC)ww(u(b|_Un8Et)UL=Y5PCA1-7LjB9} zl~q-Td-&hkIj5VvLqb9>K0l`7{Gg8bK1ikfnW5KrJ@FMCof|5e6OgQk ziAQ^nfB=t)n&91VrGb1TOWoTutxSt!CFG21Qkny;;7~UaA~*yM&_8<8^W!6OUdM0x zOhEQZkaG@GpaIL*;SRW@hv?G*TK4wM^cnH!Gk?U>@kot8c*gf z_}#9-(eKo&lTO_n6O;FOe0ZdKy*5Z^z!OG`n?lm z@#gnWs{d>W8fPlawok|5HFQ@$vo zSDk|NA&}}qfsmCD)nI)IvrSvu{6(L>pyfcofzB=-nwIn0aG`WMKx@IaKcAN;XUlib zKa?#Vr}gJQ&_P9Az0r2MSUtOsi*4nro(@)ZCYg{-tv#zQxQ7%uz)lrUr;y5x6Eib2 z)14CMhJ@Mlj%6O7^F!9v*ogyDyIHv!*PWq-AFV+X{!Ee*y&Q}2NZ%VgSLKR;XBym+BuWTaD*ipo{D%N{HsIRp)nL6h*58-~1?3S5B_ln%~EP-MhzfJ*QI z<$gfxpr%(UfHzva508$H48Ex0e~H1%zmlu797JUrzk}%Rmdj9+bt?Zr;Lyo3IvoZM zTSJ4!AN)f%#+l!WrDn~@msM0aIyktw9KlM0Oat!M0-C&HM)RM=9^V#`dh^vt*w;w- zCauMb-apuwAl7<&V?!ZT1uSYiSBY-F)u30uvq3;WKzE~(I=p#x0daBxpSy5URcP_5 z|DJ_GmrLZi+RV<;BJK%cqO2_10E-{7rp%dEGyM`oi!^@MXs(C_h1# zBwk8OX_8g>;O1w9x77_LJ$h{ih$>=xR-Y=9DJd&!esj@gO2)1X5)f>ZOdBgG;7E($ z5x##L1sszE6hHvQ?S?hA~r|JG% zq#v*~j0w(`{5PQDMf@5bMM3E42_ZPRI0btCch&YfMqaneSr98xv1Oyty$7q)L7%Bb zvX4#mcDKAAg&l5?1Vgl(B?s6Mx3gF=WB4!d{9J{J3ngB4S_96%zJK3bufbg?AeV3y zm=03lvHVwOWUOkbb=AsfZsaf^mI&(42Dd#XL`}U14<9exlz(5}-|?47-)CmJdwS#t zclU&0W?!`oMrsOKN{LxR5Nq!rfc)cN#(O0?;6Lq;AzWTP9tU$MZ_9=vbJRO?H1@wu zqCL04K#Yu!W3%s_>`pJPtep4r55pHA#dYCe-0|BdqUXzKQz?N%w`8-dEYfxw)-(6% z`PoBMGO_Goq?GMu9E`!iryp58Q9Pfjvme0W3x%|?G04KJ()RDEGQpf1+~h%%Z$iM! zs;bC}=3i6O1K^g6GeKQl9aI*iXtb6a6nG)ruP=#OStNJw_@%t=Jnm}~Da)ypq}9Mi zfjxXR>z3?l6CTWmh3y2sMJs=oDOc5q5Gq=_Tg$`6lC+0^H?^M+ZkB37MpJl?nOWwO zzLu;k7*(y&;Nx?vs~_a#q(f^!W90;nGH$(bZY?cR=md`rr|pEF>rORX?CPVp4h@k> zNR#g|z*ff&eE*If&X>NV#*OcO28D%vU>6Bg(kC%7+Ft+#EH=6c)t|d|WQ&Iu>f=OW z`MOeWn;Jqy>2+9U^v+NwdDp5ksaN~yd821uw9!4+DldSR!gg%9qz4Uk&ucO=ELXda zzz;@(QgdA6Hh8n|MRqBB|5*6j`%!}GLr-i!&69Z?j*;;Zt?J53x+yS1V_+yC7ko1@ zGV*hAgGs+e|DQj<26`(_kd#y?s+;R>>kF2kt5~@w_{vo72qj}1k z&ZH1$^!zynnDPubJ34~d;$hmGw|fCtMyvEEQa+oJ$#PY;_}_o-$J->j?&S|f*L`s?J1pp zGg;JU`v(YsR1Vge?;?=j%X-xzy_L)S&*52J-qd8i^3j1TNr)ONNG?-TQ4~uw|G5wJ@khHeG_O^(m2jRfTr=oO-MI*y@ zTJ_(X?a?+ggnVe*e^X91jO?8Je87qcFojb|lvrJRbxek`PzAlO7F(tBII^;Y#1?Vv z*m0EnDDDmQKw_5${h&%ldc)=4P~uWx+ez%8b0xHnjiQh!54bzu{D|@c?bN42J?^_0 zBpEpcNQid`T!6NZnAZ)%o_ zJ&S`qshlj7m3l6&shRnY2Ar#@8U639w(D^5P?(z1)s!Q%oCFDN?gRdu-(D%Y@8Q<1 zl*Q~%3@73@H<|bxVU`&_ki?(bm*={BDW2)Club-T6de;YGCB&f;YiwY$hv zg7=Au?gRwP=v6Oqjw>U*ZE2Z-j}S`qXC`zAaF>%|bc+O=HM-2%*SH~)!77g_*>VdD zD+>!l6r{oxXSxD`G@Td(Nj0`B7L8f6_V}g+)zGkbo=r_;Jhx z{29!FR##W0GY6?n9IUpym&(V=sUVZ!AISDU51Cjn<*Dh=N7T4)4!uP}>hJG|L|PyI zR=QiakOA5oX}U?CuG-opq)lSdt5XR4@tp;(Ll_O5?YCc?B=_4jY@TuB-}rB+wx zOywr}Wm&Oa#s2fRM5_ubpYkKKugcL(&!114T4ck3e)`+Dnf-(Eij9x(?Hd+Pz1H8o zo3YRj`oBh_c?uz6@V5#yG;5rknlN&#@MmJUx3BBo2*3Qh`lfh&1VC;L;SS9D9D5!G zH-Qg?>uQc8x=e?&Bqt^&E-w#?5hZSWMZmfe3h!%t@!#R4fh!O-FVBD59qc>q&DTFf z?2?he%O&RWN=QhkcUpf9R7PDea3JC8{Ai8yUtnBgj0H@_7ZyZ2!$}i4Jb<{$HSnQx z&0gr@(l;76k6oK{c$8D58pU&A(k_2$l2;%*LgH4IWODX```+k@xS^gw67q(C=)DaE zmEFX?%tG+w37`{w9aA*i%qR%=EHKfJj7&TBCkOy0AXGHUOtE`Y zmFg7kd3is9E*_`QvG7B@>3nNC>SYbRs4Jr9YSm>IoiN(Y*6cA1%&;srhX zGrBNAGJ18mj0_4Pu{rGh?oHWSNI?>EnQ6VZ?U;ik^0!4`#a0Mt{=XKisG%Dsrh1p@ zXjcaxdIuQae(Y>nTeG;IeGe5COsHXmg!IpU_6g10)&zuARQ)t9gK%>K0;21yabfGR zA|_A$sb$8dbD?W@#!#hjfj1Hicvqe;=EseEt8F$>I+aPrjW@pF;6JN#;HeAlgmY-M zWYYicUE#|bQA$j=s{Jml12=^f#W_izT$gJ|LccUuQe)AD^;B*K z^+#2IJI?;kp!fe;-#>q2bk@_pWr{kopZU;dUZi^@JKxmQrUh~HIJl#)bUMZgeF3@# zp{rk)iS3p5bo8^>D!ZHV&IF(6P%_T11M46vFsyMWgZ`%*#3o{5V%f^R_=xMdGkk>C z^&~!QRvday0Sf&PJk^r}A``diVb6kQ#|MMAq9>-^8LHSzj-)P7K$Z|kV}l>K#eee&PAS#F|G zK1-F4KppoHOkJLOQ)2g@gQ9^2&Q>q7{6t7f9LXIHYQX2@95wPjk_7k2wb<>cBV|R! zqi?(i&=HjwQ^7^z)4Vth+`;uyPv*h*fe#_S;GZ)Ao$m3@G!<4QCnwi5KhGmg0X1?# zQ#L|J-lX#lV=XPbf1O5dXy#|R%m<+l=tFObHj1d+T+XBJZ@tOtMRKfFU_wD0Dv}P~ zNqqW0=hwc}(!p7_k|ZH9@xR2bifXrwiO!J`4*IPO@a|G&(_)H+@)Bs_sZ~`{gV`k| zBCRSXD_xl23OBVkDtvP(Xf;Ax86x$G;B4W??e^i4k`m#YnLHSr3Vhw)q(+Zv=9doIH+QSD}S(t|1H0T^l%|QV18FufrXsgu}wt) zMsOiSM6a%|XIBkaBzspmtqafUCd7o136kL8WVjA?gbLeDRmj$wfk=m#`!zL&jJkSM zdV16`@f)wX{Im;kA}D@9NitLSAhU12uAupVj9t`D1qWYNAx8{e}jj6>Mz< zzd;bzhVxPz>yogR$t#JYdwB`yabr%pMG;IkL@y5L-nVRwnF^{r_trA_D%MX z`^rz_)ofMOr|D@*R^^ZbiGOIRjD(;C0$hNU*t|l{quc+hM7cL)TW&FMc70*TIdBSh zB)qz$b`#9^ng}qQ+1}Z)n^S-TsHmuD%v>DU64l4?KVHz1fk~4IxYrW|Eb;(>08EB+ zG`1kg3xu8Q=DibhQ%ecdFkgdzp+KW9PEJaiczVhM_wK5cxAzqos51ihw(Wl5>lc`B zGM!Vx!jzbc6bS=zW5joBR86YRA$JbM`BU|JzVAIeJ*B0{R_%EjheAbCRe+Bd{c(FU zS_c)u^XBkgfU!xbdspO1^t9({+KJZSe?NvFEc;`H&Di0>XQqY6%o^99Zhx01_de`; zN`4~8X#4PCI9!u-v3*Y>WX#RY@82I67ZXE6MaA(fT5Wp#Q5XFDrKJPqvVZ?_Mn^|i zP-Ike&(f!&!V6Js^MkQMW>wX(*`9eeWmfM(NpjsaV2nBxk3Ny`j(xF6oiSAT^8XNZ zmQh)DQMbOa2^A#;3F!_=0cntu7U}MmZcwBJ1f-?AM7l%i?vNCaE@|nr-tRkS90xyi z3{>J_-)qk`=QRoO2oHWb!}aA)4WKmxKz3`JeAmaVWnh--i#vqE=S!Cwcv1%`A$# zx`8j}<1Kov%s@+}m68Z7DlS&q0YCU%KMd$GT>kC|$bR&Y{Uv<^_6w%_7#Ls=qM>Jg ziFG+jnp;z2Bq4zxZURsFjg5`r5fUmYeo10ogBBnlmrvnTRt6pKp4VyE{QB{u281Lq zz&($jnH>FW`;wE9@l6RkDQPFPp6(<~J1b3<<$-Z@ePk7OFT_0M#TtadwaX{--XVd3 zq&wDzMn>-L?s?nC%dt9`Ey2<;^>WINAWhGLWgB*5MLO3_ZwmMocP;=64Ta~s!8s6r z`}Zd*9OXBFo)s!O!vWX{Phv^=|s>!IzEvRT%Vh-|~To z9#q41PfT#p(Bx{IvdrBf@%X+~Ho#9#45h*Zq1lzw!&%Zns%UBQ)!x@v5FCQBsk5Ua zQIyPT@_U-b0;qMAl<;Cz;=BLw;l#+uO`n8>u)27vnrlvHiFCS}&=YT&&T?LiNTnXR<|rkto~Kdf#*;{R5v z+=Jc&OiW=Bk)V!&D^{JFeG#&lbO0Au&3m=5bi>Qq)Yw=&V`$FXJBVyWByscMe*4JS zSRy9BWWbMGKA;J6aiMdZqzHKDL8*AqN3(mEk3z)8-bDMgK`OA4HL&&VJEXI}|5Io~ zdZ}_^3iZ^Xg5H30GfSx`*&PV4e9*)9{Q;5M;|H>CwP)OO+Lj5TWJ7Dp@bYwsWx~-g z>N)@#-Edxw)naCQj1I|L$+{=8=K*DY5w+KkvU4iJKOE$K>667J;x$AQ)4@?ekUN~Br1%=2*_rVkln5k@ha>Ft;;BK3+Oqn?CyJYhv z=S5{4^e1^sQJ8zhCd9`Fe8fQUsjkl15e5^PxM;8POfcoRfw}R!{nkh6VsdifJsb+> zxY#FL6@ONzz5fMLyWaSO5!%v1&cIm6q|I|OFRN}_LuHH`^H+!acBnY)PGGZJTk$Nj z4yuyxA#i)%QSiR$|t%l7$S9D3scJX#YCx9^k z%($13nwnbG@ph9rh!2pphu5xAiE2efg^Zl-##q+|k+(ay}iHZX(#pm>~DQv)5}_dGot`WGq6x5RB7 zx7o~wMUiT+OE*i)nX=u?vNH5XF%e(CK7H~eueALC|CIO*tTvtRu#?@<@BjLOh}YCr zZ*On!*#|x-nK)bsp!f8scmHekDov;9I0~}45KO&+JjTK*)(OAqBlN=;d$zphiqwYl z?F2uV-h%lkvC%4eVl#6DwnjRX7$PJn$?}w8A>F25l99m{($?s(C!?p}<>{GptbpD6 zFv?8HL`}7FHN*T-Wv;{E%4!g&=V*Q|&1{9mUF0L6xw!v!<%lrFUjJ>0ZC$#)+_l)A zfA9fQX6;Xu=a$U+c1m8OrMM0!xo9|K-{fg_+wW2+hxawJ+$U1SE);n6x|`Bd>U`BL zFm31fdXe$Q(IjCoEpLxGiqD6L$`|TtL$sR*bthP;LfT4-dF9`}wGV!to+9&zCa0sp zrt|H}FDOuG%z0lgDbIZy*0R!o8P9gz2cB-W1cjp6h3;v`Q_j_#lt!?@5b69}SUdZ7 z2={g#50?~uTj%4#+mG|M2GeF+mF(>cfO!GEyqTFZcMt=Exu1SLHZy@CA$5iIba(Hr ze*T;W)HNG(b7gC12ZwkTz3v|^?$Xk=vJAM7pTkP;8mfCsN@DA_WNe+B61m?=X?t1! z8M@SR(ylkmdZ1;}6GIZ11L+evt=rt1{u2{Tf7IKaJ!`pfQw03Ji76=~MR@%wO}(9g zb?=tA2*fwY6**fpJtk|zIf!W?red;D-Z524j;`v;GSn=vP8;PTH z2t);7X_w-4=C<=yY>Z|6#hQuP?qKu1nu~`nX^!3ma_=GV<+E z+BN=TW@i7V-v}&bi0ZnQBfGn)vka{)x8^;atzp3jVqviO^Z0tVBa!&~u;o};<<$j8^nX&w4DNm~{!8N< ze!@6GQ%pK4NpF6yZrT`G!HT7?^%k`hcp2eC*zY`sQ#eG7l@)Jz zWCYfrgzPlE;0Rb7Tv#0_=r^K>DuMmv4MA;fS(S06k-C4EXL2zFDfx8Ct#(_4*bBaEla?r zfd+Z(l3~M=CeQ78c9@y@hr>d}dA#GtkN0bmt%{gr# zUI($I^IhgN#XQ7zeVDRF^Qh;0Sy_)C`YJw#za|qrJgy)(nrvj1@W@wn3L_!;rMuI@ z&$d~u>uE`<7VsEQ%Y|VEiKeAJ8<-3QC^9kVL=h6W462j#yr59&!5?u$02Dj+E-wb2 z&_apmA;+`jRo>V9i{9^HhE-NpHeJhG_$f@&$&Aly?O|or2Z0Qa_6Bovb9PqN_ILH) zzFkVoYH6MK8oVF&)|=At{>(L;8?oehc7`G-CKjKUR})hV)MSBHCVI zQ#y?V_=JQ5@nwPH89mGUZbC&7Y41Atr!M%0vcr$@c`(?!P+Y~MYVKq^i=O7KyCnKpV(yO*;7UOXmGIvZOR6?J&h`=GohngCht za6+evHkpT~c2aekHrej*5VA=&^IpbMTt-sFcqT?!w8e&lsVq+eHYcV{jMmp!STM-N z$?yI6p=XHp;#hrxm7T|dNT2F;qQsx&u~-29yt-l5Y;5m_x!tq!9p_*_x`EBCwk)bZ z-!5E}skornsEiw)>YI~l%MNZA)tDX2P<)~MAm@9TeX63_Vr6Cj@t-!2MmUeJuihso zdjd8V576(>>1jm-KDyS&3Xs_k#YvH!c;pl(_OZScK$V#rf+_#c3!terg8(bRv?I^J z!~GQ$aQBk$|1vhr3=vH?8(CS~B#i9BADaL96Af8h(udvw>6!oRvIl#6RVDA%s%!K_ zI=-t~LT><07SGZ6;AeCMkWEZZySNq85BV` zH?Dk6K*8zZQ^ocGx=i>&m)~{26KKp~dWISrjr*0K@ofJ7{vIZjLi9*dMoKy*fmaMe zQ%?%35)RgE=pnwedC5BOJl~j%XI10I;r~My6siXVhsq4Mk+rqKpt}GZ=-#fVaO}qN ze&pA5HRXD+63Vp15hOA(`ET^vx~*+nXJO5OXuAr0^{dOvMZ?vm3g?0UxaK_yO7FFF z!oz^9@iT)?qp(qDS)IjZaaE- z?u6!at#^nK+a+;LKsZ6js_~0ONKz4iyKJnjr<$%)8u`7%Z;pOcGCepDP2^Vx37egu zAx$B5Mj~s-eQBG_CgHssgL90mrHFl{{LyBs;7clGi>|m%asC!!Voo4@q=r@FcGL02 zELu*dnUxOP6Y|Ri-L8o=ld9lsez)gV;&dG(sMA;v35RGjh#0#l6b&nWA6y(iN5NH2 zzz_I<%ZgxEN*1ocFssWt$HgUOW<9HnTQIxP3i>rh@0cnBAR|$)Y4R zG&Jbxx)rp8xd>||Kf=Zj06-kKZ`Tk_Gcp#LvAex~{l;KPscQ10@EGmy`1o)p9sc=u z_raYG_v~nmi_5#UH7_MIw%6B})+IA>a46>`{~Qnz5)$SY(3x+VmzA*{9F&c%d_#Po zc5uWIUor1X4@Xekb9BVgY71%h7W{tg^Ba9tE)Qde&g1)qfmRr?g4bgt`?ZB!AYDWt zm$h<~(7V>ZtX`LQRNlPVnyoW9-V(dId4m>v-!CL#he|_LwJ-Tait2T$kce`O6vbkS zm-&DZkFBnR?(e82Hfv4ydu>U75?A}h9u3g}Or^Mx0k8m^3gcQWP8HBi4yzU|tx#2l zoocAZvE3y_JgZj6QK>5)UcD{2?U&^x}YZigTJ z{f`ORAqEiDh4`eW-++H}q|C<1h!#?Zc)x(O#vNN*42)% zBtt7JX+9zWFJPQ66}8?%SQhQt^dlM@->2Kd*e3B24YeVi<KJS;J zom$=Ax0w-A0RcI>Xn7iCrr5V?YO+*HrtCb(j8d?0b&|()M+d~}bd0PZ67T7Gjw0xA z_%1?%gGGV?7tZZ39f?8H)ngT7tt08_AJFkKZcA~5!{rmg6s<`*+w&ZWvsdI#I;O9c zqPqUnom{l(l@;XYm+L&-=QDi~lP8!n0-GmzVtHTebujUcn2t6#3nJAXr}5odZ1@<9 z^FT*VKymT6XO@a7a|(!RB@FdSLTBA8^v- z;-%>5Xuz<06Qh`iEoQq4+I*o#mD7(8eh-Nq5^SXprfNmgJ_lV_!;pkMeIFGyp3THb zP>?htM3^ZyO*PnhX#Z!r5y;oIPTT5>76-MCn~kR{gh8T_QBh^U8qUl#WK>D*o}Kjs z*wTNiAYn}=XnSf|dZN?lv3zxTPM1{YIOJ|&=Bl^;zrg z4iIThK{rx%bAtD11G(?t`EC-4$6u7hK4Law85I>Oh}4uo6S;;)!Bg3^zN5RYz8viL zn6y8sgsG249hu ze^TL$M_+;*jux-6v}D`LQs=Dy8HS+ivQA~ z{a5%}}xl-g$+%je?^QG_F%`cHFozt46F`!CVk5ufOqVE%EWj+QDYps#=>?!axd z|DtZ|HDKfv2{_JWFa7luvX~&?fGu%IO~&^|$}aah(U=eeGB`G(WCke7QAlmskThW_ zys~}r00Du_%Gx?CylHWyiUff!`-U=!dq&pQ$#8S5sX!?mF2howZ}uhCO-|S#u!aibA7VZ6c{brPvxXX@Qpp`QU;RYm$|1;s zi|Zkn@4)*+{h9*tflm(uCVPl_2EQSA@W+?D~&39%fAzCv2**K#khWWa>ObqJc75S1mEcCp*cG5)Z z3JMAWXK+?@Qso0)-;(ah}8@d5hxbIt-Yza?ZJy2bbptaa`}OYA+Nq6`Id>AI zKgpuWtetj$R;dr?a^{JBs`FuYh^~z{uFxtao{ARQbh= zlV=euN^CtF8&dI_oVtR#cKeKEh{Wk{0T-!P0v@9%N`c^uZOQCr;E>Q!V z8eoMoa-n)W%`QOn9Q1FH4B|gMYU2%jM!EbwS>+jP%Ss*%)AJ{ZJdRY4Y5}16fXFa2 z=k)N1@P*yXH!VuQ66whPYz27GSUc04b zu#}Bw8%j>rPSSF!t*8vcE_)9>gGx#;!DNiABf16#2V-w_ysm1_?y3I~JNvgJ7Z_oT z(GnDOyV55QORJ+z;2r5H%o7``l>*+FXgv96+72M}63oUnNrN_s{Ru70Esz*oFU0`Hjkdu@1Dr1Pot_IBMj*j<{Onwht z0~0*^<$CZ2#>X#%4ZF-?J)g}aOfGIvd!jknW_M>n1jB&)MGY*tElOf-W~#**j`lY! z%#0GhIIs!mRPf(JVCDzYy@DgSQ_R=+E!n|EN+ci@yazg)n*b#Y+f98eEA;p8Ass!VnZ*d*kLJ<5vZKS~ z;FV|3_5A%G9333IwH_Gg8Ov6Yj_sBr(UEhZ%Mk-tKCi}knTZ@Hmq1s7s)hzS0-{PW_M3vX^10xxTxfAG$fwi(yV~=y!`|r~;1;efZ=wjw zy?to=6zRmz%FO()G)Wg(gr z7S<0@R%uB|MP8o;-Cb;A{&<&}BJ&%a=&+ATW|JhvbdU*5|4&>-7!PF6hs{&)^Y3SIPB2T9XF9BbKKi%mrX1M;vXXC?e-%Q1ki*u&mB#;JZE# za`(G){ol<(kcfm<2qY?Htg&q1#V1x9$-cYH2&Wx5ErCj`)5E`2rSX#pI6w9%l)9qWMQqS#&nAte4w=C~P!*(skWv_$CMxnfDI~7JnTU@y!{4?s(qKkazk z2M+Wi)=w9|g}NKuyWl|T?jcTr1~)Q2?*Bm0vhmNO;`aV3!a<4Ur~&Yax5Zb51_2{E z;mdyv>5|1?kre0U-SO#p+yDA2_kV%ZXK5nLTKv+d%t7?eo-IsyW;tBm0>d0ZD6#kD z#^AFI&2txrO6mI_YCX@LZwOjgp!?@3&zt5Kc+x#h7H)^rFf=qF-Kl(HbS5?M`7;Ut0wk6o}`v4&-3C|or9(D>*8;CFE*ig+|{n&-n?mSUbN1rSb@3audV12pR6`-@8?PqCp4et*9- zC<`X4qu*Dv0S|Zj5>NP{H9Rs2{_n&eH z#`)7cu897Ey?H6%zWM~O4cd9w${I=;-nhLI6OzZ?y02gm+7N5H6_fzR){CgP);Qx& zK?%kTK|zd_lQ=lH>B&?DGo^R8O1FMi#;>-uIcnjmK2lh^^m1W!U+qm&JMRCLwl6QH)*aM+zXA}^YW^zZU3Yv4-auCNT)>@s_wMOGSHsR~vZr2`M!mVfBpi^%B;&g%~70Awj|4QBGlIuf48LV<99ND&Al*@eSxT z?D|h0KmHJdZZlh3Bqo~_9nIl+_NlN?CXxag;NIxSvH~ZHYyPYI`mm9-a3(%_jWe_B zPL|~DR3E5GBNG^+cU`JX&E^jzeoNm0ayS0 z>im9B45L9w-1s=R)0Hq}6Hs)ouYCRMyg<`>|DK4Poctx|q5t4ibEOnPM}^_oRvC7)s2(zJDYl zGb}=ewtw(0>mdemE7(P8Yg2{NFXSJ>G9|m!znmK5=qg6JQ7iWDI`++^Lg&%a*fx)P z_N2m0Z(d}RG~I5Vxky_*ppke{Ox$^^gsRvM!v(s$qBRzO>OK69d$z}&VOeBOv(eH^ zro6Q@d-x$b-VbR;A>)~RCDKy*=??wx|0%hP|FDb=rM4sb4)?d`YNYXBkI<0v*fxK* z)_X}fAW0fMb-eR3HLc-`!tfOkd?EBY#NKCYe}mUQ)lY?g?#iuUXX;2A!NeXtEis_= zl6?Ixq1@Fi*)n~6%_43WgX#HO1*N!~BJuP=I- z33;4%aG$*Jn5(a%r|*G9+n+b3j7?VTYK(M`gFx0u{Gkht5+vN;-Mjy&^)v0@F?|(s zx8T?)EggPSFfN+(A~`;K?w^Kx_C3G!t|*iA?fQDns0OkK@HD*daJR%cO5#P;WU|?s z>;kU_7{9dSd>&9Ud&ApA4oi_qE=t?5% zudk^6AuIV^F9Q^}AoVzzn2kM$qfS^ zHN?djU4s^NvRl{E?IY`eKAC6v&(K*uQ-P1ua*=$Oczf;Vd#z9~9A+0hV6- zTa-B{J_1)Rh1^SU6D1=jhZ5Y-P%GC{EYVl;IF5OvXW;@)_yjeY+9Jm>yf0-eelFW7 zpvLX*+ht}6Zq1xdz#E7gtOnYz=6#@wG@@r287$IJ)z`lv8Hq(L z!`?}|;d}XTMXWu&0}I{q6X~Sow~!Ee1YZRc2lo$eUG)$}j5 z-;rJTQz4JI%6;V9QzwV-Rd-`?s1|i11vs@T>s0R`^DAFu96lHBS+aG_osDei_lb1* zg{7nD7KLYgX>(yNOD&Gp{gmYRO}#FsdeNApzaRiK=%Nm#E?SAmAG(+b#)ni!mX7+u zL3WhXiA}R5sn8hTj;?|hr3cZmNsXT5Zij0cN*TeSFGyI|I6&N7)<5@Y_VE#i!kgTg`#YWMadxP zx8oP0P({2VQEkr~(XpHy#KROl#lu~mM&oIV=7RJtjg9D3e(02fkcCb1?gZ+le7=sF39XqI1 zT`tkpLwLv(>+_0l-^$t%&j(WH?dM6dj!sTVFYLW8Z+d!8pPk?RcUsY8&$V!vmjThN zbQ(7x0AOd?@S(mCQ-Jgu4fYcgQwU>gRonim*o;jdNYQ())}F^4F`Ak$rL9%82Iqi9 z6>(l(7p(KRe1H5wzulQ?ZwikFTH3DmSCFxt~iIPC!N=Y z0zfqePM%wc9kJnt!&K@1bML0(SGoeeKQPh6{Le_K_%_ci4s%geRL0@omzJ)(i{ulG z^*2=>ZS%@!s6!eNecnYGshzZ&GadoR)F& zG`D=tPn6KnLq0i!R~8J;sL0i+$$SiB6X8_QS%1%mx#Y)8czA?v3LqgBJU7_K8v5;$ zu&OunKfefAT@?SDlpJ`7)US2--{B`me#Wx!H*j@>#pBnnUlCGraw0QYBoz)~YU+-b zmX_I;q%Ons9yau2fjED-*oNRWSvcVl3`5+n;F`T?%)If^>2-*v4`n!Y%p^Xkq#|8K zJiq6+cS~UcmA%O?=ZA*YQ@owtyy-&G?fm^nG4Hi-Lw$1G+bDe3qnUG8Q+FrAP1};+ zy73n-uCv3jqXE*`xZJ-^_qgAojTO4T;J~)((7(d^Jr^_Z#D@8o`sDBK6soQ_7CW?K z+qb?}dL##Z{n;EboG62RvZ3a0sBz*&iG555qqQB-Vf4t`!wN-S)KKr_t(1JRw zIyyqlH${yFA0s>3G#h%%C2)Ie8Nwp2JD%Mm@G*Rj;*&PEVQQb&dgnpw(x0*PUn0v! zaI`^ZYNOTk1A@>qFkv44{VTpr7rhUbs>GM>X(0vEUtfe&S^f%4uYq<&t9jdJ{%7#D zBjG83#Sk<3>sJQLO=NNkXj$txIF3y#7Ut$aC=$;Q%dw`h^I*I37o;#<)AUy(L@nyPMN zzr5<<)>P45bq(l&gg#9b%3}83rkjG`6;@yN-WYxKARsnAp2u@aQ(3F6W15=(ia_ey z-z{KBB>2TV4szI;X|v>{=H#4$^wzw9?pd!Z6(?WVDQYpV^J6I~H1W^`{7Kf#BJXBc za-$*e+(~$3x*GLK|NnUbK0+`MSY+d=oqBhVcW?N>yV0-yxcR02Ba-fY{XoEc(H=lODl-l`H%T zuyjQls0ilp3uOxI|B3`qkn(qS>x0h%+w^m?skoBOZ|Iq4lO^MUI-ge-y80hDm5MA#TN6tJfg-H8)0u-u)X)euw;@fBCc=6wx)h@ z@q<=f6=7^7l!%_}%)YSIb#`$9)-rkc)0dqK->WqjK)!3J_qcuInPlXP7Y}9nCwWdL z_OJr}c>st(ZMODUzF-WGNpy(a@#o$fLZl>p;jFt_mHIQmnaMKJqpQG zA!|)~P)L>E(umoU2iKf4qs#!owT$D>CNtF`jYoRwNk80P3<2VQjnW}wxZ^X+XJba zt7)5wCj{`syNy7R3~+FmJPAXm0ds4aso{NHd3`=lSEO?O%Ou6b*qC4!+M?R--hJgFdSX|HQ(}{y{oCJPcmt z+c$(D31DEbDJlzgW-&q-y*WyB>Rl94_&o<*R4XlAMP?gMw6z@5?i0$;J9QcE%O-t5 znrCPGFpsu|GVZ1f-1WJ*xNuA27*Aw{pptr{#}hFHiwUn9_Y>==1_*uvx>+#~Fb{%F z&9gHzpP#4y)^wZr&N zpY|H^bCw)u%04_`fN0f4P^{z`<6>HVJcH` zbVp%IY531lkRRtA`44ig(R?q~Iq3?5Gp7;Ty~WeLr5p@mK9AkGB(eyaT%|zmVri+` zF*2K52c=5s<0(oLoEBE2GUi4# zUw?+RIjnr|cBrkNdPSeGGd5a|W!qX_L! z>ZedICaK^vma@N!fjWLF^W@Kp0&u)Tnx@(Bu5WC`e7SA#-^utWfjq~BPdv=ELboIi z*S~9z+qJF4Be#AFV3?pCY0+TkDR)~6SktV^8y2(neG^`6yBb$y3CwtS!~;VvTEzK zn)Gm}9rj+K`;sj243UOkzF*9o%6}CsX162 zWTvQJC+w`R+h2R_UtNYT-d7LB%?o3=!qZPiwdCv}?O@Hswn$FL4aI`S+>&iJPfi9p#0!$ zH`x9-%n@5^cv9weL~Y4Q_@5o9zVT~%dATwJE*SP8f@eA3*fKZwAXFQXkaSfR(p?{} zy5B^p%D`FsTIHK&kU9X@)fE+oJ2~pj0qW4gY=~RHy?=@NQ zmf0b3!kPEoy9pilZ4QLnX=^Qj8Q{sK8Fsw;ujlP5ug9;$Fn=NS(L@G<@q zM`zEQX1tu zYIRZJnEWAS4H|NB%1!$S9GT_BeL+r3_^0#_LfXnHP8o@*@zDdirC%3o--IfkhX|mx z9uiGiIK64mE}q}(C`z$cjExHy^TiurE@EOwwiPu%9Eq z$Az$^;(VjykUl-VMJDI>KR+4L(hJ$CR={q&*%`3}DNi4ECIo~|7XYp3Bu7#8v9oSIo+7fU=BZ=U{5P53_tO1}MZ4$$ z60f$-^vxQm1}G@+k7Xmv?UkINV89V~Bxu zPlBMRnBV<12RDk(krIV|KeIF99@C>5IlM|;BsDT}ym1fmn$6OWtE@juZB?%OzwqH4m0JAj!#q( zsbj9J4c?)pOK1N22(1+vOf#Skil*SK{HFX~?_IdB2(-V_(cMC@tvM;WfRv?peHF1L zVB_IlxpE0;YM+nT5~~YKOLCDElF##T-mDonK`C}^=fA{IzgpITqz@nX05{(MOv|QK zOM&hUGUzQxk?@kCx46!tl#T7_*0jUDd-ZOV;#5(fXrSD@li_D%?x>|(S6Da-6<~1q zySmnxSE$oqJ8a{IY0^9&TrWS0I)nT-Zq1ikEF%-L)3>Us#n4nrS~XZ{<&MzMuxJ%N zf#Lm!t|B&$_rV?Z=I;v`H+k>eZ1zJ}pi0Q!`j7lgvh>tr~Av0THr7PV--xeFHuOTsqgx+K`#rR-i6CU zxrgrs0dMitm-6)pC|1c`3y?06kVZi)#@XW(E~4c4#R&r*#K+bYsvj-*-=D|2^$6Pb z0NrBBOiL@4u@mGbVq2rxVv}|zWs1Pe{0nk`s2~2GoaodYql?tZ<|K0M4n5@awfl)A z_G#CaGd+V6oVO)kf5wFpdW!}<{Uj+<*n?}ox7Y?IRaI+FqwdkkNqmSvI&I@YFeXng z0jzuwE-twGMd-|cyDuvH&>+pAWUyCIULJFb+vTtAWfYU@_uq?cA;iSQ@Ug>Vi@kh= zy}__c!=K~;mnVk9fD^Fm9$rb~8|8u#Hr)R9bbxT9kgGMH?075Z%% zy?VH3Bp55F`dv#wl$=x&S)7QxrlO@2@F1-;>i;FZe-wepYb&@dd@xgIz_^1PmY*&w zx&@03g-R8H)wh50IAk8<@=V_l^i$Ev{f0GgzXIo# zddPz>UFk++Pd^~YD^4urYYhV;KU}O|WCctpS8cv`&2?!Xo8#W1MH;een_!1yVWfAZ z?U#y-xCN&JfH9>#>h8wT8KVX#>=4IiJEWh%sgP!t-@5i}aH49vHHZy^`Cy+I|7R6& znYHSCye`R3wob7SY_!w0AuIp~^SL=RsghYezfT_0^^{vTH@tX0!r(5-@5vGosFq>p z{MU5t&aPH=ozisV<~cFA^T=0QgfTjLIRv+%XZ3)~^55e;!_W94Y4X^3iQa)6f6q3t zKs{8%ZZo!LC#VQo12$6zOuc2L!$)qHK+mO6d0ciaWAfJ7;6>XH-#TE%oE?Y8y>x${ z#!9_j;s(WZ-zh+o-Wmd2!btpvTX4JZ7Z{Nt+ALrvZk!KH+gHTEHT4H9hMBc^T$nyG2! zdo#tFeAbw4NW{m)lo&Z|di7vb0MqE*y*12H+G=#)AAAm`C%$)if<)ET)h+R*O^s*d zeOi8vdH$@<<0BSW6-V2*6AtCbwbs~EN4#%n z@NJdSSA2I9(fq0fNlY3N1RnzzN(CKe!bfmEvd18S*UXf^P6Cgj zAee6#rLeQYUH@qrpzzm+1=f}d1spWQf(lTiV<7XXrN!-;Lc}{dBCPs` zjd6#w^D3?grJ0(j!HicVoQVhRgy`}&fOvHi0e)9}eBS-T0M}=~_cmgd@IaT^om-l3 z37CC3GbBH>?(pPEJQztocgeg7->pA*@ElU@9qs4f>?C>g2n7KSV1CmH%%yPCzg~__ zv9h!r422=EKSe;mpxq#$4fd{3B>f+Gfi61zXqh0Cif&_O>zDCjVO)C}G1H}T!Prap zqp2zz9bmdCjDF5u4-O8_l8#MzVL$aJ7Y4|T(9+W9B1WIjM8(HZJ3nRkw}WFIlx4`Y zxdn-S*bgzSs0CR9CV;8WG;RBHn2>{o7^=wT?|~$?B??G=!pU{!JntFs_#vsCy**Ue zXQVc>Psoa-9&O^I3$4Fo;G(Ca+ZZdDfD{@ZA0P3R<|sHV!-#mtw|KVNi9*yq3(u3x~8r(RfXg;`* zbqr&wZyN~oCps{|K9G)%ZmM*d3q)NJ$MDk9QdoiSwgyGrDZ||pfDDNrdMtqock28L zo5q@34dASmx7$xrsrGMf{tdN-FYE8zL8@zOidFXnl$UlVbhy<2x#$OlqHa$)vhY6n z@Y|N#yn>*JCO4PHghk?O(ha4QV!IG8T85(0_$P!KAw5ldb_Dw5#1uG2qvjVbj*{QK zI_cR;wwUu0M>egD)D>UUiMxL*t!=8X)qpnoqU2kjOYsrg^wMt9Xl`vLjXx9>CTz^N z+)XCTleif;QINl$UbBBb-A}CPpRN%uxTYw>M@HF+$d!&F|2p5Ut}9VPzBg4bM|Jc7{F6NP9ej-8n+?cMmZo*SKX5NyLAt+L0`y*jhWy9^8j8d19waew~Q z376o6{1`RkSj`wfninZ|wHlt(UdmnwH_o%7Hw2_UyV3K>-2ReL?puLz(^At&cy z3bP=}D1e(_J^SRzy6;`UnJxAwy>cVP))o`~sMpdCrX-{}nx6Fzt7w!=GJ9grveos{ z#KfIN5HT!t8oUNGhso&yPSz*IdV;~?Xk17W2pCe`#A`U zTFo?XWL-R*_&&6+|MzQXXvqK85f!M4_*RzFl?@ROW@ld}@U3@6<;W&m4j7j~U_(V! zH7+7zkG7jiufBO0SIN{~aG^u94=CsE#~Et*x#8#Cq%mjCM-a z*47aD#befH-^^xs#{gwtWfxQMoBvn=gK6ZF&wu``E%{aW?_c84X0+;>H_P>#e;z22 z==d!4hWvW@x=cCoZ8xf)Hg<7f-g>W&u_?~r%2(3bjvq-;-{46r6^>?o16k7BrX~&_ zX>h;(rqy!qLvDV)eo0&-zf~-gmh0JJ5N|lM)lc30a^>jpi={vBAGlh&r|BQGf(8;Xt`bg{nEFzTGzT3;r9)#qHFeBE1|ma9b>okK6f zj0*WQmVq$iF9y2!<`f3ndicnFCRPtqpAOXa$h7@ogP@pn{-+OYIzKD0zmB3X*eK_! zv^htum~Zqf(=G|;iS`W$z)NB7?eR< zf+}muxGjzv<0UQF4#S(jCs~9jLnNFU@w}f?%~&R^CyhLKK4dSzw(_|eC4xbC%rjNz zeN7C~CfA&5TuLmL^Uh*-cQCkjMmK34bXPzB1#=Xl+u~nAqu1#7@83VCo#7&&=ltm+ zr+N!SJI}Mxy+9!mlis+K5jjHB+Qt*|L${3{W&u_+*n`KjLdA~RF(X`yUYNQ_tjZ^3 z7i%?b?d;$@o#CL#mHydhv6_)VT%0K~%&z<;dRoHD{=kk|hlk|R9>MDtI5*`7{Jpiz z&Cy8n8e$c6rat6vAn_&BwI^PfM5tgLe=h_qd^(>|Do)yqk`J< z|L;SJgmfb%9fBYrAq^7J-7OuWG}0Z?Al;qP-61XA9ZE?_htKBD%=b6<&R-9U9*Q`%__NF`$-LuO5Z`+Jh#Xu5`#&g$>->HC=eM-L2Gxe#% zXA9K6SU4Td1)uZ0ng!;`8=7JqWHE5?-LD0fqs3GJa?)abp;?Fp_*3Ba$i$(>r7+TD zwZaJn2%TK*l@m)w+kN~9M8CL_Zvofq?)DTB(f6aBT~P^Bap4Q2m^6<+0EuN>HRt%` zvls$GI8`{S-Q|%0h-(^+gY!5u`we<q$Y=75obHz~1Kx0MZ#4l!nVFj<@2tUN>2}EZ)Qn2kMlgF!x7m3N ztLi!!n^jH@fSbU_Gel7TH|BFl=6RbbHc~KVM%-^dhDy}t;rEs%A|%A3BgQZd0ndU6 z>^1Qdm0*LS0K8OTV&H(sdm~20#7yKw{%UxI7c#D;=!krit`>7$bCrhV`NvTtAng0z z8N3jZKV?W(k^;?{>tgQS`-G&IpmDt$ix_Ts`5qOK9Z+S;^E*3T>l+(gT(2SEH%r*r z(FtL^l+kN)+`7Grf$t!AadPHp&5KIL&qHZ=1fEr^f{1CmZTPsdXv0Ls5V6a5bfj?V zTlF@3TCYl>uuYECTv!Sbdw=h5oEC;EGnIEyjDa#RspXtTN@Zg*Qm*afkM&5K1hY95 zoSR()$X34^CP@~}_xH~k;%SuL*_P`96xSF0DB5@sr}`XalthZ?oT886O!dXTLw^YH z1iIEpUpML%PXS~3{aht_nGX96`88eieEx+X6x4zWsh)@9=;~|^~~9x z+Djq_;ZC#|0?+sF4K!Ut-b>5pkI?j0ax=xmw*bT8g*}sIrwx$m_)aX!=mr!P#zW%rv&IqWYpt|+hBQ#!@-5~!Z&e(F0 zRL`}nOY>+2ucS(f;>Pkv?L$<&qOOjNRbS%A^R*5NopQZ4`{Q+P<#{*-rQ+-3K3fHQ zX-muG-(fe%VjNJ#Ttw?02T^#l)b{$mp*s&3*M--)5J;n z0$yNEF4SSM=zLbCD+)t@D7YcRP98?|0@ispLp~yL*F%?N@^En5dujmzfWGr|;qw3@ zEP-7bwfleSwRLS|&w(G>ayESf65*0Q7@<^jfqy`|lNpq=7}imX#9; zWlt>H_~S<%_>rETxUAnKPn;HK`)z)uX_meljF+)+IPgIj?CNxt${h#h48ilJsb4I) zm5m^RH`fzKPViEOJ+TDHr-+NC#xibBCjMF(CvT zJhnuLygXW`3G1e$s#W6zcs*zkpsN%q4=}13LW1r1&MsFV46{&YyWE-z;P&o6&PzjI zD4?s2{Cq+>OKjx!t0prWUYKH9Q9mt~q2<0dD;W3VlxtCAUho2~n)SOi?-#BivI_h{ zu9*QR7XK=#9S_@osHydJVL%iEB1k2`qX(_6!FZt&paR6{5auPCkdO|KBWk8O^3)3T zLstUm5YTPGvNW~T)6f{%I5r(ldZ<{+)s?%u`Vqf1sJ6xTjV;)bxZZW@7DrLyM;S$G z6X!>N3X04Yw~HV4S7xLG-^)~INck#E$FiKvG+8i$p!P_;u`dGy_NlUaYdbaeTNWF3 zEUvr-C0&38O3dRH-rz^Z(=uIh+1@+-IqP@92Z-SAy4%qj?jz5EH(b-n>4($P4;&U} zd*yP#fjJ%(u!X#ahJLsGSq7wpp|G&YfamS-Zf-a9O3T312U80W_t6rc^3^--jK_i7 z%gb8=Y*gFkQNS8qnB$q9TY!U#u)Xd6TA2(9gFpnVh=-s5Ip=xvnx{GdXIjoY0hb#q zmqP}d2oaIvYI|CBHBQXPl*Jj)bAtqL&Y!xS?FNRJ#KuqWNIcnJ0eKqy=oCJ4kREN{9NaM(;t~9fsw6XB3TgvR6Yqy@cadClk%|>{Lmv#J%hPS(K|P31A1(>s$5j_SB*ar6MMcHy*em8VAR074=5d*nWd^-+`}KS7Lquihr@NZO zbZk%t$a_CK-Z%rI@W4yo7C?$u0$;pEQPR@N9xI5GGJz9gB86STQ zs`wTb7I=AhB(1F)tVm;e4A~N?e5oD-;M8O_4s;1N*h}|J&jm-}%=+eLoSqy2U9#=% zqo(2?pe$Bq01mw*mTSw^)D=&-YW71>$fT$otLeykNCS}n(q7@Dh|WEnLS`Vy|DQ0cb#hu#BhKhXtzx zIqQP1jx~cOkLRy2+45ZTYoM$XCz_HR^I^}?9aOD@T7wk+51knf@^nR9wz>ize@e8- zt_)nLy%TR#EpBi=wvv=wvTL+k+s~E8Cq(TH!Yl_Ny-xWPKpt;a)L^dpD#ik8XN`%%;369HA9#2?-X92U3hv;N`0W6?cnW`O~5UXjRn*av3{ zgp@caKr1#As~f!3&+v{frIFT91a_ErZ=h5Ru*vfCIPtn{I6XXI5)&`d#YTriFby?> zTkjA7N&Mc;Iep6>85Jy%v6C!h7M4FHB{b0kFN5>*M<<+oI`~*Xh#GXcRnO;N&jBn< z8V4umXTTrABWT6Y@AK(s#%b36jPS3!Ks;U9*vVIU{rXdy0u`or)x+``nm7$R!}deq zBp3|({JChM^N$K@o`cy{jR?(i{QQ!3eN8B2{Pm$Ucr*|nLeeYKI@@a0MBSd+%>BUh zaOONb-`hRk1bI+|Gc+MsTk(u~=ni1EhXx1Poh+FT0$+Sl!zxvMh7pu@p#p3^8s`SK z*Z*^8zUH5f_SwPJUPi>DtQu^=gTrjf%%v?*43}U?DO1%F)VQ3sf?=2-fb~`{^+?Q0 zoBgWK%EHf*YV_9#Kir5W8Q)Wxn;F6$jskpQh z6UlG%Mwpc#%mp6Sz}h-o_Yd3FW*-UnEBB5@+ZoUED|~SEk`9)(`*TmS61FDGo{%^)&t@WP&xZ3s5dSTY!Ulrn z9p~1bUzUKCWM}sc07hH2>iGGX7M*8+oC2U9`qhH+4bO!WH#0LXBRIU!r81ox@fFHE z6AWa3;5_IyocMySCOywX+qQcfN9d)I7vPeeY(((CcyVKXIttc>nW%zy-~gj!6_x@Y z0zAeg`kys{+Y7RLH!1wNl2}~uq~>%XMWFfZRP5DJa7VK|61*_Kp0bXPjKbt;YdkF? zFCOZ4&t@)o*#FD}MkD_7#dY_SV_NH!d8i%Va=N+g1MH$R#J_VJzF&&Zh~|O5#KD^8b*>~FEzn=F)!{4fZ`6UtQ+`9eLDo18FF_4 zhCGeeDXpn#0T4>ECd^^HSXQNTInU5N$6fQ|Oe&>fJf7<{@EL#mP9YLN%Ii3} z?@+rfZ+`Nj8bb?DL?UvI$XW!^#wss5YtZ5Px=FV^b9`4F!_P992}h1t@4@v+cw`ju zMqo<~Sz$(6DN_FM0t?Z%FhaGsuqYbEUl@{SC{DlF0zcQdwV|S7U#fcAT%Mcw*RnCY zeMIvA=4euNK#JjX3759E&f#JUkVTwt^ZbL(e|Z$j!v6^3;;P%3$Rooe1J3+K)vIz) z3h22|%abarqot)%O7~Vqrp5Em^nn%#p~{f*(iyJSf8FR-HKb~z`!?D}@ZkkDNMq~8 zMGDy*RqRo2M!!UZ&?g(~NMqkka}w;9MLbGAYY9x{N_Y(62z4`BB=FIx?C$x%+wy9T ze&te0(N>sjO;mw}Caii;NV+Kz6AQ-OQ`A0>NJF<9KYsQaoYlvayU2DRM#;kq#>U0- zyyC&b!zuZ5f79Gd0s&RD_kGSxSg5rz{W=%W z0?>GgFU{HJWxUtEU?EtY+GbDgAdMLvIc*ge{Z)!xc(mDkuwsequW ztj~&Yi_HJnT)QsejV`Yi|lS zeV$M7(#%d&)UTxSq?lz!5yu2T%ScH0JnuWxJ(m~1Qyk3K*zO&A9)0hi;U#-*@jJB% z2&GMkQXbd8-;l%tJ%UI+U)W8bKsfjbP&iXswH%6i_D^j^fBO}O^e^u z;!l?q%^|@~Dz#UVm6MI049Zpeezx<{s@t)!?e1@a$r4&voA$X8za=!+AVEMh69hms zv=x1T?R9kA_lNj};ilhX?3vP=k$r(SLO4_i@y(Mli<*47R8-{M*!cJn!>Sr0nUmK_ zXrdr}=O;Y&fsg?Q?Rel#G5jTb^+pwp7dcZndw3+Wz=tT<_SbRZdHJ1Ui;1oEmRfHTm%R#~~eJq%y<1{6G2 z145|jXlij$G}ky#tRUp_@CnTSaecNjH$Q)Nuz(K+jt2VuYbhab=h+`po7)ot)OU4d zIxt>6@37&=N-bwBOgKWK4(HD<#oH0Z4l zq8FN2r4n0i|JOB2QpjD6F0@P$;biVp4+(^{`W}Bi^g@lns7N`!tqG5ok13_+U6uM< zs3J-V7>puH%5SYuA%O5*14VXMr`z;6d3$O}Tv&UC6RC4k~z(}hMCe}B}n zFym1Y8?lK48!f6C(s6-&Qo{oUMIyC+sB#%purE-&qC}4~4KVrO5?}aC7ZJB7)YBil zY?osnypL@4s?rX)GC>Te`VI()Mx-se`HDNxeT={@FkVh!z~S~ELjbriANfSM#f&%g zm0zrhyWf7#EGL{lq@k6}Q!MoD=Os{<)AomS+=7GMbQtntneo`! z-1n)~(O!h~*SjU}9-+RRJ#FCo8dqOkGI>(xS(K{ODlYJfdZm6WvFF>=PfzAjwxJ`k zQe{U>JDy{1yaD<~q*qWyRkf_T;MioEeUFxPiLk#mRleXH{l{%#BqC(UOA>-A9>YSj zg7-fSl!~T2qqNMgwA}ERT=uNHYKxN>fW-j`(j>H0-L|B99)yMP+)XdoCX$Rd!-z+3 zrf_Zl{McAod4jH1N{O_7QQ8J{wn3G&(L${?O>bf%A;{r~Hb`o@6cALHvfZDXZ?w}0 z3>32}ubW{-lhbD$PMeJk?9miOTUg+_N_CS{zg5i3ZVYy&V-dR-`6M3uR%4H$#^{CB zmoR*n0zP7OoO3iffj#qK+Rl-onL&$iG%b&(E4wCj~SP4-N*0HZ6Y@c~dBA zXqIEn!^`W|_xS*?&Fysmx!S&mHs@NO5saXsjPHz*kCzavVA{0;jjww+DdcRd6Nc0C zq#M<+IlQ3QORH?=X}K~*u2@M{0A)~|b0~S&8 zGr@~a;LiRKI=_c|#6eV}D;I@of4)EG=*an3n|O{3T!~R1Ik6To1R$+E(B{@Q4J|G8 zU!RZQ;lB{PNevfnU>rJm8yMn!=kXbf=1RJ7-K+<@WHr-l_iVDSOj|IT5>Z2Xg6$~+ zM1lngTK;Cqf~m$CHo<_6c8&@hV9!9P#*w4VG22yV@&Z0VsobC|X^|xD97zkpNsCM< z1Ct^+CjVm({@)5R8eorA;&YBL3JM09<>j6t zeanrXXkS)`wzP;yN`BRVi>3nhA?_wV0hjm_qA*TT!{a~q7sr4V2dy6J@ctOqii}FU zI;hiwYY!u2r+gN;7zV16@?&C7fA6qQm+RGe+&RfzOf&aH^%F7T!nA|l*B^~xkw`T2 zNNtR)rGY+`O76Rq9Mx}YFV3j<;NWOdl(tB>c z&jMdH)mz=0vs=hX)SEL6o2N{ZFksQZLECe|dGkoigN0^}nc+R3ry;w{qF+_A@@5dZ zc6W^-+a}Lz$Pc-Jl4^QP5$A6GNnCthA;vsArXrsQ(&u#p)-QkfWO#U#T6(Yx7?bc+ z)RXf5?Qj0~TKLlE9AJ-Z1nOR^GXX&HD_{+4o0%nm3KCGAGE*W1cA{via-Akav*X{t z9Y0*i)2s0DvjD;;P$1AO#e*y?ChZf4Rz}ei5vmUhX7<8Wh)A9U(qgbC4%xQp0K&!R zC!pcQ`aB1a@PL`=^eo{i1?EsKHlc3q8mrS4Pu9Uy11^0{L~e#Y?Cq{~AC112xkE>n z4@x|HpYCMZASwM8t!lC(3a}yHN-!(`EZ{y@HL`{$}=J$cLf z?v=2zcDN%gmJn(oS>;i#`m$Jx_a{?ZF!=rILe5bOdm(= z?)QW^8JV6be!}Kv&i+0VG~2vG%b#vLeQz_qWZQO!Xf2SCd2;S+Z;AL~QuDh?``k}+ z{6uB>oC(f*(&03lqSB1`yta{YL1r-?Yac1>AyYk6J8qpqtSDpj7muLzqA47imQ|75 zI5Tycu|;hhcs`NiZuTN}5anW(8OK@y7G#w37nJ_-k?_}5F6Ib$zzP26`q+MKPR-pD zV}IjFDW*WtL4np!uS?7mn^oW$LGq%SNvBr%c}#*ztecA~2)^iEqcbaggwI0!SFjh!7J?hh9m4z_nWZEoT5l53m}b>oVzOQ~&l&KyFpX?zLC z8>BTYl7tPC61(h|HSRyl<^!JlTwWW%FQx`Q43A%`JyVA$>ryt65)2hL? z--qn}%c_CFTGlg>qsd3YwQqB%Lr6+X*U-#zQ>J<6@vh&=#&Jz`u>(t&SqES5I&=1S z+jSON+;oP5NoR~1eHc@6VOBfkV-RXtH)_at#bWl&44O0I$Ya{|hO#=0an+T*|1Z?= zf3Gmq{57{2aHc^Szu6CYDC4)xTO%bL6cUElqW3}a&fRgOiEg-e}C)KDI86OPO=#Bd3^6o6-!dXB~gOh zxKbUEzL0_T6FroZmuoY3QoI%h{Ds5W7Zv>%muebQdL|C$Sij&Kw=94ADxK^lN5MBN zchP8f4^REXH;v=8l@id^ATBRK@OskRH_vWalUNhcdBEdk9M=dJVQoZ}@2tb{i(=b7 zR_W{aj)4HNUquC^6lwS!lr^`Zl*t4j|NP%#nM zWxm3nVXfsUCujTS(HkFf;EOJQ`mqG0LG~9ezD)L>z|)r7dJ zhRg9fg0bBnkAeL;c92&{uxxuN!9^DW>jm_rR%KIBbuuY&m|> z6=M+|y%x^QhuTxS=$z>i?KW6p+R5WqW2j*C7faD%V4(RxOe9*o8zZ$n>67^{7E}3U z)1I-ao=WPO<72k7p(N_4u@hNwpqV*9g09j1O3}vViG>1P(e}`%jlmi{7SN5OAHYxK zV11A~`1Sq!_cW>M{Ous9j06$YTzl-^&CY(=n<+oN>Ksn?WMHCmw(V*9CeBm~rs_nj z+Xerf)fw=@l&pHnrLU4haZR_RCMoqJp$wO380_|qUq|o3Ynr$Xfy148XHA!6uV0xz zkNonbd&-S^RxG|<0pEu-RcQkQ?ufjmqWl=MpOKA@>l#xSU}b%w$)KMIzozMBAyU;L zsNXAx7pQcDTW();lFHbUZR<1jr`u7V`ORbvT5LBU&A#^ zIo%wk1?s?iO`rOPsdLqS2@#&%_iGH4q*D&IEj3%Kt`#T)81fI_3x*1jb?sP$WU z!Aqh@mTh^LTE4jWEJ+G6-`526v|-jrOwr&yupr<$7xDZEXpJ}j(8IfH&Xg3bnh~Q( zUeq1};~n|?)?~>78#*4vFaUYr`9Uy6#f)~j1r2BLcBYy zF6}LR2s)|4v=C8)^w|=32+bjKtYCrrpBsNn51Ti#>E>VE59yBT*h@;tk^58qUdF`1 zL6In@l+n%A5JbwL%<#%0XOK`3%?&|j2r^U)2?~*jVW6fGlzw>eI{^mKrl7?A$@HFGP z!F))s$K=91<i^f^bwF%iXGnLd{sw5b_NaNNzQDQvjSE^f664rHO*Ar7V4-C<+tf?(ZuANe_qx0?zdm!j zY<0U46&KTe<;kD<-Uzz9-YfT?0)2gh`Dq@mp!JNHv&8BBvJ?@+BNQoQ8Sm0t<2H_n z`(pK#F1^fmUr2m+A}EWENuCD`gudvohh?Hbe`G=WWb){~M#IGug(#7rC|pHiG=8V8 z;)$LDd!Q8cy6Ay?RAi@vE_z?z{7+g@zrG9Hf)PQCZk@%@%q^lfohXdC{@4!wAI$yZ z3Oa#%rm~K%to%0xMv#FXDWv2UD^@Lafe{4>OjtNyo26C+h?{#3YG*~I*nYF-;j#M| zn+7@JOsSX}tH0V@4$cci!Y*d)I7hdKiNT3!J@U%#yP(w0bg34=C2^h3nQkHX$O+uV z#>BjK{hh6p&p($V$-YL^@Rp|Tz-}-e_}E)qcXxM7Et}~lR!vk?8s-kY1c_7VluP;p zn2CN4|EUGw_>Mt%Rh2Qh-Ol7|-t9jW2NVV3#=Y$Y;v=7lnM^2sP#+ZTc5(`-3HvA; zTU(_G0}1YYUg#MtTY>SS%DwHc@M8IebEj)&};g=~Y5iSGzIg^uK-%*&r1M6$=uR7JU#gDdRdk8SQR2v6}G zE=Wm1Ob4|Nkm&zUcJJYfOFyXuB_LyBHD5A^!ZKu}fd?T`EOwqJPM8`R5;1Eu&l(%% zDn6#z6z@fYO9m@X4r3W{IB{Dq*FO+*i}|hsRkZJnYR}P0UR`=WA_e`Jhs{+0 z3ik)z3!rLSk8Ybm!QPLprMZR=eE}B&5V=J-kHBcN@DMAYm6_E5D9IY}CjLgt=8B?D zvCI5PSesmIz}74H6_ zCa%dSyC5cE<#fj<1;m!k*5f5TZ~(pi+* zlSB@#^D1S>aF5W>cP40`Kfm9dnq(jan4$?Y0vCEEWQ=DCIy1>(pW`#MQRChxurcz9 zm32&R8z;52$v(mDbI!`eV9dc_&Md&1^E(u$@gYA$*PkEIAz;7%d1kVP8Py!f@f8%FgBzUR#K|9u4b#<+AaG; zI-pgIEVrz{3TnE#+R4kmQ{DdjH2pm;Dq@Uo{=&_{GT=NN4fpnOd6=(t@;Z_Hpe{tE z^V)MqcGWN6O?_^q=3F0{R3#`&&&0t3T8b!p4VF)?4*JS9(9py3tV zrFCst?$IToMT*$VRHQ&7?giCRgewmDDVv*kYKkn#uSpSd?Z|VEovLem3B#+^Z1*(vB^3Ir)&Kfx`5=#+=Xpvp?jjsb$E$an3F7Dr# zHhGYeysS65#HT(PW-)(EdXhqNl481n)J`MkLU@F_XNur~mDzCLN{#gBZn?onqZpQc zwaY212-h@t!edajMXu_#Cb1}XCj2j)gUkf|`2sX9wKRVz`j3C@wBN!(t=fgSzN{edeTj{WTD7-DdQD zZi8Gn9mn^#v-Zu3)C3 z@KjmhsYs*j=#A5xUu2A7CQkLQp?3=YVhRS>d7a`43c)#fx=RFo_u-gromidX14-^s;9`KAiJ%Q4Ya_Vc>9}EQT6) z4c}G?(*yn9WrBJpLBmw)s8HuoWYM#%N4ArqPF3GzOWwWfgbcLl7_{j)|MpVBEp(#} z(1X8wMPf-$CrytMpK(m$BjqO%=N*O4M2q#90un@m(a%^!ESR*p^qEuqt$Nt{k2%u zXDD6~8H!b`s1)*BQM7+Sr44STb3AdS3yWm7T3A4R>ivG*tg>I*dF<*u7@gf3J$cx9 z(uLJHG)|8Ap4dOOrXN1=7#*C`YoM16l%39-_`%?1==P~8iPftmNWwYiQ+_aLhP zgHfEjdXcQQiX-%1h*|voS3G!3a?!asb)Pr2PSluS=&>>H=aqac1u!pzXFP-+JG6r* zKIT-8LgQ$+?NxJ>p(*H*5R*@F=~DO-5`y#34FGAKz&$dI97%Y;1}9}rQyNC_7W)Qn zu*V1zf=5!Q)!E?%lWP6o+MA2zdy@x!+eqwZVJ2rAx2sVNr8I{^-MCeyrhtv~**5oG z$FhQoSJpVVHDX-gYrRdkc{xz?^_o#v~^}4|$ z(XCtgXLO)GIa@X<*?*;THwk4bL?K?REktRWj-Py3ikXO)#q)>}Rv2sLXq-XEzU^?jH`ekm zC35g666Z`fj8JfK-BCD09(MM>eSYoP$*MUVrHcD>d;Bg=>TE4A8K}=QE(>_v&Iu1O)f&RWh-ouhLs{jL_Ejd}F^1)_jUZ2(dd=7L6 z^5f4HM?DLSc*@(`YtBjlwCVb7L18r@a&}08*y>xF2_TIN)Z|w0(F7SXK&$xZ>x3-D ztM``8KnVA3&J zkktdjg%zA5lN@i`($M+F3E{;=r5I58 z(^D?I1zPcdIYpm~iMe*z+7w?dzb3B%-YeisL`vk$%{741JY;`Epz^!X7lE6W3joEJ z8;-?+xS#z7)t;je|5(1R)AfC00TY|+v(<=PjdLs1ju2_eIQ*}ro{h$Tq2!$&a?(_} zXDlfOc4%e46<^QgkNsyR(}`H_7Bk%Sq0eexFqF{P-HWhbb{G89%D~81R`?j=_N$>u zCV84B#{B-)Ul;@|Kf&lv^bYI&nn#1ct!mdF^#E|p5pKQJWA=ABn?HWcaTTjtV#N@_ zwQovJR903&`rAWXSQ@#SIb1ZpAU{dhet&*EM?a#iyzs0A^1zz7aBPuaJJOo?= z>E|Ot%F4f+4$EZUT99C3CMLQ}obvjpv)fMs(QMgteqP(

4LH-|5$_Xz`hxL{OVO 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π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%0DCUY)pXPdu*s@4kv_ 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 CS3#x# literal 0 HcmV?d00001 diff --git a/docs/screenshots/concept-analysis.png b/docs/screenshots/concept-analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..13255c7186370ccbb62817860cf36bb2f2e31165 GIT binary patch literal 504304 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 z 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

o?w>k^{W@%9;+d_8RvDy>s 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

N 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

S$c?nEORtY=Uhn=fGG`ad>Le?j6;Nw%`v; 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≷}=!-cabTld&BTv^6T(RIh$WDVd3zpn~*P&fx|^> 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/limit-ladder.png b/docs/screenshots/limit-ladder.png new file mode 100644 index 0000000000000000000000000000000000000000..41dde97fb43c9e67203456a94cd48285adcaefa5 GIT binary patch literal 429414 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 KvRd3I`2PTrHez4^ literal 0 HcmV?d00001 diff --git a/docs/screenshots/monitor.png b/docs/screenshots/monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4a9bb917392015772fa94bbba82010f2ed07fb GIT binary patch literal 227274 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 ZhYf2d8^lu; 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


>DcQ0)79}Ni+)4!#& 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 z z+mn0Hco6voQVLE>HcPpIK(f9@o6Y%R{l6A$28H*=vP6p&u7v^W@dOU;# z%7ZpK6#B_1s2M1n6wq1Tp{z)ctItm+3~jJtgt{av*9=L!aHi&sw-<3PU$Cw5DQm5M zYN^S*AaZ0;6IWfw{0(%_0M0lxJ6?qiPjB|Oeq4nDJJ(^X$Yc=TUv6B!dnt@jlzVEW`7$C&-Dmk znG_O2b&k=Q?fQF{T}Yig9)Ki&yy~?|Dertk!9xBnDHNvHs%WD5h5lyX*;{lN4hnZ9 zWo_y46WYKI*3sFd;zJ}Ha1rfr^FhJGWJ*+S3oqtu<%o&=ZnHXaEOa_QQUu!f&BUpr zkMvG}HlM53B_n11ol6ssdi+EuSIRv6pGfUU#7xC|D=rYDVy@;F_m1|t1wf*GjsDvd z#8T#d=>Yxgh;w;sgP+&zsnGOy<0tu)g3izPnf}KTEW*|<<}t;$^XZ>Fq5(XU?)iK! zKla1vJ}Tup4HFq{hNrX`3YF8$z%)0d2@z=t zk2e>!h~v8uT#^;;b22Il>D1sV5&pB}9%3IZ7+AS-h*OL$$JmyGKTjG6>sO&VAE<#1 zq7;=@UHBxjn0IQ1q3HB;503A9Y?Bf#uBNhUn}M@nSc1=@h*)}yZOiX@2~LJUm7W{Ea+dIBeZ#{tFkF1t!g|2(iy8$yg6X7cVQ{r zDbG#7W|WsLpOy0>!4aoN5pP5cf!XFAC-!{-G%kYW(Oft_d?B8_MEhBYmui6Sa`t>D zsGueL;HZ=nYj80WvyKJl{5(C3nrGlaVazjWfa>J{1eDe5ophGGnZ!c6dwVBOv^rfdu?ho!>2kSRnZ?;;bF6_ zgXZxo3m5yfRF7!k$t`+J`8#0zF)_*WP6FO@x$n1Wyd;s*>2%xM5n(rG32|dt)HdoK z-wsZXUbbSmI$a>CFXji5tZ*Alph=%6USx52;MAY=Af9`YP?u6pyb@~W$}XMZ+N@b_6Ap0ew#m)1k+;MpXd)_-cS*ELgH+;*j*qV8lWyBRiCT($om zdwMavJ3b9|(8RJpvLB;vL2JxfosB)RapX914>jU|w!8?Wd(d#m6|3~*sTq;Q(EPCeM?R_Q_y_-{F{vJvy8+AON15Nm++f&rU3J+<6!0k?FSD{0V z^eHU>{U8eYTl* zG?~iw_)$8q(Qffwp4A-~BxJwOcjZ91ve2^dI^t2q>FLBFD_AW<$FO?`68Xxd3FIM zCvQ?2?L#tm9LLDO#PnQ}NKQI!&LOh41Q?vfJWTxMaSpC4kA+B6iq~|gQ4907wZxr# zjSBU#g`xbL`eG3quZEl16VjA4ht)Zo``Sv}c!WQl)!9Jr5LJ_{LC;TO&PD!~z%!?W zvR|hQBYWP&EZ%s1)debB5LRwKp|#+_7^VbD<8bSgm;653Xtut5 zW|aAjz)s&3eS>q0Fc@~m(HvvkQjc)w^&pT(U6pOXz|ja?Evuj{OlfFGAN7E!KRqND z+|qVCEd7}++7bvnk~B9AF4i~i9tipe+Evx|&V;&`E3npK-ERpZ=3y^{xYv{{#as34 zQxex0jUW3nOiZ##C+$-o2~73?mx#^E2xh9v&zXm3eb1;nBiQ96R{;xFu-7#|$dBVa zv&UbPFo-JfXz;&(A0vIa`@2$Z1a^vrszSf{6W!%gk4CFQH_BPu5tYd`PI z2p8YU;3~2lTzoxI$4%H!B9CgzR7%d;Tpc|4M5t@k6}O&QntP#x19 z!7u{y^SGYQh0p{tpmb?Vrs z&qeovT4eUMO?~t5VKh}v_{VS>Rjiz9sPTn$l-mFw~y&u<>JBp4a$@uT;tF)mzkKh81K^<6@frQ zs(c&*lN2wiT>~qBasw0T!b*8#J-RHkrBGv}-EJHla1gyhPVMB4ZoKI65#MaF>`UZ! zJK_`7ebvm&6m3fdIY_J7N@m~IfwUbCX{CV=^^G8mGV1K%)~!~^CrzXkHBgaB?kjr< z$D_<>tD>xOi7Mj#4HO(rgWHCXW#S`MdFQ8B-7}ht<>+cr8wNk}KmTMaKGJT< zGO)mLRkM8b?f+a)FBXRN1A-m-eq+Hgpaz`tvUkp^Be%}v_z4sfy8ls|C z;!aa$2oG4qVwE35!{00{plljwtUA{re*%HjFZoSwYfJMLiF3}`rFqT{y4NG=Zq{cY z+H0m-_73};c=q#(MIA14#cUC;Yvs@HsY~&2b{$1O+~^ZK(p*(g)St~Y?lZq>R0r0p zyUDF`)-7GglOUT(KOkH?t%z!6Qx}wBOrPo9j~-TGLvR=0yh+pOqVf5N7QQjKAFo!` zN=u0d2UDVvWSUDc??*H7w-}Iae`{CEr4Yv~%2K0(wk(_7c0F%g#KkVR$qOJ$VuSs+ z);rU2!Z_L1?Q>JPh#A=Zy=lxr%VUS{j>{F*lxQJ`mxwnOS0>`{paumEP^?q&Z<(Ih z^MNDUh9xaBkZ9ZudbU1Vi^HL3urR!9W3fX~cw>CIhQ4sU^)mO+eGF^QY_I>0mWR9G z5t<0OSC{dNa2|o|r&bY8k85O?0ncVoJXcj~<;P<; z%*V9ob0MX@^0)jcGZS78#n(bGJ0?+;=Xo4X$LC~e9x@&-4mQV@{Fw{aA0YiRXN1zb z5Z!&j?1xcf14ujRn2&u|$>;aigduKsi5FYwlmV`DYABoArcNU)^>yC8$q-fEML&oH z3Ec?vPLM@dII&T7z!c2#IIUWdE`BF_d7} z)KZox$^$n?@6}uB)`BkB`;pCeLHe6KeJh&Jr}d$4mP(Gaq4jjB+m9>Y7^N(zn@x(ljEA{1D?upx08`}; za%Zk#eF>$>rUoXIxJunA@dY&5oRK8tZ~NTMq1^cjMl#)Q$K<<`3a`V(fq4I%ox8cz zn~Z!b^VzT^e0HVkj09ozZ1|i0hhVR6 zp)S4CQo*jn=6tNsvbrkquC)e^dWqVrX@-Q82tITLJcZ{vy^GqqtNfPdZHXFy47YmO z7_p@|MkN5fMnnv3m~15hBH-z?q&;NIIE;qYCnfI&0L9lpe65tTtJio`V!_I}{mWlc zlaD#uTsMz?l(tIrvk~DlI0c8K{x)it?mz8`wrbtvxEa!X&Ta02#LR}qvyJq46Q;43 z6q)Mqvd*?fM6PAPq9$CvcZR%2RRp9Xk1bfo3X+_(jycoE=IEy|8&a-Cdl|(0rKQjj z6V8`^%nK^B&a#+v@1q|K1`U!+5)o7?8AjLoD9b(GH^O!w)I6Ww1hw`Vy8Tih67PS$ zl<)}~R_BXFtLf3+Q3OAFopUF%k^Y~$j;y=GXYzaNXyZ)EuK zM&*2=XsUp6i1C0Yn}5RJ6c~zYu}2htpAjg8CIY?GnsSUC{CTtg`6$1OY^~0Lz;c z{3SHUC6Vej!}*3es>uFdl0B~oj=Nz4x+$MO6GCQE@{20K?zl6mvd{;Ykf*>~9jFV= zix$`3T+(GFLAI8s>-n3^8aL9B8KOou-{;`Lf`9Z)Y%DkZ*A25dGy^0?PXVJl{HYBFXZzs;DJi z?XrVZjq6pH(uT4i-WE#Whd~N=Pet@aoP^2@`pUM(Nh-tbUhSWSi?(pf ziM{1##pjeJq%U?6)3 z$(TpQ8^@4mI($VZ$JKSHw(w+{X5<%>bw;|c4(OF)mzq8lkD{oT)g-c7;VvabzjbcZ zngf5zFEtq#%S;wvY>*si5R6@f8#eSx2QMXO&tiU6Q`N{=9dSSYjTk+}!#Sy}^U)UpGT=xNtT(Q_%7rK=bCV=?w!vSLXqYy7qRYG^E6_>c8IEz#%Yf2 zRn>a6WdgpSi^XG!AtksooD8%kF{tn?0IHM?nXmd#jC(jVY5pPDaGC(3Vz;T6g~^h0 zU|O!$^f_Pt+p)ik$Qakx!(C}MqSr`Q?-nr(?RS1x@3mx+y+s_$OSUWDb28EbvU2I_ z^E0#RbWcxc7vP_0wamAcrhepR?75rzajjKs>EU)5LXc3d2v~-X2y_sgk(pYl73C0AL{UoxNrPmVP z$zk5c6>pYMf{ShhG%o|qN)}~GJw|&>>S#j(ry$s#oz4AVf&k9CGwrqf!|2?TDCn;5 za?}cvLMk~ZQbI(-Sh>U%_nwp*jT?_P-#C( zE|)EQaBX=%_S)61p*V{FBNf+kop8ElYuX0#)s|B1Zql2^i<-Q`&PCfzQPMSaGxYLT zibof72^VUn^c+7GZm3bGCS&?94~M=*lQz9qx>J~*df5m7QNH4#XCJ7aPV=-p{&20ye)7?|Dd1$yjH5gl2N|mm@KR4lgXm5R~Hk&D6?K1H&k(9`BpX&F#IB`Z@SN4>0 z?~~$;EI*ECq^!6csLDZ{ThNuJeLwA7ebnkNef!fs>lP{`%4i-HxYLho87ywt1yRi~ zG%6vpZ~8PZUun=K1%}?;Ny#-b?CJ>uQX;O&nv)roez`Ou@7)o&g>lg$6+Sk( zl#mo^G*7H2as}x+A-zAxeWPBDJ)Fw(HBBUOUMGz?we3vSUoh@0CIwdUZS)0}i#i0G zfBdYUh|Y2Ro%&U`Q=HmSNFs}^)<&;0m;}}68I6&;j;}bUwSow)Pa!RsknM)eW!J}4 zob*1^$oWn2DMBG0kEQY9>Fh4i#r^3-Jux}mvponE731;NVYX3y{zj0yRITCcNJ&Ds zL`p!#Ds5Gj2eYh!*fJA@|0v zh+>G{!!EEFSCkU*RE~v1amzwm9IKsexBbsF#@Cv6m8etR9vuji(1Z?9Ky18+{mQEk z=a$W3b`}o~@U2#?(uSfmHQrRu6s-E`G5(eeN-t~pU4!X9g{{(PeWTP>>oJ;1&qY2> zwqZc)DKmSS)lkB{>ACqCR`Za)cDuXRqpT9P@iXVG7P{Xn+IyGT5ZsmESJc~|xXq82 zEPz<`8KH4pH^N%wte$Fceh}Vw{BF&NBe)Gojp$haR+9taHwgQ=+K$(ac9IWaUv{cZ zuUM4V=}njCs&iHe^>aCr;D|Isq(|?pdgRN-tl+ta5^C17YKp{P#A%>lB?Q*I*X@6F$&e^!o&N1HiRC8U_*x%bjlPy=_IyCBd4mz=r zY@~Okb$WbnY8cjCS+u{f?V)(dG&1#Al~&m(>K=rWpuuzG**9|a0j9X8jLdq@Or5ytwTAD@cI~LKy5h^p)C%x$;TrEfRGE{&qSwI*USgzfOSMH(!40X!^k7B z9LVt+hU@QBiO_KEhwo4D4!+WoTwvJfE0&~yen%O1hx<9lCZ8BK_aTSeDWjr(L?#Ot zi-WQy`t0RVEAg}Z=)v_T(*Hx-TL#s&1Z$uhA_R8`!QI{6A-HYaA-KCs2*C;N!QI_8 zxVyW%Yw)*nPR_lz>iu}X-V{ac1+~|j>FH@(Uw2=kNiYX$etO9oXmf12cRfmP_naGs znvM@3Pv>4%-xM`TECDUpvd;?2dfuA~g^P%_b}>})X>#z*ys)}A*f?OoQITK}yV*<@8VB)_3~{v9ClrQ2B3z7hC@6ChD+ z>6#v5Xx_m#Q9d9ThTnwIcpO`>;9DZ?UXrv$i{P_C_@~J*Z6p{yc9qj;*2nMmtG4Lp z`s>j`70m7LbukJZ;OWTJ#^u^jZ|!`r0M@(y$#)>vUzM_2F(VhTF?j{nzXjB1-<2_$ zE=gHy_2XEMXD2KtYTUHOGnX7?lRTfQ)$Uj{ps&az*ze``gQyjGl#m4F>rc;y_jr0X8s!yv*kKku4Vt1RhuKiCX^_jB9< zu*bMqJVq+>Jt#rv27-UU{2F9bW0bPI=9}9V0(2vN&YYeWfMg|dvs+Z~cjPYdv!|js zdl3By6h{zsKBux6mA;3A|E0blKt8LR5+`ST9jS^|`RPW%gh;zes!2rQE1@D!&FSN5 z^Oq2fdGt9B%s3f)YE-6E`gFnJU*KI?PW9)R$?b88pf8u?^FW6eE|foLPyy=bBEL;d z{*TUg>n`}68=6vY-)$CkHZ{-&+LV5tFuDr+2Yt&mbjJ)J>N7$mjZPyS8?c)Nufp__ zgx^zF+!lVzU7nY)cT?+{K%WEi(G-LA)KGd!MS}y7%qA`#+}k#&(Oy-}-NGF@6}gtf zohlM6DHzcqCeNAS=Rm0wZ6?|%n4opae>Rk>U{I=TP->#y5qP!Byw4VyZ6ggAxQ!BA zA*2zf8|Nad<{7a)U->6*aS_+y9s$_PH3f@U#51`$#Ob{;G0R;smQS3-YE1e1DKvB< z=F*Ow(RG29{YqkU^DL5VTVaxdt9VSh-$F62SQB&2r2Vmldq2qNeIk16b zyeXkSo8w4|iLru?v0`-wz@&k`zSXLc@+f zWmE(JH>Z1r52M{0KLym(XhewwUJ0id%$E$tS_X_vW|e<>V}c#fwV8N@9$_R@nUf=V z-5@=*@$~DKjBhlgk5@IEJZm{Tzguq5N&7vh#TV&sDw8ilevz0GxZa|$$m|SVfVL5= zQt^7H0=KP(t=Y;6zLzAEks5} z(Eu(!3BUWBKnwD9CQ69WD!a{K4AAEovrQKO?ZZSC|Cc~Bju7H4O~>`X|Dwk|R480M zhhtHc^86qn8dwf%z00#U10fI?pasCp{~5lw1V@9KkdOi?LS=vRTRCJIMe&7_#ttlcXoJpqfLCFu*eN4M)eAHjDFx`dhEYRb6br#r zaUn|vR)6ncwI?D7fvkSv%EZK>tv0_p1mU{}qoBQCqDF%dkv~_YXN?=svss~rLzh5~ zGSmMh+N6Q!?^i*-Y@Oy2F%SNIIHAc`G$ucBZ^Fp^5q@-ST(~~SVNNRdoVz~YAe>>1 z{3R+qj9H_+3MG+24m#_ky}k!M6i5f{B)T{S3CO7K@~+=2gL#N{SGJWq_aI()Nd zdEqk5fh@^#x%DjdI#w}}SahUmB1%T#j^~}beYO5dQh;*<9qP4qxja4ITI$Ivl9y+U zhldx^H!v_@WRzQ)22=BEeaauh^w&sTj)8?9zNX*7T8l9Q95wg@V9c){t~ng;USyCSv9W=Hie+!LwW zOa^P2W~=MJaM0+B34Ys{_lIBax#r1gs?Pp#&uwmcr{;cqt{AtM)R!M{YBkQu>}?Ob zF&l+{c2_O2icu30ME7hGAFsd3sfqB&S;&LP;mMJ4Yu6iGICN*m9`09Md}L7`uKe_X z4)Z;M{tv4*NFFmFAM%$$ zG$e|yjE&;vn5fH**sS-|KHmI3XYDa`XcycS*@3?MBo1Imd#-=lI~`RUrL3c3JhmBq z8|B+z92!nZciHZHOlZ5lV@tL7)=kD|B`0*epI+3vnA$tkX?x-(Y8-=)$j^60`qX4O zk@Zf-2^LmU-@pI`y|xzp3idnT()?u;fxcV^@LX?RbNwB)*CQ9Ig8M^jPR`op)m064 zkq(bO@R)B0)HennKFxc#yxMkU!TgYlz}1mVy3mx;DTF^5U9g`&Dc>co2B-?30mnp^ z$BO{=16uMlGJ9rCw`bhb zCz;i$>as&=`>?6m!}Iq>6}ep6(?uV?sOb0jcoq8gr_1hO?{u#^R#MVNbX1|MdCR)Z zUza;)7E?a=mv>GPhbSo{V*lk6E+%laYyH%f6)`r10H`*j@Mbk%Y8Y=1OE00d?m`9rHryNj2_S6paPRIonloV$IIjW z;{^wm@|XQC#5JGa45~|*(2M$&^CB#k^YT5brnL6<_Bd>o`?VHxns$E^>j8=VL!!Q* zEbH8lEgb$to6qU&XF*pVg6h-R)%pOCs3{xc1s_Pq?dh7dX-B3YwB0y|7y*snsA_nz zyr3||6ZUSPog9hOUsgH12aroN9tW~kylcRTE2p>*j&*Xkmn59Ys z{#}m6Z+f6vwhDcKej+ll*wf_@y%Q}RUD?J4eq4eo(gd*GOa|Q_O35Hsk`fbZ6iog{ z;Qo-S*IK#0_81*~{>0A4Pjz_Ccw;k!f2CXGij<-Ao^Y#sn#_Fb^qKKK&c#bi(a*f; zv_C>z^BJJtGC-+`9npeRSzbdI+1Obnbqx(hIBIHYrHkqLc@CbZY+dhrqt};Kk=VGn z0R|ds>Z8t1Kb2DWWFm5d!6B#lFxmW3Dxe4H-?5+J7wX5$5n+-;i#l`wF zNf99t-&#e6Z%{#277-cQ!_)m$NVaDiArLD0pxMY`>L*QRRLN0qy)x?^B%69PnstQq z-z|b1uyFe!rwV8 ztt#yt#wR4~?e4c7cJG znE2{&#sa?X_tY+pT&39mJiIPf6AZk&1b9f^LYDPkEfq<@>|JG`TJ7awakNC2JN$bf zv$pvM>pX4g2#+$5Vuj21)YSsO{)+|p9$Kc`u7NqPY-?+q$m4d2se9}$cH|Fq z!%ZC8L7s@GeO+n1y25z0S-8|)kt0fw>?zg6`*#W*)jhUqqT(^6Ml&a^NT7W+#~+7v zepO}GJ+FM}T#X7?-&-@4?ojRl4bA;D_{s;sWDM$S)T5w9{*m$Mt>(m?A|mLokA;oP zI-+zHegyX};g6M+|4fvWjO_Yo?sY3-uD2Jj!S%u~Yhum?EI&T1>+{UYSec|Gd<48c z=1F@Qh~aN;^lCJnXdby+Q5x z#14mc$^2zk=L#z8{L92b8f=y1YBx~vs)xH03w9#ygx5T;oV;JQL_;ygQtC6ZvWDm9 zWBayFmM|SIzqI_Y05CpZP=ZCejUD)(9WC74+|<+xdaa|P6q;RpN{;~l;xkzcPpHv< zN(fYg-aA`o;!&PCH8nTqVrR$7%uG#7Dr)O;aK z%~)7T?a%QQHf!}ERUf%X4<$*6f^%5;xw*Lmm+D_Fdph#>Hkk@qW&fJ`Fg%)5X~n%J z<(y=t(@!U3=m-e+L=#`dBhnrxK^bveuKh;i8DGbURqKaPVZKvR4xF@xV1|kiMGt(@ zqN4|n+uG}kh#|hVP?LRB!F%<;B^<^v*ox2k-hj@pk$?tpl4LQ{)1T)p=~6}vKC&rz z!Kog(mT8g2NaiY9M*L^Gf>J+ZHH|k)3|Zks!qhj?P9QGOVH0zEX*n7Yk08| zPdWNqc?0mBP92LoIt(h26fG?P$>Gtq=-$41S^U?os<65OaD!D6877}T7Z7hDw0`m}CN>W%t)oSu$}f{`XZNNif? z1o<#Qo6~J}-~s<{9XVjKJa4Q%&R9tvAHrg9WvNas%VqD*LLr!l^){};Xsv)ja*iFCTpSxHfLc2SfA$wbuv8MT5D z{I%y@DY#;H#jKK3)Lcpg_kSh_-E(z+NBT~IC#v`@sI>BNvq3mCPOeJ!y{wHW&s=C% z9Z^xFB>g~o8FN=M5M7Pz$45c#YUwq$C#ho&=;<6!*dXEDvtuYs@qgxz0*mcxT_5Ug?z3d;}z z5TrIYR;^Q&b!b|6A9B@)Zh_49KO$(~b+NGQ^lL@llzniJ zfvOxLT-aDvNzB)&JuzOAs?$uJ{+XrOrlQ~5hXSJPSs}5wU#H%@$uH+a+BPoq^kfRH zk~PDfBsEz5I7ru|^E?W@@kHFo!dsTEG-N1-Fz%2Le79Bzk7OKb;;qYj^?2wq77|*V zi>a6+5|+UGoJ65vr?lA2o)To-Hca^}{8U|6Jo#(5pCc}$UJx6xM(?_0!C@n~Gmo4a=jlANY*vdy z!=5DhL{vAK;u@zOh~0FpVQW@RS0YkFQOkpiqbLchd6`t=d-G~;1CsTalEFb?zh%)$ z+mgPsf9#6lIV`l{>dQEe+05JO`JdB|tGTp$_{n{GXBcG$!znyvT|QlCNoeEU_xWj> z_F%%mO(8ILwd{K;>MlhUmAG#JTbrJxIsmmj_Qke8$BKxMPz+4#*U}iip`rov#P2Cb z#t;fm1671GvGz(|E{jb_D1nB@@jq|)O12%cY^Z{Ra+o$}#l}(}FIxshsimCM;%^cB z-{JjPzWnw1$=WzKDkUESLtR--XFhDS9~)i>!pVJi*Gguay>)gcY!R56>Prt)8cEgh zflMrmfr!sm2`tn!H#ymAQmsg?{QD@P#nlW=-c$DHW=;OlTY4ovmyOCojTTi|5l0D% zqIEkDwr7o2I5+fM(ZNw8KR75QOx~(vPA#Lx==Ydmb$3H-pk0&| zUEcHxfK|y8lD2wSjfNfqd>?(>%VIG}fVeXc8Vwy$gX& zo8}N@tGi`#4-~U_f|&08VsWHBtpYwr2-mR`jQxEs(GL}nHs%g0%N zJ1rNuLBkq}Z&tW#o2h0#Y;;F*AxyMsA10Aj{IS!PeLm#_KCio+v<^;P8rZ!s>sYeh zntb_V5e1)t^^LvvOOc7rI1o?%Gctq^GxOOOCoeVB7uFyJJ<8vK(sG>(iCqv- zv$}R5I22pj`?Jd?!OfNKd%&rKWgC$JcRP>JzYQQoCVkh7f;2(UPP|X>96Y3xRTXY}B z4lBu8OYYj*&R4$Nw_08_FBlLRPnfQ5@tdF84ak?=s92UxoriEv=Z>r79II6n1}lVz zU}Exu5vPpf!EgjHmsb=GNQpT-6ErTuhD>saZCs3|hCkDVyC}CFKe1=8eK_NxE-e(b!K@ufV>w~YFa+^==#++Yr zzq2|)-e(hG)eGI{G>F|qUSAo`xEr|7ND+Q*0{_T@~flPm(~ruV|IX z3i4^X+q)f0_|j7H3Y`#?W8#B>Z%$~tKougz?&V~)SYoi&_+Daab#Zvx)cP~xQJONk z2?{AMl?D^zXeO20qj}G=UAClbF8E%)rE1vEUCZ^47WhO))<{xX)$2cB*89G9hSh9F zBUysaXyJPtW?r2Rz|Bt=3yU18{)M~#Kl*1Aph-UQGk4?6~VxyV8pjb0XC^%)8 zORV=kc3K(QH4r5xD9B(dCL5ERU1=h2U(q^dt&@J1ZoZGq_+0H# za0R?^ev$}I40@DdXGZy;5?6>HH{=s#euH>*_G!bzt#e$bH6RwVvJ&CMOPl3HA~oW)jOFbr@7u7NOPe3v%m>gMR0KR;OkeX z*B%pOWCf%Z7-&FF>OmbLF551v>TaVx$8mX8(etacp7Iq2_T|Sk^OF^v4p02yem45 zN4BW7;<-hf;uE%wSb`Ii{7zpDbM68c>gA`(8ZpwBXDMa)iyI*BP^Zcdxnd%wpBlL*Hi-fG zr0tuZv_Oe?C;aU_3eZqCK?(1)TtkEHG;eJ##KN$|46^j8Ib!Og%oL=6rbU95wz$LA zVh9ZLb1iljrD_7jt$-z9z5&sVpOYh9^js_sr-rW$&4xtHu7__@~*PEUvv{lk~nPnO^ak9 z7j@MP%_v8=BxE{Y>x&-zvQOcBa{`&0Bc3I7H*^F`X**8_cW^P^`Z<^CZP$vPiQ+j$ z{r8oz`2hU8NW4ZRubtP0=BtK+!DqzvbcfO5is6cHzA%s>0sfkh38Be#0(Aan#z=Xl z>R;#c#2ioDZvx_{X^}5A0?@y%l#yX3x zsY+S9vlg~=$mBp%t2n9V{VoP=>a(hqc3Ao1?99p)I)?aYlTUSg zP8xBtf;w;1VD(AFC7PYZ5lG+j$#>|p*xuHq@kI`$EV4U$KWk$AXs)tfV!DGp>_iio zf0%~4nx4yP6uv^t*h){R$=jGz)yQ@2n#~{Wpq;t0i$vkFy%+xW;#>eJ@&c*xm0*G?=eOSdRBgnZB4i1kggaw|Rj^o!I*lH380|5m4L}T-dyDZ^rHKC$ zREW!v#IF!pxaH5WZK?{*9zLCrjPfzu#a2_l0m_X z25tD?xqdhZn@_AqTgxZZ1`$Ef^dMooaJxh=+hD-qwG1yvoRK9-lJ2>I?9&no!6)1m z2E-pY#Ypse9`F&^@XTzmH{Zm^%4*6XpH^>Lv_6oUJHd+A*Kxth^FH}va2XVSlQ}2}?2bLT0yyEn z-PXsr9(dHj zTQ83P_6+N@xx-rs327;JODIAGKJRY^S&i136+F}p_f8Od39t>6)hII;TDu&ej@(+r z6xi;PNT@~#0dN*o0f^3eF;ho0o*hIJq96*t13{q3CpnmyL|xSaLAl42Sl%$&k#{m| zpwj=%vhnu^ws!(=6;XEz-+wv&v%QNHMN)qc@|X2s^~^+51d+jN$K<3fXdDa*OGKE# zUpR96Ebwgdh4iYbk>24F15?|Fy}i(eZ{pOa66@~UzYd1|vJ_C1+R;@u&nn^(jNHjq zdn;2`wn}XLt{7&@-x~_4S|}}<8jiCgK%|0^dRzV1$UFQGjPpxnbWCaZ`sU_jNG%6U za2WhZ@*rJ>ZM36!#LV&x9>7x6o6t8m5oHGMiwJf zp&Srxy^|HB!8HWN-+3rhKiUh#B^Lxytv?ZQ+|+%fM<1@F_$kp?Hh5|9WPeXX-%F2a z%*F$fX*-u+eb*wDgTh$~WmhA3&)5-4**^P|TWj=Q^uvs%;nv#=Y?d8NgDw9``CPI= zW)`!4|Bv006gW0z1D}05XH|Nx@G&rM?s7g5x(Iot{>*Cn@BF?`j3p6t*rhpRhuP_K zWZ$cVnDBghPg+(9fy_mn^F4q%t0n200|U4#mG)(A`alF^GcRH$UqKwxJyepyFDhnJDhAL~_h(KJuu(Z$o;3`T#W~*sxaQOb zd&H{=o0Ld%eAM|lW%u<4f<-}w?T%EwO~*qw`Js;Jy*gBMJkLc0Q{Ycg z@$g_)oaX}b;Nt{TocJE4gPo;9-Ai9ixR3UBc^4$IR>qr9J?Ph>6*5WR6VWdV(WO&% zRz4iK6p1w!2EGCLsBhr=7{I8IfJwmCUB?rpnHK!#)SHyb{o1}jbM^uk1O7*wSI^OV&=)|01R$#Fm%&{cPZ587OC_$% za9>v%7^8Cy%?hORQA_}TBxG{el{085RIpGljifr-R_8wv(9$Ho(%b0 z`lMyMJz2N*%SrI#=Chqd^4rOQ>imX*s%eiG-O6s4!A(Anq2|f1iC517>~^_t=#wOwgwL$mcZqk(Dg1yV6WI$3TWjHO=~Q!6YjaV(kz&|$izRRtF(hx=^g zyFG{inZ+6jFQJ!5MrDX#>pfu^l22v$jjD#79)Zw5(gUmOS`a+Fs<52s`WAB6{`y_^ zut19x$`>W6WNz%-+WBU`UA5(50`Ww4k#YM*puT9Bo;}^%s=6L&Hcs~*7bNMjR^peW zeDp^8)M3sG$=v65Xa@h7{-nx*`?1ak=hcc0)N#}pxJ*Tl`-0rTK+RYrIfK>4sVZp$ zJ<{|r@z-z&;sXx1o5~-pu#fqx$1gYp<3aSp7B%>AoyJ!lKTe&qiOxd41CX}QL~r|2 z49mZp3AKO7)P1Y^0VEApJgVOv|K(}*oy;A(T8L4h^|NvY(-5q}B4S>IqA}@ZBh-Bc z`d}ftWm{f5j}rtxjHQay7!Mo4*Q6$)cXGvJi5s*$ps&yUH~$ofNdS{_m9NPNcT_(Z11)O^3fp$|`^?R-P9=aJ1@{g7`% z--q4<#Bq66qg8o#=|msUQfc;Zewp5OpLHjDetK&$nDBV5+>(mRxgzXbYQNvw!o_=jlGqU0!Vv&6m_Kpyd z+xe{JuR0b9EX6w+qA30VvL zS~3R)oRr>wy^>nD%qujg5o$f$N{*}cM%JQPHyE;l(ZOut&f{X%u6*A6hytzf;e~)%RqF zJ*I~qF6GutNk16wcJ8I!7O}lnRbk48{cB{|k3~}w9InF_C)E=THOFLHx=ZNb-~X78$xZc(xZ0h{Y@Ax3@fd21(CYR8<$d4D z@?PG>I4kRW@;6z-&FlrVj@+M!Az*<)l^@$zs2@R}2q2l8fsyYtu{9o{6q5)oxmCnJ`yXkI4tVUpb;bD@ngRY$}+WRpxK! zD#etw$w+3HZo7E$iT62&_ie=_NiW6PVaMXPxHMt!Yj;`xJ+_wD(~`rQ#lqfcRvHjo)uOA zV@FbPuFEhxMRx}u_^ zS~vCWH1P!*!^;HRk@_Rqx9_h2Xt|3-QSK=Wv(^2Q1?A{RO=zT&75nX!hzQTCeQt>; zj;ma2ng%ZuFAmKQdS?s}$J0R4J@<1l`Y*l+Ri6ld8Zg_B+YB|kbq=nbN8yP`A6YcygXh?r{=L17ohDR zKLE{x{>1{+S#O+zj`43lk`y*2t#N%3x~@hQF?ns~9Pu5ED3e^Qy=rdwPMfRa@_KT= z9#8zTj3V5ozC=;yl4^0Qy0!rEuTKd%1C zjs3g#&yxI7E9{503wGQl{RBb>XO!vnIXisUi?H6id#_iguafZlaGJ2tP*L5JcoZ`Z zKQXx5m)P~y&n+~ci3w2#%Z$i#w{KS#R+NojuZnHyD<5vgYf>Y!UxqQq%4Hw7*F4zT z82Ra}_&Nrp928$}XhBcE)tlB9$JtSwX}-xj0x6Gu=?Rb=zul5w*U~j(6ER?HZxZf2 zpC$@_aK8Z^mv$2g7+4oF$BC!ouokeeZ|u#+M~}5H@E?Y+H`J)x2gxVLT%M&1{*|z) zrqP)avuiN~IT7ð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 ma5 或 ma10" +- "RSI < 30" +- "放量(量比 > 2)" + +### 模式 B:历史窗口(filter_history) +规则涉及以下任何时序/回溯逻辑时使用: +- "最近 N 天内出现过涨停/金叉/某信号" +- "涨停后的第 X 天" +- "上次涨停价"、"前高"、"前低" +- "连续 N 天阴跌/阳线" +- 任何需要多天数据才能判断的条件 + +## 你必须完成的全部内容 + +输出完整的 Python 策略文件,包含: + +1. **META**:id(name, description, tags, params, scoring, basic_filter, limit 等) +2. **ENTRY_SIGNALS / EXIT_SIGNALS**:根据策略逻辑自行选择合适的信号列(参考下方可用信号表),不要照抄示例 +3. **STOP_LOSS / MAX_HOLD_DAYS**:根据策略类型合理设定,做多止损一般为 -5%~-8%,短线持有 5~20 天 +4. **ALERTS**:列出需要监控提醒的条件 +5. **RULES**:中文逐条列出核心筛选逻辑(至少 3 条),准确完整 +6. **filter() 或 filter_history()**:核心筛选逻辑 + +## 性能原则 + +- 优先用 Polars 表达式、`with_columns`、`over("symbol")`、`group_by`、`join`、`filter` +- 只有复杂状态机难以用表达式描述时,才用 `partition_by("symbol")` + `to_dicts()` + +--- + +## 模式 A 框架(单日过滤) + +```python +"""策略简短描述""" +import polars as pl + +META = { + "id": "ai_xxxxxxxxxxxx", # 使用用户提供的 strategy_id + "name": "用户给的名称", + "description": "用户给的描述", + "tags": ["根据策略添加标签"], + "basic_filter": { + "price_min": 3, # 根据策略调整 + "price_max": 200, + "market_cap_min": 10e8, + "amount_min": 0.5e8, + "exclude_st": True, + "exclude_new_days": 30, + }, + "params": [ + # 只把用户可能调节的阈值放这里;每个参数含 id/label/type/default/min/max/step + ], + "scoring": { + # 根据策略核心逻辑定制权重,总和 = 1.0 + }, + "order_by": "score", + "descending": True, + "limit": 100, +} + +# 根据策略逻辑选择合适的信号,见下方可用信号表 +ENTRY_SIGNALS = [] +EXIT_SIGNALS = [] + +# 根据策略类型设定 +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 20 + +ALERTS = [] + +RULES = """ +1. 规则一 +2. 规则二 +3. 规则三 +""" + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + """策略核心过滤逻辑,返回 Polars 布尔表达式。""" + # 用 params.get("param_id", 默认值) 读取参数 + return pl.col("<字段>") > pl.col("<字段>") # 替换为实际逻辑 +``` + +## 模式 B 框架(历史窗口) + +```python +"""策略简短描述""" +import polars as pl + +META = { + "id": "ai_xxxxxxxxxxxx", + "name": "用户给的名称", + "description": "用户给的描述", + "tags": ["根据策略添加标签"], + "basic_filter": { + "price_min": 3, + "price_max": 200, + "market_cap_min": 10e8, + "amount_min": 0.5e8, + "exclude_st": True, + "exclude_new_days": 30, + }, + "params": [ + # 只把用户可能调节的阈值放这里 + ], + "scoring": { + # 根据策略核心逻辑定制权重,总和 = 1.0 + }, + "order_by": "score", + "descending": True, + "limit": 100, +} + +LOOKBACK_DAYS = 8 # 根据策略需要的最大回看天数设置 + +ENTRY_SIGNALS = [] +EXIT_SIGNALS = [] + +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 20 + +ALERTS = [] + +RULES = """ +1. 规则一(包含时序逻辑) +2. 规则二 +3. 规则三 +""" + +def filter_history(df: pl.DataFrame, params: dict) -> pl.DataFrame: + if df.is_empty() or "date" not in df.columns: + return df + + # 用 shift/over 回溯历史数据,或用 group_by 计算窗口聚合 + # 重要: 返回所有匹配行,不要只过滤 latest,否则回测只有最后一天有信号 + hist = ( + df.sort(["symbol", "date"]) + .with_columns([ + pl.col("close").shift(1).over("symbol").alias("_prev_close"), + # ... 根据策略需要添加更多回溯列 + ]) + ) + return hist.filter( + # 在此编写筛选条件 + ) +``` + +--- + +## 可用指标列(参考) + +见 [strategy-guide.md](./strategy-guide.md) 第 3 节。 + +## 可用信号列(参考) + +以下信号列已预计算,**根据策略含义自行选择匹配的**,不要全部照搬: + +| 列名 | 含义 | 方向 | +|------|------|------| +| signal_ma_golden_5_20 | MA5 上穿 MA20 | 买入 | +| signal_ma_dead_5_20 | MA5 下穿 MA20 | 卖出 | +| signal_ma_golden_20_60 | MA20 上穿 MA60 | 买入 | +| signal_macd_golden | MACD 金叉 | 买入 | +| signal_macd_dead | MACD 死叉 | 卖出 | +| signal_ma20_breakout | 突破 MA20 | 买入 | +| signal_ma20_breakdown | 跌破 MA20 | 卖出 | +| signal_n_day_high | 60日新高 | 买入 | +| signal_n_day_low | 60日新低 | 卖出 | +| signal_boll_breakout_upper | 突破布林上轨 | 中性 | +| signal_boll_breakdown_lower | 跌破布林下轨 | 中性 | +| signal_volume_surge | 放量 | 中性 | +| signal_limit_up | 涨停 | 买入 | +| signal_limit_down | 跌停 | 卖出 | +| signal_limit_down_recovery | 跌停翘板 | 买入 | + +**选信号原则**:选和策略逻辑直接相关的,不要凑数。监控类策略两类都选。 + +--- + +## 规则 + +1. 用户可能调节的阈值才放 `params`;公式常数、固定窗口边界不必参数化 +2. 信号列使用 `.fill_null(False)` 处理空值 +3. `filter()` 只返回 `pl.Expr`,`filter_history()` 返回筛选后的 `DataFrame` +4. scoring 权重总和 = 1.0 +5. **必须生成 RULES**:用中文逐条列出核心逻辑(至少 3 条),准确完整 +6. **贴合用户需求**:不为了用已有字段而改变用户本意。用户说"前高"就自己算前高 +7. **输出前自我检查**:确认 RULES 完整、语法正确、括号匹配、引号闭合 +8. **优先 Polars**:不要默认生成逐行/逐股 Python 循环 +9. 直接输出 Python 代码,不要解释文字 diff --git a/docs/strategy-builder-step2.md b/docs/strategy-builder-step2.md new file mode 100644 index 0000000..551ef72 --- /dev/null +++ b/docs/strategy-builder-step2.md @@ -0,0 +1,34 @@ +# 步骤 2:修改策略任意部分 + +你是A股量化策略工程师。根据用户指令修改策略代码的任意部分。 + +## 输入格式 + +分两部分提供: +1. 当前策略的完整 Python 代码 +2. 用户的修改指令(自然语言) + +## 输出要求 + +只输出修改后的完整 Python 代码,不要解释。 + +## 你应该做的事 + +- 增/删/改参数 → 更新 META["params"],同步修改 filter() +- 调整信号 → 更新 ENTRY_SIGNALS / EXIT_SIGNALS +- 修改止损/持有 → 更新 STOP_LOSS / MAX_HOLD_DAYS +- 增减告警 → 更新 ALERTS +- 调整评分 → 更新 META["scoring"],权重总和保持 100 +- 修改筛选逻辑 → 更新 filter();如果新增/删除了历史回溯逻辑,同步改为或移除 filter_history() 与 LOOKBACK_DAYS + +## 规则 + +1. 保持策略文件结构完整,不丢失任何已有字段(包括 RULES) +2. 删除参数后 filter() 中用原 default 值代替 +3. 新增参数要有 type、label、default、min、max、step +4. 删除信号时 ENTRY_SIGNALS / EXIT_SIGNALS 至少保留一个 +5. 如果修改了筛选逻辑,同步更新 RULES 中的对应条目 +6. 用户可能调节的阈值才需要放入 META["params"];公式常数、固定窗口边界不必强行参数化 +7. 优先使用 Polars 表达式、窗口函数、聚合和 join,不要默认改成逐行/逐股 Python 循环 +8. **输出前自我检查**:完整通读修改后的代码,确认 Python 语法正确、括号匹配、引号闭合、缩进一致。有错误直接修正再输出。 +9. 直接输出完整 Python 代码 diff --git a/docs/strategy-example.md b/docs/strategy-example.md new file mode 100644 index 0000000..7e0cca2 --- /dev/null +++ b/docs/strategy-example.md @@ -0,0 +1,153 @@ +# 两步创建示例:强势反包策略 + +本文演示从零创建一个自定义策略的完整流程。 + +--- + +## Step 1:填写规则 + +用户在创建对话框填写: + +| 字段 | 填写内容 | +|------|---------| +| 名称 | **强势反包** | +| 描述 | 筛选前日阴线下跌、今日放量阳线反包的短线强势股 | +| 方向 | 做多 | +| 规则 | 前一交易日为明显阴线且跌幅不低于2%,今日阳线收盘反包前一日实体,收盘价接近或高于前一日高点,成交量较前一日放大1.2倍以上,当前 close > ma5 或 close > ma10;使用 filter_history,并优先用 Polars shift/with_columns/filter 实现。 | + +点击「AI 生成」,AI 返回完整策略代码(含参数、信号、评分、告警): + +```python +"""强势反包 — 前日阴线下跌 + 今日放量阳线反包""" +import polars as pl + +META = { + "id": "strong_reversal", + "name": "强势反包", + "description": "筛选前日阴线下跌、今日放量阳线反包的短线强势股", + "tags": ["反包", "短线", "放量"], + "basic_filter": { + "price_min": 3, + "price_max": 200, + "market_cap_min": 10e8, + "amount_min": 0.5e8, + "exclude_st": True, + "exclude_new_days": 30, + }, + "params": [ + { + "id": "prev_down_pct", + "label": "前日最大跌幅", + "type": "float", + "default": -0.02, + "min": -0.10, + "max": -0.005, + "step": 0.005, + }, + { + "id": "volume_ratio", + "label": "成交量放大倍数", + "type": "float", + "default": 1.2, + "min": 1.0, + "max": 5.0, + "step": 0.1, + }, + { + "id": "reversal_tolerance", + "label": "反包容忍误差", + "type": "float", + "default": 0.005, + "min": 0.0, + "max": 0.03, + "step": 0.005, + }, + ], + "scoring": { + "change_pct": 0.4, + "vol_ratio_5d": 0.3, + "momentum_5d": 0.3, + }, + "order_by": "score", + "descending": True, + "limit": 100, +} + +LOOKBACK_DAYS = 2 + +ENTRY_SIGNALS = ["signal_broken_board_recovery"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 10 +ALERTS = [ + {"field": "signal_broken_board_recovery", "message": "反包信号"}, +] + +RULES = """ +1. 前一交易日为阴线,且跌幅不小于设定阈值 +2. 今日为阳线,收盘价收复前一日开盘价并接近或突破前一日高点 +3. 今日成交量较前一日明显放大,且收盘价站上 MA5 或 MA10 +""" + + +def filter_history(df: pl.DataFrame, params: dict) -> pl.DataFrame: + if df.is_empty() or "date" not in df.columns: + return df + + down_pct = float(params.get("prev_down_pct", -0.02)) + vol_ratio = float(params.get("volume_ratio", 1.2)) + tolerance = float(params.get("reversal_tolerance", 0.005)) + latest = df["date"].max() + hist = ( + df.sort(["symbol", "date"]) + .with_columns([ + pl.col("open").shift(1).over("symbol").alias("_prev_open"), + pl.col("high").shift(1).over("symbol").alias("_prev_high"), + pl.col("close").shift(1).over("symbol").alias("_prev_close"), + pl.col("volume").shift(1).over("symbol").alias("_prev_volume"), + pl.col("change_pct").shift(1).over("symbol").alias("_prev_change_pct"), + ]) + ) + return hist.filter(pl.col("date") == latest).filter( + (pl.col("_prev_close") < pl.col("_prev_open")) + & (pl.col("_prev_change_pct") <= down_pct) + & (pl.col("close") > pl.col("open")) + & (pl.col("close") > pl.col("_prev_open")) + & (pl.col("close") >= pl.col("_prev_high") * (1 - tolerance)) + & (pl.col("volume") >= pl.col("_prev_volume") * vol_ratio) + & ((pl.col("close") > pl.col("ma5")) | (pl.col("close") > pl.col("ma10"))) + ) +``` + +--- + +## Step 2:预览 + 指令修改 + +进入第二步,显示完整的策略预览和指令输入框。 + +用户如果觉得反包条件太严格,可以输入「把前日跌幅放宽到 -1.5%,反包前高允许 1% 误差」→ 点 AI 修改。AI 更新 `params` 默认值和 `filter_history()` 逻辑。 + +确认无误后点「保存策略」→ 策略池中出现。 + +--- + +## 后续使用 + +打开策略配置,**基础参数**和**策略参数**分别独立: + +``` +┌─ 配置:强势反包 ──────────────────────────┐ +│ 名称 [强势反包 ] 显示上限 [30]│ +│ │ +│ 📊 基础参数 [启用 ●] │ +│ 价格 [3]~[200]元 排除ST、新股 │ +│ 最低成交额 [5000万] │ +│ │ +│ ⚙ 策略参数 │ +│ 前日最大跌幅 [-0.02] │ +│ 成交量放大倍数 [1.2] │ +│ 反包容忍误差 [0.005] │ +│ │ +│ ⭐ 评分权重 📈 交易参数 │ +└────────────────────────────────────────────┘ +``` diff --git a/docs/strategy-guide.md b/docs/strategy-guide.md new file mode 100644 index 0000000..cd5b684 --- /dev/null +++ b/docs/strategy-guide.md @@ -0,0 +1,347 @@ +# 策略开发指南 + +本文档是策略开发的完整参考。人类开发者参考它编写策略,AI 读取它生成策略代码。 + +## 1. 策略文件格式 + +每个策略是一个 Python 文件,放在以下目录: + +- 内置策略: `backend/app/strategy/builtin/` +- 自定义策略: `data/strategies/custom/`,建议文件名和 ID 使用 `custom_时间戳` +- AI 生成策略: `data/strategies/ai/`,文件名和 ID 使用 `ai_时间戳` + +## 2. 文件结构模板 + +```python +"""策略简短描述""" +import polars as pl + +META = { + "id": "strategy_id", # 英文ID, 唯一, 文件名同名;自定义策略建议 custom_时间戳 + "name": "策略中文名", # 显示名称 + "description": "策略详细描述", # 一句话说明策略逻辑 + "tags": ["标签1", "标签2"], # 分类标签 + + # 基础过滤参数 (Stage 1, 引擎统一处理) + "basic_filter": { + "price_min": 5, # 最低价格 + "price_max": 200, # 最高价格 + "market_cap_min": 20e8, # 最小总市值 (元) + "amount_min": 1e8, # 最小成交额 (元) + "exclude_st": True, # 排除 ST/*ST/退市 + "exclude_new_days": 60, # 排除上市N天内新股 + }, + + # 策略参数 (只把用户可能调节的阈值放这里,公式常数不必参数化) + # 每个参数含 id/label/type/default/min/max/step;select 类型用 options + "params": [ + ], + + # 评分权重 (用于排序, 根据策略核心逻辑定制, 权重总和 = 1.0) + "scoring": { + }, + + "order_by": "score", # 排序字段, 通常用 "score" + "descending": True, # True = 从高到低 + "limit": 100, # 最多返回条数 +} + +# 买入信号 (回测 + 监控用, 根据策略逻辑选择合适的信号列) +ENTRY_SIGNALS = [] + +# 卖出信号 +EXIT_SIGNALS = [] + +# 止损 (负数, 根据策略类型合理设定, 如做多短线 -0.05~-0.08) +STOP_LOSS = -0.05 + +# 最长持有天数 (短线 5~20, 中线 20~60) +MAX_HOLD_DAYS = 20 + +# 提醒条件 (监控用) +ALERTS = [] + + +# 策略规则(人类可读,逐条编号,至少 3 条) +RULES = """ +1. 规则描述一 +2. 规则描述二 +3. 规则描述三 +""" + +def filter(df: pl.DataFrame, params: dict) -> pl.Expr: + """策略核心过滤逻辑。 + + df: Stage 1 基础过滤后的 enriched 数据 + params: META.params 中定义的参数值 (用户可在前端覆盖) + + 返回: Polars 布尔表达式 (pl.Expr) + """ + # 用 params.get("param_id", 默认值) 读取参数 + return ( + (pl.col("close") > pl.col("ma5")) + & (pl.col("rsi_14") < 30) + ) +``` + +### 历史窗口策略(filter_history) + +普通 `filter()` 只接收当前日期的单日数据。当策略需要以下逻辑时,必须使用 `filter_history()`: + +- "最近 N 天内出现过某个事件"(如涨停、金叉) +- "某个事件发生后的第 X 天"(如涨停后放量下跌) +- "前高 / 前低 / 上次某事件的价格"等需要回溯历史的自定义字段 +- 任何需要多日数据才能计算的时序逻辑 + +**不需要** `filter_history()` 的场景:只用当日指标列做比较(如 close > ma60、rsi_14 < 30)。 + +```python +LOOKBACK_DAYS = 8 # 回看交易日数,根据策略需要设置 + +def filter_history(df: pl.DataFrame, params: dict) -> pl.DataFrame: + """df 包含目标日期之前 LOOKBACK_DAYS 个交易日的数据(所有股票混合)。 + 每行包含 symbol, date 及所有指标列/信号列。 + + 返回值: 筛选后的 DataFrame。 + 重要: 返回所有匹配的行,不要只过滤最新日期,否则回测只有最后一天有信号。 + """ + if df.is_empty() or "date" not in df.columns: + return df + + down_pct = float(params.get("prev_down_pct", -0.02)) + vol_ratio = float(params.get("volume_ratio", 1.2)) + tolerance = float(params.get("reversal_tolerance", 0.005)) + + # 示例: 前日明显阴线下跌,今日放量阳线反包前日实体 + hist = ( + df.sort(["symbol", "date"]) + .with_columns([ + pl.col("open").shift(1).over("symbol").alias("_prev_open"), + pl.col("high").shift(1).over("symbol").alias("_prev_high"), + pl.col("close").shift(1).over("symbol").alias("_prev_close"), + pl.col("volume").shift(1).over("symbol").alias("_prev_volume"), + pl.col("change_pct").shift(1).over("symbol").alias("_prev_change_pct"), + ]) + ) + + return hist.filter( + (pl.col("_prev_close") < pl.col("_prev_open")) + & (pl.col("_prev_change_pct") <= down_pct) + & (pl.col("close") > pl.col("open")) + & (pl.col("close") > pl.col("_prev_open")) + & (pl.col("close") >= pl.col("_prev_high") * (1 - tolerance)) + & (pl.col("volume") >= pl.col("_prev_volume") * vol_ratio) + & ((pl.col("close") > pl.col("ma5")) | (pl.col("close") > pl.col("ma10"))) + ) +``` + +**关键要点:** +- `LOOKBACK_DAYS` 决定引擎加载多少天的数据,设为策略逻辑需要的最大回看天数 +- 优先使用 Polars 的 `with_columns`、`over("symbol")`、`group_by`、`join`、`filter` 实现历史逻辑,避免把数据转成 Python list/dict 循环 +- 只有遇到表达式难以描述的复杂状态机时,才使用 `partition_by("symbol")` + `to_dicts()` 逐股票分析 +- **返回所有匹配行,不要过滤 `latest`**;选股引擎会自动取最新日,回测引擎需要全区间命中 +- 未声明 `filter_history()` 的策略走普通 `filter()` 路径,不受影响 + +## 3. 常用指标列(参考,可直接使用) + +以下列在数据中已预计算,可直接引用。**但如果这些列无法满足策略需求,可以不用,自行在 `filter_history()` 中基于 enriched 表的数据(已复权,含所有指标列和信号列)计算任何需要的字段。** + +### 通用列 + +| 列名 | 类型 | 说明 | +|------|------|------| +| symbol | string | 股票代码 (如 600519.SH) | +| date | date | 交易日期 | + +### 价格相关 + +| 列名 | 类型 | 说明 | +|------|------|------| +| open, high, low, close | float | OHLCV 开高低收 (前复权) | +| raw_close, raw_high, raw_low | float | 原始未复权价 | +| prev_close | float | 昨收价 | +| change_pct | float | 涨跌幅 (如 0.032 = +3.2%) | +| change_amount | float | 涨跌额 | +| amount | float | 成交额 | +| amplitude | float | 振幅 | + +### 均线 + +| 列名 | 说明 | +|------|------| +| ma5, ma10, ma20, ma30, ma60 | 简单移动均线 | +| ema5, ema10, ema20, ema30, ema60 | 指数移动均线 | + +### 技术指标 + +| 列名 | 说明 | +|------|------| +| macd_dif | MACD DIF 线 | +| macd_dea | MACD DEA 线 | +| macd_hist | MACD 柱状 | +| boll_upper, boll_lower | 布林带上/下轨 | +| kdj_k, kdj_d, kdj_j | KDJ 指标 | +| rsi_6, rsi_14, rsi_24 | RSI 相对强弱 | +| atr_14 | 平均真实波幅 | + +### 量能 + +| 列名 | 说明 | +|------|------| +| volume | 成交量 | +| vol_ma5, vol_ma10 | 成交量均线 | +| vol_ratio_5d | 5日量比 | +| turnover_rate | 换手率 | + +### 动量与波动 + +| 列名 | 说明 | +|------|------| +| momentum_5d / 10d / 20d / 30d / 60d | N日涨幅 | +| annual_vol_20d | 20日年化波动率 | +| high_60d, low_60d | 60日最高/最低价 | + +### 涨跌停 + +| 列名 | 说明 | +|------|------| +| consecutive_limit_ups | 连续涨停天数 | +| consecutive_limit_downs | 连续跌停天数 | + +### 运行时附加列(由引擎从 instruments 表 JOIN) + +| 列名 | 说明 | +|------|------| +| name | 股票名称 | +| total_shares | 总股本 | +| float_shares | 流通股本 | + +(`total_shares` 和 `float_shares` 用于 `basic_filter` 中计算市值:`close * total_shares`) + +## 4. 常用信号列(参考) + +信号列是布尔值,**必须**使用 `.fill_null(False)` 处理空值。同样仅供参考,根据策略含义自行选择匹配的。 + +| 列名 | 方向 | 说明 | +|------|------|------| +| signal_ma_golden_5_20 | 买入 | MA5 上穿 MA20 | +| signal_ma_dead_5_20 | 卖出 | MA5 下穿 MA20 | +| signal_ma_golden_20_60 | 买入 | MA20 上穿 MA60 | +| signal_macd_golden | 买入 | MACD 金叉 | +| signal_macd_dead | 卖出 | MACD 死叉 | +| signal_ma20_breakout | 买入 | 突破 MA20 | +| signal_ma20_breakdown | 卖出 | 跌破 MA20 | +| signal_n_day_high | 买入 | 60日新高 | +| signal_n_day_low | 卖出 | 60日新低 | +| signal_boll_breakout_upper | 中性 | 突破布林上轨 | +| signal_boll_breakdown_lower | 中性 | 跌破布林下轨 | +| signal_volume_surge | 中性 | 放量 | +| signal_limit_up | 买入 | 涨停 (依赖 instruments 表,部分环境不生成) | +| signal_limit_down | 卖出 | 跌停 (依赖 instruments 表,部分环境不生成) | +| signal_limit_down_recovery | 买入 | 跌停翘板 (依赖 instruments 表,部分环境不生成) | +| signal_broken_limit_up | 卖出 | 炸板 (依赖 instruments 表,部分环境不生成) | + +> **注意**:涨跌停类信号需要 instruments 表(板块代码)才能计算。如果策略只用涨停判断,优先用 `consecutive_limit_ups >= 1`(稳定列,始终可用)。 + +此外,用户自定义信号(`data/user_data/custom_signals/`)以 `csg_` 前缀注入,也可在 filter() 中引用。 + +## 5. 不可用的数据(重要) + +以下数据**不在** enriched DataFrame 中,策略代码中**不能**直接引用: + +| 数据 | 说明 | +|------|------| +| 财务数据 (PE/PB/ROE/净利润/营收/资产负债等) | 存储在独立 financials 表,未 JOIN | +| 扩展数据 (概念/行业/人气排名/资金流向等) | 存储在 ext_data 目录,未 JOIN | +| 盘中实时数据 (分时价/五档盘口等) | 仅前端轮询使用 | + +如需财务或扩展数据作为筛选条件,需先在系统层面完成 JOIN 再提供给策略(当前未实现)。 + +## 6. 规则 + +1. `filter()` 必须返回 `pl.Expr` (用 `&` `|` 组合布尔表达式);`filter_history()` 返回筛选后的 `DataFrame` +2. 信号列使用 `.fill_null(False)` 处理空值 +3. 用户可能调节的数值阈值通过 `params` 暴露;公式常数、固定窗口边界、一次性内部变量不必强行参数化 +4. `scoring` 权重总和必须为 1.0 +5. 遵循 A 股 T+1 规则 (当日买入次日才能卖出) +6. 只允许 `import polars as pl`,禁止 import 其他模块 +7. 禁止使用 `open()`, `exec()`, `eval()`, `os`, `sys`, `subprocess` +8. **贴合用户需求优先**:第3/4节的指标列和信号列仅供参考,能用则用;如果用户需求需要自定义计算(如"前高""上次涨停价""N日内某个事件后X天"),直接在 `filter_history()` 中自行设计和计算,不需要局限于已有列 +9. `filter_history()` 中优先用 Polars 向量化语法;仅在复杂状态机无法清晰表达时,才用 `partition_by("symbol")` 逐股票分析 + +## 7. 策略示例 + +### 强势反包 + +```python +"""强势反包 — 前日阴线下跌 + 今日放量阳线反包""" +import polars as pl + +META = { + "id": "strong_reversal", + "name": "强势反包", + "description": "前一日明显阴线下跌,今日放量阳线收复前一日阴线实体", + "tags": ["反包", "短线", "放量"], + "basic_filter": { + "price_min": 3, "price_max": 200, + "market_cap_min": 10e8, "amount_min": 0.5e8, + "exclude_st": True, "exclude_new_days": 30, + }, + "params": [ + {"id": "prev_down_pct", "label": "前日最大跌幅", "type": "float", + "default": -0.02, "min": -0.10, "max": -0.005, "step": 0.005}, + {"id": "volume_ratio", "label": "成交量放大倍数", "type": "float", + "default": 1.2, "min": 1.0, "max": 5.0, "step": 0.1}, + {"id": "reversal_tolerance", "label": "反包容忍误差", "type": "float", + "default": 0.005, "min": 0.0, "max": 0.03, "step": 0.005}, + ], + "scoring": {"change_pct": 0.4, "vol_ratio_5d": 0.3, "momentum_5d": 0.3}, + "order_by": "score", "descending": True, "limit": 100, +} + +LOOKBACK_DAYS = 2 + +ENTRY_SIGNALS = ["signal_broken_board_recovery"] +EXIT_SIGNALS = ["signal_ma20_breakdown"] +STOP_LOSS = -0.05 +MAX_HOLD_DAYS = 10 +ALERTS = [{"field": "signal_broken_board_recovery", "message": "反包信号"}] + +RULES = """ +1. 前一交易日为阴线,且跌幅不小于设定阈值 +2. 今日为阳线,收盘价收复前一日开盘价并接近或突破前一日高点 +3. 今日成交量较前一日明显放大,且收盘价站上 MA5 或 MA10 +""" + +def filter_history(df: pl.DataFrame, params: dict) -> pl.DataFrame: + if df.is_empty() or "date" not in df.columns: + return df + + down_pct = float(params.get("prev_down_pct", -0.02)) + vol_ratio = float(params.get("volume_ratio", 1.2)) + tolerance = float(params.get("reversal_tolerance", 0.005)) + latest = df["date"].max() + hist = ( + df.sort(["symbol", "date"]) + .with_columns([ + pl.col("open").shift(1).over("symbol").alias("_prev_open"), + pl.col("high").shift(1).over("symbol").alias("_prev_high"), + pl.col("close").shift(1).over("symbol").alias("_prev_close"), + pl.col("volume").shift(1).over("symbol").alias("_prev_volume"), + pl.col("change_pct").shift(1).over("symbol").alias("_prev_change_pct"), + ]) + ) + return hist.filter( + (pl.col("_prev_close") < pl.col("_prev_open")) + & (pl.col("_prev_change_pct") <= down_pct) + & (pl.col("close") > pl.col("open")) + & (pl.col("close") > pl.col("_prev_open")) + & (pl.col("close") >= pl.col("_prev_high") * (1 - tolerance)) + & (pl.col("volume") >= pl.col("_prev_volume") * vol_ratio) + & ((pl.col("close") > pl.col("ma5")) | (pl.col("close") > pl.col("ma10"))) + ) +``` + +## 8. 完整示例 + +见 [strategy-example.md](./strategy-example.md) — 从零创建强势反包策略的三步完整演示。 diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..dfa9518 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +.vite +*.log +.DS_Store diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..15f1563 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,19 @@ + + + + + + + + A股工作台 + + + + + + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..0b1b0ee --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,3041 @@ +{ + "name": "stock-panel-frontend", + "version": "0.1.44", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "stock-panel-frontend", + "version": "0.1.44", + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@tanstack/react-query": "^5.55.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "echarts": "^5.5.0", + "echarts-for-react": "^3.0.2", + "framer-motion": "^11.5.0", + "lightweight-charts": "^4.2.0", + "lucide-react": "^0.439.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.0", + "tailwind-merge": "^2.5.2" + }, + "devDependencies": { + "@types/node": "^25.9.3", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.45", + "tailwindcss": "^3.4.10", + "tailwindcss-animate": "^1.0.7", + "typescript": "^5.5.4", + "vite": "^5.4.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.3", + "resolved": "https://registry.npmmirror.com/@remix-run/router/-/router-1.23.3.tgz", + "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tanstack/query-core": { + "version": "5.101.1", + "resolved": "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-5.101.1.tgz", + "integrity": "sha512-Y6Y92dkXtNqx67m2pMSxUsA3zOCwv862JexZRP8/EPwvKXMPu9m8rv43spiXWzOUIggQ3SQApttALStzhA8B4g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.101.1", + "resolved": "https://registry.npmmirror.com/@tanstack/react-query/-/react-query-5.101.1.tgz", + "integrity": "sha512-ZnONUuQKJe1bJMStXUL1s5uKN9FcfC28j5cK+iDZcdSHtUv1wtin1cGc/Oewhf2Oc4eKY7lggtpvT/AbMmhHew==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.101.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.4", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.9.4.tgz", + "integrity": "sha512-dszCsrKb5U7ZsVZBWiHFklTloVl0mSEnWH/iZXfZUlI4rzCUnsvGmgqfuVRHL54ugE7/wRuxEIXRa2iMZ+BG6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.2", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.5.2.tgz", + "integrity": "sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.4", + "caniuse-lite": "^1.0.30001799", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.38", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.4", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "node_modules/echarts-for-react": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/echarts-for-react/-/echarts-for-react-3.0.6.tgz", + "integrity": "sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "size-sensor": "^1.0.1" + }, + "peerDependencies": { + "echarts": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "react": "^15.0.0 || >=16.0.0" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.378", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz", + "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fancy-canvas": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fancy-canvas/-/fancy-canvas-2.1.0.tgz", + "integrity": "sha512-nifxXJ95JNLFR2NgRV4/MxVP45G9909wJTEKz5fg/TZS20JJZA6hfgRVh/bC9bwl2zBtBNcYPjiBE4njQHVBwQ==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "11.18.2", + "resolved": "https://registry.npmmirror.com/framer-motion/-/framer-motion-11.18.2.tgz", + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "license": "MIT", + "dependencies": { + "motion-dom": "^11.18.1", + "motion-utils": "^11.18.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightweight-charts": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/lightweight-charts/-/lightweight-charts-4.2.3.tgz", + "integrity": "sha512-5kS/2hY3wNYNzhnS8Gb+GAS07DX8GPF2YVDnd2NMC85gJVQ6RLU6YrXNgNJ6eg0AnWPwCnvaGtYmGky3HiLQEw==", + "license": "Apache-2.0", + "dependencies": { + "fancy-canvas": "2.1.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.439.0", + "resolved": "https://registry.npmmirror.com/lucide-react/-/lucide-react-0.439.0.tgz", + "integrity": "sha512-PafSWvDTpxdtNEndS2HIHxcNAbd54OaqSYJO90/b63rab2HWYqDbH194j0i82ZFdWOAcf0AHinRykXRRK2PJbw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/motion-dom": { + "version": "11.18.1", + "resolved": "https://registry.npmmirror.com/motion-dom/-/motion-dom-11.18.1.tgz", + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^11.18.1" + } + }, + "node_modules/motion-utils": { + "version": "11.18.1", + "resolved": "https://registry.npmmirror.com/motion-utils/-/motion-utils-11.18.1.tgz", + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.50", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.4", + "resolved": "https://registry.npmmirror.com/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.4", + "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/size-sensor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/size-sensor/-/size-sensor-1.0.3.tgz", + "integrity": "sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==", + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-2.6.1.tgz", + "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..ddcc83f --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,42 @@ +{ + "name": "stock-panel-frontend", + "private": true, + "version": "0.1.44", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview", + "lint": "eslint ." + }, + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@tanstack/react-query": "^5.55.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "echarts": "^5.5.0", + "echarts-for-react": "^3.0.2", + "framer-motion": "^11.5.0", + "lightweight-charts": "^4.2.0", + "lucide-react": "^0.439.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.0", + "tailwind-merge": "^2.5.2" + }, + "devDependencies": { + "@types/node": "^25.9.3", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.45", + "tailwindcss": "^3.4.10", + "tailwindcss-animate": "^1.0.7", + "typescript": "^5.5.4", + "vite": "^5.4.3" + }, + "packageManager": "pnpm@9.10.0" +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..ed7d8c7 --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,1917 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@dnd-kit/core': + specifier: ^6.3.1 + version: 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/sortable': + specifier: ^10.0.0 + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.55.0 + version: 5.100.11(react@18.3.1) + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + echarts: + specifier: ^5.5.0 + version: 5.6.0 + echarts-for-react: + specifier: ^3.0.2 + version: 3.0.6(echarts@5.6.0)(react@18.3.1) + framer-motion: + specifier: ^11.5.0 + version: 11.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + lightweight-charts: + specifier: ^4.2.0 + version: 4.2.3 + lucide-react: + specifier: ^0.439.0 + version: 0.439.0(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: ^6.26.0 + version: 6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwind-merge: + specifier: ^2.5.2 + version: 2.6.1 + devDependencies: + '@types/node': + specifier: ^25.9.3 + version: 25.9.3 + '@types/react': + specifier: ^18.3.5 + version: 18.3.29 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.7(@types/react@18.3.29) + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.7.0(vite@5.4.21(@types/node@25.9.3)) + autoprefixer: + specifier: ^10.4.20 + version: 10.5.0(postcss@8.5.15) + postcss: + specifier: ^8.4.45 + version: 8.5.15 + tailwindcss: + specifier: ^3.4.10 + version: 3.4.19 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.19) + typescript: + specifier: ^5.5.4 + version: 5.9.3 + vite: + specifier: ^5.4.3 + version: 5.4.21(@types/node@25.9.3) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@dnd-kit/accessibility@3.1.1': + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.3.1': + resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/sortable@10.0.0': + resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==} + peerDependencies: + '@dnd-kit/core': ^6.3.0 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@remix-run/router@1.23.2': + resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} + engines: {node: '>=14.0.0'} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/rollup-android-arm-eabi@4.60.4': + resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.4': + resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.4': + resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.4': + resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.4': + resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.4': + resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.4': + resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.4': + resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.4': + resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.4': + resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.4': + resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.4': + resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.4': + resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.4': + resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} + cpu: [x64] + os: [win32] + + '@tanstack/query-core@5.100.11': + resolution: {integrity: sha512-lmE0994apShXPj8CUxgx4ch5yUJhE9k/+tVwihBvPOyerACWdBocfFg24t8+0RhtlTd7tEgchDkhlCxNssvDxw==} + + '@tanstack/react-query@5.100.11': + resolution: {integrity: sha512-J0f9s5x3LE1450nNNfYx+e/n0DMa0uOBdFJUy5r0RvmsXd4nB/n0rbHtHI1vYXhikNFan+wf51p6Tmp4c8ucrg==} + peerDependencies: + react: ^18 || ^19 + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@25.9.3': + resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.29': + resolution: {integrity: sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg==} + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + autoprefixer@10.5.0: + resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + baseline-browser-mapping@2.10.31: + resolution: {integrity: sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + echarts-for-react@3.0.6: + resolution: {integrity: sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==} + peerDependencies: + echarts: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + react: ^15.0.0 || >=16.0.0 + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + electron-to-chromium@1.5.361: + resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + fancy-canvas@2.1.0: + resolution: {integrity: sha512-nifxXJ95JNLFR2NgRV4/MxVP45G9909wJTEKz5fg/TZS20JJZA6hfgRVh/bC9bwl2zBtBNcYPjiBE4njQHVBwQ==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + framer-motion@11.18.2: + resolution: {integrity: sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + lightweight-charts@4.2.3: + resolution: {integrity: sha512-5kS/2hY3wNYNzhnS8Gb+GAS07DX8GPF2YVDnd2NMC85gJVQ6RLU6YrXNgNJ6eg0AnWPwCnvaGtYmGky3HiLQEw==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@0.439.0: + resolution: {integrity: sha512-PafSWvDTpxdtNEndS2HIHxcNAbd54OaqSYJO90/b63rab2HWYqDbH194j0i82ZFdWOAcf0AHinRykXRRK2PJbw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + motion-dom@11.18.1: + resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} + + motion-utils@11.18.1: + resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.46: + resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + engines: {node: '>=18'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.30.3: + resolution: {integrity: sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.30.3: + resolution: {integrity: sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.60.4: + resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + size-sensor@1.0.3: + resolution: {integrity: sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@2.6.1: + resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.3': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@dnd-kit/accessibility@3.1.1(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/accessibility': 3.1.1(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/utilities@3.2.2(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.8.1 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@remix-run/router@1.23.2': {} + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rollup/rollup-android-arm-eabi@4.60.4': + optional: true + + '@rollup/rollup-android-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.4': + optional: true + + '@rollup/rollup-darwin-x64@4.60.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.4': + optional: true + + '@tanstack/query-core@5.100.11': {} + + '@tanstack/react-query@5.100.11(react@18.3.1)': + dependencies: + '@tanstack/query-core': 5.100.11 + react: 18.3.1 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/estree@1.0.8': {} + + '@types/node@25.9.3': + dependencies: + undici-types: 7.24.6 + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@18.3.7(@types/react@18.3.29)': + dependencies: + '@types/react': 18.3.29 + + '@types/react@18.3.29': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.9.3))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.21(@types/node@25.9.3) + transitivePeerDependencies: + - supports-color + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + arg@5.0.2: {} + + autoprefixer@10.5.0(postcss@8.5.15): + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001793 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.15 + postcss-value-parser: 4.2.0 + + baseline-browser-mapping@2.10.31: {} + + binary-extensions@2.3.0: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.31 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.361 + node-releases: 2.0.46 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001793: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + clsx@2.1.1: {} + + commander@4.1.1: {} + + convert-source-map@2.0.0: {} + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + echarts-for-react@3.0.6(echarts@5.6.0)(react@18.3.1): + dependencies: + echarts: 5.6.0 + fast-deep-equal: 3.1.3 + react: 18.3.1 + size-sensor: 1.0.3 + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + electron-to-chromium@1.5.361: {} + + es-errors@1.3.0: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + fancy-canvas@2.1.0: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + fraction.js@5.3.4: {} + + framer-motion@11.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + motion-dom: 11.18.1 + motion-utils: 11.18.1 + tslib: 2.8.1 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.3 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + lightweight-charts@4.2.3: + dependencies: + fancy-canvas: 2.1.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@0.439.0(react@18.3.1): + dependencies: + react: 18.3.1 + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + motion-dom@11.18.1: + dependencies: + motion-utils: 11.18.1 + + motion-utils@11.18.1: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.12: {} + + node-releases@2.0.46: {} + + normalize-path@3.0.0: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pify@2.3.0: {} + + pirates@4.0.7: {} + + postcss-import@15.1.0(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.12 + + postcss-js@4.1.0(postcss@8.5.15): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.15 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.15): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.15 + + postcss-nested@6.2.0(postcss@8.5.15): + dependencies: + postcss: 8.5.15 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + queue-microtask@1.2.3: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-refresh@0.17.0: {} + + react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.23.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.30.3(react@18.3.1) + + react-router@6.30.3(react@18.3.1): + dependencies: + '@remix-run/router': 1.23.2 + react: 18.3.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rollup@4.60.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.4 + '@rollup/rollup-android-arm64': 4.60.4 + '@rollup/rollup-darwin-arm64': 4.60.4 + '@rollup/rollup-darwin-x64': 4.60.4 + '@rollup/rollup-freebsd-arm64': 4.60.4 + '@rollup/rollup-freebsd-x64': 4.60.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 + '@rollup/rollup-linux-arm-musleabihf': 4.60.4 + '@rollup/rollup-linux-arm64-gnu': 4.60.4 + '@rollup/rollup-linux-arm64-musl': 4.60.4 + '@rollup/rollup-linux-loong64-gnu': 4.60.4 + '@rollup/rollup-linux-loong64-musl': 4.60.4 + '@rollup/rollup-linux-ppc64-gnu': 4.60.4 + '@rollup/rollup-linux-ppc64-musl': 4.60.4 + '@rollup/rollup-linux-riscv64-gnu': 4.60.4 + '@rollup/rollup-linux-riscv64-musl': 4.60.4 + '@rollup/rollup-linux-s390x-gnu': 4.60.4 + '@rollup/rollup-linux-x64-gnu': 4.60.4 + '@rollup/rollup-linux-x64-musl': 4.60.4 + '@rollup/rollup-openbsd-x64': 4.60.4 + '@rollup/rollup-openharmony-arm64': 4.60.4 + '@rollup/rollup-win32-arm64-msvc': 4.60.4 + '@rollup/rollup-win32-ia32-msvc': 4.60.4 + '@rollup/rollup-win32-x64-gnu': 4.60.4 + '@rollup/rollup-win32-x64-msvc': 4.60.4 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@6.3.1: {} + + size-sensor@1.0.3: {} + + source-map-js@1.2.1: {} + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.16 + ts-interface-checker: 0.1.13 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@2.6.1: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.19): + dependencies: + tailwindcss: 3.4.19 + + tailwindcss@3.4.19: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.15 + postcss-import: 15.1.0(postcss@8.5.15) + postcss-js: 4.1.0(postcss@8.5.15) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.15) + postcss-nested: 6.2.0(postcss@8.5.15) + postcss-selector-parser: 6.1.2 + resolve: 1.22.12 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-interface-checker@0.1.13: {} + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + typescript@5.9.3: {} + + undici-types@7.24.6: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + util-deprecate@1.0.2: {} + + vite@5.4.21(@types/node@25.9.3): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.15 + rollup: 4.60.4 + optionalDependencies: + '@types/node': 25.9.3 + fsevents: 2.3.3 + + yallist@3.1.1: {} + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 0000000..504f453 --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/frontend/src/components/AccessGuard.tsx b/frontend/src/components/AccessGuard.tsx new file mode 100644 index 0000000..15374c9 --- /dev/null +++ b/frontend/src/components/AccessGuard.tsx @@ -0,0 +1,46 @@ +import { Navigate, useLocation } from 'react-router-dom' +import { useQuery } from '@tanstack/react-query' +import { Loader2 } from 'lucide-react' +import { api } from '@/lib/api' + +function getStoredToken(): string | null { + try { return localStorage.getItem('access_token') } catch { return null } +} + +export function AccessGuard({ children, requireAdmin = false }: { children: React.ReactNode; requireAdmin?: boolean }) { + const location = useLocation() + const token = getStoredToken() + + const { data: status, isLoading } = useQuery({ + queryKey: ['access-auth-status', token], + queryFn: () => api.accessAuthStatus(), + // 即使 token 为空也查询一次,用于确认服务端是否启用了门控 + enabled: true, + staleTime: 5 * 60 * 1000, + }) + + if (isLoading) { + return ( +
+ +
+ ) + } + + // 未启用门控,直接放行 + if (!status?.enabled) { + return <>{children} + } + + // 未验证,跳转到登录页 + if (!status.verified) { + return + } + + // 需要管理员权限但当前非管理员 + if (requireAdmin && status.role !== 'admin') { + return + } + + return <>{children} +} diff --git a/frontend/src/components/AdminGuard.tsx b/frontend/src/components/AdminGuard.tsx new file mode 100644 index 0000000..fc9e9ea --- /dev/null +++ b/frontend/src/components/AdminGuard.tsx @@ -0,0 +1,33 @@ +import { Navigate } from 'react-router-dom' +import { useQuery } from '@tanstack/react-query' +import { Loader2 } from 'lucide-react' +import { api } from '@/lib/api' + +function getStoredRole(): string | null { + try { return localStorage.getItem('access_role') } catch { return null } +} + +export function AdminGuard({ children }: { children: React.ReactNode }) { + const { data: status, isLoading } = useQuery({ + queryKey: ['access-auth-status'], + queryFn: () => api.accessAuthStatus(), + enabled: true, + staleTime: 5 * 60 * 1000, + }) + + if (isLoading) { + return ( +
+ +
+ ) + } + + // 未启用门控或本地角色为 admin,均放行 + const localRole = getStoredRole() + if (!status?.enabled || localRole === 'admin' || status.role === 'admin') { + return <>{children} + } + + return +} diff --git a/frontend/src/components/AlertToast.tsx b/frontend/src/components/AlertToast.tsx new file mode 100644 index 0000000..cf2f898 --- /dev/null +++ b/frontend/src/components/AlertToast.tsx @@ -0,0 +1,176 @@ +import { useCallback, useEffect, useState } from 'react' +import { useNavigate } from 'react-router-dom' +import { motion, AnimatePresence } from 'framer-motion' +import { Bell, TrendingUp, TrendingDown, X } from 'lucide-react' +import type { AlertEvent } from '@/lib/api' +import { fmtPct, fmtPrice } from '@/lib/format' +import { cn } from '@/lib/cn' +import { playNotificationSound } from '@/lib/notificationSound' + +// ===== 全局状态 (模块级, 仿 Toast.tsx 模式) ===== +type Item = { id: number; alert: AlertEvent } +let _id = 0 +let _queue: Item[] = [] +const AUTO_DISMISS = 5000 // 5 秒自动消失 +const _listeners: Set<(items: Item[]) => void> = new Set() + +/** 从 localStorage 读取配置 */ +function getEnabled(): boolean { + try { + const v = localStorage.getItem('alert_toast_enabled') + return v === null ? true : v === '1' // 默认开启 + } catch { return true } +} + +function getMaxVisible(): number { + try { + const v = parseInt(localStorage.getItem('alert_toast_max') || '', 10) + return v >= 1 && v <= 10 ? v : 3 // 默认 3, 范围 1-10 + } catch { return 3 } +} + +/** 通知外部配置变更后刷新 (设置页改了配置后调用) */ +export function refreshAlertToastConfig() { + _emit() +} + +function _emit() { _listeners.forEach(fn => fn([..._queue])) } + +/** 推入单条监控告警通知 (兼容入口, 不发声 — 发声由批量入口统一处理) */ +export function pushAlertToast(alert: AlertEvent) { + pushAlertToasts([alert]) +} + +/** + * 批量推入监控告警通知 (一轮 SSE 多只新命中时调用)。 + * - 每条都弹 Toast (受 maxVisible 上限, 超出丢最旧) + * - 整批只播放一声通知音, 避免短时连续响多声刷屏 + */ +export function pushAlertToasts(alerts: AlertEvent[]) { + if (alerts.length === 0) return + if (!getEnabled()) return // 开关关闭: 不弹 + const maxVisible = getMaxVisible() + const newItems = alerts.map(alert => ({ id: ++_id, alert })) + _queue = [..._queue, ...newItems] + // 超出上限: 丢弃最旧的 + if (_queue.length > maxVisible) { + _queue = _queue.slice(-maxVisible) + } + _emit() + for (const item of newItems) { + setTimeout(() => dismiss(item.id), AUTO_DISMISS) + } + playNotificationSound() // 整批只响一声 +} + +/** 手动关闭 */ +export function dismiss(id: number) { + _queue = _queue.filter(t => t.id !== id) + _emit() +} + +// ===== 配色 ===== +const SEVERITY_BAR: Record = { + info: 'bg-accent', warn: 'bg-warning', critical: 'bg-danger', +} +const SOURCE_BADGE: Record = { + strategy: { label: '策略', cls: 'bg-amber-400/15 text-amber-400' }, + signal: { label: '信号', cls: 'bg-accent/15 text-accent' }, + price: { label: '价格', cls: 'bg-emerald-400/15 text-emerald-400' }, + market: { label: '异动', cls: 'bg-purple-500/15 text-purple-400' }, + new_entry: { label: '进入', cls: 'bg-emerald-400/15 text-emerald-400' }, + dropped: { label: '移出', cls: 'bg-danger/15 text-danger' }, +} + +// ===== 容器 — 挂在 Layout ===== +export function AlertToastContainer() { + const [items, setItems] = useState([]) + const navigate = useNavigate() + + const sub = useCallback(() => { + _listeners.add(setItems) + return () => { _listeners.delete(setItems) } + }, []) + useEffect(sub, [sub]) + + // 点击通知 → 跳转监控中心 + 关闭当前通知 + const handleClick = (id: number) => { + dismiss(id) + navigate('/monitor') + } + + if (!items.length) return null + + return ( +
+ + {items + .filter(item => !(item.alert.source === 'strategy' && !item.alert.symbol)) + .map(item => { + const ev = item.alert + const sev = SEVERITY_BAR[ev.severity ?? 'info'] ?? SEVERITY_BAR.info + const badgeKey = (ev.source === 'strategy' && ev.type) ? ev.type : ev.source + const badge = SOURCE_BADGE[badgeKey] ?? { label: badgeKey, cls: 'bg-elevated text-muted' } + const pct = ev.change_pct ?? 0 + const isStrategy = ev.source === 'strategy' + const sm = isStrategy ? ev.message?.match(/策略「([^」]+)」/) : null + const sname = sm ? sm[1] : '' + const isNew = ev.type === 'new_entry' + return ( + handleClick(item.id)} + className="pointer-events-auto relative overflow-hidden rounded-xl border border-border/60 bg-surface/95 backdrop-blur-md shadow-2xl pl-3 pr-2 py-2.5 cursor-pointer hover:border-accent/40 hover:shadow-accent/10 transition-all" + > + {/* 左侧色条 */} +
+ + {/* 顶行: 分类标签 + 代码/名称 + 涨跌幅 + 关闭 */} +
+ + {badge.label} + + {ev.symbol && {ev.symbol}} + {ev.name && {ev.name}} + {ev.change_pct != null && ( + = 0 ? 'text-danger' : 'text-bear')}> + {pct >= 0 ? : } + {fmtPct(pct)} + + )} + +
+ + {/* 底行: 策略类型走新格式, 其他走旧格式 */} + {isStrategy ? ( +
+ + + {isNew ? '进入' : '移出'} + + 策略 + 「{sname}」 + + {ev.price != null && {fmtPrice(ev.price)}} +
+ ) : ( +
+ + {ev.message && {ev.message}} + {ev.price != null && {fmtPrice(ev.price)}} +
+ )} + + ) + })} + +
+ ) +} diff --git a/frontend/src/components/CandlestickChart.tsx b/frontend/src/components/CandlestickChart.tsx new file mode 100644 index 0000000..8652938 --- /dev/null +++ b/frontend/src/components/CandlestickChart.tsx @@ -0,0 +1,154 @@ +import { useEffect, useRef } from 'react' +import { + createChart, + CrosshairMode, + type IChartApi, + type ISeriesApi, + type CandlestickData, + type HistogramData, +} from 'lightweight-charts' + +export interface OHLC { + date: string + open: number + high: number + low: number + close: number + volume?: number +} + +export function fmtBigNum(v: number): string { + if (v >= 1_000_000_000_000) return `${(v / 1_000_000_000_000).toFixed(2)}万亿` + if (v >= 100_000_000) return `${(v / 100_000_000).toFixed(2)}亿` + if (v >= 10_000) return `${(v / 10_000).toFixed(0)}万` + return v.toFixed(0) +} + +const THEME = { + background: 'transparent', + textColor: '#A1A1AA', + gridColor: 'rgba(255,255,255,0.04)', + borderColor: '#27272A', + bull: '#F04438', + bear: '#12B76A', + volBull: 'rgba(240,68,56,0.4)', + volBear: 'rgba(18,183,106,0.4)', +} + +interface Props { + data: OHLC[] + height?: number +} + +export function CandlestickChart({ data, height = 480 }: Props) { + const containerRef = useRef(null) + const chartRef = useRef(null) + const candleRef = useRef | null>(null) + const volRef = useRef | null>(null) + + useEffect(() => { + if (!containerRef.current) return + const el = containerRef.current + + const chart = createChart(el, { + width: el.clientWidth, + height, + layout: { + background: { color: THEME.background }, + textColor: THEME.textColor, + fontFamily: 'JetBrains Mono, monospace', + fontSize: 11, + }, + grid: { + vertLines: { color: THEME.gridColor }, + horzLines: { color: THEME.gridColor }, + }, + crosshair: { + mode: CrosshairMode.Normal, + vertLine: { labelVisible: false }, + horzLine: { labelVisible: false }, + }, + rightPriceScale: { borderColor: THEME.borderColor }, + timeScale: { + borderColor: THEME.borderColor, + timeVisible: false, + secondsVisible: false, + }, + }) + + // Candlestick — occupies top 80% via default price scale + const candle = chart.addCandlestickSeries({ + upColor: THEME.bull, + downColor: THEME.bear, + borderUpColor: THEME.bull, + borderDownColor: THEME.bear, + wickUpColor: THEME.bull, + wickDownColor: THEME.bear, + lastValueVisible: false, + priceLineVisible: false, + }) + + // Volume — separate price scale, squeezed to bottom 20% + const volume = chart.addHistogramSeries({ + priceFormat: { type: 'volume' }, + priceScaleId: 'volume', + lastValueVisible: false, + priceLineVisible: false, + }) + chart.priceScale('volume').applyOptions({ + scaleMargins: { top: 0.8, bottom: 0 }, + }) + + chartRef.current = chart + candleRef.current = candle + volRef.current = volume + + const ro = new ResizeObserver(() => { + chart.applyOptions({ width: el.clientWidth }) + }) + ro.observe(el) + + return () => { + ro.disconnect() + chart.remove() + chartRef.current = null + candleRef.current = null + volRef.current = null + } + }, [height]) + + useEffect(() => { + if (!chartRef.current || !candleRef.current || !volRef.current || data.length === 0) return + + candleRef.current.setData( + data.map(d => ({ + time: d.date as any, + open: d.open, + high: d.high, + low: d.low, + close: d.close, + })) as CandlestickData[], + ) + + volRef.current.setData( + data.map(d => ({ + time: d.date as any, + value: d.volume ?? 0, + color: d.close >= d.open ? THEME.volBull : THEME.volBear, + })) as HistogramData[], + ) + + const ts = chartRef.current.timeScale() + if (data.length > 60) { + const startIdx = data.length - 60 + ts.setVisibleRange({ + from: data[startIdx].date as any, + to: data[data.length - 1].date as any, + }) + } else { + ts.fitContent() + } + }, [data]) + + return
+} diff --git a/frontend/src/components/ColumnCustomizer.tsx b/frontend/src/components/ColumnCustomizer.tsx new file mode 100644 index 0000000..814dcd7 --- /dev/null +++ b/frontend/src/components/ColumnCustomizer.tsx @@ -0,0 +1,24 @@ +import { ListColumnCustomizer } from '@/components/ListColumnCustomizer' +import { COLUMN_GROUPS, type ColumnConfig } from '@/lib/watchlist-columns' + +interface ColumnCustomizerProps { + columns: ColumnConfig[] + onChange: (columns: ColumnConfig[]) => void + open: boolean + onClose: () => void +} + +export function ColumnCustomizer({ columns, onChange, open, onClose }: ColumnCustomizerProps) { + return ( + + ) +} diff --git a/frontend/src/components/DatePicker.tsx b/frontend/src/components/DatePicker.tsx new file mode 100644 index 0000000..ef4fe81 --- /dev/null +++ b/frontend/src/components/DatePicker.tsx @@ -0,0 +1,235 @@ +import { useState, useRef, useEffect } from 'react' +import { motion, AnimatePresence } from 'framer-motion' +import { Calendar, ChevronLeft, ChevronRight } from 'lucide-react' + +interface DatePickerProps { + value: string // YYYY-MM-DD + onChange: (v: string) => void + min?: string + max?: string + placeholder?: string + className?: string + buttonClassName?: string + align?: 'left' | 'right' +} + +const WEEKDAYS = ['一', '二', '三', '四', '五', '六', '日'] + +function pad(n: number) { return String(n).padStart(2, '0') } +function toDateStr(y: number, m: number, d: number) { + return `${y}-${pad(m + 1)}-${pad(d)}` +} +function todayStr() { + const date = new Date() + return toDateStr(date.getFullYear(), date.getMonth(), date.getDate()) +} +function viewDate(value: string, min?: string, max?: string) { + const source = value || max || min || todayStr() + return { + year: Number(source.slice(0, 4)), + month: Number(source.slice(5, 7)) - 1, + } +} + +export function DatePicker({ + value, + onChange, + min, + max, + placeholder = '选择日期', + className = '', + buttonClassName = '', + align = 'right', +}: DatePickerProps) { + const [open, setOpen] = useState(false) + const [showYearPicker, setShowYearPicker] = useState(false) + const ref = useRef(null) + + // 当前显示的月份 + const [viewYear, setViewYear] = useState(() => viewDate(value, min, max).year) + const [viewMonth, setViewMonth] = useState(() => viewDate(value, min, max).month) + + // 当 value 外部变化时同步 view + useEffect(() => { + const next = viewDate(value, min, max) + setViewYear(next.year) + setViewMonth(next.month) + }, [value, min, max]) + + // 点击外部关闭 + useEffect(() => { + if (!open) return + const handler = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) + } + document.addEventListener('mousedown', handler) + return () => document.removeEventListener('mousedown', handler) + }, [open]) + + const prevMonth = () => { + if (viewMonth === 0) { setViewMonth(11); setViewYear(viewYear - 1) } + else setViewMonth(viewMonth - 1) + } + const nextMonth = () => { + if (viewMonth === 11) { setViewMonth(0); setViewYear(viewYear + 1) } + else setViewMonth(viewMonth + 1) + } + + // 构建日历格子: 周一为第一天 + const firstDay = new Date(viewYear, viewMonth, 1).getDay() + const offset = firstDay === 0 ? 6 : firstDay - 1 // 周一=0 + const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate() + const prevMonthDays = new Date(viewYear, viewMonth, 0).getDate() + + const cells: { day: number; cur: boolean; dateStr: string; disabled: boolean }[] = [] + + // 上月尾部 + for (let i = offset - 1; i >= 0; i--) { + const d = prevMonthDays - i + const m = viewMonth === 0 ? 11 : viewMonth - 1 + const y = viewMonth === 0 ? viewYear - 1 : viewYear + const ds = toDateStr(y, m, d) + cells.push({ day: d, cur: false, dateStr: ds, disabled: !!min && ds < min || !!max && ds > max }) + } + // 当月 + for (let d = 1; d <= daysInMonth; d++) { + const ds = toDateStr(viewYear, viewMonth, d) + cells.push({ day: d, cur: true, dateStr: ds, disabled: !!min && ds < min || !!max && ds > max }) + } + // 下月头部 — 补齐到 6 行 × 7 = 42 + const remain = 42 - cells.length + for (let d = 1; d <= remain; d++) { + const m = viewMonth === 11 ? 0 : viewMonth + 1 + const y = viewMonth === 11 ? viewYear + 1 : viewYear + const ds = toDateStr(y, m, d) + cells.push({ day: d, cur: false, dateStr: ds, disabled: !!min && ds < min || !!max && ds > max }) + } + + const displayLabel = value || placeholder + const today = todayStr() + + return ( +
+ {/* 触发按钮 */} + + + {/* 弹出日历 */} + + {open && ( + + {/* 月份导航 */} +
+ + + +
+ + {showYearPicker ? ( + /* 年份选择网格 */ +
+ {Array.from({ length: 12 }, (_, i) => viewYear - 5 + i).map(y => { + const isSelected = y === Number(value.slice(0, 4)) + const isThisYear = y === new Date().getFullYear() + return ( + + ) + })} +
+ ) : ( + <> + {/* 星期头 */} +
+ {WEEKDAYS.map((w) => ( +
{w}
+ ))} +
+ + {/* 日期格子 */} +
+ {cells.map((c, i) => { + const isSelected = c.dateStr === value + const isToday = c.dateStr === today + return ( + + ) + })} +
+ + )} +
+ )} +
+
+ ) +} diff --git a/frontend/src/components/EChartsCandlestick.tsx b/frontend/src/components/EChartsCandlestick.tsx new file mode 100644 index 0000000..af51f06 --- /dev/null +++ b/frontend/src/components/EChartsCandlestick.tsx @@ -0,0 +1,1114 @@ +import { useEffect, useRef, useCallback, useMemo } from 'react' +import * as echarts from 'echarts' +import type { ECharts, EChartsOption } from 'echarts' +import { useChartTheme, type ChartTheme } from '@/lib/chartTheme' + +export interface OHLC { + date: string + open: number + high: number + low: number + close: number + volume?: number + ma5?: number | null + ma10?: number | null + ma20?: number | null + ma60?: number | null + macd_dif?: number | null + macd_dea?: number | null + macd_hist?: number | null + rsi_6?: number | null + rsi_14?: number | null + rsi_24?: number | null + kdj_k?: number | null + kdj_d?: number | null + kdj_j?: number | null + boll_upper?: number | null + boll_lower?: number | null +} + +export interface ChartMarker { + date: string + kind: 'buy' | 'sell' | 'neutral' + label?: string + /** 若为 true,标记放在蜡烛上方(如涨停连板标签)。 */ + above?: boolean + /** 自定义标签颜色,覆盖默认的 kind 对应色。 */ + color?: string +} + +export interface ChartRange { + start: string + end: string + label?: string + color?: string +} + +export interface ChartPriceLine { + value: number + label?: string + color?: string + start?: string + end?: string +} + +export interface StockInfo { + name?: string + total_shares?: number + float_shares?: number + /** 扩展数据(key: configId__fieldName),来自 klineDaily 的 ext_columns */ + ext?: Record +} + +/** 子图定义 */ +export interface SubChartDef { + key: string + label: string + /** 子图固定高度 px */ + height: number + /** 构建 series 数组 */ + buildSeries: (data: OHLC[]) => any[] + /** 构建信息栏文字 (当前数据行 -> 显示内容) */ + buildInfo: (d: OHLC | null) => { label: string; color: string; value: string }[] + /** Y 轴特殊配置 */ + yAxisConfig?: Record +} + +// ===== 成交量 N 日均量 ===== +function volMaN(data: OHLC[], n: number): (number | null)[] { + const result: (number | null)[] = [] + for (let i = 0; i < data.length; i++) { + if (i < n - 1) { result.push(null); continue } + let sum = 0 + for (let j = i - n + 1; j <= i; j++) sum += data[j].volume ?? 0 + result.push(sum / n) + } + return result +} + +function fmtVol(v: number | null | undefined): string { + if (v == null) return '—' + if (v >= 1e8) return (v / 1e8).toFixed(2) + '亿' + if (v >= 1e4) return (v / 1e4).toFixed(0) + '万' + return v.toFixed(0) +} + +export const SUB_CHARTS: SubChartDef[] = [ + { + key: 'vol', + label: '成交量', + height: 84, + yAxisConfig: { min: 0 }, + buildSeries: (data) => { + const ma5Data = volMaN(data, 5) + const ma10Data = volMaN(data, 10) + return [ + { + name: '成交量', + type: 'bar', + data: data.map(d => ({ + value: d.volume ?? 0, + itemStyle: { + color: d.close >= d.open ? 'rgba(240,68,56,0.6)' : 'rgba(18,183,106,0.6)', + }, + })), + barWidth: '60%', + animation: false, + }, + { + name: 'VOL5', + type: 'line', + data: ma5Data, + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#FACC15' }, + itemStyle: { color: '#FACC15' }, + }, + { + name: 'VOL10', + type: 'line', + data: ma10Data, + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#8B5CF6' }, + itemStyle: { color: '#8B5CF6' }, + }, + ] + }, + buildInfo: (d) => { + if (!d) return [] + return [ + { label: '量', color: d.close >= d.open ? '#C74040' : '#2D9B65', value: fmtVol(d.volume) }, + ] + }, + }, + { + key: 'macd', + label: 'MACD', + height: 72, + buildSeries: (data) => [ + { + name: 'DIF', + type: 'line', + data: data.map(d => d.macd_dif != null ? Number(d.macd_dif) : '-'), + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#FACC15' }, + itemStyle: { color: '#FACC15' }, + }, + { + name: 'DEA', + type: 'line', + data: data.map(d => d.macd_dea != null ? Number(d.macd_dea) : '-'), + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#8B5CF6' }, + itemStyle: { color: '#8B5CF6' }, + }, + { + name: 'MACD', + type: 'bar', + data: data.map(d => { + const v = d.macd_hist + if (v == null) return '-' + return { + value: Number(v), + itemStyle: { color: Number(v) >= 0 ? 'rgba(240,68,56,0.6)' : 'rgba(18,183,106,0.6)' }, + } + }), + barWidth: '40%', + animation: false, + }, + ], + buildInfo: (d) => { + if (!d) return [] + return [ + { label: 'DIF', color: '#FACC15', value: d.macd_dif != null ? d.macd_dif.toFixed(3) : '—' }, + { label: 'DEA', color: '#8B5CF6', value: d.macd_dea != null ? d.macd_dea.toFixed(3) : '—' }, + { label: 'MACD', color: d.macd_hist != null && d.macd_hist >= 0 ? '#C74040' : '#2D9B65', value: d.macd_hist != null ? d.macd_hist.toFixed(3) : '—' }, + ] + }, + }, + { + key: 'rsi', + label: 'RSI', + height: 72, + yAxisConfig: { min: 0, max: 100 }, + buildSeries: (data) => [ + { + name: 'RSI6', + type: 'line', + data: data.map(d => d.rsi_6 != null ? Number(d.rsi_6) : '-'), + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#FACC15' }, + itemStyle: { color: '#FACC15' }, + }, + { + name: 'RSI14', + type: 'line', + data: data.map(d => d.rsi_14 != null ? Number(d.rsi_14) : '-'), + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#3B82F6' }, + itemStyle: { color: '#3B82F6' }, + }, + { + name: 'RSI24', + type: 'line', + data: data.map(d => d.rsi_24 != null ? Number(d.rsi_24) : '-'), + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#8B5CF6' }, + itemStyle: { color: '#8B5CF6' }, + }, + ], + buildInfo: (d) => { + if (!d) return [] + return [ + { label: 'RSI6', color: '#FACC15', value: d.rsi_6 != null ? d.rsi_6.toFixed(1) : '—' }, + { label: 'RSI14', color: '#3B82F6', value: d.rsi_14 != null ? d.rsi_14.toFixed(1) : '—' }, + { label: 'RSI24', color: '#8B5CF6', value: d.rsi_24 != null ? d.rsi_24.toFixed(1) : '—' }, + ] + }, + }, + { + key: 'kdj', + label: 'KDJ', + height: 72, + buildSeries: (data) => [ + { + name: 'K', + type: 'line', + data: data.map(d => d.kdj_k != null ? Number(d.kdj_k) : '-'), + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#FACC15' }, + itemStyle: { color: '#FACC15' }, + }, + { + name: 'D', + type: 'line', + data: data.map(d => d.kdj_d != null ? Number(d.kdj_d) : '-'), + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#3B82F6' }, + itemStyle: { color: '#3B82F6' }, + }, + { + name: 'J', + type: 'line', + data: data.map(d => d.kdj_j != null ? Number(d.kdj_j) : '-'), + smooth: true, symbol: 'none', animation: false, + lineStyle: { width: 1, color: '#8B5CF6' }, + itemStyle: { color: '#8B5CF6' }, + }, + ], + buildInfo: (d) => { + if (!d) return [] + return [ + { label: 'K', color: '#FACC15', value: d.kdj_k != null ? d.kdj_k.toFixed(1) : '—' }, + { label: 'D', color: '#3B82F6', value: d.kdj_d != null ? d.kdj_d.toFixed(1) : '—' }, + { label: 'J', color: '#8B5CF6', value: d.kdj_j != null ? d.kdj_j.toFixed(1) : '—' }, + ] + }, + }, +] + +/** 向后兼容的 INDICATORS 导出 (不含 vol) */ +export const INDICATORS = SUB_CHARTS.filter(s => s.key !== 'vol') + +/** 主图叠加指标 (画在 K 线上方, 不占副图空间) */ +export const OVERLAY_INDICATORS: { key: string; label: string }[] = [ + { key: 'boll', label: 'BOLL' }, +] + +interface Props { + data: OHLC[] + markers?: ChartMarker[] + ranges?: ChartRange[] + priceLines?: ChartPriceLine[] + height?: number + showMA?: boolean + showInfoBar?: boolean + showMarkers?: boolean + onToggleMarkers?: () => void + stockInfo?: StockInfo + symbol?: string + linkedPrice?: number | null + onDateClick?: (date: string) => void + /** 默认可见蜡烛根数, 默认 60 */ + visibleBars?: number + /** 已激活的子图 key 列表 (含 vol, 按点击顺序) */ + activeIndicators?: string[] +} + +function getTHEME(ct: ChartTheme) { + return { + bull: '#C74040', + bear: '#2D9B65', + bullAlpha: 'rgba(240,68,56,0.7)', + bearAlpha: 'rgba(18,183,106,0.7)', + ma5: '#A1A1AA', + ma10: '#3B82F6', + ma20: '#F97316', + ma60: '#8B5CF6', + text: ct.text, + grid: ct.splitLine, + border: ct.axisLine, + bg: 'transparent', + tooltipBg: ct.tooltipBg, + tooltipBorder: ct.tooltipBorder, + tooltipText: ct.tooltipText, + crosshair: ct.crosshair, + } +} + +/** 可见蜡烛超过此数量时,涨停/炸板标签切换为小圆点。 */ +const COMPACT_THRESHOLD = 60 + +/** 子图上方信息栏高度 (px) */ +const INFO_BAR_H = 16 +/** 子图之间的间距 (px) */ +const SUB_GAP_PX = 4 + +function buildSubInfoGraphics( + data: OHLC[], + infoIdx: number, + activeIndicators: string[], + subStartTop: number, + theme: ReturnType, +): any[] { + const d = infoIdx >= 0 && infoIdx < data.length ? data[infoIdx] : null + const graphics: any[] = [] + let curTop = subStartTop + + activeIndicators.forEach((key) => { + const def = SUB_CHARTS.find(s => s.key === key) + if (!def) return + + const items = def.buildInfo(d) + if (def.key === 'vol' && d) { + const calcVolMa = (n: number) => { + if (infoIdx < n - 1) return null + let sum = 0 + for (let j = infoIdx - n + 1; j <= infoIdx; j++) sum += data[j].volume ?? 0 + return sum / n + } + const vol5 = calcVolMa(5) + const vol10 = calcVolMa(10) + items.push({ label: 'VOL5', color: '#FACC15', value: fmtVol(vol5) }) + items.push({ label: 'VOL10', color: '#8B5CF6', value: fmtVol(vol10) }) + } + + // 每个元素加固定 id,确保 ECharts 增量更新时能正确匹配 + graphics.push({ + id: `sub-sep-${key}`, + type: 'line', + shape: { x1: 0, y1: curTop, x2: 2000, y2: curTop }, + style: { stroke: theme.grid, lineWidth: 1 }, + silent: true, z: 0, + }) + graphics.push({ + id: `sub-label-${key}`, + type: 'text', + style: { + text: def.label, + x: 4, y: curTop + 4, + fill: '#8E8E96', + fontSize: 10, fontFamily: 'JetBrains Mono, monospace', + fontWeight: 'bold', + }, + silent: true, z: 10, + }) + + const richTextParts: string[] = [] + const rich: Record = {} + items.forEach((item, idx) => { + const styleKey = `s${idx}` + richTextParts.push(`{${styleKey}|${item.label}:${item.value}}`) + rich[styleKey] = { + fill: item.color, + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + } + }) + graphics.push({ + id: `sub-val-${key}`, + type: 'text', + right: 24, + style: { + text: richTextParts.join(`{gap| }`), + y: curTop + 3, + rich: { + gap: { fill: 'transparent', fontSize: 10 }, + ...rich, + }, + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + textAlign: 'right', + textVerticalAlign: 'top', + }, + silent: true, z: 10, + }) + + curTop += INFO_BAR_H + def.height + SUB_GAP_PX + }) + + return graphics +} + +function buildOption( + data: OHLC[], + dates: string[], + dateIndexMap: Map, + markers: ChartMarker[] | undefined, + ranges: ChartRange[] | undefined, + priceLines: ChartPriceLine[] | undefined, + showMA: boolean, + compact: boolean, + activeIndicators: string[], + containerHeight: number, + infoIdx: number, + linkedPrice: number | null | undefined, + theme: ReturnType, +): EChartsOption { + const candleData = data.map(d => [d.open, d.close, d.low, d.high]) + + const hasMA = showMA && data.some(d => d.ma5 != null || d.ma10 != null || d.ma20 != null || d.ma60 != null) + + const markPointData: any[] = [] + if (markers && markers.length > 0) { + for (const m of markers) { + const idx = dateIndexMap.get(m.date) + if (idx == null) continue + const d = data[idx] + const isBuy = m.kind === 'buy' + const isSell = m.kind === 'sell' + + if (m.above) { + const dotColor = m.color ?? (isBuy ? '#FACC15' : theme.text) + if (compact) { + markPointData.push({ + name: m.date, coord: [m.date, d.high], + symbol: 'circle', symbolSize: 4, symbolOffset: [0, -10], + itemStyle: { color: dotColor, cursor: 'pointer' }, + label: { show: false }, z: 100, zlevel: 10, + }) + } else { + markPointData.push({ + name: m.date, coord: [m.date, d.high], + symbol: 'circle', symbolSize: 12, symbolOffset: [0, -2], + itemStyle: { color: 'transparent' }, + label: { + show: true, formatter: m.label ?? '', position: 'top', distance: 0, + color: dotColor, fontSize: 10, fontWeight: 'normal', + fontFamily: 'JetBrains Mono, monospace', + }, + z: 100, zlevel: 10, + }) + } + } else { + markPointData.push({ + name: m.label ?? '', + coord: [m.date, isBuy ? d.low : d.high], + symbol: 'arrow', symbolSize: 12, + symbolRotate: isBuy ? 0 : 180, + symbolOffset: isBuy ? [0, '60%'] : [0, '-60%'], + itemStyle: { color: isBuy ? theme.bull : isSell ? theme.bear : theme.text }, + label: { + show: !!m.label, formatter: m.label ?? '', + position: isBuy ? 'bottom' : 'top', distance: 8, + color: theme.text, fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + }, + }) + } + } + } + + // ====== 布局计算 ====== + const left = 60 + const right = 20 + const topPad = 8 + const candleBottomPad = 22 + + let subTotalH = 0 + const activeSubDefs: SubChartDef[] = [] + activeIndicators.forEach(key => { + const def = SUB_CHARTS.find(s => s.key === key) + if (!def) return + activeSubDefs.push(def) + subTotalH += INFO_BAR_H + def.height + }) + if (activeSubDefs.length > 0) subTotalH += activeSubDefs.length * SUB_GAP_PX + + const candleAvail = Math.max(containerHeight - topPad - candleBottomPad - subTotalH, 100) + + const grids: any[] = [] + const xAxes: any[] = [] + const yAxes: any[] = [] + const series: any[] = [] + const xAxisIndices: number[] = [] + + // ===== grid 0: K线主图 ===== + grids.push({ left, right, top: topPad, height: candleAvail }) + xAxes.push({ + type: 'category', data: dates, boundaryGap: true, + axisLine: { lineStyle: { color: theme.border } }, + axisLabel: { color: theme.text, fontSize: 10, fontFamily: 'JetBrains Mono, monospace' }, + axisTick: { show: false }, + splitLine: { show: false }, + }) + yAxes.push({ + scale: true, + // 上下各留 3% 边距: 防止最高/最低点的蜡烛贴边, 涨停/炸板标签被遮挡 + boundaryGap: [0.03, 0.03], + splitArea: { show: false }, + axisLine: { show: false }, axisTick: { show: false }, + splitLine: { lineStyle: { color: theme.grid } }, + axisLabel: { color: theme.text, fontSize: 10, fontFamily: 'JetBrains Mono, monospace' }, + }) + xAxisIndices.push(0) + + const markAreaData = (ranges ?? []) + .filter(r => dateIndexMap.has(r.start) && dateIndexMap.has(r.end)) + .map(r => ([ + { + name: r.label ?? '', + xAxis: r.start, + itemStyle: { color: r.color ?? 'rgba(59,130,246,0.08)' }, + label: { + show: !!r.label, + position: 'insideTop', + distance: 8, + color: theme.tooltipText, + backgroundColor: theme.tooltipBg, + borderColor: theme.tooltipBorder, + borderWidth: 1, + borderRadius: 4, + padding: [2, 6], + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + }, + }, + { xAxis: r.end }, + ])) + + const markLineData: any[] = (priceLines ?? []) + .filter(line => Number.isFinite(line.value)) + .map(line => { + const lineStyle = { + color: line.color ?? theme.text, + type: 'dashed' as const, + width: 1, + opacity: 0.92, + } + const label = { + show: !!line.label, + formatter: line.label ?? '', + position: 'insideEndTop' as const, + color: line.color ?? theme.text, + backgroundColor: theme.tooltipBg, + borderRadius: 4, + padding: [2, 6], + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + } + if (line.start && line.end && dateIndexMap.has(line.start) && dateIndexMap.has(line.end)) { + return [ + { xAxis: line.start, yAxis: line.value }, + { xAxis: line.end, yAxis: line.value, lineStyle, label, symbol: 'none' }, + ] + } + return { yAxis: line.value, lineStyle, label, symbol: 'none' } + }) + + if (linkedPrice != null) { + markLineData.push({ + yAxis: linkedPrice, + lineStyle: { color: '#3B82F6', type: 'dashed', width: 1, opacity: 0.7 }, + label: { + show: true, + formatter: linkedPrice.toFixed(2), + position: 'insideEndTop', + color: '#3B82F6', + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + backgroundColor: theme.tooltipBg, + borderColor: '#3B82F6', + borderWidth: 1, + padding: [1, 4], + borderRadius: 2, + }, + symbol: 'none', + }) + } + + series.push({ + name: 'K', type: 'candlestick', data: candleData, + animation: false, + itemStyle: { + color: theme.bull, color0: theme.bear, + borderColor: theme.bull, borderColor0: theme.bear, + cursor: 'pointer', + }, + markPoint: markPointData.length > 0 ? { data: markPointData, animation: false } : undefined, + markArea: markAreaData.length > 0 ? { silent: true, data: markAreaData } : undefined, + markLine: markLineData.length > 0 ? { silent: true, symbol: 'none', data: markLineData, animation: false } : undefined, + }) + + if (hasMA) { + const maLine = (key: keyof OHLC, color: string, name: string) => ({ + name, type: 'line', + data: data.map(d => (d[key] != null ? Number(d[key]) : '-')), + smooth: true, symbol: 'none', animation: false, + silent: true, + lineStyle: { width: 1, color }, itemStyle: { color }, + }) + series.push(maLine('ma5', theme.ma5, 'MA5')) + series.push(maLine('ma10', theme.ma10, 'MA10')) + series.push(maLine('ma20', theme.ma20, 'MA20')) + series.push(maLine('ma60', theme.ma60, 'MA60')) + } + + // BOLL 布林带 — 需在 activeIndicators 中激活 + const showBOLL = activeIndicators.includes('boll') && data.some(d => d.boll_upper != null || d.boll_lower != null) + if (showBOLL) { + const bollLine = (key: keyof OHLC, color: string, name: string) => ({ + name, type: 'line', + data: data.map(d => (d[key] != null ? Number(d[key]) : '-')), + smooth: true, symbol: 'none', animation: false, + silent: true, + lineStyle: { width: 1, color, type: 'dashed' as const }, itemStyle: { color }, + }) + series.push(bollLine('boll_upper', '#E879F9', 'BOLL上')) + series.push(bollLine('boll_lower', '#E879F9', 'BOLL下')) + } + + // ===== 子图区域 ===== + let curTop = topPad + candleAvail + candleBottomPad + + activeSubDefs.forEach((def, i) => { + const gridIdx = i + 1 + const xAxisIdx = i + 1 + const yAxisIdx = i + 1 + + const chartTop = curTop + INFO_BAR_H + grids.push({ + left, right, + top: chartTop, + height: def.height, + show: true, + borderColor: theme.grid, + borderWidth: 1, + }) + + xAxes.push({ + type: 'category', gridIndex: gridIdx, data: dates, boundaryGap: true, + axisLine: { show: false }, axisLabel: { show: false }, + axisTick: { show: false }, splitLine: { show: false }, + axisPointer: { label: { show: false } }, + }) + + const isFixedRange = !!def.yAxisConfig + yAxes.push({ + scale: !isFixedRange, + ...(isFixedRange ? def.yAxisConfig : {}), + gridIndex: gridIdx, + splitNumber: 2, + axisLine: { show: false }, axisTick: { show: false }, + splitLine: { lineStyle: { color: theme.grid } }, + axisLabel: { + show: true, color: theme.text, fontSize: 9, + fontFamily: 'JetBrains Mono, monospace', + }, + }) + + xAxisIndices.push(xAxisIdx) + + const subSeries = def.buildSeries(data) + subSeries.forEach((s: any) => { + series.push({ ...s, xAxisIndex: xAxisIdx, yAxisIndex: yAxisIdx }) + }) + + curTop += INFO_BAR_H + def.height + SUB_GAP_PX + }) + + // 子图信息栏 graphic + const subStartTop = topPad + candleAvail + candleBottomPad + const infoGraphics = buildSubInfoGraphics(data, infoIdx, activeIndicators, subStartTop, theme) + + return { + animation: false, + backgroundColor: theme.bg, + tooltip: { + trigger: 'axis', + axisPointer: { type: 'cross', crossStyle: { color: theme.crosshair } }, + backgroundColor: 'transparent', + borderWidth: 0, + textStyle: { fontSize: 0 }, + formatter: () => '', + }, + axisPointer: { + link: [{ xAxisIndex: 'all' }], + label: { + backgroundColor: theme.tooltipBg, + color: theme.tooltipText, + fontFamily: 'JetBrains Mono, monospace', + fontSize: 10, + }, + }, + graphic: infoGraphics.length > 0 ? infoGraphics : undefined, + grid: grids, + xAxis: xAxes, + yAxis: yAxes, + dataZoom: [ + { + type: 'inside', + xAxisIndex: xAxisIndices, + start: 0, + end: 100, + moveOnMouseMove: true, + zoomOnMouseWheel: true, + }, + ], + series, + } +} + + +export function EChartsCandlestick({ + data, + markers, + ranges, + priceLines, + height = 480, + showMA = true, + showInfoBar = true, + showMarkers: showMarkersProp = true, + onToggleMarkers: _onToggleMarkers, + stockInfo, + symbol: _symbol, + linkedPrice, + onDateClick, + visibleBars = 60, + activeIndicators = [], +}: Props) { + const chartTheme = useChartTheme() + const theme = useMemo(() => getTHEME(chartTheme), [chartTheme]) + + const containerRef = useRef(null) + const chartRef = useRef(null) + const dataRef = useRef(data) + dataRef.current = data + const onDateClickRef = useRef(onDateClick) + onDateClickRef.current = onDateClick + + // --- 全部用 ref,避免高频交互触发 React 重渲染 --- + const infoIdxRef = useRef(data.length - 1) + const compactRef = useRef(false) + const userZoomRef = useRef<{ start: number; end: number } | null>(null) + + // 需要在闭包中访问最新值的变量 — 先声明占位,后面赋值 + const activeIndicatorsRef = useRef(activeIndicators) + activeIndicatorsRef.current = activeIndicators + const chartHeightRef = useRef(300) + const subTotalHRef = useRef(0) + const getInfoBarHTMLRef = useRef<() => string>(() => '') + const themeRef = useRef(theme) + themeRef.current = theme + + // 强制刷新信息栏 DOM 的回调 + const infoBarRef = useRef(null) + const triggerInfoBarUpdate = useRef(() => { + const idx = infoIdxRef.current + const curData = dataRef.current + const d = idx >= 0 && idx < curData.length ? curData[idx] : null + if (!d) return + const chart = chartRef.current + if (!chart) return + const subStartTop = chartHeightRef.current - subTotalHRef.current + const infoGraphics = buildSubInfoGraphics(curData, idx, activeIndicatorsRef.current, subStartTop, themeRef.current) + if (infoGraphics.length > 0) { + chart.setOption({ graphic: infoGraphics }, { lazyUpdate: true }) + } + }).current + + // 计算子图总高度 + const activeSubDefs = activeIndicators + .map(key => SUB_CHARTS.find(s => s.key === key)) + .filter((d): d is SubChartDef => !!d) + + let subTotalH = 0 + activeSubDefs.forEach(def => { subTotalH += INFO_BAR_H + def.height }) + if (activeSubDefs.length > 0) subTotalH += activeSubDefs.length * SUB_GAP_PX + + const mainInfoBarH = showInfoBar ? 40 : 0 + const minCandleH = 120 + + const chartHeight = Math.max(height - mainInfoBarH, 8 + minCandleH + 14 + subTotalH) + chartHeightRef.current = chartHeight + subTotalHRef.current = subTotalH + + // 预计算 date→index Map (O(1) 查找) + const dates = useMemo(() => data.map(d => d.date), [data]) + const dateIndexMap = useMemo(() => { + const m = new Map() + dates.forEach((d, i) => m.set(d, i)) + return m + }, [dates]) + + // 计算 dataZoom 初始范围 + const initialZoom = useMemo(() => ({ + start: Math.max(0, 100 - (visibleBars / Math.max(data.length, 1)) * 100), + end: 100, + }), [visibleBars, data.length]) + + // ===== 信息栏 HTML 内容 (基于 infoIdxRef.current) ===== + const getInfoBarHTML = useCallback(() => { + let idx = infoIdxRef.current + let d = idx >= 0 && idx < data.length ? data[idx] : null + // fallback: 如果当前 idx 无数据,取最后一根 K 线 + if (!d && data.length > 0) { + idx = data.length - 1 + d = data[idx] + } + if (!d) return '' + const prev = idx > 0 ? data[idx - 1] : null + const chg = prev ? d.close - prev.close : 0 + const isUp = chg >= 0 + const clr = isUp ? theme.bull : theme.bear + const floatShares = stockInfo?.float_shares + const turnoverRate = floatShares && d.volume ? (d.volume * 100 / floatShares * 100) : null + + let html = `
` + html += `${d.date}` + html += `` + html += `${d.open.toFixed(2)}` + html += `` + html += `${d.high.toFixed(2)}` + html += `` + html += `${d.low.toFixed(2)}` + html += `` + html += `${d.close.toFixed(2)}` + // 涨跌幅 (收盘后, 换手前; 和收间隔一些距离) + if (prev) { + const chgPct = (chg / prev.close * 100) + html += `${isUp ? '+' : ''}${chgPct.toFixed(2)}%` + } + if (turnoverRate != null) { + html += `换手` + html += `${turnoverRate.toFixed(2)}%` + } + html += `
` + + // 第二行: MA + BOLL + if (showMA) { + html += `
` + if (d.ma5 != null) html += `MA5:${Number(d.ma5).toFixed(2)}` + if (d.ma10 != null) html += `MA10:${Number(d.ma10).toFixed(2)}` + if (d.ma20 != null) html += `MA20:${Number(d.ma20).toFixed(2)}` + if (d.ma60 != null) html += `MA60:${Number(d.ma60).toFixed(2)}` + if (d.boll_upper != null && activeIndicators.includes('boll')) { + html += `BOLL:${Number(d.boll_upper).toFixed(2)}/${Number(d.ma20).toFixed(2)}/${Number(d.boll_lower).toFixed(2)}` + } + html += `
` + } + + return html + }, [data, stockInfo, showMA, activeIndicators, theme]) + getInfoBarHTMLRef.current = getInfoBarHTML + + // data 变化时重置 infoIdx + useEffect(() => { + infoIdxRef.current = data.length - 1 + compactRef.current = false + userZoomRef.current = null + }, [data.length]) + + // ===== 初始化 chart (只在 chartHeight 变化时重建) ===== + useEffect(() => { + const el = containerRef.current + if (!el) return + + const chart = echarts.init(el, undefined, { renderer: 'canvas' }) + chartRef.current = chart + + // 鼠标移动 → 只更新 ref + DOM,不触发 React re-render + // 设计原则: 找不到有效数据时保持上次显示,永远不清空信息栏 + chart.on('updateAxisPointer', (event: any) => { + const axesInfo = event.axesInfo + if (!axesInfo) return // 鼠标移出图表区域,保持当前显示 + for (const info of Object.values(axesInfo)) { + const val = (info as any)?.value + if (val == null) continue + const d = dataRef.current + const idx = typeof val === 'number' ? val : d.findIndex(x => x.date === val) + if (idx >= 0 && idx < d.length) { + if (infoIdxRef.current === idx) return + infoIdxRef.current = idx + + // 直接更新信息栏 DOM (通过 ref 读取最新的生成函数) + const infoEl = infoBarRef.current + if (infoEl) { + const html = getInfoBarHTMLRef.current() + if (html) infoEl.innerHTML = html // 只在有内容时更新 + } + + // 更新子图 graphic + triggerInfoBarUpdate() + return + } + } + // 没有找到有效数据 — 不做任何操作,保持上次显示 + }) + + chart.on('click', (params: any) => { + if (params.componentType === 'markPoint' && params.name) { + onDateClickRef.current?.(params.name) + return + } + if (params.seriesName !== 'K' || params.dataIndex == null) return + const d = dataRef.current + const idx = params.dataIndex + if (idx >= 0 && idx < d.length) { + onDateClickRef.current?.(d[idx].date) + } + }) + + // dataZoom → 只更新 ref,不触发 React re-render + // compact 变化时需要增量更新 markPoint + chart.on('dataZoom', () => { + const opt = chart.getOption() as any + const zoom = opt?.dataZoom?.[0] + if (!zoom) return + userZoomRef.current = { start: zoom.start, end: zoom.end } + + const d = dataRef.current + const total = d.length + const visibleCount = Math.round(total * (zoom.end - zoom.start) / 100) + const newCompact = visibleCount > COMPACT_THRESHOLD + if (newCompact !== compactRef.current) { + compactRef.current = newCompact + // compact 变了需要更新 markPoint,但只更新 markPoint series + // 通过 dispatch 自定义事件来增量更新 + updateMarkPoints() + } + }) + + const ro = new ResizeObserver(() => { chart.resize() }) + ro.observe(el) + + return () => { + chart.off('updateAxisPointer') + chart.off('click') + chart.off('dataZoom') + ro.disconnect() + chart.dispose() + chartRef.current = null + } + }, [chartHeight]) // eslint-disable-line react-hooks/exhaustive-deps + + // 增量更新 markPoint (compact 切换时) + function updateMarkPoints() { + const chart = chartRef.current + if (!chart) return + const mkrs = showMarkersProp ? markers : undefined + if (!mkrs || mkrs.length === 0) return + const compact = compactRef.current + const markPointData: any[] = [] + for (const m of mkrs) { + const idx = dateIndexMap.get(m.date) + if (idx == null) continue + const d = data[idx] + const isBuy = m.kind === 'buy' + const isSell = m.kind === 'sell' + if (m.above) { + const dotColor = m.color ?? (isBuy ? '#FACC15' : theme.text) + if (compact) { + markPointData.push({ + name: m.date, coord: [m.date, d.high], + symbol: 'circle', symbolSize: 4, symbolOffset: [0, -10], + itemStyle: { color: dotColor, cursor: 'pointer' }, + label: { show: false }, z: 100, zlevel: 10, + }) + } else { + markPointData.push({ + name: m.date, coord: [m.date, d.high], + symbol: 'circle', symbolSize: 12, symbolOffset: [0, -2], + itemStyle: { color: 'transparent' }, + label: { + show: true, formatter: m.label ?? '', position: 'top', distance: 0, + color: dotColor, fontSize: 10, fontWeight: 'normal', + fontFamily: 'JetBrains Mono, monospace', + }, + z: 100, zlevel: 10, + }) + } + } else { + markPointData.push({ + name: m.label ?? '', + coord: [m.date, isBuy ? d.low : d.high], + symbol: 'arrow', symbolSize: 12, + symbolRotate: isBuy ? 0 : 180, + symbolOffset: isBuy ? [0, '60%'] : [0, '-60%'], + itemStyle: { color: isBuy ? theme.bull : isSell ? theme.bear : theme.text }, + label: { + show: !!m.label, formatter: m.label ?? '', + position: isBuy ? 'bottom' : 'top', distance: 8, + color: theme.text, fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + }, + }) + } + } + chart.setOption({ + series: [{ + name: 'K', + markPoint: markPointData.length > 0 ? { data: markPointData, animation: false } : undefined, + }] + }) + } + + // ===== 核心: 仅在数据/配置变更时全量 setOption ===== + useEffect(() => { + const chart = chartRef.current + if (!chart) return + + const option = buildOption( + data, dates, dateIndexMap, + showMarkersProp ? markers : undefined, + ranges, + priceLines, + showMA, compactRef.current, + activeIndicators, chartHeight, + infoIdxRef.current, + linkedPrice, + theme, + ) + + chart.setOption(option, true) + + // 恢复用户缩放位置 + const zoom = userZoomRef.current + if (zoom) { + chart.dispatchAction({ type: 'dataZoom', start: zoom.start, end: zoom.end }) + } else { + chart.dispatchAction({ type: 'dataZoom', start: initialZoom.start, end: initialZoom.end }) + } + + // 初始信息栏 + const infoEl = infoBarRef.current + if (infoEl) { + infoEl.innerHTML = getInfoBarHTML() + } + }, [data, markers, ranges, priceLines, linkedPrice, showMA, showMarkersProp, activeIndicators, chartHeight, dates, dateIndexMap, initialZoom, getInfoBarHTML, theme]) + + // 渲染信息栏容器 (内容由 JS 直接写入) + const initialHTML = useMemo(() => { + const idx = data.length - 1 + const d = idx >= 0 && idx < data.length ? data[idx] : null + if (!d) return '' + const floatShares = stockInfo?.float_shares + const turnoverRate = floatShares && d.volume ? (d.volume * 100 / floatShares * 100) : null + let html = `
` + html += `${d.date}` + html += `` + html += `${d.open.toFixed(2)}` + html += `` + html += `${d.high.toFixed(2)}` + html += `` + html += `${d.low.toFixed(2)}` + html += `` + const prevClose0 = data[idx-1]?.close ?? d.close + const clr0 = d.close >= prevClose0 ? theme.bull : theme.bear + html += `${d.close.toFixed(2)}` + // 涨跌幅 (收盘后, 换手前; 和收间隔一些距离) + if (idx > 0) { + const chgPct0 = ((d.close - prevClose0) / prevClose0 * 100) + html += `${chgPct0 >= 0 ? '+' : ''}${chgPct0.toFixed(2)}%` + } + if (turnoverRate != null) { + html += `换手` + html += `${turnoverRate.toFixed(2)}%` + } + html += `
` + if (showMA) { + html += `
` + if (d.ma5 != null) html += `MA5:${Number(d.ma5).toFixed(2)}` + if (d.ma10 != null) html += `MA10:${Number(d.ma10).toFixed(2)}` + if (d.ma20 != null) html += `MA20:${Number(d.ma20).toFixed(2)}` + if (d.ma60 != null) html += `MA60:${Number(d.ma60).toFixed(2)}` + if (d.boll_upper != null && activeIndicators.includes('boll')) { + html += `BOLL:${Number(d.boll_upper).toFixed(2)}/${Number(d.ma20).toFixed(2)}/${Number(d.boll_lower).toFixed(2)}` + } + html += `
` + } + return html + }, [data, stockInfo, showMA, activeIndicators, theme]) + + return ( +
+ {/* 主图信息栏 — 内容由 JS 直接操作 innerHTML */} + {showInfoBar && ( +
+ )} + + {/* ECharts canvas */} +
+
+ ) +} diff --git a/frontend/src/components/EChartsIntraday.tsx b/frontend/src/components/EChartsIntraday.tsx new file mode 100644 index 0000000..264bc7a --- /dev/null +++ b/frontend/src/components/EChartsIntraday.tsx @@ -0,0 +1,613 @@ +import { useEffect, useMemo, useRef, useState } from 'react' +import * as echarts from 'echarts' +import type { ECharts, EChartsOption } from 'echarts' +import type { MinuteKlineRow } from '@/lib/api' +import { useChartTheme, type ChartTheme } from '@/lib/chartTheme' + +type YMode = 'adaptive' | 'limit' + +function getTHEME(ct: ChartTheme) { + return { + line: '#3B82F6', + areaFill: 'rgba(59,130,246,0.40)', + avgLine: '#F59E0B', + refLine: ct.crosshair, + volUp: 'rgba(240,68,56,0.6)', + volDown: 'rgba(18,183,106,0.6)', + text: ct.text, + grid: ct.splitLine, + border: ct.axisLine, + tooltipBg: ct.tooltipBg, + tooltipBorder: ct.tooltipBorder, + tooltipText: ct.tooltipText, + crosshair: ct.crosshair, + } +} + +interface Props { + data: MinuteKlineRow[] + height?: number + prevClose?: number + date?: string + symbol?: string + onPriceHover?: (price: number | null) => void + showLimitLines?: boolean + showAvgLine?: boolean +} + +function fmtTime(dt: string): string { + const match = dt.match(/(\d{2}):(\d{2})/) + if (!match) return dt.slice(11, 16) + const h = (parseInt(match[1]) + 8) % 24 + return `${String(h).padStart(2, '0')}:${match[2]}` +} + +function computeAvgPrice(data: MinuteKlineRow[]): number[] { + // 分时均线 = 累计成交额 / 累计成交量(手→股) + const result: number[] = [] + let sumAmt = 0 + let sumVol = 0 + for (const d of data) { + sumAmt += d.amount + sumVol += d.volume * 100 + result.push(sumVol > 0 ? sumAmt / sumVol : d.close) + } + return result +} + +function fmtAmt(v: number): string { + if (v >= 1_000_000_000) return `${(v / 1_000_000_000).toFixed(2)}亿` + if (v >= 10_000) return `${(v / 10_000).toFixed(0)}万` + return v.toFixed(0) +} + +function isValidPrice(v: number | null | undefined): v is number { + return typeof v === 'number' && Number.isFinite(v) && v > 0 +} + +/** 生成全天分时时间刻度 9:30 ~ 11:30, 13:00 ~ 15:00, 每分钟一个点 (共242个) */ +function generateFullDayTimes(): string[] { + const times: string[] = [] + // 上午 9:30 ~ 11:30 (121 分钟) + for (let h = 9; h <= 11; h++) { + const startM = h === 9 ? 30 : 0 + const endM = h === 11 ? 30 : 59 + for (let m = startM; m <= endM; m++) { + times.push(`${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`) + } + } + // 下午 13:00 ~ 15:00 (121 分钟) + for (let h = 13; h <= 15; h++) { + const endM = h === 15 ? 0 : 59 + for (let m = 0; m <= endM; m++) { + times.push(`${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`) + } + } + return times +} + +const FULL_DAY_TIMES = generateFullDayTimes() + +/** 根据 symbol 判断涨跌停幅度 (创业板/科创板 ±20%, 北交所 ±30%, 其余 ±10%) */ +function getLimitPct(symbol?: string): number { + if (!symbol) return 0.10 + if (symbol.endsWith('.BJ')) return 0.30 // 北交所 + if (symbol.startsWith('300') || symbol.startsWith('301')) return 0.20 // 创业板 + if (symbol.startsWith('688') || symbol.startsWith('689')) return 0.20 // 科创板 + return 0.10 +} + +/** 计算实际涨跌停价 (四舍五入到2位小数) 和实际涨跌停幅度 */ +function getLimitPrices(prevClose: number, symbol?: string): { + limitUp: number // 涨停价 (四舍五入) + limitDown: number // 跌停价 (四舍五入) + upPct: number // 实际涨停幅度 (如 9.97) + downPct: number // 实际跌停幅度 (如 -9.97) +} { + const pct = getLimitPct(symbol) + const rawUp = prevClose * (1 + pct) + const rawDown = prevClose * (1 - pct) + // A股涨跌停价四舍五入到分 (2位小数) + const limitUp = Math.round(rawUp * 100) / 100 + const limitDown = Math.round(rawDown * 100) / 100 + const upPct = (limitUp - prevClose) / prevClose * 100 + const downPct = (limitDown - prevClose) / prevClose * 100 + return { limitUp, limitDown, upPct, downPct } +} + +function buildOption( + data: MinuteKlineRow[], + prevClose: number | undefined, + avgPrices: number[], + lineColor: string, + areaColor: string, + yMode: YMode, + theme: ReturnType, + symbol?: string, + showLimitLines = true, + showAvgLine = true, +): EChartsOption { + // 将数据映射到全天时间轴上的正确位置 + const timeIndexMap = new Map(FULL_DAY_TIMES.map((t, i) => [t, i])) + const closes = new Array(FULL_DAY_TIMES.length).fill(null) as (number | null)[] + const highs = new Array(FULL_DAY_TIMES.length).fill(null) as (number | null)[] + const lows = new Array(FULL_DAY_TIMES.length).fill(null) as (number | null)[] + const avgData = new Array(FULL_DAY_TIMES.length).fill(null) as (number | null)[] + const volumes = new Array(FULL_DAY_TIMES.length).fill(null) as (any | null)[] + + const volNeutral = 'rgba(161,161,170,0.5)' + for (let i = 0; i < data.length; i++) { + const timeKey = fmtTime(data[i].datetime) + const idx = timeIndexMap.get(timeKey) + if (idx !== undefined) { + closes[idx] = data[i].close + highs[idx] = data[i].high + lows[idx] = data[i].low + avgData[idx] = avgPrices[i] + volumes[idx] = { + value: data[i].volume, + itemStyle: { + color: data[i].close > data[i].open ? theme.volUp : data[i].close < data[i].open ? theme.volDown : volNeutral, + }, + } + } + } + + const areaStyle: any = { + color: { + type: 'linear', + x: 0, y: 0, x2: 0, y2: 1, + colorStops: [ + { offset: 0, color: areaColor }, + { offset: 1, color: 'rgba(0,0,0,0)' }, + ], + }, + } + + const markLineData: any[] = [] + if (prevClose != null) { + markLineData.push({ + yAxis: prevClose, + lineStyle: { color: theme.refLine, type: 'dashed', width: 1 }, + label: { show: false }, + symbol: 'none', + }) + } + + let yMin: number | undefined + let yMax: number | undefined + let maxDiff = 0 + if (isValidPrice(prevClose) && data.length > 0) { + const priceArrays = showAvgLine ? [closes, highs, lows, avgData] : [closes, highs, lows] + for (const arr of priceArrays) { + for (const v of arr) { + if (!isValidPrice(v)) continue + const diff = Math.abs(v - prevClose) + if (diff > maxDiff) maxDiff = diff + } + } + + if (showLimitLines && yMode === 'limit') { + const { limitUp, limitDown } = getLimitPrices(prevClose, symbol) + const limitDiffUp = limitUp - prevClose + const limitDiffDown = prevClose - limitDown + const limitDiff = Math.max(limitDiffUp, limitDiffDown) + // 涨跌停模式: Y 轴按实际涨跌停价 + maxDiff = limitDiff + yMin = prevClose - maxDiff + yMax = prevClose + maxDiff + // 加 markLine 标注涨停价和跌停价 (仅虚线, 不显示文字) + markLineData.push( + { + yAxis: limitUp, + lineStyle: { color: 'rgba(199,64,64,0.4)', type: 'dashed', width: 1 }, + label: { show: false }, + symbol: 'none', + }, + { + yAxis: limitDown, + lineStyle: { color: 'rgba(45,155,101,0.4)', type: 'dashed', width: 1 }, + label: { show: false }, + symbol: 'none', + }, + ) + } else { + // 自适应模式: Y 轴按实际涨跌幅对称, 但不超出实际涨跌停范围 + if (showLimitLines) { + const { limitUp, limitDown } = getLimitPrices(prevClose, symbol) + const limitDiff = Math.max(limitUp - prevClose, prevClose - limitDown) + maxDiff = Math.min(maxDiff, limitDiff) + } + if (!showLimitLines && maxDiff > 0) { + maxDiff *= 1.1 + } + // 至少保证一个可视范围 (防止数据平时 maxDiff=0)。指数不使用涨跌停范围,最小范围要更紧,否则低波动指数会被压成横线。 + const minDiff = showLimitLines ? prevClose * 0.01 : prevClose * 0.001 + if (maxDiff < minDiff) maxDiff = minDiff + yMin = prevClose - maxDiff + yMax = prevClose + maxDiff + } + } + + // x 轴标签: 9:30, 10:30, 11:30/13:00, 14:00, 15:00 + // 11:30(idx 120) 和 13:00(idx 121) 相邻会重叠, 合并为一个标签 + const xAxisLabelMap: Record = { + 0: '9:30', + 60: '10:30', + 120: '11:30/13:00', + 181: '14:00', + 241: '15:00', + } + const xAxisLabelFormatter = (_value: string, idx: number) => { + return xAxisLabelMap[idx] ?? '' + } + + return { + animation: false, + backgroundColor: 'transparent', + tooltip: { + trigger: 'axis', + backgroundColor: 'transparent', + borderWidth: 0, + textStyle: { fontSize: 0 }, + formatter: () => '', + axisPointer: { + type: 'cross', + label: { + show: true, + backgroundColor: theme.tooltipBg, + borderColor: theme.tooltipBorder, + borderWidth: 1, + padding: [2, 5], + color: theme.text, + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + }, + crossStyle: { color: theme.crosshair, type: 'dashed', width: 1 }, + lineStyle: { color: theme.crosshair, type: 'dashed', width: 1 }, + }, + }, + axisPointer: { + link: [{ xAxisIndex: 'all' }], + }, + grid: [ + { left: 60, right: 55, top: 24, bottom: '28%' }, + { left: 60, right: 55, top: '74%', bottom: 20 }, + ], + xAxis: [ + { + type: 'category', + data: FULL_DAY_TIMES, + boundaryGap: false, + axisPointer: { + show: true, + lineStyle: { color: theme.crosshair, type: 'dashed', width: 1 }, + label: { + show: true, + backgroundColor: theme.tooltipBg, + borderColor: theme.tooltipBorder, + borderWidth: 1, + padding: [2, 4], + color: theme.text, + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + formatter: (params: any) => { + return params.value ?? '' + }, + }, + }, + axisLine: { show: false }, + axisLabel: { + color: theme.text, + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + formatter: xAxisLabelFormatter, + interval: 0, + }, + axisTick: { show: false }, + splitLine: { + show: true, + lineStyle: { color: theme.grid }, + }, + }, + { + type: 'category', + gridIndex: 1, + data: FULL_DAY_TIMES, + boundaryGap: false, + axisLine: { show: false }, + axisLabel: { show: false }, + axisTick: { show: false }, + splitLine: { show: false }, + }, + ], + yAxis: [ + { + type: 'value', + min: yMin, + max: yMax, + interval: maxDiff || undefined, + splitArea: { show: false }, + axisLine: { show: false }, + axisTick: { show: false }, + splitLine: { lineStyle: { color: theme.grid } }, + axisPointer: { + label: { + formatter: (params: any) => { + const v = params.value + return typeof v === 'number' ? v.toFixed(2) : '' + }, + }, + }, + axisLabel: { + color: theme.text, + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + formatter: (v: number) => v.toFixed(2), + }, + }, + { + scale: true, + gridIndex: 1, + splitNumber: 2, + axisLine: { show: false }, + axisTick: { show: false }, + splitLine: { show: false }, + axisLabel: { show: false }, + }, + ...(isValidPrice(prevClose) && yMin != null && yMax != null ? [{ + type: 'value' as const, + position: 'right' as const, + gridIndex: 0, + min: yMin, + max: yMax, + interval: maxDiff || undefined, + splitArea: { show: false }, + axisLine: { show: false }, + axisTick: { show: false }, + splitLine: { show: false }, + axisPointer: { + label: { + formatter: (params: any) => { + const v = params.value + if (typeof v !== 'number') return '' + const pct = (v - prevClose) / prevClose * 100 + if (Math.abs(pct) < 0.01) return '0.00%' + return (pct > 0 ? '+' : '') + pct.toFixed(2) + '%' + }, + }, + }, + axisLabel: { + color: theme.text, + fontSize: 10, + fontFamily: 'JetBrains Mono, monospace', + formatter: (v: number) => { + const pct = (v - prevClose) / prevClose * 100 + if (Math.abs(pct) < 0.01) return '0.00%' + return (pct > 0 ? '+' : '') + pct.toFixed(2) + '%' + }, + }, + }] : []), + ], + series: [ + { + name: '价格', + type: 'line', + data: closes, + smooth: false, + symbol: 'none', + cursor: 'crosshair', + lineStyle: { width: 1.2, color: lineColor }, + areaStyle, + connectNulls: true, + markLine: markLineData.length > 0 ? { symbol: 'none', data: markLineData, animation: false, silent: true } : undefined, + }, + ...(showAvgLine ? [{ + name: '均价', + type: 'line' as const, + data: avgData, + smooth: false, + symbol: 'none', + cursor: 'crosshair', + lineStyle: { width: 1, color: theme.avgLine }, + connectNulls: true, + }] : []), + { + name: '成交量', + type: 'bar', + data: volumes, + xAxisIndex: 1, + yAxisIndex: 1, + cursor: 'crosshair', + }, + ], + } +} + +export function EChartsIntraday({ data, height = 320, prevClose, date, symbol, onPriceHover, showLimitLines = true, showAvgLine = true }: Props) { + const chartTheme = useChartTheme() + const theme = useMemo(() => getTHEME(chartTheme), [chartTheme]) + + const containerRef = useRef(null) + const chartRef = useRef(null) + const roRef = useRef(null) + const moRef = useRef(null) + const dataRef = useRef(data) + dataRef.current = data + const onPriceHoverRef = useRef(onPriceHover) + onPriceHoverRef.current = onPriceHover + // 全日索引 → 数据数组索引 的映射 (ref 避免重建 chart) + const fullDayToDataIdx = useRef>(new Map()) + + const [infoIdx, setInfoIdx] = useState(data.length - 1) + const [yMode, setYMode] = useState('adaptive') + const avgPrices = useMemo(() => computeAvgPrice(data), [data]) + + // 分时线颜色:基于最新价 vs 昨收 + const lastClose = data.length > 0 ? data[data.length - 1].close : null + const lineIsUp = lastClose != null && prevClose != null ? lastClose > prevClose : true + const lineIsFlat = lastClose != null && prevClose != null ? lastClose === prevClose : false + const lineColor = lineIsFlat ? '#A1A1AA' : lineIsUp ? '#C74040' : '#2D9B65' + const areaFill = lineIsFlat ? 'rgba(180,180,190,0.40)' : lineIsUp ? 'rgba(199,64,64,0.40)' : 'rgba(34,197,94,0.40)' + + useEffect(() => { + setInfoIdx(data.length - 1) + }, [data.length]) + + useEffect(() => { + const el = containerRef.current + if (!el) return + + let chart = chartRef.current + if (!chart) { + chart = echarts.init(el, undefined, { renderer: 'canvas' }) + chartRef.current = chart + // 强制 canvas 使用十字光标,覆盖 ECharts 默认的 pointer + const forceCursor = () => { + const canvases = el.querySelectorAll('canvas') + canvases.forEach(c => { c.style.setProperty('cursor', 'crosshair', 'important') }) + } + forceCursor() + // MutationObserver: ECharts 内部可能重建/修改 canvas 属性,持续强制 cursor + const mo = new MutationObserver(forceCursor) + mo.observe(el, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }) + moRef.current = mo + roRef.current = new ResizeObserver(() => { + chart!.resize() + forceCursor() + }) + roRef.current.observe(el) + + chart.on('updateAxisPointer', (event: any) => { + const axesInfo = event.axesInfo + if (!axesInfo) return + for (const info of Object.values(axesInfo)) { + const val = (info as any)?.value + if (val == null) continue + const fullDayIdx = typeof val === 'number' ? val : -1 + if (fullDayIdx >= 0) { + const dataIdx = fullDayToDataIdx.current.get(fullDayIdx) ?? -1 + setInfoIdx(dataIdx) + const d = dataRef.current + if (dataIdx >= 0 && dataIdx < d.length) { + onPriceHoverRef.current?.(d[dataIdx].close) + } + return + } + } + }) + + chart.on('globalout', () => { + onPriceHoverRef.current?.(null) + }) + } + + if (data.length > 0) { + // 构建全日索引 → 数据索引 的映射 + const timeIndexMap = new Map(FULL_DAY_TIMES.map((t, i) => [t, i])) + const mapping = new Map() + for (let i = 0; i < data.length; i++) { + const timeKey = fmtTime(data[i].datetime) + const fullDayIdx = timeIndexMap.get(timeKey) + if (fullDayIdx !== undefined) { + mapping.set(fullDayIdx, i) + } + } + fullDayToDataIdx.current = mapping + + chart.setOption(buildOption(data, prevClose, avgPrices, lineColor, areaFill, yMode, theme, symbol, showLimitLines, showAvgLine), true) + } else { + chart.clear() + } + }, [data, prevClose, height, lineColor, areaFill, yMode, symbol, showLimitLines, showAvgLine, theme]) + + useEffect(() => { + return () => { + chartRef.current?.off('updateAxisPointer') + chartRef.current?.off('globalout') + moRef.current?.disconnect() + roRef.current?.disconnect() + chartRef.current?.dispose() + chartRef.current = null + moRef.current = null + roRef.current = null + } + }, []) + + const d = infoIdx >= 0 && infoIdx < data.length ? data[infoIdx] : null + const avg = d != null ? avgPrices[infoIdx] : null + const chg = d && prevClose != null ? d.close - prevClose : null + const isUp = chg != null ? chg > 0 : true + const isFlat = chg != null ? chg === 0 : false + const priceClr = isFlat ? '#A1A1AA' : isUp ? '#C74040' : '#2D9B65' + + return ( +
+ {/* 按钮行: 切换式按钮组, 居右 */} + {showLimitLines &&
+
+ +
+ +
+
} +
+ {/* 第一行: 日期 + OHLC */} +
+ {!d && } + {d && ( + <> + {date && {date}} + + {d.open.toFixed(2)} + + {d.high.toFixed(2)} + + {d.low.toFixed(2)} + + {d.close.toFixed(2)} + + )} +
+ {/* 第二行: 价格+均价+量+额 */} +
+ {d && ( + <> + + + {d.close.toFixed(2)} + + {showAvgLine && + + {avg?.toFixed(2)} + } + + {d.volume.toFixed(0)} + + {fmtAmt(d.amount)} + + )} +
+
+
+
+ ) +} diff --git a/frontend/src/components/EmptyState.tsx b/frontend/src/components/EmptyState.tsx new file mode 100644 index 0000000..3132e90 --- /dev/null +++ b/frontend/src/components/EmptyState.tsx @@ -0,0 +1,20 @@ +import { type LucideIcon, Construction } from 'lucide-react' + +interface Props { + icon?: LucideIcon + title: string + hint?: string +} + +// §6.0.5 四态评审 — empty 状态:图示 + 引导,而不是一句"暂无数据" +export function EmptyState({ icon: Icon = Construction, title, hint }: Props) { + return ( +
+
+ +

{title}

+ {hint &&

{hint}

} +
+
+ ) +} diff --git a/frontend/src/components/EndpointTestDialog.tsx b/frontend/src/components/EndpointTestDialog.tsx new file mode 100644 index 0000000..ac2e7e7 --- /dev/null +++ b/frontend/src/components/EndpointTestDialog.tsx @@ -0,0 +1,263 @@ +import { useState } from 'react' +import { useQuery, useQueryClient } from '@tanstack/react-query' +import { motion, AnimatePresence } from 'framer-motion' +import { Wifi, Play, Loader2, X, Check, Crown } from 'lucide-react' +import { api, type EndpointItem } from '@/lib/api' +import { QK } from '@/lib/queryKeys' +import { EXPERT_RANK, tierRank } from '@/lib/capability-labels' + +interface EpResult { + ok: boolean + median_ms?: number | null + min_ms?: number | null + max_ms?: number | null + rounds?: number + success?: number + error?: string +} + +export function EndpointTestDialog({ hasKey, tierLabel, currentEndpoint, onClose }: { hasKey: boolean; tierLabel: string; currentEndpoint: string; onClose: () => void }) { + const qc = useQueryClient() + const [results, setResults] = useState>({}) + const [testing, setTesting] = useState>({}) + const [switching, setSwitching] = useState(null) + + // 动态加载端点清单 —— 前端无法跨域直连数据源官网,走后端代理 + const { data, isLoading } = useQuery({ + queryKey: QK.endpoints, + queryFn: api.listEndpoints, + staleTime: 5 * 60 * 1000, + }) + + const endpoints = data?.endpoints ?? [] + const isFallback = data?.source === 'fallback' + const testRounds = data?.testRounds + + async function testOne(url: string) { + setTesting(prev => ({ ...prev, [url]: true })) + setResults(prev => ({ ...prev, [url]: null })) + try { + const res = await api.testEndpoint(url, testRounds) + setResults(prev => ({ ...prev, [url]: res })) + } catch (e: any) { + setResults(prev => ({ ...prev, [url]: { ok: false, error: e?.message ?? '请求失败' } })) + } finally { + setTesting(prev => ({ ...prev, [url]: false })) + } + } + + async function testAll() { + setResults({}) + await Promise.all(endpoints.map(ep => testOne(ep.url))) + } + + const anyTesting = Object.values(testing).some(Boolean) + const isFree = !hasKey + // 专线端点需 Expert 及以上套餐;Free 模式必然不可用 + const canUsePremium = !isFree && tierRank(tierLabel) >= EXPERT_RANK + const currentLabel = endpoints.find(ep => ep.url === currentEndpoint)?.label ?? currentEndpoint + + async function applyEndpoint(url: string) { + setSwitching(url) + try { + await api.switchEndpoint(url) + await qc.invalidateQueries({ queryKey: QK.settings }) + onClose() + } catch { + // 错误由 query 处理 + } finally { + setSwitching(null) + } + } + + return ( + +
+ + + {/* 顶栏 */} +
+
+ + 端点测速 +
+
+ {isFree && ( + Free 模式 + )} + + +
+
+ + {/* 当前使用 */} +
+ + 当前使用 + {currentLabel} + {currentEndpoint.replace('https://', '')} +
+ + {/* Free 模式提示 —— 以下均为 Starter+ 付费端点 */} + {isFree && ( +
+ + 以下均为 Starter+ 付费端点,Free 模式不可使用。配置 API Key 后可自动切换并测速选优。 + +
+ )} + + {/* 端点列表 —— 可滚动区,顶栏/当前使用/底栏始终可见 */} +
+ {isLoading ? ( +
+ + 加载端点列表… +
+ ) : endpoints.length === 0 ? ( +
未能加载端点列表
+ ) : ( + endpoints.map(ep => ( + + )) + )} +
+ + {isFallback ? ( + 远程获取失败,显示内置列表 + ) : null} +
+
+
+ ) +} + +function EpRow({ ep, result, testing, isCurrent, isFree, canUsePremium, switching, onApply }: { + ep: EndpointItem + result: EpResult | null + testing?: boolean + isCurrent?: boolean + isFree?: boolean + canUsePremium?: boolean + switching: string | null + onApply: (url: string) => void +}) { + const isError = result && !result.ok + const canApply = result?.ok && !testing && !isCurrent + const isPremium = ep.premium === true + const median = result?.median_ms + + return ( +
+
+ {/* 第1行:label + 徽章(左) / 中位延迟(右) */} +
+
+ {ep.label} + {isPremium && ( + + + 专线 + + )} + {isCurrent && ( + 使用中 + )} +
+ {/* 中位延迟 —— 测试中/前/后都占位,避免高度跳动 */} + + {isFree ? ( + // Free 模式:普通付费端点需 Starter+,premium 端点需 Expert+ + + {isPremium ? 'Expert+' : 'Starter+'} + + ) : testing ? ( + 测试中… + ) : result && result.ok && median != null ? ( + + {median} ms + + ) : result && !result.ok ? ( + {result.error ?? '不可达'} + ) : ( + + )} + +
+ + {/* 第2行:description */} + {ep.description} + + {/* 第3行:URL(左) / min~max·成功率(右) —— 副信息始终占位,行数不变 */} +
+ {ep.url.replace('https://', '')} + + {result && result.ok && result.min_ms != null + ? `${result.min_ms}~${result.max_ms} · ${result.success}/${result.rounds}` + : '\u00A0'} + +
+
+ + {/* 应用按钮区域 —— Free 模式不可用任何付费端点;专线端点需 Expert+ */} + {isFree ? null : (isPremium && !canUsePremium) ? ( + // 专线端点:需 Expert 及以上套餐权限,当前套餐不足,不可应用 + + + Expert+ + + ) : canApply ? ( + + ) : null} +
+ ) +} diff --git a/frontend/src/components/ExtDimensionAnalysis.tsx b/frontend/src/components/ExtDimensionAnalysis.tsx new file mode 100644 index 0000000..30b04cf --- /dev/null +++ b/frontend/src/components/ExtDimensionAnalysis.tsx @@ -0,0 +1,436 @@ +import { useMemo, useState, type ComponentType } from 'react' +import { useQuery } from '@tanstack/react-query' +import { + BarChart3, + CalendarDays, + Database, + Layers3, + Search, + Tags, + TrendingUp, + Users, +} from 'lucide-react' +import { PageHeader } from '@/components/PageHeader' +import { api, type AnalysisColumn, type ExtDataConfig, type ExtDataField } from '@/lib/api' +import { QK } from '@/lib/queryKeys' + +interface DimensionAnalysisProps { + menuId?: string + title?: string + subtitle?: string + kindLabel?: string + emptyHint?: string + accentClass?: string + keywords?: string[] + fallbackFieldNames?: string[] +} + +interface DimensionGroup { + key: string + count: number + rows: Record[] + metrics: Record +} + +const PAGE_LIMIT = 5000 +const SEPARATORS = /[、,,;;|/\s]+/ + +function normalizeText(v: unknown): string { + if (v == null) return '' + return String(v).trim() +} + +function fieldLabel(fields: ExtDataField[], name: string): string { + return fields.find(f => f.name === name)?.label || name +} + +function isNumericField(f: ExtDataField) { + return f.dtype === 'int' || f.dtype === 'float' +} + +function scoreConfig(config: ExtDataConfig, keywords: string[]) { + const haystack = [ + config.id, + config.label, + config.description ?? '', + ...config.fields.flatMap(f => [f.name, f.label]), + ].join(' ').toLowerCase() + return keywords.reduce((n, k) => n + (haystack.includes(k.toLowerCase()) ? 1 : 0), 0) +} + +function pickDefaultConfig(configs: ExtDataConfig[], keywords: string[]) { + const ranked = [...configs].sort((a, b) => scoreConfig(b, keywords) - scoreConfig(a, keywords)) + return ranked[0]?.id ?? '' +} + +function pickDefaultDimensionField(config: ExtDataConfig | undefined, fallbackFieldNames: string[]) { + if (!config) return '' + const fields = config.fields.filter(f => f.name !== 'symbol' && f.name !== 'code') + for (const name of fallbackFieldNames) { + const matched = fields.find(f => f.name.toLowerCase().includes(name) || f.label.toLowerCase().includes(name)) + if (matched) return matched.name + } + return fields.find(f => !isNumericField(f))?.name ?? fields[0]?.name ?? '' +} + +function formatNumber(v: unknown, digits = 2) { + if (typeof v !== 'number' || !Number.isFinite(v)) return '—' + return v.toLocaleString('zh-CN', { maximumFractionDigits: digits }) +} + +function formatValue(v: unknown, col?: AnalysisColumn) { + if (v == null || v === '') return '—' + if (typeof v === 'boolean') return v ? '是' : '否' + if (typeof v !== 'number') return String(v) + + const digits = col?.precision ?? (col?.type === 'number' || col?.type === 'amount' || col?.type === 'percent' ? 2 : 2) + if (col?.type === 'percent') return `${formatNumber(v, digits)}%` + if (col?.type === 'amount' || col?.format === 'amount') return formatNumber(v, digits) + return formatNumber(v, digits) +} + +function splitDimensionValues(value: unknown) { + const text = normalizeText(value) + if (!text) return [] + return text.split(SEPARATORS).map(s => s.trim()).filter(Boolean) +} + +function StatCard({ label, value, hint, icon: Icon }: { + label: string + value: string | number + hint: string + icon: ComponentType<{ className?: string }> +}) { + return ( +
+
+ {label} + +
+
{value}
+
{hint}
+
+ ) +} + +function columnsFromFields(fields: ExtDataField[], dimensionField: string, rows: Record[]) { + const numericFields = fields.filter(f => isNumericField(f) && rows.some(r => typeof r[f.name] === 'number')).slice(0, 4) + return [ + ...fields.filter(f => ['symbol', 'code', 'name', '股票简称', '股票代码'].includes(f.name)), + ...fields.filter(f => f.name === dimensionField), + ...numericFields, + ] + .filter((f, i, arr) => arr.findIndex(x => x.name === f.name) === i) + .map(f => ({ + field: f.name, + label: f.label || f.name, + type: isNumericField(f) ? 'number' : 'string', + precision: f.dtype === 'float' ? 2 : null, + sortable: isNumericField(f), + visible: true, + })) +} + +function aggregate(rows: Record[], col: AnalysisColumn) { + if (col.field === '__count') return rows.length + const values = rows.map(r => r[col.field]).filter((v): v is number => typeof v === 'number' && Number.isFinite(v)) + if (!values.length) return null + switch (col.aggregate) { + case 'sum': return values.reduce((a, b) => a + b, 0) + case 'min': return Math.min(...values) + case 'max': return Math.max(...values) + case 'avg': + default: + return values.reduce((a, b) => a + b, 0) / values.length + } +} + +export function ExtDimensionAnalysis({ + menuId, + title, + subtitle, + kindLabel = '维度', + emptyHint = '还没有可用于分析的扩展数据。', + accentClass = 'bg-[radial-gradient(circle_at_top_right,rgba(59,130,246,0.16),transparent_36%)]', + keywords = [], + fallbackFieldNames = [], +}: DimensionAnalysisProps) { + const configs = useQuery({ queryKey: QK.extData, queryFn: api.extDataList }) + const menuQuery = useQuery({ + queryKey: QK.analysisMenu(menuId ?? ''), + queryFn: () => api.analysisMenu(menuId!), + enabled: !!menuId, + }) + const menu = menuQuery.data + + const [selectedConfigId, setSelectedConfigId] = useState('') + const [dimensionField, setDimensionField] = useState('') + const [search, setSearch] = useState('') + const [selectedGroup, setSelectedGroup] = useState(null) + + const availableConfigs = configs.data?.items ?? [] + const activeConfigId = menu?.data_source || selectedConfigId || pickDefaultConfig(availableConfigs, keywords) + const activeConfig = availableConfigs.find(c => c.id === activeConfigId) + const activeDimensionField = menu?.dimension_field || dimensionField || pickDefaultDimensionField(activeConfig, fallbackFieldNames) + const activeTitle = menu?.label || title || '扩展分析' + const activeKindLabel = menu?.template === 'table' ? '数据' : kindLabel + + const configuredColumns = useMemo(() => { + const cols = menu?.detail_columns?.filter(c => c.visible !== false) ?? [] + return cols.length > 0 ? cols : null + }, [menu?.detail_columns]) + const requestedColumns = useMemo(() => { + const cols = [activeDimensionField, ...(configuredColumns?.map(c => c.field) ?? [])].filter(Boolean) + return Array.from(new Set(cols)) + }, [activeDimensionField, configuredColumns]) + const columnsKey = requestedColumns.join(',') + + const rowsQuery = useQuery({ + queryKey: QK.extDataRows(activeConfigId, undefined, PAGE_LIMIT, columnsKey), + queryFn: () => api.extDataRows(activeConfigId, { limit: PAGE_LIMIT, columns: requestedColumns }), + enabled: !!activeConfigId, + }) + + const rows = rowsQuery.data?.rows ?? [] + const baseFields = activeConfig?.fields ?? rowsQuery.data?.fields ?? [] + const fields = rows.some(r => r.name != null) && !baseFields.some(f => f.name === 'name') + ? [...baseFields, { name: 'name', dtype: 'string', label: '名称' }] + : baseFields + const dimensionOptions = fields.filter(f => f.name !== 'symbol' && f.name !== 'code') + const displayColumns = configuredColumns ?? columnsFromFields(fields, activeDimensionField, rows) + const groupColumns = (menu?.group_columns?.length ? menu.group_columns : [ + { field: '__dimension', label: activeKindLabel }, + { field: '__count', label: '股票数', type: 'number' as const, sortable: true }, + ]).filter(c => c.visible !== false) + + const sortedRows = useMemo(() => { + if (!menu?.default_sort?.field) return rows + const factor = menu.default_sort.order === 'asc' ? 1 : -1 + return [...rows].sort((a, b) => { + const av = a[menu.default_sort!.field] + const bv = b[menu.default_sort!.field] + if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * factor + return String(av ?? '').localeCompare(String(bv ?? '')) * factor + }) + }, [rows, menu?.default_sort]) + + const groups = useMemo(() => { + if (!activeDimensionField || menu?.template === 'table' || menu?.template === 'ranking') return [] + const map = new Map[]>() + for (const row of sortedRows) { + const values = splitDimensionValues(row[activeDimensionField]) + for (const value of values) { + const item = map.get(value) ?? [] + item.push(row) + map.set(value, item) + } + } + return [...map.entries()] + .map(([key, itemRows]) => ({ + key, + count: itemRows.length, + rows: itemRows, + metrics: Object.fromEntries(groupColumns.map(col => [col.field, aggregate(itemRows, col)])), + })) + .sort((a, b) => b.count - a.count) + }, [sortedRows, activeDimensionField, groupColumns, menu?.template]) + + const filteredGroups = useMemo(() => { + const q = search.trim().toLowerCase() + if (!q) return groups + return groups.filter(g => g.key.toLowerCase().includes(q)) + }, [groups, search]) + + const currentGroup = filteredGroups.find(g => g.key === selectedGroup) ?? filteredGroups[0] + const tableRows = menu?.template === 'table' || menu?.template === 'ranking' ? sortedRows : (currentGroup?.rows ?? []) + const coveredSymbols = useMemo(() => { + const set = new Set() + rows.forEach(r => { if (r.symbol) set.add(String(r.symbol)) }) + return set.size + }, [rows]) + const missingConfiguredColumns = displayColumns.filter(c => rows.length > 0 && !Object.prototype.hasOwnProperty.call(rows[0], c.field)) + + return ( + <> + + + +
+ } + /> + +
+
+
+
+ + 扩展数据驱动 · 菜单可配置 · 列动态渲染 +
+

{activeTitle}

+

+ 页面按分析菜单配置读取扩展数据源,使用分组字段生成榜单,并严格按照 detail_columns 渲染明细列。 +

+
+
+ +
+
+ + {configs.isLoading || menuQuery.isLoading ? ( +
加载配置中…
+ ) : menuQuery.isError ? ( +
分析菜单不存在或已删除。
+ ) : !activeConfig ? ( +
+ +
{emptyHint}
+
请先在“数据”页面新增扩展数据,并在“扩展分析”中创建分析菜单。
+
+ ) : ( + <> +
+ + + + +
+ + {missingConfiguredColumns.length > 0 && ( +
+ 菜单中有字段在当前数据中不存在:{missingConfiguredColumns.map(c => c.field).join('、')} +
+ )} + +
+ {menu?.template !== 'table' && menu?.template !== 'ranking' && ( +
+
+
+

分组榜单

+

按覆盖标的数量排序

+
+ Top {Math.min(filteredGroups.length, 100)} +
+
+
+ + { setSearch(e.target.value); setSelectedGroup(null) }} + placeholder={`搜索${activeKindLabel}`} + className="h-8 w-full rounded-btn border border-border bg-base pl-8 pr-3 text-xs text-foreground placeholder:text-muted/50 focus:outline-none focus:border-accent/50" + /> +
+
+
+ {filteredGroups.length === 0 ? ( +
没有可展示的分组
+ ) : filteredGroups.slice(0, 100).map((group, i) => { + const active = currentGroup?.key === group.key + return ( + + ) + })} +
+
+ )} + +
+
+
+
+

{menu?.template === 'table' || menu?.template === 'ranking' ? '明细列表' : currentGroup?.key ?? `选择${activeKindLabel}`}

+ {tableRows.length} 条 +
+

列来自菜单 detail_columns:{displayColumns.map(f => f.label || f.field).join(' / ') || '暂无字段'}

+
+
+ + {rowsQuery.data?.date ?? '当前快照'} +
+
+ +
+ + + + {displayColumns.map(col => ( + + ))} + + + + {rowsQuery.isLoading ? ( + + ) : tableRows.length === 0 ? ( + + ) : tableRows.slice(0, 300).map((row, i) => ( + + {displayColumns.map(col => ( + + ))} + + ))} + +
{col.label || col.field}
加载数据中…
暂无明细数据
+ {formatValue(row[col.field], col)} +
+
+ + {tableRows.length > 300 && ( +
仅展示前 300 条明细,共 {tableRows.length} 条
+ )} +
+
+ + )} +
+ + ) +} diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx new file mode 100644 index 0000000..3a4f44f --- /dev/null +++ b/frontend/src/components/Layout.tsx @@ -0,0 +1,539 @@ +import { useEffect, useRef, useState } from 'react' +import { NavLink, Outlet, useNavigate } from 'react-router-dom' +import { useQuery, useQueryClient } from '@tanstack/react-query' +import { motion } from 'framer-motion' +import { useQuoteStream } from '@/lib/useQuoteStream' +import { ToastContainer } from '@/components/Toast' +import { AlertToastContainer } from '@/components/AlertToast' +import { + useCapabilities, + useSettings, + usePreferences, + useQuoteStatus, + useVersion, +} from '@/lib/useSharedQueries' +import { + useToggleRealtimeQuotes, +} from '@/lib/useSharedMutations' +import { QK } from '@/lib/queryKeys' +import { tierRank } from '@/lib/capability-labels' +import { + Star, + ScanSearch, + History, + FileText, + Settings, + Key, + Database, + Timer, + Loader2, + LayoutDashboard, + Tags, + TrendingUp, + Flame, + BarChart3, + Sparkles, + Layers3, + Landmark, + Cable, + RadioTower, + CheckCircle2, +} from 'lucide-react' +import { Logo } from './Logo' +import { useTheme } from './ThemeProvider' +import { api, type IndexQuote } from '@/lib/api' +import { cn } from '@/lib/cn' +import { setCurrentTotal as setAlertTotal, useUnreadAlerts } from '@/lib/monitorBadge' + +// 品牌色 — 只用于 logo / brand 区域,不影响功能语义色 +const BRAND = '#8B5CF6' + +const CORE_INDEXES = [ + { symbol: '000001.SH', name: '上证指数' }, + { symbol: '399001.SZ', name: '深证成指' }, + { symbol: '399006.SZ', name: '创业板指' }, + { symbol: '000680.SH', name: '科创综指' }, +] as const + +type CoreIndex = (typeof CORE_INDEXES)[number] + +const nav = [ + { to: '/', label: '看板', icon: LayoutDashboard }, + { to: '/watchlist', label: '自选', icon: Star }, + { to: '/screener', label: '策略', icon: ScanSearch }, + { to: '/backtest', label: '回测', icon: History }, + { to: '/limit-ladder', label: '连板梯队', icon: Flame }, + { to: '/concept-analysis', label: '概念分析', icon: Layers3 }, + { to: '/industry-analysis', label: '行业分析', icon: Landmark }, + { to: '/stock-analysis', label: '个股分析', icon: TrendingUp }, + { to: '/financials', label: '财务', icon: FileText }, + { to: '/indices', label: '指数', icon: BarChart3 }, + { to: '/trading', label: '交易', icon: Cable }, + { to: '/monitor', label: '监控中心', icon: RadioTower }, + { to: '/data', label: '数据', icon: Database }, +] as const + +function fmtIndexValue(v: number | null | undefined) { + if (v == null || Number.isNaN(Number(v))) return '--' + return Number(v).toFixed(2) +} + +function fmtIndexPct(v: number | null | undefined) { + if (v == null || Number.isNaN(Number(v))) return '--' + return `${Number(v) >= 0 ? '+' : ''}${Number(v).toFixed(2)}%` +} + +function indexPctClass(v: number | null | undefined) { + if (v == null || Number.isNaN(Number(v))) return 'text-muted' + const n = Number(v) + if (n === 0) return 'text-foreground' + return n > 0 ? 'text-bull' : 'text-bear' +} + +/** 监控中心未读徽标 — 仅在非监控页且有未读时显示。 */ +function MonitorBadge({ active }: { active: boolean }) { + const unread = useUnreadAlerts() + // 尊重用户设置: 可在菜单设置里关闭数字提示 + const badgeEnabled = (() => { + try { return localStorage.getItem('monitor_badge_enabled') !== '0' } catch { return true } + })() + if (active || unread <= 0 || !badgeEnabled) return null + return ( + + {unread > 99 ? '99+' : unread} + + ) +} + +function SidebarIndexQuotes({ rows, items }: { rows: IndexQuote[] | undefined; items: CoreIndex[] }) { + if (items.length === 0) return null + const quoteBySymbol = new Map((rows ?? []).map(q => [q.symbol, q])) + return ( +
+ {items.map(item => { + const q = quoteBySymbol.get(item.symbol) + const value = q?.last_price ?? q?.close + const pct = q?.change_pct + return ( + +
+ {item.name} + {fmtIndexPct(pct)} +
+
+ {fmtIndexValue(value)} +
+
+ ) + })} +
+ ) +} + +// ===== 档位卡片 ===== +function TierBadge({ label, hasKey }: { label: string; hasKey?: boolean }) { + const base = label.split(' ')[0].split('+')[0].toLowerCase() + const isNone = base === 'none' + + const tierConfig: Record = { + none: { + desc: '未配置 Key · 仅历史日K', + tagBg: { background: 'rgba(113,113,122,0.15)' }, + dotStyle: { background: '#52525b' }, + labelTextStyle: { color: '#71717a' }, + }, + free: { + desc: '基础日K · 单股查询', + tagBg: { background: 'rgba(113,113,122,0.3)' }, + dotStyle: { background: '#71717a' }, + labelTextStyle: { color: '#a1a1aa' }, + }, + starter: { + desc: '批量同步 · 行情池', + tagBg: { background: 'rgba(59,130,246,0.2)' }, + dotStyle: { background: '#3b82f6' }, + labelTextStyle: { color: '#60a5fa' }, + }, + pro: { + desc: '分钟K · 实时行情 · 盘口', + tagBg: { background: 'linear-gradient(135deg, rgba(168,85,247,0.2), rgba(124,58,237,0.15))' }, + dotStyle: { background: 'linear-gradient(135deg, #a855f7, #7c3aed)' }, + labelTextStyle: { background: 'linear-gradient(135deg, #c084fc, #a855f7)', WebkitBackgroundClip: 'text', backgroundClip: 'text', color: 'transparent' }, + }, + expert: { + desc: 'WebSocket · 财务数据', + tagBg: { background: 'linear-gradient(135deg, rgba(59,130,246,0.2), rgba(168,85,247,0.2), rgba(245,158,11,0.2))' }, + dotStyle: { background: 'linear-gradient(135deg, #3b82f6, #a855f7, #f59e0b)' }, + labelTextStyle: { background: 'linear-gradient(135deg, #60a5fa, #c084fc, #fbbf24)', WebkitBackgroundClip: 'text', backgroundClip: 'text', color: 'transparent' }, + }, + } + + const t = tierConfig[base] || tierConfig.none + // none 档显示中文「无」,无 label 时显示「无档」 + const displayLabel = isNone ? '无' : (label || '无') + + return ( + +
+
+
+
+ +
+
+
+ 数据源 + +
+
+ {isNone && !hasKey ? '配置 Key 解锁更多能力' : t.desc} +
+
+ + {displayLabel} + + +
+ +
+ + ) +} + +function AIConfigBadge({ configured, model }: { configured?: boolean; model?: string }) { + return ( + +
+
+
+
+ +
+
+
+ AI 配置 + +
+
+ {configured ? (model || '已接入模型') : '接入策略生成模型'} +
+
+ +
+
+ + ) +} + +export function Layout() { + // ===== 共享 hooks (替代内联 useQuery) ===== + const { resolved } = useTheme() + const isDark = resolved === 'dark' + const { data: caps } = useCapabilities() + const { data: settingsState } = useSettings() + const { data: versionData } = useVersion() + const { data: prefs } = usePreferences() + const { data: quoteStatus } = useQuoteStatus() + const { data: analysisMenus } = useQuery({ + queryKey: QK.analysisMenus, + queryFn: api.analysisMenus, + }) + + // 数据同步状态轮询: 有活跃 job 时「数据」菜单项显示转圈 + const { data: pipelineJobs } = useQuery({ + queryKey: QK.pipelineJobs, + queryFn: () => api.pipelineJobs(1), + refetchInterval: (query) => (query.state.data?.active_id ? 2000 : 15000), + refetchIntervalInBackground: true, + }) + const isDataSyncing = !!pipelineJobs?.active_id + + // 数据同步完成的"瞬时反馈": isDataSyncing 从 true→false 时显示绿色对勾, + // 闪烁约 3 秒后自动消失。 + const [dataSyncJustDone, setDataSyncJustDone] = useState(false) + const prevSyncingRef = useRef(false) + useEffect(() => { + // 仅在"刚结束"(true→false)且非首次挂载时触发 + if (prevSyncingRef.current && !isDataSyncing) { + setDataSyncJustDone(true) + const t = setTimeout(() => setDataSyncJustDone(false), 3000) + prevSyncingRef.current = isDataSyncing + return () => clearTimeout(t) + } + prevSyncingRef.current = isDataSyncing + }, [isDataSyncing]) + + const qc = useQueryClient() + const navigate = useNavigate() + const version = versionData?.version + const realtimeEnabled = prefs?.realtime_quotes_enabled ?? false + const indicesPinned = prefs?.indices_nav_pinned ?? true + const sidebarIndexSymbols = prefs?.sidebar_index_symbols ?? CORE_INDEXES.map(p => p.symbol) + const sidebarIndexes = CORE_INDEXES.filter(item => sidebarIndexSymbols.includes(item.symbol)) + // 卡片数据:固定显示时也拉取(即使实时行情关闭) + const showSidebarQuotes = indicesPinned || realtimeEnabled + const { data: sidebarIndexQuotes } = useQuery({ + queryKey: [...QK.indexQuotes, 'sidebar', sidebarIndexSymbols.join(',')] as const, + queryFn: () => api.indexQuotes(sidebarIndexes.map(p => p.symbol)), + enabled: showSidebarQuotes && sidebarIndexes.length > 0, + placeholderData: (prev) => prev, + }) + + // SSE: 行情更新时自动刷新相关 queries + 告警通知 + useQuoteStream(realtimeEnabled, prefs?.sse_refresh_pages) + + const toggleQuote = useToggleRealtimeQuotes() + const isRunning = quoteStatus?.running ?? false + const isTrading = quoteStatus?.is_trading_hours ?? false + // none/free 档(无实时行情权限)→ rank < starter(1) + const isFreeTier = tierRank(caps?.label ?? '') < 1 + + // 轮询触发记录总数 → 更新监控中心徽标 (每 15 秒) + const alertsTotalQuery = useQuery({ + queryKey: ['alerts-total'], + queryFn: () => api.alertsList({ days: 7, limit: 1 }), + refetchInterval: 15000, + refetchIntervalInBackground: true, + select: (data) => data.total, + }) + // 只在拿到真实总数时同步徽标 (避免 data=undefined 时传 0 重置 lastSeen) + const alertsTotal = alertsTotalQuery.data + useEffect(() => { + if (alertsTotal != null) setAlertTotal(alertsTotal) + }, [alertsTotal]) + + // 合并内置页面 + 可见的扩展分析菜单 + const analysisNav = (analysisMenus?.items ?? []) + .filter(m => m.visible) + .map(m => ({ to: `/analysis/${m.id}`, label: m.label, icon: m.icon === 'tags' ? Tags : BarChart3 })) + + const allNav = [...nav, ...analysisNav] + const savedOrder = prefs?.nav_order ?? [] + + const navItems = savedOrder.length > 0 + ? (() => { + const byTo = new Map(allNav.map(n => [n.to, n])) + const ordered = savedOrder + .map(id => byTo.get(id) ?? byTo.get(`/analysis/${id}`)) + .filter(Boolean) + const seen = new Set(ordered.map(n => n!.to)) + return [...ordered as typeof allNav, ...allNav.filter(n => !seen.has(n.to))] + })() + : allNav + + const hiddenIds = new Set(prefs?.nav_hidden ?? []) + const visibleNavItems = navItems.filter(n => !hiddenIds.has(n.to) && !hiddenIds.has(n.to.replace(/^\/analysis\//, ''))) + + const handleToggle = async (enabled: boolean) => { + // 开启时重新校验档位 + if (enabled) { + const fresh = await qc.fetchQuery({ + queryKey: QK.capabilities, + queryFn: api.capabilities, + }) + if (tierRank(fresh.label ?? '') < 1) return + } + await toggleQuote.mutateAsync(enabled) + // 仅在交易时段立即获取一次行情 + if (enabled && isTrading) { + api.intradayRefresh().catch(() => {}) + } + } + + return ( +
+ + + + + + + +
+ ) +} diff --git a/frontend/src/components/ListColumnCustomizer.tsx b/frontend/src/components/ListColumnCustomizer.tsx new file mode 100644 index 0000000..3580576 --- /dev/null +++ b/frontend/src/components/ListColumnCustomizer.tsx @@ -0,0 +1,757 @@ +/** + * 通用列表列自定义组件。 + * + * 布局: + * - 上半区「已启用」:已启用的列,@dnd-kit 拖拽排序 + * - 下半区「内置列」:按业务分组折叠 + * - 底部「扩展数据列」:复用 ext_data schema,按需添加字段 + */ +import React, { useState, useCallback, useEffect, useMemo } from 'react' +import { motion, AnimatePresence } from 'framer-motion' +import { + DndContext, closestCenter, KeyboardSensor, PointerSensor, + useSensor, useSensors, type DragEndEvent, +} from '@dnd-kit/core' +import { + arrayMove, SortableContext, sortableKeyboardCoordinates, + useSortable, verticalListSortingStrategy, +} from '@dnd-kit/sortable' +import { CSS } from '@dnd-kit/utilities' +import { X, GripVertical, Plus, ChevronDown, ChevronRight, Database, Settings2, Search, Eye, EyeOff } from 'lucide-react' +import { api } from '@/lib/api' +import { useQuery } from '@tanstack/react-query' +import { QK } from '@/lib/queryKeys' +import type { ColumnConfig, ColumnGroup, ExtColumnDisplayConfig, CandleColumnConfig } from '@/lib/list-columns' +import { resolveCandleConfig } from '@/lib/list-columns' + +interface ListColumnCustomizerProps { + columns: ColumnConfig[] + groups: ColumnGroup[] + onChange: (columns: ColumnConfig[]) => void + open: boolean + onClose: () => void + title?: string + builtinSectionLabel?: string + extColumnAlign?: 'left' | 'center' | 'right' + extFieldFilter?: (field: { name: string; label: string; type: string }) => boolean + /** 是否显示扩展数据列区块(默认 true;信息条等无法渲染 ext 数据的场景设为 false)。 */ + showExtColumns?: boolean + /** 是否显示「单独显示」勾选项(默认 false;仅信息条场景启用,让某列独占一行)。 */ + showStandaloneToggle?: boolean +} + +function SortableActiveCol({ col, onRemove, onConfig, configOpen, extTableLabel, extConfig, candleConfig: candlePanel, strategiesConfig, showStandaloneToggle, onToggleStandalone }: { + col: ColumnConfig + onRemove: (id: string) => void + onConfig: (id: string | null) => void + configOpen: boolean + extTableLabel: string + extConfig: React.ReactNode + candleConfig: React.ReactNode + strategiesConfig: React.ReactNode + showStandaloneToggle?: boolean + onToggleStandalone?: (id: string) => void +}) { + const { + attributes, listeners, setNodeRef, transform, transition, isDragging, + } = useSortable({ id: col.id }) + const isExt = col.source.type === 'ext' + const isCandle = col.source.type === 'builtin' && col.source.key === 'candle' + const isStrategies = col.source.type === 'builtin' && col.source.key === 'strategies' + const hasConfig = isExt || isCandle || isStrategies + + return ( + <> +
+ + + + + {isExt && col.source.type === 'ext' + ? `${col.label}(${extTableLabel})` + : col.label} + + {showStandaloneToggle && ( + + )} + {hasConfig && ( + + )} + +
+ {hasConfig && configOpen && (isExt ? extConfig : isCandle ? candlePanel : strategiesConfig)} + + ) +} + +export function ListColumnCustomizer({ + columns, + groups, + onChange, + open, + onClose, + title = '自定义列', + builtinSectionLabel = '内置列', + extColumnAlign = 'center', + extFieldFilter, + showExtColumns = true, + showStandaloneToggle = false, +}: ListColumnCustomizerProps) { + const extSchema = useQuery({ + queryKey: QK.extDataSchemaAll, + queryFn: api.extDataSchemaAll, + enabled: open && showExtColumns, + staleTime: 60_000, + }) + + const [searchQuery, setSearchQuery] = useState('') + const [expandedGroups, setExpandedGroups] = useState>(new Set()) + const [configOpenId, setConfigOpenId] = useState(null) + const [expandedTables, setExpandedTables] = useState>(new Set()) + + const colById = useMemo(() => new Map(columns.map(c => [c.id, c])), [columns]) + const keyToId = useMemo(() => { + const m = new Map() + for (const c of columns) { + if (c.source.type === 'builtin' || c.source.type === 'computed') m.set(c.source.key, c.id) + } + return m + }, [columns]) + + const activeCols = useMemo(() => columns.filter(c => !c.pinned && c.visible), [columns]) + + const toggleVisible = useCallback((colId: string) => { + onChange(columns.map(c => + c.id === colId && !c.pinned ? { ...c, visible: !c.visible } : c + )) + }, [columns, onChange]) + + const toggleStandalone = useCallback((colId: string) => { + onChange(columns.map(c => + c.id === colId ? { ...c, standalone: !c.standalone } : c + )) + }, [columns, onChange]) + + const sensors = useSensors( + useSensor(PointerSensor, { activationConstraint: { distance: 5 } }), + useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }), + ) + + const handleDragEnd = useCallback((event: DragEndEvent) => { + const { active, over } = event + if (!over || active.id === over.id) return + const reorderCols = columns.filter(c => !c.pinned) + const pinnedCols = columns.filter(c => c.pinned) + const ids = reorderCols.map(c => c.id) + const oldIdx = ids.indexOf(active.id as string) + const newIdx = ids.indexOf(over.id as string) + if (oldIdx < 0 || newIdx < 0) return + const reordered = arrayMove(reorderCols, oldIdx, newIdx) + onChange([...pinnedCols, ...reordered]) + }, [columns, onChange]) + + const addExtColumn = useCallback((configId: string, fieldName: string, fieldLabel?: string) => { + const colId = `ext:${configId}:${fieldName}` + if (columns.some(c => c.id === colId)) { + toggleVisible(colId) + return + } + const newCol: ColumnConfig = { + id: colId, + source: { type: 'ext', configId, fieldName, fieldLabel }, + label: fieldLabel || fieldName, + visible: true, + align: extColumnAlign, + } + const actionIdx = columns.findIndex(c => c.id === 'builtin:action') + if (actionIdx >= 0) { + const next = [...columns] + next.splice(actionIdx, 0, newCol) + onChange(next) + } else { + onChange([...columns, newCol]) + } + }, [columns, extColumnAlign, onChange, toggleVisible]) + + const hideColumn = useCallback((colId: string) => { + onChange(columns.map(c => c.id === colId ? { ...c, visible: false } : c)) + }, [columns, onChange]) + + const updateExtDisplay = useCallback((colId: string, patch: Partial) => { + onChange(columns.map(c => { + if (c.id !== colId) return c + return { ...c, extDisplay: { displayMode: 'tag', ...(c.extDisplay || {}), ...patch } } + })) + }, [columns, onChange]) + + const resetExtDisplay = useCallback((colId: string) => { + onChange(columns.map(c => { + if (c.id !== colId) return c + const { extDisplay, ...rest } = c + return rest + })) + }, [columns, onChange]) + + const updateCandleConfig = useCallback((colId: string, patch: Partial) => { + onChange(columns.map(c => { + if (c.id !== colId) return c + return { ...c, candleConfig: { ...c.candleConfig, ...patch } } + })) + }, [columns, onChange]) + + const resetCandleConfig = useCallback((colId: string) => { + onChange(columns.map(c => { + if (c.id !== colId) return c + const { candleConfig, ...rest } = c + return rest + })) + }, [columns, onChange]) + + const toggleGroup = useCallback((groupId: string) => { + setExpandedGroups(prev => { + const next = new Set(prev) + if (next.has(groupId)) next.delete(groupId) + else next.add(groupId) + return next + }) + }, []) + + const toggleTableExpand = useCallback((tableId: string) => { + setExpandedTables(prev => { + const next = new Set(prev) + if (next.has(tableId)) next.delete(tableId) + else next.add(tableId) + return next + }) + }, []) + + const extTables = extSchema.data?.items ?? [] + const extTableLabelMap = new Map(extTables.map(t => [t.id, t.label])) + + const query = searchQuery.trim().toLowerCase() + const filteredGroups = useMemo(() => { + if (!query) return groups + return groups.filter(g => + g.label.includes(query) || + g.keys.some(k => { + const id = keyToId.get(k) + return id && (colById.get(id)?.label ?? '').toLowerCase().includes(query) + }) + ) + }, [groups, query, keyToId, colById]) + + useEffect(() => { + if (!open) { setConfigOpenId(null); setSearchQuery('') } + }, [open]) + + useEffect(() => { + if (query) setExpandedGroups(new Set(filteredGroups.map(g => g.id))) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [query]) + + const renderExtConfig = (col: ColumnConfig) => ( + +
+ + {(col.extDisplay?.displayMode ?? 'tag') === 'tag' && ( + + )} + + {(col.extDisplay?.displayMode ?? 'tag') === 'tag' && ( + + )} + {(col.extDisplay?.displayMode ?? 'tag') === 'tag' && (col.extDisplay?.maxTags ?? 0) > 0 && ( +
+ 显示位置 +
+ {Array.from({ length: col.extDisplay!.maxTags! }, (_, i) => { + const hidden = col.extDisplay?.hiddenIndices?.includes(i) + return ( + + ) + })} +
+
+ )} + {(col.extDisplay?.displayMode ?? 'tag') === 'tag' && ( + + )} + {col.extDisplay && ( +
+ +
+ )} +
+
+ ) + + // 策略列配置(精简版:仅显示数量/位置/排列方向,复用 extDisplay 存储) + const renderStrategiesConfig = (col: ColumnConfig) => ( + +
+ + {(col.extDisplay?.maxTags ?? 0) > 0 && ( +
+ 显示位置 +
+ {Array.from({ length: col.extDisplay!.maxTags! }, (_, i) => { + const hidden = col.extDisplay?.hiddenIndices?.includes(i) + return ( + + ) + })} +
+
+ )} + + {col.extDisplay && ( +
+ +
+ )} +
+
+ ) + + const renderCandleConfig = (col: ColumnConfig) => { + const cfg = resolveCandleConfig(col.candleConfig) + // 数值输入:空字符串回退到默认值,便于清空重输 + const numInput = ( + field: keyof CandleColumnConfig, + label: string, + ) => ( + + ) + return ( + +
+ {numInput('days', '日k天数')} + {numInput('enabledWidth', '开启宽度')} + {numInput('enabledHeight', '开启高度')} + {numInput('disabledWidth', '收起宽度')} + {numInput('disabledHeight', '收起高度')} +
+ 宽度 40–300 / 高度 32–200 / 天数 1–60,越界自动钳制到边界 +
+ {col.candleConfig && ( +
+ +
+ )} +
+
+ ) + } + + const renderCheckbox = (checked: boolean) => ( + + + + + + ) + + const renderBuiltinRow = (col: ColumnConfig) => ( +
+ + {showStandaloneToggle && col.visible && ( + + )} +
+ ) + + const renderExtFieldRow = (configId: string, field: { name: string; label: string; type: string }) => { + const colId = `ext:${configId}:${field.name}` + const existing = columns.find(c => c.id === colId) + const checked = !!existing?.visible + return ( + + ) + } + + return ( + + {open && ( +
+ + +
+

{title}

+ +
+ +
+
+ + setSearchQuery(e.target.value)} + placeholder="搜索列名..." + className="w-full h-8 pl-8 pr-3 rounded-lg bg-elevated border border-border text-xs text-foreground placeholder:text-muted focus:outline-none focus:border-accent/50 transition-colors" + /> +
+
+ +
+ {activeCols.length > 0 && ( +
+
+ + 已启用 + {activeCols.length} 列 · 拖拽排序 +
+ + c.id)} strategy={verticalListSortingStrategy}> + {activeCols.map(col => ( + + ))} + + +
+ )} + +
+ +
+
+ + {builtinSectionLabel} +
+ + {filteredGroups.map(group => { + const isExpanded = expandedGroups.has(group.id) + const groupCols = group.keys + .map(k => keyToId.get(k)) + .filter((id): id is string => !!id) + .map(id => colById.get(id)) + .filter((c): c is ColumnConfig => !!c) + if (groupCols.length === 0) return null + const visCount = groupCols.filter(c => c.visible).length + + return ( +
+ + + {isExpanded && ( + +
+ {groupCols.map(col => renderBuiltinRow(col))} +
+
+ )} +
+
+ ) + })} +
+ + {showExtColumns && extTables.length > 0 && ( +
+
+ + 扩展数据列 +
+
+ {extTables.map(table => { + const isExpanded = expandedTables.has(table.id) + const dataFields = table.columns + .filter(c => !['symbol', 'code', 'date'].includes(c.name)) + .filter(c => extFieldFilter ? extFieldFilter(c) : true) + const activeCount = dataFields.filter(f => { + const colId = `ext:${table.id}:${f.name}` + return columns.some(c => c.id === colId && c.visible) + }).length + return ( +
+ + + {isExpanded && ( + +
+ {dataFields.map(field => renderExtFieldRow(table.id, field))} +
+
+ )} +
+
+ ) + })} +
+
+ )} + + {showExtColumns && extTables.length === 0 && extSchema.isSuccess && ( +
+ 暂无扩展数据表,可在「数据」页面创建 +
+ )} +
+ +
+ )} + + ) +} diff --git a/frontend/src/components/Logo.tsx b/frontend/src/components/Logo.tsx new file mode 100644 index 0000000..d86e515 --- /dev/null +++ b/frontend/src/components/Logo.tsx @@ -0,0 +1,59 @@ +// 原创 logo:方括号 [ ] 包裹一根带 wick 的 K 线 +// +// 概念: +// - 外层 brackets:终端 / 代码 / 引用边界 — 赛博 + quant 气质 +// - 中央 wick+body:一根标准 K 线 — 直接的金融指代 +// - body 偏上 + 下影长:bullish 站稳感 (上影短 / 下影长) +// +// 用 currentColor,继承父级 color 设定,方便切换品牌色。 +interface LogoProps { + className?: string + size?: number + style?: React.CSSProperties +} + +export function Logo({ className, size = 32, style }: LogoProps) { + return ( + + {/* 左方括号 */} + + {/* 右方括号 */} + + {/* K 线 wick(上下影线,半透明) */} + + {/* K 线 body — 偏上,上影短/下影长, bullish 站稳感 */} + + + ) +} diff --git a/frontend/src/components/PageHeader.tsx b/frontend/src/components/PageHeader.tsx new file mode 100644 index 0000000..3b7b6ef --- /dev/null +++ b/frontend/src/components/PageHeader.tsx @@ -0,0 +1,28 @@ +import { cn } from '@/lib/cn' + +interface Props { + title: string + subtitle?: string + /** 标题右侧、subtitle 之前的额外节点(如状态徽标) */ + titleExtra?: React.ReactNode + right?: React.ReactNode + className?: string +} + +export function PageHeader({ title, subtitle, titleExtra, right, className }: Props) { + return ( +
+
+

{title}

+ {titleExtra} + {subtitle && {subtitle}} +
+ {right} +
+ ) +} diff --git a/frontend/src/components/SealedBadge.tsx b/frontend/src/components/SealedBadge.tsx new file mode 100644 index 0000000..b70b966 --- /dev/null +++ b/frontend/src/components/SealedBadge.tsx @@ -0,0 +1,143 @@ +import { useState } from 'react' +import { useNavigate } from 'react-router-dom' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { motion, AnimatePresence } from 'framer-motion' +import { HelpCircle } from 'lucide-react' +import { api } from '@/lib/api' +import { toast } from '@/components/Toast' + +/** 单方向(涨停/跌停)的修正明细块 */ +function SealedDirBlock({ title, color, counts, rawTotal }: { + title: string + color: 'bull' | 'bear' + counts?: { real: number; fake: number; pending: number } + rawTotal?: number +}) { + const real = counts?.real ?? 0 + const fake = counts?.fake ?? 0 + // pending 从原始总数推算(后端 pending 含另一方向票, 不可用) + const pending = Math.max(0, (rawTotal ?? 0) - real - fake) + const original = rawTotal ?? (real + fake + pending) + const fixed = real + pending + return ( +
+
+ {title} + + {original} + + {fixed} + +
+
+ 真封 {real} + 假 {fake} + {pending > 0 && ( + 待 {pending} + )} +
+
+ ) +} + +/** 修正/降级 标识 + 问号弹窗(连板梯队/看板共用) */ +export function SealedBadge({ degraded, hasDepth, isHistorical, sealedReady, sealedCountsUp, sealedCountsDown, rawUp, rawDown, invalidateKeys = ['limit-ladder'] }: { + degraded: boolean + hasDepth: boolean + isHistorical: boolean + sealedReady: boolean | undefined + sealedCountsUp?: { real: number; fake: number; pending: number } + sealedCountsDown?: { real: number; fake: number; pending: number } + rawUp?: number + rawDown?: number + /** 修正后要刷新的 queryKey 前缀(默认连板梯队) */ + invalidateKeys?: string[] +}) { + const [showHint, setShowHint] = useState(false) + const navigate = useNavigate() + const qc = useQueryClient() + const runFix = useMutation({ + mutationFn: () => api.runLimitLadderFix(), + onSuccess: (data) => { + toast(data.msg, data.ok ? 'success' : 'error') + if (data.ok) invalidateKeys.forEach(k => qc.invalidateQueries({ queryKey: [k] })) + }, + onError: () => toast('修正请求失败', 'error'), + }) + + // 组装原因文案(仅降级时用) + const reasons: string[] = [] + if (!hasDepth) reasons.push('当前套餐无五档盘口能力(需 Pro+),涨停判定基于收盘价,可能含假涨停') + if (isHistorical) reasons.push('历史日期的盘口快照不可获取,无法判定真假板') + if (hasDepth && !isHistorical && !sealedReady) reasons.push('盘中 sealed 数据尚未就绪,收盘后自动恢复') + + const label = degraded ? '降级' : '修正' + + return ( +
+ + + {showHint && ( + <> +
setShowHint(false)} /> + e.stopPropagation()} + > + {degraded ? ( + <> +
真假涨停判定降级
+ {reasons.map((r, i) => ( +
+ · + {r} +
+ ))} +
+ 真假板判定依赖五档盘口实时快照(卖一/买一量)。Pro+ 套餐的当天数据在收盘后自动恢复。 +
+ + ) : ( + <> +
五档盘口修正结果
+ + +
+ 真封板显示封单量,假涨停/假跌停已归入炸板/翘板视图。{sealedReady && '数据为盘中快照,收盘后自动定版。'} +
+ + )} +
+ {hasDepth && !isHistorical && ( + + )} + +
+
+ + )} + +
+ ) +} diff --git a/frontend/src/components/StockDailyKChart.tsx b/frontend/src/components/StockDailyKChart.tsx new file mode 100644 index 0000000..5a57487 --- /dev/null +++ b/frontend/src/components/StockDailyKChart.tsx @@ -0,0 +1,236 @@ +import { useCallback, useEffect, useMemo, useState } from 'react' +import { useQuery } from '@tanstack/react-query' +import { api, type KlineRow } from '@/lib/api' +import { QK } from '@/lib/queryKeys' +import { + EChartsCandlestick, + OVERLAY_INDICATORS, + SUB_CHARTS, + type ChartMarker, + type ChartPriceLine, + type ChartRange, + type OHLC, + type StockInfo, +} from '@/components/EChartsCandlestick' + +const SUB_INFO_H = 16 +const SUB_GAP = 4 +const MAX_DAYS = 2000 + +export interface StockDailyKChartResult { + rows: OHLC[] + rawRows: KlineRow[] + stockInfo?: StockInfo + name?: string +} + +interface Props { + symbol: string + height?: number + className?: string + dateRange?: { start: string; end: string } + markers?: ChartMarker[] + ranges?: ChartRange[] + priceLines?: ChartPriceLine[] + showLimitMarkers?: boolean + showIndicatorControls?: boolean + showMarkerToggle?: boolean + showMA?: boolean + showInfoBar?: boolean + visibleBars?: number + linkedPrice?: number | null + onDateClick?: (date: string) => void + onDataChange?: (result: StockDailyKChartResult) => void + /** 扩展数据列参数(逗号分隔 config_id.field_name),透传给 klineDaily 接口 */ + extColumns?: string +} + +function isValidRow(r: any): boolean { + return r && r.date != null && r.open != null && r.close != null +} + +export function toOHLC(rows: KlineRow[]): OHLC[] { + return rows + .filter(isValidRow) + .map(r => ({ + date: typeof r.date === 'string' ? r.date.slice(0, 10) : String(r.date), + open: Number(r.open), + high: Number(r.high), + low: Number(r.low), + close: Number(r.close), + volume: Number(r.volume ?? 0), + ma5: r.ma5 != null ? Number(r.ma5) : null, + ma10: r.ma10 != null ? Number(r.ma10) : null, + ma20: r.ma20 != null ? Number(r.ma20) : null, + ma60: r.ma60 != null ? Number(r.ma60) : null, + macd_dif: r.macd_dif != null ? Number(r.macd_dif) : null, + macd_dea: r.macd_dea != null ? Number(r.macd_dea) : null, + macd_hist: r.macd_hist != null ? Number(r.macd_hist) : null, + rsi_6: r.rsi_6 != null ? Number(r.rsi_6) : null, + rsi_14: r.rsi_14 != null ? Number(r.rsi_14) : null, + rsi_24: r.rsi_24 != null ? Number(r.rsi_24) : null, + kdj_k: r.kdj_k != null ? Number(r.kdj_k) : null, + kdj_d: r.kdj_d != null ? Number(r.kdj_d) : null, + kdj_j: r.kdj_j != null ? Number(r.kdj_j) : null, + boll_upper: r.boll_upper != null ? Number(r.boll_upper) : null, + boll_lower: r.boll_lower != null ? Number(r.boll_lower) : null, + })) +} + +function buildLimitUpMarkers(rows: KlineRow[]): ChartMarker[] { + const markers: ChartMarker[] = [] + for (const r of rows) { + const date = typeof r.date === 'string' ? r.date.slice(0, 10) : String(r.date) + if (r.signal_broken_limit_up) { + markers.push({ date, kind: 'neutral', above: true, color: '#8B5CF6', label: '炸' }) + } else if (r.signal_limit_up) { + const boards: number = r.consecutive_limit_ups ?? 1 + markers.push({ date, kind: 'buy', above: true, color: '#FACC15', label: boards <= 1 ? '板' : String(boards) }) + } + } + return markers +} + +export function getDefaultRange(): { start: string; end: string } { + const now = new Date() + const end = now.toISOString().slice(0, 10) + const s = new Date(now) + s.setMonth(s.getMonth() - 6) + const start = s.toISOString().slice(0, 10) + return { start, end } +} + +function rangeDays(range: { start: string; end: string }): number { + const start = new Date(range.start) + const end = new Date(range.end) + return Math.min(Math.ceil((end.getTime() - start.getTime()) / 86400000) + 30, MAX_DAYS) +} + +export function StockDailyKChart({ + symbol, + height = 520, + className, + dateRange: externalDateRange, + markers, + ranges, + priceLines, + showLimitMarkers = true, + showIndicatorControls = true, + showMarkerToggle = true, + showMA = true, + showInfoBar = true, + visibleBars = 60, + linkedPrice, + onDateClick, + onDataChange, + extColumns, +}: Props) { + const [activeIndicators, setActiveIndicators] = useState(['vol']) + const [showMarkers, setShowMarkers] = useState(true) + const dateRange = externalDateRange ?? getDefaultRange() + const days = useMemo(() => rangeDays(dateRange), [dateRange]) + + // extColumns 纳入 query key:勾选/取消扩展字段时需重新请求(带 ext_columns 参数) + const kline = useQuery({ + queryKey: QK.kline(symbol, dateRange.start, dateRange.end, extColumns), + queryFn: () => api.klineDaily(symbol, days, dateRange, extColumns), + enabled: !!symbol, + placeholderData: (prev) => prev, + }) + + const rows = useMemo(() => toOHLC(kline.data?.rows ?? []), [kline.data?.rows]) + const stockInfo = kline.data?.stock_info + const limitMarkers = useMemo(() => buildLimitUpMarkers(kline.data?.rows ?? []), [kline.data?.rows]) + const allMarkers = useMemo(() => [ + ...(markers ?? []), + ...(showLimitMarkers ? limitMarkers : []), + ], [limitMarkers, markers, showLimitMarkers]) + + const toggleIndicator = useCallback((key: string) => { + setActiveIndicators(prev => prev.includes(key) ? prev.filter(k => k !== key) : [...prev, key]) + }, []) + + const activeSubDefs = activeIndicators + .map(key => SUB_CHARTS.find(s => s.key === key)) + .filter((d): d is typeof SUB_CHARTS[number] => !!d) + let subExtraH = 0 + activeSubDefs.forEach(def => { subExtraH += SUB_INFO_H + def.height }) + if (activeSubDefs.length > 0) subExtraH += activeSubDefs.length * SUB_GAP + 14 + const chartHeight = height + subExtraH + + useEffect(() => { + onDataChange?.({ rows, rawRows: kline.data?.rows ?? [], stockInfo, name: kline.data?.name }) + }, [kline.data?.name, kline.data?.rows, onDataChange, rows, stockInfo]) + + if (!symbol) return null + + return ( +
+ {showIndicatorControls && rows.length > 0 && ( +
+ {SUB_CHARTS.map(ind => ( + + ))} + {OVERLAY_INDICATORS.map(ind => ( + + ))} + {showMarkerToggle && showLimitMarkers && ( + + )} +
+ )} + {kline.isLoading &&
加载中…
} + {kline.isError &&
日K加载失败
} + {!kline.isLoading && !kline.isError && (kline.data?.rows?.length ?? 0) > 0 && rows.length === 0 && ( +
数据格式异常,请刷新页面
+ )} + {rows.length > 0 && ( + + )} +
+ ) +} diff --git a/frontend/src/components/StockInfoBar.tsx b/frontend/src/components/StockInfoBar.tsx new file mode 100644 index 0000000..1063249 --- /dev/null +++ b/frontend/src/components/StockInfoBar.tsx @@ -0,0 +1,278 @@ +import { useState, type ReactNode } from 'react' +import { Settings2, RadioTower, Star } from 'lucide-react' +import type { KlineRow, FinancialMetricRecord } from '@/lib/api' +import { fmtPrice, fmtBigNum, fmtVolume } from '@/lib/format' +import { ListColumnCustomizer } from '@/components/ListColumnCustomizer' +import { INFO_GROUPS, type ColumnConfig } from '@/lib/stock-info-fields' + +const BULL = '#C74040' +const BEAR = '#2D9B65' + +interface Props { + symbol: string + name?: string + stockInfo?: { name?: string; total_shares?: number; float_shares?: number; ext?: Record } + rows: KlineRow[] + /** 信息条字段配置(由 StockPanel 提升,受控) */ + fields: ColumnConfig[] + onFieldsChange: (fields: ColumnConfig[]) => void + /** 财务指标最新一期(来自 useFinancialMetrics,受 Cap.FINANCIAL 门控) */ + financialMetrics?: FinancialMetricRecord + /** 加监控回调 (个股弹窗传入, 有值时渲染 RadioTower 图标) */ + onMonitor?: () => void + /** 加自选回调 + 是否已自选 (有 onToggle 时渲染 Star 图标) */ + inWatchlist?: boolean + onToggleWatchlist?: () => void +} + +/** + * 精简渲染扩展数据值(信息条专用)。 + * 仍尊重 extDisplay 配置:text=纯文本,tag(默认)=按分隔符拆成小标签 + maxTags 截断。 + * 与自选列表的差异:标签模式无 maxWidth/排列方向,但保留 +N 展开交互。 + */ +function renderExtInline( + val: unknown, + col: ColumnConfig, + expanded: boolean, + onToggle: () => void, +): ReactNode { + if (val == null || (typeof val === 'number' && Number.isNaN(val))) { + return + } + if (typeof val === 'number') { + const displayVal = Number.isInteger(val) ? fmtPrice(val, 0) : fmtPrice(val) + return {displayVal} + } + if (typeof val === 'boolean') { + return {val ? '是' : '否'} + } + const str = String(val) + // 纯文本模式 + if (col.extDisplay?.displayMode === 'text') { + return {str} + } + // 标签模式(默认):按分隔符拆成小标签 + const sep = col.extDisplay?.separator?.trim() || null + const tags = sep + ? str.split(sep).map(s => s.trim()).filter(Boolean) + : str.split(/[、,,;;\-]/).map(s => s.trim()).filter(Boolean) + if (tags.length === 0) return + // maxTags 截断 + 展开交互:收起时显示前 N 个 + +N,展开时显示全部 + 收起 + const maxTags = col.extDisplay?.maxTags ?? 0 + const hiddenIndices = maxTags > 0 ? col.extDisplay?.hiddenIndices : undefined + const showAll = maxTags <= 0 || expanded + const sliced = showAll ? tags : tags.slice(0, maxTags) + const shown = hiddenIndices?.length ? sliced.filter((_, i) => !hiddenIndices.includes(i)) : sliced + const overflow = tags.length - shown.length + return ( + + {shown.map((tag, i) => ( + + {tag} + + ))} + {!showAll && overflow > 0 && ( + + )} + {showAll && maxTags > 0 && tags.length > maxTags && ( + + )} + + ) +} + +export function StockInfoBar({ symbol, name, stockInfo, rows, fields, onFieldsChange, financialMetrics, onMonitor, inWatchlist, onToggleWatchlist }: Props) { + // 弹窗开关:纯本地状态,与数据/配置无关,放早期 return 之前 + const [customizerOpen, setCustomizerOpen] = useState(false) + // ext 标签展开状态:按 symbol::colId,切股/切字段时互不干扰 + const [expandedExt, setExpandedExt] = useState>(new Set()) + + const toggleExtExpand = (key: string) => { + setExpandedExt(prev => { + const next = new Set(prev) + if (next.has(key)) next.delete(key) + else next.add(key) + return next + }) + } + + if (rows.length === 0) return null + + const latest = rows[rows.length - 1] + const prev = rows.length >= 2 ? rows[rows.length - 2] : null + const close = Number(latest.close) + const chg = prev ? close - Number(prev.close) : 0 + const chgPct = prev ? chg / Number(prev.close) * 100 : 0 + const isUp = chg >= 0 + const clr = isUp ? BULL : BEAR + + const totalShares = stockInfo?.total_shares + const floatShares = stockInfo?.float_shares + const marketCap = totalShares ? close * totalShares : null + const floatMarketCap = floatShares ? close * floatShares : null + const turnoverRate = floatShares && latest.volume + ? (Number(latest.volume) * 100 / floatShares * 100) + : null + + const displayName = stockInfo?.name ?? name ?? '' + const extData = stockInfo?.ext ?? {} + + // 按指标 key 计算格式化值,无数据返回 null(渲染时跳过,与原行为一致)。 + // 普通函数:依赖行情值每次 render 都变,useCallback 无收益;且必须定义在早期 return 之后。 + const computeBuiltinValue = (key: string): string | null => { + switch (key) { + case 'market_cap': return marketCap != null ? fmtBigNum(marketCap) : null + case 'float_market_cap': return floatMarketCap != null ? fmtBigNum(floatMarketCap) : null + case 'turnover': return turnoverRate != null ? `${turnoverRate.toFixed(2)}%` : null + case 'volume': return latest.volume != null ? fmtVolume(Number(latest.volume)) : null + case 'amplitude': { + const prevClose = prev ? Number(prev.close) : null + if (prevClose == null || prevClose === 0) return null + const hi = Number(latest.high) + const lo = Number(latest.low) + return `${((hi - lo) / prevClose * 100).toFixed(2)}%` + } + case 'open': return fmtPrice(Number(latest.open)) + case 'high': return fmtPrice(Number(latest.high)) + case 'low': return fmtPrice(Number(latest.low)) + // 财务指标:百分比字段存储为百分点(12.3 表示 12.3%),直接 toFixed(2) + % + case 'eps': return financialMetrics?.eps_basic != null ? fmtPrice(financialMetrics.eps_basic) : null + case 'bps': return financialMetrics?.bps != null ? fmtPrice(financialMetrics.bps) : null + case 'roe': return financialMetrics?.roe != null ? `${financialMetrics.roe.toFixed(2)}%` : null + case 'gross_margin':return financialMetrics?.gross_margin != null ? `${financialMetrics.gross_margin.toFixed(2)}%` : null + case 'net_margin': return financialMetrics?.net_margin != null ? `${financialMetrics.net_margin.toFixed(2)}%` : null + case 'debt_ratio': return financialMetrics?.debt_to_asset_ratio != null ? `${financialMetrics.debt_to_asset_ratio.toFixed(2)}%` : null + case 'revenue_yoy': return financialMetrics?.revenue_yoy != null ? `${financialMetrics.revenue_yoy.toFixed(2)}%` : null + case 'net_income_yoy': return financialMetrics?.net_income_yoy != null ? `${financialMetrics.net_income_yoy.toFixed(2)}%` : null + // PE/PB 后端无此字段,用现价现算(PE 基于最新一期 EPS,非严格 TTM) + case 'pe_ttm': { + const eps = financialMetrics?.eps_basic + return eps && eps !== 0 ? fmtPrice(close / eps) : null + } + case 'pb': { + const bps = financialMetrics?.bps + return bps && bps !== 0 ? fmtPrice(close / bps) : null + } + default: return null + } + } + + const visibleFields = fields.filter(f => f.visible) + // 按是否单独显示分组:普通列共一行,standalone 列各占一行 + const inlineFields = visibleFields.filter(f => !f.standalone) + const standaloneFields = visibleFields.filter(f => f.standalone) + + // 渲染单个字段(builtin / ext 通用) + const renderField = (f: ColumnConfig): ReactNode => { + if (f.source.type === 'ext') { + const { configId, fieldName } = f.source + const val = extData[`${configId}__${fieldName}`] + // 无值的 ext 字段整体跳过(与 builtin 无数据行为一致) + if (val == null || (typeof val === 'number' && Number.isNaN(val))) return null + const cellKey = `${symbol}::${f.id}` + return ( + + {f.label} + + {renderExtInline(val, f, expandedExt.has(cellKey), () => toggleExtExpand(cellKey))} + + + ) + } + // builtin + const value = computeBuiltinValue(f.source.type === 'builtin' ? f.source.key : '') + if (value == null) return null + return ( + + {f.label} {value} + + ) + } + + return ( +
+ {/* Row 1: code, name, price, change, change% */} +
+ {symbol} + {displayName} + + {fmtPrice(close)} + + + {isUp ? '+' : ''}{fmtPrice(chg)} + + + {isUp ? '+' : ''}{fmtPrice(chgPct)}% + + {/* 右侧操作按钮:加自选 + 加监控 + 信息条配置 */} +
+ {onToggleWatchlist && ( + + )} + {onMonitor && ( + + )} + +
+
+ + {/* Row 2: 普通指标(builtin + ext,共一行 flex-wrap) */} + {inlineFields.length > 0 && ( +
+ {inlineFields.map(renderField)} +
+ )} + + {/* 单独显示的指标:各占一行 */} + {standaloneFields.map(f => { + const node = renderField(f) + if (node == null) return null + return ( +
+ {node} +
+ ) + })} + + setCustomizerOpen(false)} + title="信息条指标" + builtinSectionLabel="可选指标" + extColumnAlign="left" + showStandaloneToggle + /> +
+ ) +} diff --git a/frontend/src/components/StockIntradayChart.tsx b/frontend/src/components/StockIntradayChart.tsx new file mode 100644 index 0000000..d252a9b --- /dev/null +++ b/frontend/src/components/StockIntradayChart.tsx @@ -0,0 +1,120 @@ +import { useEffect, useMemo, useState } from 'react' +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' +import { Loader2 } from 'lucide-react' +import { api, type MinuteKlineRow } from '@/lib/api' +import { QK } from '@/lib/queryKeys' +import { EChartsIntraday } from '@/components/EChartsIntraday' + +interface Props { + symbol: string + date: string | null + height?: number + prevClose?: number + className?: string + onPriceHover?: (price: number | null) => void +} + +export function StockIntradayChart({ + symbol, + date, + height = 520, + prevClose, + className, + onPriceHover, +}: Props) { + const qc = useQueryClient() + const [minuteDismissed, setMinuteDismissed] = useState(false) + + const minute = useQuery({ + queryKey: QK.klineMinute(symbol, date ?? ''), + queryFn: () => api.klineMinute(symbol, date ?? undefined), + enabled: !!symbol && !!date, + }) + + const fetchMinute = useMutation({ + mutationFn: () => api.extendMinuteHistory(5, 'day'), + onSuccess: () => { + qc.invalidateQueries({ queryKey: ['kline-minute', symbol] }) + qc.invalidateQueries({ queryKey: QK.dataStatus }) + qc.invalidateQueries({ queryKey: QK.pipelineJobs }) + setMinuteDismissed(false) + }, + }) + + const minuteRows: MinuteKlineRow[] = useMemo(() => minute.data?.rows ?? [], [minute.data?.rows]) + // source=none 表示本地无数据且数据源也拉不到 (停牌/复牌延迟/非交易日) + // 此时不弹"是否获取"询问窗, 只做静态提示, 避免误导用户去拉明知拉不到的数据 + const sourceIsNone = minute.data?.source === 'none' + + useEffect(() => { + setMinuteDismissed(false) + onPriceHover?.(null) + }, [date, onPriceHover]) + + if (!symbol || !date) return null + + return ( +
+ {minute.isLoading &&
分时加载中…
} + {!minute.isLoading && minuteRows.length === 0 && ( + <> + {fetchMinute.isPending ? ( +
+ + 正在获取最近5日分钟K… +
+ ) : sourceIsNone ? ( + // 数据源确认无此日分钟数据 (停牌/复牌延迟等): 静态提示 + 保留重试 +
+
该日暂无分钟数据(数据源未提供)
+ +
+ ) : minuteDismissed ? ( +
+
暂无分钟数据
+ +
+ ) : ( +
+
是否立即获取最近5日分钟K?
+
+ + +
+
+ )} + + )} + {minuteRows.length > 0 && ( + + )} +
+ ) +} diff --git a/frontend/src/components/StockPanel.tsx b/frontend/src/components/StockPanel.tsx new file mode 100644 index 0000000..7385c0d --- /dev/null +++ b/frontend/src/components/StockPanel.tsx @@ -0,0 +1,166 @@ +import { useEffect, useState, useCallback, useRef, useMemo } from 'react' +import { type KlineRow, type FinancialMetricRecord } from '@/lib/api' +import { StockInfoBar } from '@/components/StockInfoBar' +import { StockDailyKChart, getDefaultRange, type StockDailyKChartResult } from '@/components/StockDailyKChart' +import { StockIntradayChart } from '@/components/StockIntradayChart' +import { useFinancialMetrics } from '@/lib/useFinancials' +import { useCapabilities } from '@/lib/useSharedQueries' +import type { ChartMarker, ChartPriceLine, ChartRange } from '@/components/EChartsCandlestick' +import { + loadInfoFields, + saveInfoFields, + buildInfoExtColumnsParam, + type ColumnConfig, +} from '@/lib/stock-info-fields' + +interface Props { + symbol: string + height?: number + showIntraday?: boolean + className?: string + /** 当用户点击蜡烛选中日期时回调(用于外部自动开启分时图)。 */ + onSelectDate?: (date: string) => void + /** 外部传入的日期范围 */ + dateRange?: { start: string; end: string } + markers?: ChartMarker[] + ranges?: ChartRange[] + priceLines?: ChartPriceLine[] + showLimitMarkers?: boolean + showMarkerToggle?: boolean + /** 加监控回调 (传入后信息条显示 RadioTower 图标) */ + onMonitor?: () => void + /** 加自选 (传入后信息条显示 Star 图标) */ + inWatchlist?: boolean + onToggleWatchlist?: () => void +} + +export { getDefaultRange } + +export function StockPanel({ + symbol, + height = 520, + showIntraday = true, + className, + onSelectDate, + dateRange: externalDateRange, + markers, + ranges, + priceLines, + showLimitMarkers = true, + showMarkerToggle = true, + onMonitor, + inWatchlist, + onToggleWatchlist, +}: Props) { + const [linkedPrice, setLinkedPrice] = useState(null) + const [selectedDate, setSelectedDate] = useState(null) + const [dailyResult, setDailyResult] = useState(null) + // 信息条指标配置提升到此层:同时供 StockInfoBar 渲染与 StockDailyKChart 请求 ext 数据 + const [fields, setFields] = useState(loadInfoFields) + const extColumns = useMemo(() => buildInfoExtColumnsParam(fields), [fields]) + + const handleFieldsChange = useCallback((next: ColumnConfig[]) => { + setFields(next) + saveInfoFields(next) + }, []) + + // 财务指标:仅当信息条配置含可见的财务字段且用户具备 FINANCIAL 能力 (Expert) 时才请求 + // 无能力时跳过请求, 避免后端抛 CapabilityDenied (403) 导致 free/starter 档弹错误提示 + const { data: caps } = useCapabilities() + const hasFinancialCap = !!caps?.capabilities?.['financial'] + const hasFinanceField = useMemo( + () => fields.some(f => f.visible && f.source.type === 'builtin' + && ['eps', 'bps', 'roe', 'pe_ttm', 'pb', 'gross_margin', 'net_margin', 'debt_ratio', 'revenue_yoy', 'net_income_yoy'].includes(f.source.key)), + [fields], + ) + const financials = useFinancialMetrics(hasFinanceField && hasFinancialCap ? symbol : undefined) + + const dateRange = externalDateRange ?? getDefaultRange() + + const handleDateClick = useCallback((date: string) => { + setSelectedDate(date) + onSelectDate?.(date) + }, [onSelectDate]) + + const rows = dailyResult?.rows ?? [] + const stockInfo = dailyResult?.stockInfo + const rawRows: KlineRow[] = dailyResult?.rawRows ?? [] + + // symbol 变化时重置分时相关状态,避免切股后残留旧日期。 + // 注意:必须跳过首次挂载——重开弹窗时 kline 命中 react-query 缓存, + // 子组件 onDataChange effect(先于父 effect 执行)会把 dailyResult 置为有效数据, + // 若此处再无条件清空,会把刚加载的数据抹掉,导致信息条整行消失。 + const prevSymbol = useRef(symbol) + useEffect(() => { + if (prevSymbol.current === symbol) return + prevSymbol.current = symbol + setSelectedDate(null) + setLinkedPrice(null) + setDailyResult(null) + }, [symbol]) + + // 当分时开启、无选中日期时,自动选中最新日期 + useEffect(() => { + if (showIntraday && !selectedDate && rows.length > 0) { + setSelectedDate(rows[rows.length - 1].date) + } + }, [showIntraday, selectedDate, rows]) + + const selectedIdx = selectedDate ? rows.findIndex(r => r.date === selectedDate) : -1 + const prevClose = selectedIdx > 0 + ? rows[selectedIdx - 1].close + : rows.length >= 2 + ? rows[rows.length - 2].close + : undefined + if (!symbol) return null + + // 财务指标最新一期(metrics 按 period_end 排序,取首项) + const financialMetrics: FinancialMetricRecord | undefined = financials.data?.data?.[0] + + return ( +
+ + +
+ + + {showIntraday && selectedDate && ( + + )} +
+
+ ) +} diff --git a/frontend/src/components/StockPreviewDialog.tsx b/frontend/src/components/StockPreviewDialog.tsx new file mode 100644 index 0000000..4c49108 --- /dev/null +++ b/frontend/src/components/StockPreviewDialog.tsx @@ -0,0 +1,279 @@ +import { useState, useEffect } from 'react' +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' +import { motion, AnimatePresence } from 'framer-motion' +import { X, RefreshCw, Clock } from 'lucide-react' +import { api } from '@/lib/api' +import { QK } from '@/lib/queryKeys' +import { cnSignal } from '@/lib/signals' +import { StockPanel, getDefaultRange } from '@/components/StockPanel' +import { DatePicker } from '@/components/DatePicker' +import { RuleEditor } from '@/components/monitor/RuleEditor' + +interface Props { + symbol: string | null + name?: string + onClose: () => void + /** 触发信息 (来自监控触发记录, 有值时在顶栏下方显示) */ + triggerInfo?: { + price?: number | null + changePct?: number | null + ts?: number + signals?: string[] + message?: string + } | null +} + +// ===== 板块标识(与 Screener 列表一致)===== + +// 预设快捷范围(只保留半年和1年) +const PRESETS: { label: string; months: number }[] = [ + { label: '半年', months: 6 }, + { label: '1年', months: 12 }, +] + +function boardTag(symbol: string): { label: string; color: string } | null { + if (/^(300|301)/.test(symbol)) return { label: '创', color: 'text-[#f97316] bg-[#f97316]/12 border-[#f97316]/25' } + if (/^688/.test(symbol)) return { label: '科', color: 'text-purple-400 bg-purple-400/12 border-purple-400/25' } + if (/^[48]/.test(symbol)) return { label: '北', color: 'text-cyan-400 bg-cyan-400/12 border-cyan-400/25' } + return null +} + +export function StockPreviewDialog({ symbol, name, onClose, triggerInfo }: Props) { + const [showIntraday, setShowIntraday] = useState(false) + const [dateRange, setDateRange] = useState(getDefaultRange) + const [showMonitorEditor, setShowMonitorEditor] = useState(false) + const qc = useQueryClient() + + const watchlist = useQuery({ + queryKey: QK.watchlist, + queryFn: api.watchlistList, + enabled: !!symbol, + }) + const inWatchlist = (watchlist.data?.symbols ?? []).some((s: any) => s.symbol === symbol) + + const toggleWatchlist = useMutation({ + mutationFn: () => inWatchlist ? api.watchlistRemove(symbol!) : api.watchlistAdd(symbol!), + onSuccess: () => { + qc.invalidateQueries({ queryKey: QK.watchlist }) + qc.invalidateQueries({ queryKey: QK.watchlistEnriched() }) + }, + }) + + // ESC 关闭 + useEffect(() => { + if (!symbol) return + const handler = (e: KeyboardEvent) => { + if (e.key === 'Escape') onClose() + } + document.addEventListener('keydown', handler) + return () => document.removeEventListener('keydown', handler) + }, [symbol, onClose]) + + const handleRefresh = () => { + if (!symbol) return + qc.invalidateQueries({ queryKey: ['kline', symbol!] }) + if (showIntraday) { + qc.invalidateQueries({ queryKey: ['kline-minute', symbol!] }) + } + } + + return ( + + {symbol && ( +
+ {/* 遮罩 */} + + + {/* 弹窗主体 */} + + {/* 顶栏 */} +
+
+ {(() => { + const board = symbol ? boardTag(symbol) : null + return board ? ( + + {board.label} + + ) : null + })()} + {symbol} + {name && {name}} +
+ +
+ {/* 日期范围快捷 */} + {PRESETS.map(p => { + const now = new Date() + const s = new Date(now) + s.setMonth(s.getMonth() - p.months) + const expected = s.toISOString().slice(0, 10) + const isActive = dateRange.start === expected + return ( + + ) + })} + setDateRange(prev => ({ ...prev, start: v }))} + max={dateRange.end} + /> + ~ + setDateRange(prev => ({ ...prev, end: v }))} + min={dateRange.start} + /> + + | + + {/* 分时开关 */} + + + | + + {/* 刷新 */} + + + {/* 关闭 */} + +
+
+ + {/* 触发信息条 (来自监控触发记录) */} + {triggerInfo && ( +
+ {/* 左: 触发标记 + 时间 */} +
+ ⚡ 触发 + {triggerInfo.ts && ( + + {new Date(triggerInfo.ts).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' })} + + )} +
+ + {/* 中: 价格 + 涨跌幅 */} +
+ {triggerInfo.price != null && ( + {triggerInfo.price.toFixed(2)} + )} + {triggerInfo.changePct != null && ( + = 0 ? 'text-danger' : 'text-bear'}`}> + {triggerInfo.changePct >= 0 ? '+' : ''}{(triggerInfo.changePct * 100).toFixed(2)}% + + )} +
+ + {/* 右: 消息 + 信号标签 */} +
+ {triggerInfo.message && ( + {triggerInfo.message} + )} + {triggerInfo.signals && triggerInfo.signals.length > 0 && ( +
+ {triggerInfo.signals.map((s, j) => ( + {cnSignal(s)} + ))} +
+ )} +
+
+ )} + + {/* K 线内容 */} +
+ { if (!showIntraday) setShowIntraday(true) }} + dateRange={dateRange} + onMonitor={() => setShowMonitorEditor(true)} + inWatchlist={inWatchlist} + onToggleWatchlist={() => toggleWatchlist.mutate()} + /> +
+ + {/* 加监控编辑器弹层 */} + + {showMonitorEditor && symbol && ( + setShowMonitorEditor(false)} + > +
e.stopPropagation()}> + setShowMonitorEditor(false)} + onSaved={() => setShowMonitorEditor(false)} + /> +
+
+ )} +
+
+
+ )} +
+ ) +} diff --git a/frontend/src/components/ThemeProvider.tsx b/frontend/src/components/ThemeProvider.tsx new file mode 100644 index 0000000..1c2fb88 --- /dev/null +++ b/frontend/src/components/ThemeProvider.tsx @@ -0,0 +1,78 @@ +import { createContext, useContext, useEffect, useState } from 'react' +import { storage } from '@/lib/storage' + +export type Theme = 'light' | 'dark' | 'system' +export type ResolvedTheme = 'light' | 'dark' + +interface ThemeContextValue { + theme: Theme + resolved: ResolvedTheme + setTheme: (theme: Theme) => void +} + +const ThemeContext = createContext(null) + +function resolveTheme(theme: Theme): ResolvedTheme { + if (theme !== 'system') return theme + if (typeof window === 'undefined') return 'dark' + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' +} + +function updateMetaThemeColor(resolved: ResolvedTheme) { + if (typeof document === 'undefined') return + const meta = document.querySelector('meta[name="theme-color"]') + if (!meta) return + // 暗色保持品牌紫, 浅色使用浅色背景避免状态栏突兀 + meta.setAttribute('content', resolved === 'dark' ? '#8B5CF6' : '#FAFAFA') +} + +export function ThemeProvider({ children }: { children: React.ReactNode }) { + const [theme, setThemeState] = useState(() => { + const saved = storage.theme.get('system') + return saved === 'light' || saved === 'dark' || saved === 'system' ? saved : 'system' + }) + const [resolved, setResolved] = useState(() => resolveTheme(theme)) + + useEffect(() => { + const nextResolved = resolveTheme(theme) + setResolved(nextResolved) + + const root = document.documentElement + root.classList.remove('light', 'dark') + root.classList.add(nextResolved) + storage.theme.set(theme) + updateMetaThemeColor(nextResolved) + }, [theme]) + + useEffect(() => { + if (theme !== 'system') return + const media = window.matchMedia('(prefers-color-scheme: dark)') + const handler = () => { + const nextResolved = resolveTheme('system') + setResolved(nextResolved) + document.documentElement.classList.remove('light', 'dark') + document.documentElement.classList.add(nextResolved) + updateMetaThemeColor(nextResolved) + } + media.addEventListener('change', handler) + return () => media.removeEventListener('change', handler) + }, [theme]) + + const setTheme = (next: Theme) => { + setThemeState(next) + } + + return ( + + {children} + + ) +} + +export function useTheme(): ThemeContextValue { + const ctx = useContext(ThemeContext) + if (!ctx) { + throw new Error('useTheme must be used within ThemeProvider') + } + return ctx +} diff --git a/frontend/src/components/Toast.tsx b/frontend/src/components/Toast.tsx new file mode 100644 index 0000000..389514d --- /dev/null +++ b/frontend/src/components/Toast.tsx @@ -0,0 +1,49 @@ +import { useCallback, useEffect, useState } from 'react' + +// ===== 全局 toast 状态 ===== +type ToastItem = { id: number; msg: string; kind: 'error' | 'success' } +let _id = 0 +const _listeners: Set<(items: ToastItem[]) => void> = new Set() +let _queue: ToastItem[] = [] + +function _emit() { _listeners.forEach(fn => fn([..._queue])) } + +function toast(msg: string, kind: 'error' | 'success' = 'error') { + const item = { id: ++_id, msg, kind } + _queue = [..._queue, item] + _emit() + setTimeout(() => { _queue = _queue.filter(t => t.id !== item.id); _emit() }, 4000) +} + +export { toast } + +// ===== Toast 容器 — 挂在 Layout 最顶层 ===== +export function ToastContainer() { + const [items, setItems] = useState([]) + + const sub = useCallback(() => { + _listeners.add(setItems) + return () => { _listeners.delete(setItems) } + }, []) + + useEffect(sub, [sub]) + + if (!items.length) return null + + return ( +
+ {items.map(t => ( +
+ {t.msg} +
+ ))} +
+ ) +} diff --git a/frontend/src/components/analysis-shared.tsx b/frontend/src/components/analysis-shared.tsx new file mode 100644 index 0000000..5a1ad33 --- /dev/null +++ b/frontend/src/components/analysis-shared.tsx @@ -0,0 +1,451 @@ +/** + * 概念/行业分析 — 共享 UI 组件 + * + * 包含: + * - AnalysisConfigDialog: 字段配置弹窗 + * - DimensionHeatmap: 维度热力图块 + * - OverviewStatCards: 总览统计卡片 + * - DimensionGroupSidebar: 维度分组侧边栏 + */ + +import { useMemo, useState } from 'react' +import { useQuery } from '@tanstack/react-query' +import { motion } from 'framer-motion' +import { + BarChart3, + ChevronDown, + Database, + Search, + Settings2, + Tags, + TrendingUp, + X, +} from 'lucide-react' +import { api, type ExtDataField } from '@/lib/api' +import { QK } from '@/lib/queryKeys' +import { cn } from '@/lib/cn' +import type { DimensionGroup, QuoteMap } from '@/lib/analysis-adapter' +import { computeQuoteMetrics } from '@/lib/analysis-adapter' +import { fmtPct, priceColorClass } from '@/lib/format' + +// ===== 配置类型 ===== + +export interface AnalysisFieldConfig { + /** 选中的扩展数据源 ID */ + configId?: string + /** 手动指定的维度字段(覆盖自动探测) */ + dimensionField?: string + /** 层级字段统计级别(如行业 1/2/3 级) */ + hierarchyLevel?: 1 | 2 | 3 +} + +export interface SchemaOption { + id: string + label: string + columns: { name: string; type: string; label: string }[] +} + +// ===== 配置弹窗 ===== + +export function AnalysisConfigDialog({ + currentConfig, + onSave, + onClose, + showHierarchyLevel = false, +}: { + currentConfig: AnalysisFieldConfig + onSave: (config: AnalysisFieldConfig) => void + onClose: () => void + showHierarchyLevel?: boolean +}) { + const [draft, setDraft] = useState(currentConfig) + const { data: extList } = useQuery({ + queryKey: QK.extData, + queryFn: api.extDataList, + }) + const { data: schemaData } = useQuery({ + queryKey: QK.extDataSchemaAll, + queryFn: api.extDataSchemaAll, + }) + + const configs = extList?.items ?? [] + + const fieldsForConfig = useMemo((): ExtDataField[] => { + if (!draft.configId || !schemaData?.items) return [] + const schema = schemaData.items.find(s => s.id === draft.configId) + return schema?.columns.map(c => ({ name: c.name, dtype: c.type, label: c.label })) ?? [] + }, [draft.configId, schemaData]) + + const nonMetaFields = fieldsForConfig.filter( + f => !['symbol', 'code', 'date', 'name'].includes(f.name), + ) + + return ( +
+ e.stopPropagation()} + > +
+ 配置数据源 + +
+ +
+ {/* 数据源选择 */} +
+ 扩展数据源 + +
+ + {/* 维度字段选择 */} + {nonMetaFields.length > 0 && ( +
+ 维度字段(留空自动探测) + +
+ )} + + {showHierarchyLevel && ( +
+ 统计层级 + +
+ )} + +
+ 系统自动检测数据结构:支持"个股→概念/行业"和"概念/行业→成分股列表"两种模式。 + {showHierarchyLevel ? ' 行业字段按 “-” 拆分为 1/2/3 级。' : ''} +
+
+ +
+ + +
+
+
+ ) +} + +// ===== 总览统计卡片 ===== + +export function OverviewStatCards({ + groups, + totalStocks, + configLabel, + dateStr, + accentColor, +}: { + groups: DimensionGroup[] + totalStocks: number + configLabel: string + dateStr?: string | null + accentColor: string +}) { + const cards = [ + { label: '数据源', value: configLabel, hint: dateStr ?? '快照', icon: Database }, + { label: '维度数量', value: groups.length, hint: '按维度聚合分组', icon: Tags }, + { label: '覆盖标的', value: totalStocks, hint: '去重股票数', icon: BarChart3 }, + { + label: '最大分组', + value: groups[0]?.key ?? '—', + hint: groups[0] ? `${groups[0].count} 只` : '', + icon: TrendingUp, + }, + ] + + return ( +
+ {cards.map(card => ( +
+
+ {card.label} + +
+
+ {card.value} +
+
{card.hint}
+
+ ))} +
+ ) +} + +// ===== 维度热力图 ===== + +export function DimensionHeatmap({ + groups, + quoteMap, + selectedKey, + onSelect, + colorScheme, +}: { + groups: DimensionGroup[] + quoteMap: Map + selectedKey: string | null + onSelect: (key: string | null) => void + colorScheme: 'blue' | 'amber' +}) { + const [showAll, setShowAll] = useState(false) + // 收起时最大高度(约 3 行标签高度) + const collapsedMaxH = '8rem' + + const enriched = useMemo(() => { + return groups.map(g => { + const qm = computeQuoteMetrics(g.stocks, quoteMap) + return { ...g, quoteMetrics: qm } + }) + }, [groups, quoteMap]) + + // 根据涨跌比渲染颜色强度 + const colors = colorScheme === 'blue' + ? { up: [59, 130, 246], down: [96, 165, 250], bg: [30, 64, 175] } + : { up: [245, 158, 11], down: [251, 191, 36], bg: [180, 83, 9] } + + return ( +
+
+ 热度分布(按标的覆盖数) + +
+
+ {enriched.map(g => { + const qm = g.quoteMetrics + const total = qm.upCount + qm.downCount + qm.flatCount + const upRatio = total > 0 ? qm.upCount / total : 0.5 + const size = Math.max(0.6, Math.min(1.4, g.count / (enriched[0]?.count || 1))) + const active = selectedKey === g.key + const [r, gr, b] = colors.up + + return ( + + ) + })} +
+
+ ) +} + +// ===== 维度分组侧边栏 ===== + +export function DimensionGroupSidebar({ + groups, + quoteMap, + selectedKey, + onSelect, + searchValue, + onSearchChange, + kindLabel, + colorScheme, +}: { + groups: DimensionGroup[] + quoteMap: Map + selectedKey: string | null + onSelect: (key: string) => void + searchValue: string + onSearchChange: (v: string) => void + kindLabel: string + colorScheme: 'blue' | 'amber' +}) { + const q = searchValue.trim().toLowerCase() + const filtered = q + ? groups.filter(g => g.key.toLowerCase().includes(q)) + : groups + + const accentColor = colorScheme === 'blue' ? 'rgba(59,130,246,0.7)' : 'rgba(245,158,11,0.7)' + const accentBg = colorScheme === 'blue' ? 'rgba(59,130,246,0.1)' : 'rgba(245,158,11,0.1)' + const accentBorder = colorScheme === 'blue' ? 'rgba(59,130,246,0.25)' : 'rgba(245,158,11,0.25)' + + return ( +
+
+

{kindLabel}榜单

+

按覆盖标的数量排序

+
+
+
+ + onSearchChange(e.target.value)} + placeholder={`搜索${kindLabel}`} + className="h-8 w-full rounded-btn border border-border bg-base pl-8 pr-3 text-xs text-foreground placeholder:text-muted/50 focus:outline-none focus:border-accent/50" + /> +
+
+
+ {filtered.length === 0 ? ( +
没有可展示的分组
+ ) : filtered.slice(0, 200).map((group, i) => { + const active = selectedKey === group.key + const qm = computeQuoteMetrics(group.stocks, quoteMap) + return ( + + ) + })} +
+
+ ) +} + +// ===== 行情摘要条 ===== + +export function QuoteSummaryBar({ + groups, + quoteMap, +}: { + groups: DimensionGroup[] + quoteMap: Map +}) { + const stats = useMemo(() => { + let upTotal = 0, downTotal = 0, flatTotal = 0 + for (const g of groups) { + const qm = computeQuoteMetrics(g.stocks, quoteMap) + upTotal += qm.upCount + downTotal += qm.downCount + flatTotal += qm.flatCount + } + return { upTotal, downTotal, flatTotal } + }, [groups, quoteMap]) + + const total = stats.upTotal + stats.downTotal + stats.flatTotal + if (total === 0) return null + + const upPct = (stats.upTotal / total) * 100 + const downPct = (stats.downTotal / total) * 100 + + return ( +
+
+
+
+
+
+ {stats.upTotal}涨 + / + {stats.downTotal}跌 +
+ ) +} + +// ===== 配置按钮 ===== + +export function ConfigButton({ onClick }: { onClick: () => void }) { + return ( + + ) +} diff --git a/frontend/src/components/data/ActiveJobCard.tsx b/frontend/src/components/data/ActiveJobCard.tsx new file mode 100644 index 0000000..025227a --- /dev/null +++ b/frontend/src/components/data/ActiveJobCard.tsx @@ -0,0 +1,135 @@ +import { useRef, useMemo, useEffect } from 'react' +import { motion } from 'framer-motion' +import { Loader2, CheckCircle2, XCircle } from 'lucide-react' +import { formatDuration, formatLogTime } from '@/lib/format' +import { Pill } from './StatCard' +import type { PipelineJob } from '@/lib/api' + +export const STAGE_LABELS: Record = { + init: '初始化', + resolve_universe: '解析标的池', + sync_instruments: '同步标的维表', + sync_daily: '同步日 K', + sync_adj: '同步除权因子', + compute_enriched: '计算技术指标', + sync_minute: '同步分钟 K', + extend_history: '扩展日K历史', + extend_minute: '扩展分钟K历史', + rebuild_enriched: '全量计算', + refresh_views: '刷新视图', + done: '完成', +} + +function LogViewer({ log }: { log: PipelineJob['log'] }) { + const containerRef = useRef(null) + + const displayLog = useMemo(() => { + if (!log.length) return [] + return log.filter((line, i) => { + const next = log[i + 1] + if ( + next && + line.stage === next.stage && + /\d+\/\d+/.test(line.msg) && + /\d+\/\d+/.test(next.msg) + ) { + return false + } + return true + }) + }, [log]) + + useEffect(() => { + const el = containerRef.current + if (el) el.scrollTop = el.scrollHeight + }, [displayLog]) + + return ( +
+ {displayLog.map((line, i) => ( +
+ {formatLogTime(line.ts)} + [{STAGE_LABELS[line.stage] ?? line.stage}] + {line.msg} +
+ ))} + {displayLog.length === 0 &&
等待启动…
} +
+ ) +} + +export function ActiveJobCard({ job }: { job: PipelineJob }) { + const statusMap = { + running: { icon: Loader2, color: 'text-accent', label: '运行中', spinning: true, border: 'border-accent/40', bg: 'bg-accent/5' }, + pending: { icon: Loader2, color: 'text-muted', label: '排队中', spinning: true, border: 'border-border', bg: 'bg-surface' }, + succeeded: { icon: CheckCircle2, color: 'text-bear', label: '完成', spinning: false, border: 'border-bear/30', bg: 'bg-bear/5' }, + failed: { icon: XCircle, color: 'text-danger', label: '失败', spinning: false, border: 'border-danger/40', bg: 'bg-danger/5' }, + } as const + const meta = statusMap[job.status] + const Icon = meta.icon + const isDone = job.status === 'succeeded' || job.status === 'failed' + const stageLabel = isDone ? meta.label : (STAGE_LABELS[job.stage] ?? job.stage) + + return ( +
+
+
+ +
+
+ {meta.label}{!isDone && ` · ${stageLabel}`} +
+
+ {job.id} · {job.duration_s != null ? formatDuration(job.duration_s) : '进行中'} +
+
+
+ {!isDone && ( +
+ {job.progress}% +
+ )} +
+ + {!isDone && ( +
+
+ +
+ {job.stage_pct > 0 && ( +
+ 当前阶段 + {job.stage_pct}% +
+ )} +
+ )} + + + + {job.status === 'succeeded' && job.result && (() => { + const skipped = new Set(job.result.skipped_stages ?? []) + const cell = (stage: string | null, v: string) => + stage && skipped.has(stage) ? '跳过' : v + return ( +
+ + + + + +
+ ) + })()} + {job.status === 'failed' && job.error && ( +
+ {job.error} +
+ )} +
+ ) +} diff --git a/frontend/src/components/data/DepthConfigCard.tsx b/frontend/src/components/data/DepthConfigCard.tsx new file mode 100644 index 0000000..a058515 --- /dev/null +++ b/frontend/src/components/data/DepthConfigCard.tsx @@ -0,0 +1,143 @@ +import { useState, useEffect } from 'react' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { api } from '@/lib/api' +import { QK } from '@/lib/queryKeys' +import { usePreferences, useCapabilities } from '@/lib/useSharedQueries' +import { isExpertOrAbove } from '@/lib/capability-labels' + +/** + * 五档盘口 sealed(真假涨停) 配置内容(纯内容, 无外框, 由父级 Card 包裹)。 + * + * - 轮询间隔: Pro 10~120s / Expert 3~300s + * - 盘后定版时间: 15:01~18:00, 默认 15:02 + * - disabled 时(监控关闭)输入框禁用 + */ +// 注: 文件名保留 DepthConfigCard.tsx, 导出 DepthConfigContent(纯内容无外框) +export function DepthConfigContent({ disabled }: { disabled?: boolean }) { + const qc = useQueryClient() + const prefs = usePreferences() + const caps = useCapabilities() + + const hasDepth = !!caps.data?.capabilities?.['depth5.batch'] + const tierLabel = caps.data?.label ?? '' + const range = isExpertOrAbove(tierLabel) ? { lo: 3, hi: 300 } : { lo: 10, hi: 120 } + + const interval = prefs.data?.depth_polling_interval ?? 20 + const finalizeTime = prefs.data?.depth_finalize_time ?? { hour: 15, minute: 2 } + + const [intervalInput, setIntervalInput] = useState(String(Math.round(interval))) + const [finalizeHour, setFinalizeHour] = useState(String(finalizeTime.hour)) + const [finalizeMinute, setFinalizeMinute] = useState(String(finalizeTime.minute)) + + useEffect(() => { setIntervalInput(String(Math.round(interval))) }, [interval]) + useEffect(() => { + setFinalizeHour(String(finalizeTime.hour)) + setFinalizeMinute(String(finalizeTime.minute)) + }, [finalizeTime.hour, finalizeTime.minute]) + + const saveInterval = useMutation({ + mutationFn: (v: number) => api.updateDepthPollingInterval(v), + onSuccess: () => qc.invalidateQueries({ queryKey: QK.preferences }), + }) + const saveFinalize = useMutation({ + mutationFn: ({ hour, minute }: { hour: number; minute: number }) => + api.updateDepthFinalizeTime(hour, minute), + onSuccess: () => qc.invalidateQueries({ queryKey: QK.preferences }), + }) + + // 无能力: 显示升级提示 + if (!hasDepth) { + return ( +

+ 真假涨停判定依赖五档盘口实时快照,需 Pro 及以上套餐。 + 升级后连板梯队将自动区分真封板(显示封单量)与假涨停(归入炸板)。 +

+ ) + } + + const inputCls = `w-16 h-7 bg-elevated border border-border rounded text-xs text-center px-1 focus:outline-none focus:border-accent/50 ${disabled ? 'opacity-40 cursor-not-allowed' : ''}` + + return ( +
+ {/* 盘中轮询间隔 */} +
+
+
盘中轮询间隔
+
范围 {range.lo}~{range.hi} 秒 · 涨跌停过多时系统自动放慢
+
+
+ setIntervalInput(e.target.value)} + onBlur={() => { + if (disabled) return + let v = Number(intervalInput) + if (!Number.isFinite(v)) v = range.lo + v = Math.max(range.lo, Math.min(range.hi, v)) + saveInterval.mutate(v) + }} + className={inputCls} + /> + +
+
+ + {/* 盘后定版时间 */} +
+
+
盘后定版时间
+
范围 15:01~18:00 · 收盘后拉取最终盘口定版
+
+
+ setFinalizeHour(e.target.value)} + onBlur={() => { + if (disabled) return + let h = Number(finalizeHour) + if (!Number.isFinite(h)) h = 15 + h = Math.max(15, Math.min(18, h)) + let m = Number(finalizeMinute) + if (!Number.isFinite(m)) m = 2 + m = Math.max(0, Math.min(59, m)) + if (h * 60 + m < 15 * 60 + 1) { h = 15; m = 1 } + if (h * 60 + m > 18 * 60) { h = 18; m = 0 } + saveFinalize.mutate({ hour: h, minute: m }) + }} + className={`w-12 h-7 bg-elevated border border-border rounded text-xs text-center px-1 focus:outline-none focus:border-accent/50 ${disabled ? 'opacity-40 cursor-not-allowed' : ''}`} + /> + : + setFinalizeMinute(e.target.value)} + onBlur={() => { + if (disabled) return + let h = Number(finalizeHour) + if (!Number.isFinite(h)) h = 15 + h = Math.max(15, Math.min(18, h)) + let m = Number(finalizeMinute) + if (!Number.isFinite(m)) m = 2 + m = Math.max(0, Math.min(59, m)) + if (h * 60 + m < 15 * 60 + 1) { h = 15; m = 1 } + if (h * 60 + m > 18 * 60) { h = 18; m = 0 } + saveFinalize.mutate({ hour: h, minute: m }) + }} + className={`w-12 h-7 bg-elevated border border-border rounded text-xs text-center px-1 focus:outline-none focus:border-accent/50 ${disabled ? 'opacity-40 cursor-not-allowed' : ''}`} + /> +
+
+
+ ) +} diff --git a/frontend/src/components/data/EnrichedRebuildPanel.tsx b/frontend/src/components/data/EnrichedRebuildPanel.tsx new file mode 100644 index 0000000..b50cfdc --- /dev/null +++ b/frontend/src/components/data/EnrichedRebuildPanel.tsx @@ -0,0 +1,111 @@ +import { useState } from 'react' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { Loader2 } from 'lucide-react' +import { api } from '@/lib/api' +import { QK } from '@/lib/queryKeys' +import { usePreferences } from '@/lib/useSharedQueries' + +export function EnrichedRebuildPanel({ isRunning, onStart }: { isRunning: boolean; onStart: () => void }) { + const qc = useQueryClient() + const prefs = usePreferences() + const batchSize = prefs.data?.enriched_batch_size ?? 1000 + const [editing, setEditing] = useState(false) + const [draftSize, setDraftSize] = useState(String(batchSize)) + const [hint, setHint] = useState(null) + + function clampAndSave(raw: number) { + if (isNaN(raw) || 1 > raw) { setHint('已自动设为最小值 1'); saveBatch.mutate(1); return } + if (raw > 10000) { setHint('已自动设为上限 10000'); saveBatch.mutate(10000); return } + setHint(null); saveBatch.mutate(raw) + } + + const saveBatch = useMutation({ + mutationFn: (size: number) => api.updateEnrichedBatchSize(size), + onSuccess: () => { + qc.invalidateQueries({ queryKey: QK.preferences }) + setEditing(false) + }, + }) + const rebuild = useMutation({ + mutationFn: api.rebuildEnriched, + onSuccess: () => { + onStart() + qc.invalidateQueries({ queryKey: QK.pipelineJobs }) + }, + }) + + return ( +
+
+
+
+
批次大小
+
每批计算的标的数量,影响内存占用与进度粒度
+
+ {editing ? ( +
+ setDraftSize(e.target.value)} + className="w-20 px-2 py-1 text-xs font-mono rounded-btn border border-border bg-surface text-foreground text-right tabular-nums focus:outline-none focus:border-accent" + min={1} + max={10000} + autoFocus + onKeyDown={e => { + if (e.key === 'Enter') clampAndSave(parseInt(draftSize)) + if (e.key === 'Escape') { setEditing(false); setHint(null) } + }} + /> + + +
+ ) : ( + + )} +
+
+ + 每批内存占用 = 批次大小 × 日K历史天数。批次越大或日K历史越长,内存占用越高,可能导致程序崩溃。内存不足时请适当降低此值。 + +
+ {hint && ( +
+ {hint} +
+ )} +
+ +
+
基于已有 kline_daily + adj_factor 全量计算前复权 + 技术指标 + 信号
+ +
+
+ ) +} diff --git a/frontend/src/components/data/ExtendHistoryPanel.tsx b/frontend/src/components/data/ExtendHistoryPanel.tsx new file mode 100644 index 0000000..eee7cc3 --- /dev/null +++ b/frontend/src/components/data/ExtendHistoryPanel.tsx @@ -0,0 +1,98 @@ +import { useState } from 'react' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { Loader2 } from 'lucide-react' +import { api } from '@/lib/api' +import { QK } from '@/lib/queryKeys' + +export function ExtendHistoryPanel({ caps, isRunning, earliestDate, onStart }: { + caps: { label: string; capabilities: Record } | undefined + isRunning: boolean + earliestDate: string | null + onStart: () => void +}) { + const qc = useQueryClient() + const [value, setValue] = useState(6) + const [unit, setUnit] = useState<'month' | 'year'>('month') + const hasBatchCap = !!caps?.capabilities?.['kline.daily.batch'] + + const extend = useMutation({ + mutationFn: () => api.extendHistory(value, unit), + onSuccess: () => { + onStart() + qc.invalidateQueries({ queryKey: QK.pipelineJobs }) + }, + }) + + const offsetDays = unit === 'month' ? value * 30 : value * 365 + const estimate = earliestDate + ? (() => { + const d = new Date(earliestDate) + d.setDate(d.getDate() - offsetDays) + return d.toISOString().slice(0, 10) + })() + : null + + return ( +
+
向前扩展历史数据
+ +
+
+ +
+ {value} +
+ +
+ +
+ {(['month', 'year'] as const).map(u => ( + + ))} +
+
+ + {estimate && ( +
+ 预计扩展至 {estimate} + {earliestDate && (当前最早: {earliestDate})} +
+ )} + + + + {!hasBatchCap && ( + + 需 Pro+ 权限 + + )} +
+ ) +} diff --git a/frontend/src/components/data/MinuteSyncConfig.tsx b/frontend/src/components/data/MinuteSyncConfig.tsx new file mode 100644 index 0000000..2a96b1e --- /dev/null +++ b/frontend/src/components/data/MinuteSyncConfig.tsx @@ -0,0 +1,219 @@ +import { useState, useEffect } from 'react' +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' +import { Loader2 } from 'lucide-react' +import { api } from '@/lib/api' +import { QK } from '@/lib/queryKeys' +import { isExpertOrAbove } from '@/lib/capability-labels' + +export function MinuteSyncConfig({ caps, isRunning, onStart }: { caps: { label: string; capabilities: Record } | undefined; isRunning: boolean; onStart: () => void }) { + const qc = useQueryClient() + const prefs = useQuery({ + queryKey: QK.preferences, + queryFn: api.preferences, + }) + const update = useMutation({ + mutationFn: ({ enabled, days }: { enabled: boolean; days: number }) => + api.updateMinuteSync(enabled, days), + onSuccess: () => qc.invalidateQueries({ queryKey: QK.preferences }), + }) + + const hasMinuteCap = !!caps?.capabilities?.['kline.minute.batch'] + const enabled = prefs.data?.minute_sync_enabled ?? false + const days = prefs.data?.minute_sync_days ?? 5 + const [localDays, setLocalDays] = useState(days) + + useEffect(() => { setLocalDays(days) }, [days]) + + const handleToggle = () => { + if (!hasMinuteCap) return + update.mutate({ enabled: !enabled, days: localDays }) + } + + return ( +
+
+
+ + + {enabled ? '自动同步' : '已关闭'} + +
+ {!hasMinuteCap && ( + + 需 Pro+ + + )} +
+ +
+ 同步天数 +
+
+ +
+ {localDays} +
+ +
+ +
+
+ +
+
向前扩展历史数据
+ +
+ +
+ A股标的 · 原始数据存储(查询时实时复权) +
+
+ ) +} + +function MinuteExtendControls({ hasMinuteCap, tierLabel, isRunning, onStart }: { hasMinuteCap: boolean; tierLabel: string; isRunning: boolean; onStart: () => void }) { + const qc = useQueryClient() + // 月单位(按月扩展更长的分钟K历史)仅 Expert+ 开放;Pro 仅可用"天"(1~15 天) + const canUseMonth = isExpertOrAbove(tierLabel) + const [unit, setUnit] = useState<'day' | 'month'>('day') + const [value, setValue] = useState(5) + const [confirmOpen, setConfirmOpen] = useState(false) + + const dataStatus = useQuery({ + queryKey: QK.dataStatus, + queryFn: api.dataStatus, + }) + // 判断本地是否已有分钟K数据:后端 _safe_aggregate_minute 为避免全表扫描, + // rows 恒为 0,改用 trading_days(分区目录数,真实统计)判断。 + const hasMinuteData = !!(dataStatus.data?.minute?.trading_days) + + const extend = useMutation({ + mutationFn: () => api.extendMinuteHistory(value, unit), + onSuccess: () => { + onStart() + qc.invalidateQueries({ queryKey: QK.pipelineJobs }) + qc.invalidateQueries({ queryKey: QK.dataStatus }) + }, + }) + + // 各单位上限:day 15 天,month 6 月(180 天) + const maxValue = unit === 'month' ? 6 : 15 + + const handleFetch = () => { + if (!hasMinuteData) { + setConfirmOpen(true) + } else { + extend.mutate() + } + } + + // 切换单位时把 value clamp 到新单位的上限 + const switchUnit = (u: 'day' | 'month') => { + if (u === unit) return + setUnit(u) + const max = u === 'month' ? 6 : 15 + setValue(v => Math.min(v, max)) + } + + return ( + <> +
+
+ +
+ {value} +
+ +
+ + {canUseMonth ? ( +
+ {(['day', 'month'] as const).map(u => ( + + ))} +
+ ) : ( + + )} +
+ + + + {confirmOpen && ( +
+
setConfirmOpen(false)} /> +
+
本地暂无分钟K数据,是否立即获取最近 {value} {unit === 'month' ? '月' : '天'}的分钟K?
+
+ + +
+
+
+ )} + + ) +} diff --git a/frontend/src/components/data/QuoteConfigCard.tsx b/frontend/src/components/data/QuoteConfigCard.tsx new file mode 100644 index 0000000..02484b7 --- /dev/null +++ b/frontend/src/components/data/QuoteConfigCard.tsx @@ -0,0 +1,165 @@ +import { useState } from 'react' +import { AnimatePresence, motion } from 'framer-motion' +import { Activity, Settings } from 'lucide-react' +import { Skeleton } from './Skeleton' + +export function QuoteConfigCard({ enabled, running, isTrading, lastFetchMs, intervalS, intervalMin, intervalMax, loading, onToggle, toggling, showIntervalEdit, onShowIntervalEdit, onIntervalChange }: { + enabled: boolean + running: boolean + isTrading: boolean + lastFetchMs: number | null + intervalS: number + intervalMin: number + intervalMax: number + loading: boolean + onToggle: (enabled: boolean) => void + toggling: boolean + showIntervalEdit: boolean + onShowIntervalEdit: () => void + onIntervalChange: (v: number) => void +}) { + const statusColor = running && isTrading + ? 'bg-accent shadow-[0_0_6px_rgba(61,214,140,0.5)]' + : enabled && running + ? 'bg-warning/60' + : 'bg-muted' + + const statusText = !enabled + ? '已关闭' + : !isTrading + ? '非交易时段' + : running + ? '行情运行中' + : '已停止' + + const lastFetchTime = lastFetchMs + ? new Date(lastFetchMs).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }) + : null + + return ( +
+
+
+ +

实时行情

+
+ +
+ + {loading ? ( +
+
+
+
+
+
+ ) : ( +
+
+ 状态 +
+ + {statusText} +
+
+
+ 交易时段 + {isTrading ? '交易中' : '休市'} +
+
+
+ 轮询间隔 + +
+ {intervalS}s +
+
+ 最后获取 + {lastFetchTime ?? '—'} +
+
+ )} + + + {showIntervalEdit && ( + + + + )} + +
+ ) +} + +function IntervalEditor({ min, max, value, onChange }: { + min: number; max: number; value: number; onChange: (v: number) => void +}) { + const [draft, setDraft] = useState(value) + const clamped = Math.max(min, Math.min(max, draft)) + const step = min < 1 ? 0.1 : min < 3 ? 0.5 : 1 + const presets = min <= 3 ? [3, 5, 10, 30, 60] : [5, 10, 15, 30, 60] + + return ( +
+
+ 轮询间隔 ({min}s ~ {max}s) +
+
+ {presets.map(p => ( + + ))} +
+
+ { const v = parseFloat(e.target.value); setDraft(v); onChange(v) }} + className="flex-1 h-1 accent-accent cursor-pointer" + /> + + {clamped < 1 ? clamped.toFixed(1) : clamped.toFixed(0)}s + +
+
+ ) +} diff --git a/frontend/src/components/data/ScheduleEditor.tsx b/frontend/src/components/data/ScheduleEditor.tsx new file mode 100644 index 0000000..e8c2171 --- /dev/null +++ b/frontend/src/components/data/ScheduleEditor.tsx @@ -0,0 +1,43 @@ +import { useState, useEffect } from 'react' + +export function ScheduleEditor({ value, onSave, loading, hint }: { + value: { hour: number; minute: number } + onSave: (hour: number, minute: number) => void + loading: boolean + hint?: string +}) { + const [h, setH] = useState(value.hour) + const [m, setM] = useState(value.minute) + + useEffect(() => { setH(value.hour); setM(value.minute) }, [value.hour, value.minute]) + + const handleSave = () => { + if (h === value.hour && m === value.minute) return + onSave(h, m) + } + + return ( +
+ 每日 + setH(Math.max(0, Math.min(23, Number(e.target.value))))} + className="w-12 px-1.5 py-1 rounded-btn bg-base border border-border text-xs font-mono text-foreground text-center" + /> + : + setM(Math.max(0, Math.min(59, Number(e.target.value))))} + className="w-12 px-1.5 py-1 rounded-btn bg-base border border-border text-xs font-mono text-foreground text-center" + /> + + 工作日自动执行{hint ? ` · ${hint}` : ''} +
+ ) +} diff --git a/frontend/src/components/data/SchemaModal.tsx b/frontend/src/components/data/SchemaModal.tsx new file mode 100644 index 0000000..0a42867 --- /dev/null +++ b/frontend/src/components/data/SchemaModal.tsx @@ -0,0 +1,102 @@ +import { AnimatePresence, motion } from 'framer-motion' +import { useQuery } from '@tanstack/react-query' +import { api, type EnrichedField } from '@/lib/api' +import { QK } from '@/lib/queryKeys' + +const TABLE_TITLES: Record = { + instruments: '标的维表', + daily: '日 K', + adj_factor: '除权因子', + enriched: 'Enriched', + minute: '分钟 K', + index_instruments: '指数维表', + index_daily: '指数日 K', + index_enriched: '指数 Enriched', +} + +function categorize(name: string): string { + if (['symbol', 'date'].includes(name)) return '基础' + if (['open', 'high', 'low', 'close', 'volume', 'amount'].includes(name)) return '行情' + if (name.startsWith('raw_') || name.startsWith('ex_') || name === 'close_pre_adj') return '复权' + if (name.startsWith('ma')) return '均线 MA' + if (name.startsWith('ema')) return '指数均线 EMA' + if (name.startsWith('macd')) return 'MACD' + if (name.startsWith('boll')) return '布林带' + if (name.startsWith('kdj')) return 'KDJ' + if (name.startsWith('rsi')) return 'RSI' + if (name.startsWith('signal_') || name.startsWith('consecutive_')) return '信号' + if (['atr_14', 'vol_ratio_5d', 'vol_ma5', 'vol_ma10', 'momentum_5d', 'momentum_10d', 'momentum_20d', 'momentum_30d', 'momentum_60d', 'annual_vol_20d', 'change_pct', 'change_amount', 'amplitude', 'turnover_rate'].includes(name)) return '波动/动量' + if (['high_60d', 'low_60d'].includes(name)) return '极值' + return '其他' +} + +export function EnrichedSchemaModal({ table, onClose }: { table: string | null; onClose: () => void }) { + const open = !!table + const schema = useQuery({ + queryKey: QK.tableSchema(table!), + queryFn: () => api.enrichedSchema(table!), + enabled: open, + staleTime: Infinity, + }) + + const fields = schema.data ?? [] + + const groups: Record = {} + for (const f of fields) { + const cat = categorize(f.name) + if (!groups[cat]) groups[cat] = [] + groups[cat].push(f) + } + + const title = table ? (TABLE_TITLES[table] ?? table) : '' + + return ( + + {open && ( + +
+ +
+

{title} 字段说明

+ {fields.length} 个字段 +
+
+ {schema.isLoading ? ( +
加载中…
+ ) : ( +
+ {Object.entries(groups).map(([cat, items]) => ( +
+
{cat}
+
+ {items.map((f) => ( +
+ {f.name} + {f.desc} + {f.type} +
+ ))} +
+
+ ))} +
+ )} +
+
+ + )} + + ) +} diff --git a/frontend/src/components/data/SectionTitle.tsx b/frontend/src/components/data/SectionTitle.tsx new file mode 100644 index 0000000..3756bcb --- /dev/null +++ b/frontend/src/components/data/SectionTitle.tsx @@ -0,0 +1,61 @@ +import { CheckCircle2, XCircle, Loader2, AlertCircle } from 'lucide-react' +import { formatDuration } from '@/lib/format' + +export function SectionTitle({ icon: Icon, children }: { icon: React.ComponentType<{ className?: string }>; children: React.ReactNode }) { + return ( +

+ + {children} +

+ ) +} + +export function HistoryRow({ job, onClick }: { job: any; onClick: () => void }) { + const statusIcon = { + succeeded: { icon: CheckCircle2, color: 'text-bear' }, + failed: { icon: XCircle, color: 'text-danger' }, + running: { icon: Loader2, color: 'text-accent', spinning: true }, + pending: { icon: Loader2, color: 'text-muted', spinning: true }, + }[job.status as 'succeeded'] ?? { icon: AlertCircle, color: 'text-muted' } + const Icon = statusIcon.icon + + return ( + + ) +} diff --git a/frontend/src/components/data/SettingsModal.tsx b/frontend/src/components/data/SettingsModal.tsx new file mode 100644 index 0000000..5054ef0 --- /dev/null +++ b/frontend/src/components/data/SettingsModal.tsx @@ -0,0 +1,27 @@ +import { motion } from 'framer-motion' +import { X } from 'lucide-react' + +export function SettingsModal({ title, onClose, children }: { title: string; onClose: () => void; children: React.ReactNode }) { + return ( +
+
+ +
+

{title}

+ +
+
+ {children} +
+
+
+ ) +} diff --git a/frontend/src/components/data/Skeleton.tsx b/frontend/src/components/data/Skeleton.tsx new file mode 100644 index 0000000..8afc405 --- /dev/null +++ b/frontend/src/components/data/Skeleton.tsx @@ -0,0 +1,7 @@ +export function Skeleton({ w = 'w-full', h = 'h-3.5', rounded = 'rounded-sm', className = '' }: { + w?: string; h?: string; rounded?: string; className?: string +}) { + return ( +
+ ) +} diff --git a/frontend/src/components/data/StatCard.tsx b/frontend/src/components/data/StatCard.tsx new file mode 100644 index 0000000..3b95777 --- /dev/null +++ b/frontend/src/components/data/StatCard.tsx @@ -0,0 +1,316 @@ +import { motion } from 'framer-motion' +import { Loader2, CheckCircle2, Settings, Table2 } from 'lucide-react' +import { formatNumber } from '@/lib/format' +import { fmtDate } from '@/lib/format' +import { Skeleton } from './Skeleton' + +// 卡片能力定义:capKey → 查 capability limits;tierReq → 无权限时显示的档位要求 +// capKey 为空串表示该数据在 free-api 服务器(无档/免费档)即可获取,无需付费能力门控。 +export const CARD_META: Record = { + // 标的维表走 exchanges 端点,free-api 服务器即可获取,无需付费能力 + instruments: { capKey: '', tierReq: '' }, + daily: { capKey: 'kline.daily.batch', tierReq: 'Starter+' }, + adj_factor: { capKey: 'adj_factor', tierReq: 'Starter+' }, + enriched: { capKey: '', tierReq: '' }, + minute: { capKey: 'kline.minute.batch', tierReq: 'Pro+' }, + financials: { capKey: 'financial', tierReq: 'Expert' }, +} + +export function Pill({ label, value }: { label: string; value: number | string }) { + return ( +
+
{label}
+
{value}
+
+ ) +} + +function CapBadge({ hasCap, isLocal, tierLabel, tierReq, capInfo, localSuffix }: { + hasCap: boolean + isLocal: boolean + tierLabel?: string + tierReq?: string + capInfo?: { rpm: number | null; batch: number | null; subscribe: number | null } | undefined + localSuffix?: string +}) { + if (isLocal) { + return ( + + 本地计算{localSuffix ? ` · ${localSuffix}` : ''} + + ) + } + + if (hasCap && capInfo && tierLabel) { + const parts = [tierLabel, `${capInfo.rpm}/min`] + if (capInfo.batch != null && capInfo.batch > 1) parts.push(`${capInfo.batch}股/批`) + return ( + + {parts.join(' · ')} + + ) + } + + if (!hasCap && tierReq && tierReq !== 'Free') { + // 缺权限且非 Free 档(付费档位才提示升级);Free 档人人可用, + // 若显示"需 Free"会造成 Expert 等用户困惑(通常是探测瞬时失败丢能力) + return ( + + 需 {tierReq} + + ) + } + + if (hasCap) { + return ( + + {tierLabel ?? '已授权'} + + ) + } + + return null +} + +export type FieldTab = { label: string; table: string } + +export function StatCard({ + title, hint, stats, isInstrument = false, loading = false, + active = false, done = false, skipped = false, stagePct = 0, + tierKey, capLimits, tierLabel, + auto, onSettings, onShowFields, settingsOpen, subLabel, localBadgeSuffix, fieldTabs, +}: { + title: string + hint: string + stats: any | null | undefined + isInstrument?: boolean + loading?: boolean + active?: boolean + done?: boolean + skipped?: boolean + stagePct?: number + tierKey?: string + capLimits?: Record + tierLabel?: string + onSettings?: () => void + onShowFields?: (table?: string) => void + settingsOpen?: boolean + auto?: boolean + subLabel?: string + localBadgeSuffix?: string + // 多表字段入口: [{label: '维表', table: 'index_instruments'}, ...] + // 提供时渲染多个图标按钮(每个对应一张表的字段说明); 否则回退到单个 onShowFields + fieldTabs?: FieldTab[] +}) { + const empty = loading || !stats || (stats.rows === 0 && !stats.trading_days && !stats.fields) + const borderCls = active + ? 'border-accent/50' + : done + ? 'border-bear/30' + : 'border-border' + const bgCls = active ? 'bg-accent/[0.03]' : 'bg-surface' + + const meta = tierKey ? CARD_META[tierKey] : undefined + const isLocal = meta?.capKey === '' + const capInfo = meta?.capKey ? capLimits?.[meta.capKey] : undefined + const hasCap = isLocal || !!capInfo + + // 渲染字段说明入口图标 + // - fieldTabs 提供时: 返回 null (图标由 renderSubLabelInline 内联到文字后) + // - 否则: 单个图标按钮 (onShowFields) + const renderFieldButtons = () => { + if (fieldTabs && fieldTabs.length > 0) return null + if (onShowFields) { + return ( + + ) + } + return null + } + + // 单个图标按钮 (复用样式) + const fieldIconButton = (tab: FieldTab) => ( + + ) + + // subLabel 文本内容 (不含图标) + const subLabelText = subLabel + ?? (isInstrument + ? `标的 · ${((stats?.named ?? stats?.rows) ?? 0).toLocaleString()} 个含名称` + : stats?.fields + ? '字段 · 复权 · 技术指标' + : title === '日 K' && stats?.trading_days + ? '日 · A股标的 · 日线' + : stats?.trading_days && !stats?.rows + ? '日 · A股标的 · 分钟级' + : (() => { + const parts = [`行 · ${(stats?.symbols_covered ?? 0)} 只标的`] + if (stats?.trading_days) parts.push(`· ${stats.trading_days} 日`) + return parts.join(' ') + })()) + + // 有 fieldTabs 时: 把 subLabel 按分隔符拆开, 每个匹配词后面内联图标 + // 例如 "日 · 维表 · 日K · 指标" → 日 · 维表[icon] · 日K[icon] · 指标[icon] + const renderSubLabelInline = () => { + if (!fieldTabs || fieldTabs.length === 0) { + return <>{subLabelText}{renderFieldButtons()} + } + const labels = fieldTabs.map(t => t.label) + // 按非字母数字汉字的分隔符拆分, 保留分隔符 + const tokens = subLabelText.split(/(\s*·\s*|\s+)/).filter(t => t !== '') + const used = new Set() + return ( + <> + {tokens.map((tok, i) => { + const trimmed = tok.trim() + // 跳过纯分隔符 + if (trimmed === '' || trimmed === '·') return {tok} + // 匹配某个 tab label (整体匹配, 避免部分子串误命中) + const idx = labels.indexOf(trimmed) + if (idx >= 0 && !used.has(trimmed)) { + used.add(trimmed) + return {tok}{fieldIconButton(fieldTabs[idx])} + } + return {tok} + })} + + ) + } + + return ( +
+
+

{title}

+
+ {auto !== undefined && !loading && ( + + + {auto ? '自动' : '关闭'} + + )} + {active && } + {done && !active && !skipped && } + {skipped && !active && ( + + 本次跳过 + + )} + {onSettings && ( + + )} +
+
+ +
{hint}
+ +
+ {loading ? ( + + ) : ( + + )} +
+ +
+ {loading ? ( + <> + + + + ) : empty ? ( + <> +
+
+ 暂无数据{renderFieldButtons()} +
+ + ) : ( + <> +
+ {stats.fields + ? stats.fields + : stats.trading_days && !stats.rows + ? stats.trading_days.toLocaleString() + : formatNumber(stats.rows)} +
+
+ {renderSubLabelInline()} +
+ + )} +
+ +
+ {loading ? ( + <> +
+
+ + ) : empty ? ( + <> +
+ {isInstrument ? '快照日' : '起'} + +
+
+ {isInstrument ? '标的数' : '止'} + +
+ + ) : ( + <> +
+ {isInstrument ? '快照日' : '起'} + {fmtDate(isInstrument ? stats.latest_as_of : stats.earliest_date)} +
+
+ {isInstrument ? '标的数' : '止'} + {isInstrument ? String(stats.rows) : fmtDate(stats.latest_date)} +
+ + )} +
+ + {active && stagePct > 0 && ( +
+ +
+ )} +
+ ) +} diff --git a/frontend/src/components/ext-data/CreateExtDialog.tsx b/frontend/src/components/ext-data/CreateExtDialog.tsx new file mode 100644 index 0000000..2c7c995 --- /dev/null +++ b/frontend/src/components/ext-data/CreateExtDialog.tsx @@ -0,0 +1,383 @@ +import { useRef, useState } from 'react' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { motion } from 'framer-motion' +import { X, Loader2, Upload, Plus, AlertCircle, Tag, Clock } from 'lucide-react' +import { api, type ExtDataField } from '@/lib/api' +import { QK } from '@/lib/queryKeys' + +export function CreateExtDialog({ onClose }: { onClose: () => void }) { + const qc = useQueryClient() + const [id, setId] = useState('') + const [label, setLabel] = useState('') + const [description, setDescription] = useState('') + const [mode, setMode] = useState<'snapshot' | 'timeseries'>('snapshot') + const [fields, setFields] = useState([]) + const [error, setError] = useState('') + const detectFileRef = useRef(null) + const [detecting, setDetecting] = useState(false) + const [dragOver, setDragOver] = useState(false) + const [symbolMap, setSymbolMap] = useState>({}) + const [codeMap, setCodeMap] = useState>({}) + const [matchStatus, setMatchStatus] = useState<'none' | 'partial' | 'full'>('none') + const [selectMapping, setSelectMapping] = useState<{ fields: { name: string; dtype: string; label: string }[]; need: 'symbol' | 'code' | 'both' } | null>(null) + + const create = useMutation({ + mutationFn: () => { + const userF = fields.filter((f) => f.name.trim() && f.name !== 'symbol' && f.name !== 'code') + return api.extDataCreate({ + id, + label, + mode, + fields: [ + { name: 'symbol', dtype: 'string', label: '标的代码' }, + { name: 'code', dtype: 'string', label: '代码' }, + ...userF, + ], + description: description.trim() || undefined, + symbol_map: symbolMap, + code_map: codeMap, + }) + }, + onSuccess: () => { + qc.invalidateQueries({ queryKey: QK.extData }) + onClose() + }, + onError: (err) => setError(String(err)), + }) + + const addField = () => + setFields([...fields, { name: '', dtype: 'string', label: '' }]) + + const removeField = (i: number) => + setFields(fields.filter((_, idx) => idx !== i)) + + const updateField = (i: number, key: keyof ExtDataField, val: string) => + setFields(fields.map((f, idx) => (idx === i ? { ...f, [key]: val } : f))) + + const valid = id.trim() && label.trim() && fields.some((f) => f.name.trim()) && matchStatus !== 'none' + + const processDetection = ( + detected: { name: string; dtype: string; label: string }[], + symCands: string[], + codeCands: string[], + ) => { + let sm: Record = {} + let cm: Record = {} + let status: 'none' | 'partial' | 'full' = 'none' + + if (symCands.length === 1 && codeCands.length === 1) { + sm = { type: 'mapped', col: symCands[0] } + cm = { type: 'mapped', col: codeCands[0] } + status = 'full' + } else if (symCands.length === 1 && codeCands.length === 0) { + sm = { type: 'mapped', col: symCands[0] } + cm = { type: 'computed', from: 'symbol', method: 'strip_exchange' } + status = 'full' + } else if (symCands.length === 0 && codeCands.length === 1) { + cm = { type: 'mapped', col: codeCands[0] } + sm = { type: 'computed', from: 'code', method: 'append_exchange' } + status = 'full' + } else if (symCands.length > 1 || codeCands.length > 1) { + setSelectMapping({ + fields: detected, + need: symCands.length > 0 && codeCands.length > 0 ? 'both' : symCands.length > 0 ? 'symbol' : 'code', + }) + setFields(detected) + return + } else { + setSelectMapping({ fields: detected, need: 'both' }) + setFields(detected) + return + } + + setSymbolMap(sm) + setCodeMap(cm) + setMatchStatus(status) + setFields(detected) + setSelectMapping(null) + } + + const handleDetectFile = (e: React.ChangeEvent) => { + const file = e.target.files?.[0] + if (!file) return + e.target.value = '' + setDetecting(true); setError(''); setSelectMapping(null) + api.extDataDetectFields(file) + .then((res) => { + processDetection(res.fields, res.symbol_candidates, res.code_candidates) + }) + .catch((err) => setError(String(err))) + .finally(() => setDetecting(false)) + } + + const userFields = fields.filter(f => f.name !== 'symbol' && f.name !== 'code') + + return ( +
+
+ +
+
+
+

新增扩展数据

+

+ 接入自有数据,与标的自动关联(第三方接口或CSV/Excel),支持概念、人气、资金流、舆情、研报评分标签等场景 +

+
+ +
+
+ +
+
+
数据类型
+
+ {(['snapshot', 'timeseries'] as const).map((m) => { + const active = mode === m + return ( + + ) + })} +
+
+ +
+
+
显示名称
+ setLabel(e.target.value)} + placeholder={mode === 'snapshot' ? '例: 概念' : '例: 资金流'} + className="w-full h-9 px-3 rounded-lg bg-base border border-border text-xs text-foreground placeholder:text-muted/40 focus:outline-none focus:ring-1 focus:ring-accent/30 focus:border-accent/50 transition-shadow" + /> +
+
+
标识符
+ setId(e.target.value.replace(/[^a-zA-Z0-9_]/g, ''))} + placeholder={mode === 'snapshot' ? '例: concept' : '例: money_flow'} + className="w-full h-9 px-3 rounded-lg bg-base border border-border text-xs text-foreground font-mono placeholder:text-muted/40 focus:outline-none focus:ring-1 focus:ring-accent/30 focus:border-accent/50 transition-shadow" + /> +
+
+ +
+
描述
+ setDescription(e.target.value)} + placeholder="扩展数据 · 与标的 JOIN(可选自定义描述)" + className="w-full h-9 px-3 rounded-lg bg-base border border-border text-xs text-foreground placeholder:text-muted/40 focus:outline-none focus:ring-1 focus:ring-accent/30 focus:border-accent/50 transition-shadow" + /> +
+ +
+
字段定义
+ + + + {selectMapping && ( + +
+ 未自动识别到标的代码,请选择哪一列作为标的代码(symbol) +
+
+ {selectMapping.fields.map(f => ( + + ))} + +
+
+ )} + + {userFields.length === 0 ? ( +
detectFileRef.current?.click()} + onDragOver={e => { e.preventDefault(); setDragOver(true) }} + onDragLeave={() => setDragOver(false)} + onDrop={e => { + e.preventDefault() + setDragOver(false) + const file = e.dataTransfer.files[0] + if (file) { setDetecting(true); setError(''); setSelectMapping(null); api.extDataDetectFields(file).then(res => { processDetection(res.fields, res.symbol_candidates, res.code_candidates); }).catch(err => setError(String(err))).finally(() => setDetecting(false)) } + }} + className={`rounded-xl border-2 border-dashed py-6 flex flex-col items-center justify-center gap-2 cursor-pointer transition-colors ${ + dragOver ? 'border-accent bg-accent/[0.06]' : detecting ? 'border-border/40 pointer-events-none' : 'border-border/30 hover:border-accent/40 hover:bg-accent/[0.02]' + }`} + > + {detecting ? ( + <>检测字段中… + ) : ( + <> + + 上传数据文件(CSV / Excel)自动识别数据格式 + 自动识别列名和类型,symbol 列自动匹配 + + )} +
+ ) : ( + <> +
+ + +
+
+
+ 标的代码 + symbol + 文本 + {matchStatus !== 'none' + ? + {symbolMap.type === 'mapped' ? `← ${symbolMap.col}` : '← 计算'} + + : } +
+
+ 代码 + code + 文本 + {matchStatus !== 'none' + ? + {codeMap.type === 'mapped' ? `← ${codeMap.col}` : codeMap.method === 'strip_exchange' ? '← symbol截取' : '← 推算'} + + : } +
+ {userFields.map((f) => { + const idx = fields.indexOf(f) + return ( +
+ updateField(idx, 'label', e.target.value)} + placeholder="显示名" + className="w-[72px] h-7 px-2 rounded-md border border-border bg-base text-[11px] text-foreground placeholder:text-muted/40 focus:outline-none focus:border-accent/40" + /> + updateField(idx, 'name', e.target.value)} + placeholder="字段名" + className="flex-1 h-7 px-2 rounded-md border border-border bg-base text-[11px] font-mono text-foreground placeholder:text-muted/40 focus:outline-none focus:border-accent/40" + /> + + +
+ ) + })} +
+ + )} +
+ + {error && ( +
{error}
+ )} +
+ +
+
数据需自行维护和更新,系统不会自动同步
+
+ + +
+
+
+
+ ) +} diff --git a/frontend/src/components/ext-data/EditExtDialog.tsx b/frontend/src/components/ext-data/EditExtDialog.tsx new file mode 100644 index 0000000..acae389 --- /dev/null +++ b/frontend/src/components/ext-data/EditExtDialog.tsx @@ -0,0 +1,252 @@ +import { useRef, useState } from 'react' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { motion } from 'framer-motion' +import { X, Loader2, Upload } from 'lucide-react' +import { api, type ExtDataConfig, type ExtDataField } from '@/lib/api' +import { QK } from '@/lib/queryKeys' + +export function EditExtDialog({ config, onClose }: { config: ExtDataConfig; onClose: () => void }) { + const qc = useQueryClient() + const [label, setLabel] = useState(config.label) + const [description, setDescription] = useState(config.description ?? '') + const [fields, setFields] = useState([...config.fields]) + const [error, setError] = useState('') + const detectFileRef = useRef(null) + const [detecting, setDetecting] = useState(false) + const [symbolMapping, setSymbolMapping] = useState<{ candidates: string[]; file: File } | null>(null) + + const update = useMutation({ + mutationFn: () => + api.extDataUpdate(config.id, { + label: label.trim(), + fields: fields.filter((f) => f.name.trim()), + description: description.trim() || '', + }), + onSuccess: () => { + qc.invalidateQueries({ queryKey: QK.extData }) + onClose() + }, + onError: (err) => setError(String(err)), + }) + + const addField = () => + setFields([...fields, { name: '', dtype: 'string', label: '' }]) + + const removeField = (i: number) => + setFields(fields.filter((_, idx) => idx !== i)) + + const updateField = (i: number, key: keyof ExtDataField, val: string) => + setFields(fields.map((f, idx) => (idx === i ? { ...f, [key]: val } : f))) + + const valid = label.trim() && fields.some((f) => f.name.trim()) + + const applyDetectedFields = (detected: { name: string; dtype: string; label: string }[]) => { + const rest = detected.filter(f => f.name !== 'symbol') + setFields([ + { name: 'symbol', dtype: 'string', label: '标的代码' }, + ...rest, + ]) + } + + const handleDetectFile = (e: React.ChangeEvent) => { + const file = e.target.files?.[0] + if (!file) return + e.target.value = '' + setDetecting(true); setError(''); setSymbolMapping(null) + api.extDataDetectFields(file) + .then((res) => { + const hasSym = res.symbol_candidates.length > 0 + const hasCode = res.code_candidates.length > 0 + if (hasSym || hasCode) { + applyDetectedFields(res.fields) + } else { + const candidates = res.fields.map(f => f.name) + setSymbolMapping({ candidates, file }) + } + }) + .catch((err) => setError(String(err))) + .finally(() => setDetecting(false)) + } + + const handleSymbolMap = (_col: string) => { + if (!symbolMapping) return + setDetecting(true); setError('') + const rest = fields.filter(f => f.name !== 'symbol') + setFields([{ name: 'symbol', dtype: 'string', label: '标的代码' }, ...rest]) + setSymbolMapping(null) + setDetecting(false) + } + + return ( +
+
+ +
+

编辑扩展数据

+ +
+ +
+
+
+ +
+ {config.id} +
+
+
+ +
+ {config.mode === 'snapshot' ? '快照型' : '时序型'} +
+
+
+ +
+ + setLabel(e.target.value)} + className="w-full h-8 px-3 rounded-btn bg-base border border-border text-xs text-foreground placeholder:text-muted/40 focus:outline-none focus:border-accent/50" + /> +
+ +
+ + setDescription(e.target.value)} + placeholder="可选,简要说明数据的用途" + className="w-full h-8 px-3 rounded-btn bg-base border border-border text-xs text-foreground placeholder:text-muted/40 focus:outline-none focus:border-accent/50" + /> +
+ +
+
+ +
+ + + +
+
+ {symbolMapping && ( +
+
未找到 symbol 列,请选择哪一列作为标的代码:
+
+ {symbolMapping.candidates.map(col => ( + + ))} + +
+
+ )} +
+ {fields.map((f, i) => { + const isBuiltin = f.name === 'symbol' || f.name === 'name' + return ( +
+ updateField(i, 'label', e.target.value)} + placeholder="显示名" + disabled={isBuiltin} + className={`w-20 h-7 px-2 rounded-btn border text-[11px] text-foreground placeholder:text-muted/40 focus:outline-none focus:border-accent/50 ${ + isBuiltin + ? 'bg-elevated/50 border-border text-muted cursor-not-allowed' + : 'bg-base border-border' + }`} + /> + updateField(i, 'name', e.target.value)} + placeholder="字段名 (英文)" + disabled={isBuiltin} + className={`flex-1 h-7 px-2 rounded-btn border text-[11px] font-mono placeholder:text-muted/40 focus:outline-none focus:border-accent/50 ${ + isBuiltin + ? 'bg-elevated/50 border-border text-muted cursor-not-allowed' + : 'bg-base border-border' + }`} + /> + + {!isBuiltin && fields.length > 3 && ( + + )} + {isBuiltin &&
} +
+ ) + })} +
+
+ + {error && ( +
{error}
+ )} +
+ +
+ + +
+ +
+ ) +} diff --git a/frontend/src/components/ext-data/ExtDataApiPanel.tsx b/frontend/src/components/ext-data/ExtDataApiPanel.tsx new file mode 100644 index 0000000..5cd3700 --- /dev/null +++ b/frontend/src/components/ext-data/ExtDataApiPanel.tsx @@ -0,0 +1,79 @@ +import { Check, Copy } from 'lucide-react' +import type { ExtDataConfig } from '@/lib/api' + +export function ExtDataApiPanel({ config, copied, setCopied }: { + config: ExtDataConfig + copied: boolean + setCopied: (v: boolean) => void +}) { + const endpoint = `POST /api/ext-data/${config.id}/ingest` + + const exampleRow: Record = { symbol: '000001.SZ' } + for (const f of config.fields) { + if (f.name === 'symbol' || f.name === 'code') continue + exampleRow[f.name] = f.dtype === 'int' ? 100 : f.dtype === 'float' ? 1.5 : f.dtype === 'bool' ? true : '示例' + } + if (config.fields.some(f => f.name === 'code')) { + exampleRow['code'] = '000001' + } + const exampleBody = { + date: config.mode === 'timeseries' ? '2025-01-15' : undefined, + rows: [exampleRow], + } + const exampleJson = JSON.stringify(exampleBody, null, 2) + const curlCmd = `curl -X POST http://localhost:${window.location.port || '3018'}/api/ext-data/${config.id}/ingest \\ + -H 'Content-Type: application/json' \\ + -d '${JSON.stringify(exampleBody)}'` + + const handleCopy = (text: string) => { + navigator.clipboard.writeText(text).then(() => { + setCopied(true) + setTimeout(() => setCopied(false), 2000) + }) + } + + return ( +
+
+
接口端点
+
+ {endpoint} + +
+
+ +
+
请求体示例
+
+          {exampleJson}
+        
+
+ +
+
+ cURL 示例 + +
+
+          {curlCmd}
+        
+
+ +
+ {config.mode === 'snapshot' ? ( + <>date 可选,默认当天;每次写入覆盖同日期数据 + ) : ( + <>date 必填,指定交易日;按日期分区存储 + )} +
+
+ ) +} diff --git a/frontend/src/components/ext-data/ExtDataPullPanel.tsx b/frontend/src/components/ext-data/ExtDataPullPanel.tsx new file mode 100644 index 0000000..36ad379 --- /dev/null +++ b/frontend/src/components/ext-data/ExtDataPullPanel.tsx @@ -0,0 +1,212 @@ +import { useState } from 'react' +import { Loader2, Search, RefreshCw, Check } from 'lucide-react' +import { api, type ExtDataConfig } from '@/lib/api' + +export function ExtDataPullPanel({ config, onSaved }: { + config: ExtDataConfig + onSaved: () => void +}) { + const pull = config.pull + const [url, setUrl] = useState(pull?.url ?? '') + const [method, setMethod] = useState(pull?.method ?? 'GET') + const [headerStr, setHeaderStr] = useState( + pull?.headers ? JSON.stringify(pull.headers, null, 2) : '' + ) + const [body, setBody] = useState(pull?.body ?? '') + const [responsePath, setResponsePath] = useState(pull?.response_path ?? '') + const [fieldMapStr, setFieldMapStr] = useState( + pull?.field_map ? JSON.stringify(pull.field_map, null, 2) : '' + ) + const [schedule, setSchedule] = useState(pull?.schedule_minutes ?? 1440) + const [enabled, setEnabled] = useState(pull?.enabled ?? false) + const [saving, setSaving] = useState(false) + const [testing, setTesting] = useState(false) + const [running, setRunning] = useState(false) + const [testResult, setTestResult] = useState<{ total_rows: number; preview: Record[]; has_symbol: boolean } | null>(null) + const [error, setError] = useState('') + + const handleSave = () => { + let headers: Record | undefined + if (headerStr.trim()) { + try { headers = JSON.parse(headerStr) } + catch { setError('Headers 不是有效 JSON'); return } + } + let field_map: Record | undefined + if (fieldMapStr.trim()) { + try { field_map = JSON.parse(fieldMapStr) } + catch { setError('字段映射不是有效 JSON'); return } + } + setSaving(true); setError('') + api.extDataPullConfig(config.id, { + url, method, headers, body: body || undefined, + response_path: responsePath, field_map, + schedule_minutes: schedule, enabled, + }).then(() => onSaved()) + .catch(e => setError(e.message || '保存失败')) + .finally(() => setSaving(false)) + } + + const handleTest = () => { + setTesting(true); setError(''); setTestResult(null) + let headers: Record | undefined + if (headerStr.trim()) { + try { headers = JSON.parse(headerStr) } + catch { setError('Headers 不是有效 JSON'); setTesting(false); return } + } + let field_map: Record | undefined + if (fieldMapStr.trim()) { + try { field_map = JSON.parse(fieldMapStr) } + catch { setError('字段映射不是有效 JSON'); setTesting(false); return } + } + api.extDataPullConfig(config.id, { + url, method, headers, body: body || undefined, + response_path: responsePath, field_map, + schedule_minutes: schedule, enabled, + }).then(() => api.extDataPullTest(config.id)) + .then(r => { setTestResult(r); onSaved() }) + .catch(e => setError(e.message || '测试失败')) + .finally(() => setTesting(false)) + } + + const handleRun = () => { + setRunning(true); setError('') + api.extDataPullRun(config.id) + .then(() => onSaved()) + .catch(e => setError(e.message || '执行失败')) + .finally(() => setRunning(false)) + } + + return ( +
+
+ + setUrl(e.target.value)} + placeholder="https://api.example.com/data" + className="flex-1 min-w-0 rounded-md border border-border bg-elevated px-2.5 py-1.5 text-[11px] font-mono text-foreground placeholder:text-muted/50" + /> +
+ +
+
Headers (JSON,可选)
+

nCTPFfe2(14d+ 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�whRnxuaY=P3*Dmk&Y&gNgPzMpEnu>s@P&}2Ppp{vSx0X?4{GIFqD@QiffoS=A zfyL$?1Evqq-@y(p6iZMA_74t7rU8+xlb)_@zlVqa!ehX&6IfiMF6yDWicg8GR3UZ) z8->=orbhnzESyhCr@PkRN83Ks6?)`DJzyZfdR7-l$!UgHAq}>{aKUB#u+8~x@jMsQ zix?70u1ULhu0CyyYzV|zID$KF8N|tluMQ7(tPxh$&t;w(6nVL5(uin}+N23`r59k0 zY1n>F0Aa^kLv!#ag@2&&)&cW@*8Q5NZo(NIp^_S?8GE|wQY}2O%9*IEMMSD@#af^6 zfYpG1k+g&L_OGPYL8=*l-b;-u}?sf+PZ-D0m!ypqt6Xer03zUguec zFg7;Whv~4yoMx4IZ^V_aFz4=WUNN#TZMmcA`=t(iPT`vru@3NnN~eE29-B>CQ!7&G z!Wxv3XfKm58XTSYSf#oFjwP<9V2p@wdKpjr5BLKO3x(Tb1(o%k=qlmC)2KG0+P6V z3xC`d;`_+@*kC#My|XBT;MhnW!{#cKa3&J*5Q6Vks~a3+xTT6=t5+O_4LDkw*A^~- zmNVjA627lJ7*;X=3TJ2hk3V#DHa2{?-;29JmJwovY?%C5u@!$Nb@sJm9U*au5JTRO zGLo$_LyS;i-liLsHw`43S{m3?C61k%J6R`D4PrzRCI29+aUsRyO1!)lvXoL!gAmRz znqgo^2gXQ%9P}<3=ho@1Jj$RO%!i1nS^Fu+^w^PleN68p_o6+4vJrX19?K=0^&I`o za8sDw#uuy;Ieq&jFbjgWk$1(bt{7jCtGTlt|3Zs8w_(>g^yA4R_2I6#dP+NIlIGjC6VhglPaTcoFx zu7Il(nWB&D>n-fSpg~>^|G{N)?j{MHNY-pbI1p6EFtZr-Q1TK1G>>$exzdB(TeIvz zkdi34w!j!c&ds7hiqYJt)5)Sfnhv;rw|{2xWBkMex32UguA`z1aEDp|Ilj_mW%;8U zhOKrLXquT8zNI7nTG)Bnw0um$-YGv3BrWx(^YabjgBFC2W>1kzihVJebA7cy*Ob{u z#{Z*p(T))@5#aEPK5^S7IQjsCZ7j6Cp%8_6Zhv-wMw#x@PQZk|Zy&!<&r%Z~P+)0+ z8El8KqJ_d>99mvH#6suENZK3=vc)td9G46^-&^^f<73g`T|1(Erts5E?kBpRG=bFx zItfN{e(7=x=GeTUtQC5phBUmi zptB0m1{Rgk#Hdl1a>bUicWLb<IEzd_0xzY8cDB20j3ime#5mEmiO4!l5;o88a>yh`#zHEk^OlQmb%=}F{koOGA$E49F5NAe!NxQ+?{tQCg#gjI+ zOar$188icHQ@QQ0nD!d8T3Za;7B&%UB_Ax5EYNKhU|~VDPEu5by^jB%&4#7(;FlO!YDEc(eyqZqb^?Aw9eU@e%?eA zl*749IqbbhnuWgYaEWfFPo#eHs-gL!YUDV8j;Fa#G`#?-@4 z4~Z0F#ModMXt0R6ozR7b@d0dsxs37|q;y?FMft4ADrwF{+zMOk*pCKFsd3d_nd6QEAPkqs({%c3a2SbP)L z{hEGa?fhUFA$5QtM>mUiTRO1-^Mjq5UCg~$qG7BLBMe7^h*ltND*ex_J_^(DOuezE zj$*?x?(2RzK>uJ^Nd@#c`4-6U@bgKNjqkxHChSsM9WNBOHZfz^Kgry`CT+`WbCC@H z*1T=zr<1K!4leN6SKu*4v9sC1$OkYwqUkFKk0bYseD3df))}Z>vV3T8WxzZkY%)4RWBW9RYk3P5WWgK?chlFkhy<*Jv z+Ay7WGhS32NmaPiO2eAIk~JP2K&zb;Fj7yUmHU1Il#DPckvv1k36JcS-183ZWt7LI zyo<7hm%dOcBqeDM8E+NpcIrk)I@pg`Wu;qSZUdHAeU)uLyw4hU&Sh<}NRdBpO7>+^ zbWva2hv*TuaYk_q-GVbjXA|o`Sb$67 zzQge4Q;7tOY_-M)c#DJ&I;Qy0F)yH3i~i)5ujN*UB~=C7LA&M0js6dv^B zXO~QfctYwg=S4*P75{ut{?_ipACPl5NF$i%_q9(zaGc0CI5v#LUig?}T)R}r*3ENE zFVryA|ByHW=rsC%Fm zAKp9(IZTky5j;3D7?Ftyd-xdM^SlmpQ@2Nf^S|0^Hwg+j%7t z=pW3#EPX%|*Q;dFBlorxb5Cc{^Tz+&#FfZn)X3ea2!aqeV@N>$8{B=�)-c41rGY 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

fMN+pk`eNu?Z!+pe9jKMA+Mksh%1=znh0 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�Pda!V=SEXB3@f%WYms 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 NTo_W>U2`bU)( zqTvIQx8%of%Ewsk_*f1f#ET`I;cH#fs`6aElcMN4Q#9>Fh~{3!F@YJ>@=d}d*OnVsA(cbhmr+WNBv1g zy&qAaUmhKKsEjLpjbLQMwUhe|ZK1I_q-oU!)n^T(@+opI zr^=Rk_VM2o^WA;{j~(h-GTL_E=BgR5*S5-;eim`F70GIg+vCw(l3~+CB0tQ!?n(L9 zpF27}$ZJvfp8oK8pr>VEQ3`aOj-v83y~a*Hq#kKzPdRXJx$;hW&&qLM)$6Djxj#;a zBSREUDav4Sr%U>DesoZ`KI|(|6eBavfE2OPpVjJ;5&bs(uJ`7>n8cTpwF*Ajk?Bpl z2buo6`;u{n@UZF3Qrd>+N0}Up>p#h9VZUc83dC4GHy|tFQ>s>_5$8tm>O%@P3>4L> zRB<#!=`cj@--F9F%Dch!nVsb|)KU`S@3&EZsfNq^>^V+HJZI5}X63Xun&9!3(l4nQ zK|e%6R@Yko8COa%sl8%NN&lcnlT0!pmDv4(rf`$&)VnBwL4ZDs3G;+hZCa&9jMQuJ zsS(GNi*-60LPRK|fG71uqMCP%SXnb$TZGZwE^23*pX{*ubG&zN7qv(|CCmH_hOPDG zt#-E-5GS{J;Z8NEs?wq%oN$eM zTL|TLC0`8JM>p@TK`4~JTa4p2oE|j;5Tf(ssv;VN+Illi)NSi`Dz|USwe6F;yeC zr6iTWowI|9UZb(iT1^H*PnMQ0K`G|rtJko1aTxbAc_6LqUA`v-p$(UW;bR`-~ET07A4k-sV@9(xI)RdZ-_d7G&7=O zif>}5N~>5B#t*EVB~N2^2cNJN_Ly&{l;nd5CBw^bNx*UfZv+MheC6t`2I94HHPzDd zK4`umbwk-Yax3)vaUL=na1xQk_om94tXlV=f&syA705*GfYTYz(yQ8!Pqgq3mxW+B z8r4@W^cjw~2Pbz*(^gtH=9NhC#UBN-ggr__l^1w9+T{)cS3`{6yV zXa*(7N@A9KW?2x)aXJJ%L(mJ(YDCr(vmrEMGSc>`$%dOmBZK5MP}&xBSPB)fhN|{bMo?+uo@Vt zVPWmFblAFbQ>rN5hw*Q+jyXabg;fg2yiUlge}xLkaZVy9Et-XQjIsv0ZpM7!ppUL3 z$jVgF=DapvSw+!IxPIa!Ov_ZM?H(B>-fH9fu3clbly)C$#t`oRx=5^X@@KOzE8~T9 zmKZ9dxmh~ndDWTL2s6TO<`~MHLZe!a26#>rZ_-QL_4oeER%cqVSI#%bKRPR$kY1|- z3+IhE#~ElJ*>MK=PSg=~sdio1=6+M|5#Pd>7O?oVvo5tkEWU9fzTXZcy8elp-4;Vn z=9za8H>PlZA(^pk$|VB*^s9Jyf=CG6>I|s=PH_lXBdg`Km&98iCUiFZ&H@Dmbr> zH9@9B4Eo8B-ARkV%@~62x|CrgYgd**2KCHVR_~s7fGa{2rI?{vzA1T+yQX4e_kujB z$Y0WX)$B0R9w{gm22i?JG%B<(RsGm{dI};N2tYfG>GjCS5BHyW8X$L~%V+!YD9#Evsn#is!Y?A6t7njA&fnqB5xd!I$hcw5zTfhcrH{N`U$3hsacMNWdI!>0MuMy$$a7^|Rit2?tLmg&(tqllD&3 z7HlSl8Jr8N$qC23trDu@;ojeFu!lf|gOw(!(sHttvOIA!X=%iD!}065-2P~ZvV5|F zWUde2VNkDlbasBjjUE1Uyqw;no0VE@RY%0EB|Q#IoJn=?TX}dycpI?Wjq46dva+zm z)?1f&_<-MHTS8^NK?H+Npv%Jq=|C^nuZTKgM6mnl?iV1=?LU`(956QjO@P!50Y>-V z6fG0*k^iQW@PV)W_mV;m*8Fe6k0RthS-kx83lm@n|GlRl{)lETJH8`_;wt>|qlAd8 KaHXJr!2biBX7N4% literal 0 HcmV?d00001 diff --git a/docs/screenshots/dashboard.png b/docs/screenshots/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..bba7a1e88032351c2d10b613768b151423122e6f GIT binary patch literal 376763 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%0ARIeAdaHSzq5pWrIYaNaEWiczYCMSsoCy8 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 z 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